diff options
author | David Ahern <dsa@cumulusnetworks.com> | 2017-03-31 07:14:04 -0700 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2017-04-01 20:21:44 -0700 |
commit | 1511009cd68015c2e04135bfefa4bf5020baa8d9 (patch) | |
tree | ca1ca7c8f76a3bc752ccf31e3b216fa9119f71d7 /net/mpls | |
parent | a4ac8c986d3f72ccbaf6d6782511fb645e568306 (diff) | |
download | talos-obmc-linux-1511009cd68015c2e04135bfefa4bf5020baa8d9.tar.gz talos-obmc-linux-1511009cd68015c2e04135bfefa4bf5020baa8d9.zip |
net: mpls: Increase max number of labels for lwt encap
Alow users to push down more labels per MPLS encap. Similar to LSR case,
move label array to the end of mpls_iptunnel_encap and allocate based on
the number of labels for the route.
For consistency with the LSR case, re-use the same maximum number of
labels.
Signed-off-by: David Ahern <dsa@cumulusnetworks.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/mpls')
-rw-r--r-- | net/mpls/af_mpls.c | 5 | ||||
-rw-r--r-- | net/mpls/internal.h | 5 | ||||
-rw-r--r-- | net/mpls/mpls_iptunnel.c | 13 |
3 files changed, 15 insertions, 8 deletions
diff --git a/net/mpls/af_mpls.c b/net/mpls/af_mpls.c index 10daefd7f938..5928d22ba9c8 100644 --- a/net/mpls/af_mpls.c +++ b/net/mpls/af_mpls.c @@ -24,11 +24,6 @@ #include <net/nexthop.h> #include "internal.h" -/* put a reasonable limit on the number of labels - * we will accept from userspace - */ -#define MAX_NEW_LABELS 30 - /* max memory we will use for mpls_route */ #define MAX_MPLS_ROUTE_MEM 4096 diff --git a/net/mpls/internal.h b/net/mpls/internal.h index c5d2f5bc37ec..4db6a5971322 100644 --- a/net/mpls/internal.h +++ b/net/mpls/internal.h @@ -2,6 +2,11 @@ #define MPLS_INTERNAL_H #include <net/mpls.h> +/* put a reasonable limit on the number of labels + * we will accept from userspace + */ +#define MAX_NEW_LABELS 30 + struct mpls_entry_decoded { u32 label; u8 ttl; diff --git a/net/mpls/mpls_iptunnel.c b/net/mpls/mpls_iptunnel.c index 22f71fce0bfb..fe00e98667cf 100644 --- a/net/mpls/mpls_iptunnel.c +++ b/net/mpls/mpls_iptunnel.c @@ -164,6 +164,7 @@ static int mpls_build_state(struct nlattr *nla, struct mpls_iptunnel_encap *tun_encap_info; struct nlattr *tb[MPLS_IPTUNNEL_MAX + 1]; struct lwtunnel_state *newts; + u8 n_labels; int ret; ret = nla_parse_nested(tb, MPLS_IPTUNNEL_MAX, nla, @@ -175,12 +176,18 @@ static int mpls_build_state(struct nlattr *nla, return -EINVAL; - newts = lwtunnel_state_alloc(sizeof(*tun_encap_info)); + /* determine number of labels */ + if (nla_get_labels(tb[MPLS_IPTUNNEL_DST], + MAX_NEW_LABELS, &n_labels, NULL)) + return -EINVAL; + + newts = lwtunnel_state_alloc(sizeof(*tun_encap_info) + + n_labels * sizeof(u32)); if (!newts) return -ENOMEM; tun_encap_info = mpls_lwtunnel_encap(newts); - ret = nla_get_labels(tb[MPLS_IPTUNNEL_DST], MAX_NEW_LABELS, + ret = nla_get_labels(tb[MPLS_IPTUNNEL_DST], n_labels, &tun_encap_info->labels, tun_encap_info->label); if (ret) goto errout; @@ -257,7 +264,7 @@ static int mpls_encap_cmp(struct lwtunnel_state *a, struct lwtunnel_state *b) a_hdr->default_ttl != b_hdr->default_ttl) return 1; - for (l = 0; l < MAX_NEW_LABELS; l++) + for (l = 0; l < a_hdr->labels; l++) if (a_hdr->label[l] != b_hdr->label[l]) return 1; return 0; |