Note that OVS_KEY_ATTR_MPLS may be an array of ovs_key_mpls and that the acceptable length may be restricted by the implementation.
Currently the user-space datapath and proposed kernel datapath implementation restrict the length to a single element. Also update the mpls_top_lse name of the element of struct ovs_key_mpls, as it is an array of LSEs and thus not necessarily just the top LSE. As requested by Jesse Gross Cc: Jesse Gross <je...@nicira.com> Signed-off-by: Simon Horman <horms+rene...@verge.net.au> --- This patch was formerly part of "[PATCH v2.28] datapath: Add basic MPLS support to kernel". I have broken it out as there seems to be no particularly good reason not to apply the change independently of that patch. This change may be applied independently of other MPLS patches and I would like it considered for merging. --- include/linux/openvswitch.h | 6 ++++-- lib/odp-util.c | 8 ++++---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/include/linux/openvswitch.h b/include/linux/openvswitch.h index bd2f05f..e890fd8 100644 --- a/include/linux/openvswitch.h +++ b/include/linux/openvswitch.h @@ -287,7 +287,9 @@ enum ovs_key_attr { OVS_KEY_ATTR_IPV4_TUNNEL, /* struct ovs_key_ipv4_tunnel */ #endif - OVS_KEY_ATTR_MPLS = 62, /* struct ovs_key_mpls */ + OVS_KEY_ATTR_MPLS = 62, /* array of struct ovs_key_mpls. + * The implementation may restrict + * the accepted length of the array. */ __OVS_KEY_ATTR_MAX }; @@ -330,7 +332,7 @@ struct ovs_key_ethernet { }; struct ovs_key_mpls { - __be32 mpls_top_lse; + __be32 mpls_lse; }; struct ovs_key_ipv4 { diff --git a/lib/odp-util.c b/lib/odp-util.c index 1988c63..ae09267 100644 --- a/lib/odp-util.c +++ b/lib/odp-util.c @@ -942,7 +942,7 @@ format_odp_key_attr(const struct nlattr *a, struct ds *ds) 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_lse); + format_mpls_lse(ds, mpls_key->mpls_lse); ds_put_char(ds, ')'); break; } @@ -1267,7 +1267,7 @@ parse_odp_key_attr(const char *s, const struct simap *port_names, mpls = nl_msg_put_unspec_uninit(key, OVS_KEY_ATTR_MPLS, sizeof *mpls); - mpls->mpls_top_lse = mpls_lse_from_components(label, tc, ttl, bos); + mpls->mpls_lse = mpls_lse_from_components(label, tc, ttl, bos); return n; } } @@ -1630,7 +1630,7 @@ odp_flow_key_from_flow(struct ofpbuf *buf, const struct flow *flow, mpls_key = nl_msg_put_unspec_uninit(buf, OVS_KEY_ATTR_MPLS, sizeof *mpls_key); - mpls_key->mpls_top_lse = flow->mpls_lse; + mpls_key->mpls_lse = flow->mpls_lse; } if (is_ip_any(flow) && !(flow->nw_frag & FLOW_NW_FRAG_LATER)) { @@ -2285,7 +2285,7 @@ commit_mpls_action(const struct flow *flow, struct flow *base, } else { struct ovs_key_mpls mpls_key; - mpls_key.mpls_top_lse = flow->mpls_lse; + mpls_key.mpls_lse = flow->mpls_lse; commit_set_action(odp_actions, OVS_KEY_ATTR_MPLS, &mpls_key, sizeof(mpls_key)); } -- 1.8.2.1 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev