On Tue, Oct 09, 2012 at 04:08:33PM +0900, Simon Horman wrote: > This is to match the kernel implementation in the > patch "datapath: Add basic MPLS support to kernel" > by Leo Alterman. > > Cc: Leo Alterman <lalter...@nicira.com> > Signed-off-by: Simon Horman <ho...@verge.net.au> > > --- > > v2.2 > * No change > > v2.1 > * Initial post > --- > lib/dpif-netdev.c | 13 +++++++++++++ > lib/odp-util.c | 43 +++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 56 insertions(+) > > diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c > index c9e3210..6deb9ff 100644 > --- a/lib/dpif-netdev.c > +++ b/lib/dpif-netdev.c > @@ -1212,6 +1212,7 @@ execute_set_action(struct ofpbuf *packet, const struct > nlattr *a) > case OVS_KEY_ATTR_ICMPV6: > case OVS_KEY_ATTR_ARP: > case OVS_KEY_ATTR_ND: > + case OVS_KEY_ATTR_MPLS: > case __OVS_KEY_ATTR_MAX: > default: > NOT_REACHED(); > @@ -1249,6 +1250,18 @@ dp_netdev_execute_actions(struct dp_netdev *dp, > eth_pop_vlan(packet); > break; > > + case OVS_ACTION_ATTR_PUSH_MPLS: > + push_mpls(packet, nl_attr_get_be16(a)); > + break; > + > + case OVS_ACTION_ATTR_POP_MPLS: > + pop_mpls(packet, nl_attr_get_be16(a)); > + break; > + > + case OVS_ACTION_ATTR_SET_MPLS: > + set_mpls_lse(packet, nl_attr_get_be32(a)); > + break; > + > case OVS_ACTION_ATTR_SET: > execute_set_action(packet, nl_attr_get(a)); > break; > diff --git a/lib/odp-util.c b/lib/odp-util.c > index 257d7a7..13b3248 100644 > --- a/lib/odp-util.c > +++ b/lib/odp-util.c > @@ -73,6 +73,9 @@ odp_action_len(uint16_t type) > case OVS_ACTION_ATTR_USERSPACE: return -2; > case OVS_ACTION_ATTR_PUSH_VLAN: return sizeof(struct > ovs_action_push_vlan); > case OVS_ACTION_ATTR_POP_VLAN: return 0; > + case OVS_ACTION_ATTR_PUSH_MPLS: return sizeof(struct > ovs_action_push_mpls); > + case OVS_ACTION_ATTR_POP_MPLS: return sizeof(ovs_be16); > + case OVS_ACTION_ATTR_SET_MPLS: return sizeof(ovs_be32); > case OVS_ACTION_ATTR_SET: return -2; > case OVS_ACTION_ATTR_SAMPLE: return -2; > > @@ -106,6 +109,7 @@ ovs_key_attr_to_string(enum ovs_key_attr attr) > case OVS_KEY_ATTR_ARP: return "arp"; > case OVS_KEY_ATTR_ND: return "nd"; > case OVS_KEY_ATTR_TUN_ID: return "tun_id"; > + case OVS_KEY_ATTR_MPLS: return "mpls"; > > case __OVS_KEY_ATTR_MAX: > default: > @@ -273,6 +277,17 @@ format_vlan_tci(struct ds *ds, ovs_be16 vlan_tci) > } > > static void > +format_mpls_lse(struct ds *ds, ovs_be32 mpls_lse) > +{ > + ds_put_format(ds, "label=%"PRIu32",tc=%d,ttl=%d,bos=%d", > + mpls_lse_to_label(mpls_lse), > + mpls_lse_to_tc(mpls_lse), > + mpls_lse_to_ttl(mpls_lse), > + mpls_lse_to_stack(mpls_lse)); > +} > + > + > +static void > format_odp_action(struct ds *ds, const struct nlattr *a) > { > int expected_len; > @@ -311,6 +326,25 @@ format_odp_action(struct ds *ds, const struct nlattr *a) > case OVS_ACTION_ATTR_POP_VLAN: > ds_put_cstr(ds, "pop_vlan"); > break; > + case OVS_ACTION_ATTR_PUSH_MPLS: { > + const struct ovs_action_push_mpls *mpls = nl_attr_get(a); > + ds_put_cstr(ds, "push_mpls("); > + format_mpls_lse(ds, mpls->mpls_label); > + ds_put_format(ds, "eth_type=0x%"PRIx16")", > ntohs(mpls->mpls_ethertype)); > + break; > + } > + case OVS_ACTION_ATTR_POP_MPLS: { > + ovs_be16 ethertype = nl_attr_get_be16(a); > + ds_put_format(ds, "pop_mpls(eth_type=0x%"PRIx16")", > ntohs(ethertype)); > + break; > + }
Minor nitpick. the position of '}' thanks, > + case OVS_ACTION_ATTR_SET_MPLS: { > + ovs_be32 label = nl_attr_get_be32(a); > + ds_put_cstr(ds, "set_mpls("); > + format_mpls_lse(ds, label); > + ds_put_char(ds, ')'); > + break; > + } > case OVS_ACTION_ATTR_SAMPLE: > format_odp_sample_action(ds, a); > break; > @@ -606,6 +640,7 @@ odp_flow_key_attr_len(uint16_t type) > case OVS_KEY_ATTR_ETHERNET: return sizeof(struct ovs_key_ethernet); > case OVS_KEY_ATTR_VLAN: return sizeof(ovs_be16); > case OVS_KEY_ATTR_ETHERTYPE: return 2; > + case OVS_KEY_ATTR_MPLS: return sizeof(struct ovs_key_mpls); > case OVS_KEY_ATTR_IPV4: return sizeof(struct ovs_key_ipv4); > case OVS_KEY_ATTR_IPV6: return sizeof(struct ovs_key_ipv6); > case OVS_KEY_ATTR_TCP: return sizeof(struct ovs_key_tcp); > @@ -715,6 +750,14 @@ format_odp_key_attr(const struct nlattr *a, struct ds > *ds) > ds_put_char(ds, ')'); > break; > > + case OVS_KEY_ATTR_MPLS: { > + const struct ovs_key_mpls *mpls_key = nl_attr_get(a); > + ds_put_char(ds, '('); > + format_mpls_lse(ds, mpls_key->mpls_top_label); > + ds_put_char(ds, ')'); > + break; > + } > + > case OVS_KEY_ATTR_ETHERTYPE: > ds_put_format(ds, "(0x%04"PRIx16")", > ntohs(nl_attr_get_be16(a))); > -- > 1.7.10.4 > > _______________________________________________ > dev mailing list > dev@openvswitch.org > http://openvswitch.org/mailman/listinfo/dev > -- yamahata _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev