mirror of
https://github.com/openvswitch/ovs
synced 2025-10-27 15:18:06 +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:
@@ -573,7 +573,7 @@ nx_put_raw(struct ofpbuf *b, bool oxm, const struct match *match,
|
||||
int match_len;
|
||||
int i;
|
||||
|
||||
BUILD_ASSERT_DECL(FLOW_WC_SEQ == 18);
|
||||
BUILD_ASSERT_DECL(FLOW_WC_SEQ == 19);
|
||||
|
||||
/* Metadata. */
|
||||
if (match->wc.masks.in_port) {
|
||||
@@ -615,6 +615,22 @@ nx_put_raw(struct ofpbuf *b, bool oxm, const struct match *match,
|
||||
match->wc.masks.vlan_tci);
|
||||
}
|
||||
|
||||
/* MPLS. */
|
||||
if (eth_type_mpls(flow->dl_type)) {
|
||||
if (match->wc.masks.mpls_lse & htonl(MPLS_TC_MASK)) {
|
||||
nxm_put_8(b, OXM_OF_MPLS_TC, mpls_lse_to_tc(flow->mpls_lse));
|
||||
}
|
||||
|
||||
if (match->wc.masks.mpls_lse & htonl(MPLS_BOS_MASK)) {
|
||||
nxm_put_8(b, OXM_OF_MPLS_BOS, mpls_lse_to_bos(flow->mpls_lse));
|
||||
}
|
||||
|
||||
if (match->wc.masks.mpls_lse & htonl(MPLS_LABEL_MASK)) {
|
||||
nxm_put_32(b, OXM_OF_MPLS_LABEL,
|
||||
htonl(mpls_lse_to_label(flow->mpls_lse)));
|
||||
}
|
||||
}
|
||||
|
||||
/* L3. */
|
||||
if (flow->dl_type == htons(ETH_TYPE_IP)) {
|
||||
/* IP. */
|
||||
|
||||
Reference in New Issue
Block a user