[ovs-dev] [RFC PATCH v2 10/13] Add push_eth/pop_eth flow actions for kernel data path

Johnson Li johnson.li at intel.com
Tue Jul 12 17:29:12 UTC 2016


Ethernet header could be pushed to/stripped from packets with
flow action push_eth/pop_eth, origin packets will be treated as
payload even the packets are Ethernet packets.

Derived from work by Lorand Jakub and Simon Horman.
Cc: Lorand Jakab <lojakab at cisco.com>
Cc: Simon Horman <simon.horman at netronome.com>
---
This is extracted from l3 flow support paches currently
being targeted at net-next by Simon Horman.

Signed-off-by: Johnson Li <johnson.li at intel.com>

diff --git a/datapath/linux/compat/include/linux/openvswitch.h b/datapath/linux/compat/include/linux/openvswitch.h
index 896fa68..9cf8edd 100644
--- a/datapath/linux/compat/include/linux/openvswitch.h
+++ b/datapath/linux/compat/include/linux/openvswitch.h
@@ -663,6 +663,15 @@ struct ovs_action_push_nsh {
 	uint8_t header[NSH_HEADER_LEN_MAX]; /* NSH header */
 };
 
+/**
+ * struct ovs_action_push_eth - %OVS_ACTION_ATTR_PUSH_ETH action argument.
+ * @addr: Ethernet Addresses(Destination and Source MAC address).
+ * @type: Ethernet Type(IPv4/IPv6, etc.).
+ */
+struct ovs_action_push_eth {
+	struct ovs_key_ethernet addresses;
+};
+
 /* Data path hash algorithm for computing Datapath hash.
  *
  * The algorithm type only specifies the fields in a flow
@@ -843,6 +852,8 @@ enum ovs_action_attr {
 	OVS_ACTION_ATTR_TRUNC,        /* u32 struct ovs_action_trunc. */
 	OVS_ACTION_ATTR_PUSH_NSH,     /* struct ovs_action_push_nsh. */
 	OVS_ACTION_ATTR_POP_NSH,      /* No argument. */
+	OVS_ACTION_ATTR_PUSH_ETH,     /* struct ovs_action_push_eth. */
+	OVS_ACTION_ATTR_POP_ETH,      /* No argument. */
 
 #ifndef __KERNEL__
 	OVS_ACTION_ATTR_TUNNEL_PUSH,   /* struct ovs_action_push_tnl*/
diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
index d2bd64f..ebad3e7 100644
--- a/lib/dpif-netdev.c
+++ b/lib/dpif-netdev.c
@@ -4199,6 +4199,8 @@ dp_execute_cb(void *aux_, struct dp_packet_batch *packets_,
     case OVS_ACTION_ATTR_TRUNC:
     case OVS_ACTION_ATTR_PUSH_NSH:
     case OVS_ACTION_ATTR_POP_NSH:
+    case OVS_ACTION_ATTR_PUSH_ETH:
+    case OVS_ACTION_ATTR_POP_ETH:
     case __OVS_ACTION_ATTR_MAX:
         OVS_NOT_REACHED();
     }
diff --git a/lib/dpif.c b/lib/dpif.c
index cff453e..9132d07 100644
--- a/lib/dpif.c
+++ b/lib/dpif.c
@@ -1171,6 +1171,8 @@ dpif_execute_helper_cb(void *aux_, struct dp_packet_batch *packets_,
     case OVS_ACTION_ATTR_TRUNC:
     case OVS_ACTION_ATTR_PUSH_NSH:
     case OVS_ACTION_ATTR_POP_NSH:
+    case OVS_ACTION_ATTR_PUSH_ETH:
+    case OVS_ACTION_ATTR_POP_ETH:
     case OVS_ACTION_ATTR_UNSPEC:
     case __OVS_ACTION_ATTR_MAX:
         OVS_NOT_REACHED();
diff --git a/lib/odp-execute.c b/lib/odp-execute.c
index 8b2d989..375506e 100644
--- a/lib/odp-execute.c
+++ b/lib/odp-execute.c
@@ -508,6 +508,8 @@ requires_datapath_assistance(const struct nlattr *a)
     case OVS_ACTION_ATTR_TRUNC:
     case OVS_ACTION_ATTR_PUSH_NSH:
     case OVS_ACTION_ATTR_POP_NSH:
+    case OVS_ACTION_ATTR_PUSH_ETH:
+    case OVS_ACTION_ATTR_POP_ETH:
         return false;
 
     case OVS_ACTION_ATTR_UNSPEC:
@@ -643,6 +645,8 @@ odp_execute_actions(void *dp, struct dp_packet_batch *batch, bool steal,
 
         case OVS_ACTION_ATTR_PUSH_NSH:
         case OVS_ACTION_ATTR_POP_NSH:
+        case OVS_ACTION_ATTR_PUSH_ETH:
+        case OVS_ACTION_ATTR_POP_ETH:
             break;
 
         case OVS_ACTION_ATTR_OUTPUT:
diff --git a/lib/odp-util.c b/lib/odp-util.c
index e8213c0..8697e00 100644
--- a/lib/odp-util.c
+++ b/lib/odp-util.c
@@ -123,6 +123,8 @@ odp_action_len(uint16_t type)
     case OVS_ACTION_ATTR_CT: return ATTR_LEN_VARIABLE;
     case OVS_ACTION_ATTR_PUSH_NSH: return sizeof(struct ovs_action_push_nsh);
     case OVS_ACTION_ATTR_POP_NSH: return 0;
+    case OVS_ACTION_ATTR_PUSH_ETH: return sizeof(struct ovs_action_push_eth);
+    case OVS_ACTION_ATTR_POP_ETH: return 0;
 
     case OVS_ACTION_ATTR_UNSPEC:
     case __OVS_ACTION_ATTR_MAX:
@@ -933,6 +935,10 @@ format_odp_action(struct ds *ds, const struct nlattr *a)
         ds_put_cstr(ds, "pop_nsh");
         break;
 
+    case OVS_ACTION_ATTR_PUSH_ETH:
+    case OVS_ACTION_ATTR_POP_ETH:
+        break;
+
     case OVS_ACTION_ATTR_UNSPEC:
     case __OVS_ACTION_ATTR_MAX:
     default:
diff --git a/ofproto/ofproto-dpif-sflow.c b/ofproto/ofproto-dpif-sflow.c
index 86ffdd5..003b2dd 100644
--- a/ofproto/ofproto-dpif-sflow.c
+++ b/ofproto/ofproto-dpif-sflow.c
@@ -1179,6 +1179,8 @@ dpif_sflow_read_actions(const struct flow *flow,
 	case OVS_ACTION_ATTR_UNSPEC:
 	case OVS_ACTION_ATTR_PUSH_NSH:
 	case OVS_ACTION_ATTR_POP_NSH:
+	case OVS_ACTION_ATTR_PUSH_ETH:
+	case OVS_ACTION_ATTR_POP_ETH:
 	case __OVS_ACTION_ATTR_MAX:
 	default:
 	    break;
-- 
1.8.4.2

--------------------------------------------------------------
Intel Research and Development Ireland Limited
Registered in Ireland
Registered Office: Collinstown Industrial Park, Leixlip, County Kildare
Registered Number: 308263


This e-mail and any attachments may contain confidential material for the sole
use of the intended recipient(s). Any review or distribution by others is
strictly prohibited. If you are not the intended recipient, please contact the
sender and delete all copies.




More information about the dev mailing list