Commit 1511009c authored by David Ahern's avatar David Ahern Committed by David S. Miller

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: default avatarDavid Ahern <dsa@cumulusnetworks.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent a4ac8c98
...@@ -14,13 +14,12 @@ ...@@ -14,13 +14,12 @@
#ifndef _NET_MPLS_IPTUNNEL_H #ifndef _NET_MPLS_IPTUNNEL_H
#define _NET_MPLS_IPTUNNEL_H 1 #define _NET_MPLS_IPTUNNEL_H 1
#define MAX_NEW_LABELS 2
struct mpls_iptunnel_encap { struct mpls_iptunnel_encap {
u32 label[MAX_NEW_LABELS];
u8 labels; u8 labels;
u8 ttl_propagate; u8 ttl_propagate;
u8 default_ttl; u8 default_ttl;
u8 reserved1;
u32 label[0];
}; };
static inline struct mpls_iptunnel_encap *mpls_lwtunnel_encap(struct lwtunnel_state *lwtstate) static inline struct mpls_iptunnel_encap *mpls_lwtunnel_encap(struct lwtunnel_state *lwtstate)
......
...@@ -24,11 +24,6 @@ ...@@ -24,11 +24,6 @@
#include <net/nexthop.h> #include <net/nexthop.h>
#include "internal.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 */ /* max memory we will use for mpls_route */
#define MAX_MPLS_ROUTE_MEM 4096 #define MAX_MPLS_ROUTE_MEM 4096
......
...@@ -2,6 +2,11 @@ ...@@ -2,6 +2,11 @@
#define MPLS_INTERNAL_H #define MPLS_INTERNAL_H
#include <net/mpls.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 { struct mpls_entry_decoded {
u32 label; u32 label;
u8 ttl; u8 ttl;
......
...@@ -164,6 +164,7 @@ static int mpls_build_state(struct nlattr *nla, ...@@ -164,6 +164,7 @@ static int mpls_build_state(struct nlattr *nla,
struct mpls_iptunnel_encap *tun_encap_info; struct mpls_iptunnel_encap *tun_encap_info;
struct nlattr *tb[MPLS_IPTUNNEL_MAX + 1]; struct nlattr *tb[MPLS_IPTUNNEL_MAX + 1];
struct lwtunnel_state *newts; struct lwtunnel_state *newts;
u8 n_labels;
int ret; int ret;
ret = nla_parse_nested(tb, MPLS_IPTUNNEL_MAX, nla, ret = nla_parse_nested(tb, MPLS_IPTUNNEL_MAX, nla,
...@@ -175,12 +176,18 @@ static int mpls_build_state(struct nlattr *nla, ...@@ -175,12 +176,18 @@ static int mpls_build_state(struct nlattr *nla,
return -EINVAL; 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) if (!newts)
return -ENOMEM; return -ENOMEM;
tun_encap_info = mpls_lwtunnel_encap(newts); 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); &tun_encap_info->labels, tun_encap_info->label);
if (ret) if (ret)
goto errout; goto errout;
...@@ -257,7 +264,7 @@ static int mpls_encap_cmp(struct lwtunnel_state *a, struct lwtunnel_state *b) ...@@ -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) a_hdr->default_ttl != b_hdr->default_ttl)
return 1; 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]) if (a_hdr->label[l] != b_hdr->label[l])
return 1; return 1;
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment