@@ -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*/
@@ -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();
}
@@ -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();
@@ -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:
@@ -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:
@@ -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;
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@cisco.com> Cc: Simon Horman <simon.horman@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@intel.com>