diff options
author | Simon Horman <horms@verge.net.au> | 2013-01-25 16:22:07 +0900 |
---|---|---|
committer | Ben Pfaff <blp@nicira.com> | 2013-02-05 09:17:45 -0800 |
commit | b02475c53b3ca857c45eb5e17d12fdf233a9dac8 (patch) | |
tree | 2f655ed5868adfceff879e372951e04a89599750 /lib/dpif-netdev.c | |
parent | d224e3501437af4a8480d734a99ca371a1eafa11 (diff) |
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>
Diffstat (limited to 'lib/dpif-netdev.c')
-rw-r--r-- | lib/dpif-netdev.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index 038dfdc9..d315b594 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -1233,6 +1233,10 @@ execute_set_action(struct ofpbuf *packet, const struct nlattr *a) packet_set_udp_port(packet, udp_key->udp_src, udp_key->udp_dst); break; + case OVS_KEY_ATTR_MPLS: + set_mpls_lse(packet, nl_attr_get_be32(a)); + break; + case OVS_KEY_ATTR_UNSPEC: case OVS_KEY_ATTR_ENCAP: case OVS_KEY_ATTR_ETHERTYPE: @@ -1279,6 +1283,16 @@ dp_netdev_execute_actions(struct dp_netdev *dp, eth_pop_vlan(packet); break; + case OVS_ACTION_ATTR_PUSH_MPLS: { + const struct ovs_action_push_mpls *mpls = nl_attr_get(a); + push_mpls(packet, mpls->mpls_ethertype, mpls->mpls_lse); + break; + } + + case OVS_ACTION_ATTR_POP_MPLS: + pop_mpls(packet, nl_attr_get_be16(a)); + break; + case OVS_ACTION_ATTR_SET: execute_set_action(packet, nl_attr_get(a)); break; |