mirror of
https://github.com/openvswitch/ovs
synced 2025-08-31 22:35:15 +00:00
User-Space MPLS actions and matches
This patch implements use-space datapath and non-datapath code to match and use the datapath API set out in Leo Alterman's patch "user-space datapath: Add basic MPLS support to kernel". The resulting MPLS implementation supports: * Pushing a single MPLS label * Poping a single MPLS label * Modifying an MPLS lable using set-field or load actions that act on the label value, tc and bos bit. * There is no support for manipulating the TTL this is considered future work. The single-level push pop limitation is implemented by processing push, pop and set-field/load actions in order and discarding information that would require multiple levels of push/pop to be supported. e.g. push,push -> the first push is discarded pop,pop -> the first pop is discarded This patch is based heavily on work by Ravi K. Cc: Ravi K <rkerur@gmail.com> Reviewed-by: Isaku Yamahata <yamahata@valinux.co.jp> Signed-off-by: Simon Horman <horms@verge.net.au> Signed-off-by: Ben Pfaff <blp@nicira.com>
This commit is contained in:
@@ -283,6 +283,8 @@ enum ovs_key_attr {
|
||||
#ifdef __KERNEL__
|
||||
OVS_KEY_ATTR_IPV4_TUNNEL, /* struct ovs_key_ipv4_tunnel */
|
||||
#endif
|
||||
|
||||
OVS_KEY_ATTR_MPLS = 62, /* struct ovs_key_mpls */
|
||||
OVS_KEY_ATTR_TUN_ID = 63, /* be64 tunnel ID */
|
||||
__OVS_KEY_ATTR_MAX
|
||||
};
|
||||
@@ -325,6 +327,10 @@ struct ovs_key_ethernet {
|
||||
__u8 eth_dst[6];
|
||||
};
|
||||
|
||||
struct ovs_key_mpls {
|
||||
__be32 mpls_top_lse;
|
||||
};
|
||||
|
||||
struct ovs_key_ipv4 {
|
||||
__be32 ipv4_src;
|
||||
__be32 ipv4_dst;
|
||||
@@ -454,6 +460,19 @@ enum ovs_userspace_attr {
|
||||
|
||||
#define OVS_USERSPACE_ATTR_MAX (__OVS_USERSPACE_ATTR_MAX - 1)
|
||||
|
||||
/**
|
||||
* struct ovs_action_push_mpls - %OVS_ACTION_ATTR_PUSH_MPLS action argument.
|
||||
* @mpls_lse: MPLS label stack entry to push.
|
||||
* @mpls_ethertype: Ethertype to set in the encapsulating ethernet frame.
|
||||
*
|
||||
* The only values @mpls_ethertype should ever be given are %ETH_P_MPLS_UC and
|
||||
* %ETH_P_MPLS_MC, indicating MPLS unicast or multicast. Other are rejected.
|
||||
*/
|
||||
struct ovs_action_push_mpls {
|
||||
__be32 mpls_lse;
|
||||
__be16 mpls_ethertype; /* Either %ETH_P_MPLS_UC or %ETH_P_MPLS_MC */
|
||||
};
|
||||
|
||||
/**
|
||||
* struct ovs_action_push_vlan - %OVS_ACTION_ATTR_PUSH_VLAN action argument.
|
||||
* @vlan_tpid: Tag protocol identifier (TPID) to push.
|
||||
@@ -476,14 +495,23 @@ struct ovs_action_push_vlan {
|
||||
* @OVS_ACTION_ATTR_OUTPUT: Output packet to port.
|
||||
* @OVS_ACTION_ATTR_USERSPACE: Send packet to userspace according to nested
|
||||
* %OVS_USERSPACE_ATTR_* attributes.
|
||||
* @OVS_ACTION_ATTR_SET: Replaces the contents of an existing header. The
|
||||
* single nested %OVS_KEY_ATTR_* attribute specifies a header to modify and its
|
||||
* value.
|
||||
* @OVS_ACTION_ATTR_PUSH_VLAN: Push a new outermost 802.1Q header onto the
|
||||
* packet.
|
||||
* @OVS_ACTION_ATTR_POP_VLAN: Pop the outermost 802.1Q header off the packet.
|
||||
* @OVS_ACTION_ATTR_SAMPLE: Probabilitically executes actions, as specified in
|
||||
* the nested %OVS_SAMPLE_ATTR_* attributes.
|
||||
* @OVS_ACTION_ATTR_SET: Replaces the contents of an existing header. The
|
||||
* single nested %OVS_KEY_ATTR_* attribute specifies a header to modify and its
|
||||
* value.
|
||||
* @OVS_ACTION_ATTR_PUSH_MPLS: Push a new MPLS label stack entry onto the
|
||||
* top of the packets MPLS label stack. Set the ethertype of the
|
||||
* encapsulating frame to either %ETH_P_MPLS_UC or %ETH_P_MPLS_MC to
|
||||
* indicate the new packet contents.
|
||||
* @OVS_ACTION_ATTR_POP_MPLS: Pop an MPLS label stack entry off of the
|
||||
* packet's MPLS label stack. Set the encapsulating frame's ethertype to
|
||||
* indicate the new packet contents This could potentially still be
|
||||
* %ETH_P_MPLS_* if the resulting MPLS label stack is not empty. If there
|
||||
* is no MPLS label stack, as determined by ethertype, no action is taken.
|
||||
*
|
||||
* Only a single header can be set with a single %OVS_ACTION_ATTR_SET. Not all
|
||||
* fields within a header are modifiable, e.g. the IPv4 protocol and fragment
|
||||
@@ -498,6 +526,8 @@ enum ovs_action_attr {
|
||||
OVS_ACTION_ATTR_PUSH_VLAN, /* struct ovs_action_push_vlan. */
|
||||
OVS_ACTION_ATTR_POP_VLAN, /* No argument. */
|
||||
OVS_ACTION_ATTR_SAMPLE, /* Nested OVS_SAMPLE_ATTR_*. */
|
||||
OVS_ACTION_ATTR_PUSH_MPLS, /* struct ovs_action_push_mpls. */
|
||||
OVS_ACTION_ATTR_POP_MPLS, /* __be16 ethertype. */
|
||||
__OVS_ACTION_ATTR_MAX
|
||||
};
|
||||
|
||||
|
Reference in New Issue
Block a user