Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Conflicts: drivers/net/geneve.c Here we had an overlapping change, where in 'net' the extraneous stats bump was being removed whilst in 'net-next' the final argument to udp_tunnel6_xmit_skb() was being changed. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -27,6 +27,8 @@
|
||||
*/
|
||||
#define MAX_MP_SELECT_LABELS 4
|
||||
|
||||
#define MPLS_NEIGH_TABLE_UNSPEC (NEIGH_LINK_TABLE + 1)
|
||||
|
||||
static int zero = 0;
|
||||
static int label_limit = (1 << 20) - 1;
|
||||
|
||||
@@ -341,7 +343,13 @@ static int mpls_forward(struct sk_buff *skb, struct net_device *dev,
|
||||
}
|
||||
}
|
||||
|
||||
err = neigh_xmit(nh->nh_via_table, out_dev, mpls_nh_via(rt, nh), skb);
|
||||
/* If via wasn't specified then send out using device address */
|
||||
if (nh->nh_via_table == MPLS_NEIGH_TABLE_UNSPEC)
|
||||
err = neigh_xmit(NEIGH_LINK_TABLE, out_dev,
|
||||
out_dev->dev_addr, skb);
|
||||
else
|
||||
err = neigh_xmit(nh->nh_via_table, out_dev,
|
||||
mpls_nh_via(rt, nh), skb);
|
||||
if (err)
|
||||
net_dbg_ratelimited("%s: packet transmission failed: %d\n",
|
||||
__func__, err);
|
||||
@@ -559,6 +567,10 @@ static int mpls_nh_assign_dev(struct net *net, struct mpls_route *rt,
|
||||
if (!mpls_dev_get(dev))
|
||||
goto errout;
|
||||
|
||||
if ((nh->nh_via_table == NEIGH_LINK_TABLE) &&
|
||||
(dev->addr_len != nh->nh_via_alen))
|
||||
goto errout;
|
||||
|
||||
RCU_INIT_POINTER(nh->nh_dev, dev);
|
||||
|
||||
if (!(dev->flags & IFF_UP)) {
|
||||
@@ -630,10 +642,14 @@ static int mpls_nh_build(struct net *net, struct mpls_route *rt,
|
||||
goto errout;
|
||||
}
|
||||
|
||||
err = nla_get_via(via, &nh->nh_via_alen, &nh->nh_via_table,
|
||||
__mpls_nh_via(rt, nh));
|
||||
if (err)
|
||||
goto errout;
|
||||
if (via) {
|
||||
err = nla_get_via(via, &nh->nh_via_alen, &nh->nh_via_table,
|
||||
__mpls_nh_via(rt, nh));
|
||||
if (err)
|
||||
goto errout;
|
||||
} else {
|
||||
nh->nh_via_table = MPLS_NEIGH_TABLE_UNSPEC;
|
||||
}
|
||||
|
||||
err = mpls_nh_assign_dev(net, rt, nh, oif);
|
||||
if (err)
|
||||
@@ -715,9 +731,6 @@ static int mpls_nh_build_multi(struct mpls_route_config *cfg,
|
||||
nla_newdst = nla_find(attrs, attrlen, RTA_NEWDST);
|
||||
}
|
||||
|
||||
if (!nla_via)
|
||||
goto errout;
|
||||
|
||||
err = mpls_nh_build(cfg->rc_nlinfo.nl_net, rt, nh,
|
||||
rtnh->rtnh_ifindex, nla_via, nla_newdst);
|
||||
if (err)
|
||||
@@ -1227,6 +1240,7 @@ static int rtm_to_route_config(struct sk_buff *skb, struct nlmsghdr *nlh,
|
||||
|
||||
cfg->rc_label = LABEL_NOT_SPECIFIED;
|
||||
cfg->rc_protocol = rtm->rtm_protocol;
|
||||
cfg->rc_via_table = MPLS_NEIGH_TABLE_UNSPEC;
|
||||
cfg->rc_nlflags = nlh->nlmsg_flags;
|
||||
cfg->rc_nlinfo.portid = NETLINK_CB(skb).portid;
|
||||
cfg->rc_nlinfo.nlh = nlh;
|
||||
@@ -1340,7 +1354,8 @@ static int mpls_dump_route(struct sk_buff *skb, u32 portid, u32 seq, int event,
|
||||
nla_put_labels(skb, RTA_NEWDST, nh->nh_labels,
|
||||
nh->nh_label))
|
||||
goto nla_put_failure;
|
||||
if (nla_put_via(skb, nh->nh_via_table, mpls_nh_via(rt, nh),
|
||||
if (nh->nh_via_table != MPLS_NEIGH_TABLE_UNSPEC &&
|
||||
nla_put_via(skb, nh->nh_via_table, mpls_nh_via(rt, nh),
|
||||
nh->nh_via_alen))
|
||||
goto nla_put_failure;
|
||||
dev = rtnl_dereference(nh->nh_dev);
|
||||
@@ -1381,7 +1396,8 @@ static int mpls_dump_route(struct sk_buff *skb, u32 portid, u32 seq, int event,
|
||||
nh->nh_labels,
|
||||
nh->nh_label))
|
||||
goto nla_put_failure;
|
||||
if (nla_put_via(skb, nh->nh_via_table,
|
||||
if (nh->nh_via_table != MPLS_NEIGH_TABLE_UNSPEC &&
|
||||
nla_put_via(skb, nh->nh_via_table,
|
||||
mpls_nh_via(rt, nh),
|
||||
nh->nh_via_alen))
|
||||
goto nla_put_failure;
|
||||
@@ -1448,7 +1464,8 @@ static inline size_t lfib_nlmsg_size(struct mpls_route *rt)
|
||||
|
||||
if (nh->nh_dev)
|
||||
payload += nla_total_size(4); /* RTA_OIF */
|
||||
payload += nla_total_size(2 + nh->nh_via_alen); /* RTA_VIA */
|
||||
if (nh->nh_via_table != MPLS_NEIGH_TABLE_UNSPEC) /* RTA_VIA */
|
||||
payload += nla_total_size(2 + nh->nh_via_alen);
|
||||
if (nh->nh_labels) /* RTA_NEWDST */
|
||||
payload += nla_total_size(nh->nh_labels * 4);
|
||||
} else {
|
||||
@@ -1457,7 +1474,9 @@ static inline size_t lfib_nlmsg_size(struct mpls_route *rt)
|
||||
|
||||
for_nexthops(rt) {
|
||||
nhsize += nla_total_size(sizeof(struct rtnexthop));
|
||||
nhsize += nla_total_size(2 + nh->nh_via_alen);
|
||||
/* RTA_VIA */
|
||||
if (nh->nh_via_table != MPLS_NEIGH_TABLE_UNSPEC)
|
||||
nhsize += nla_total_size(2 + nh->nh_via_alen);
|
||||
if (nh->nh_labels)
|
||||
nhsize += nla_total_size(nh->nh_labels * 4);
|
||||
} endfor_nexthops(rt);
|
||||
|
@@ -54,10 +54,10 @@ static int mpls_output(struct net *net, struct sock *sk, struct sk_buff *skb)
|
||||
unsigned int ttl;
|
||||
|
||||
/* Obtain the ttl */
|
||||
if (skb->protocol == htons(ETH_P_IP)) {
|
||||
if (dst->ops->family == AF_INET) {
|
||||
ttl = ip_hdr(skb)->ttl;
|
||||
rt = (struct rtable *)dst;
|
||||
} else if (skb->protocol == htons(ETH_P_IPV6)) {
|
||||
} else if (dst->ops->family == AF_INET6) {
|
||||
ttl = ipv6_hdr(skb)->hop_limit;
|
||||
rt6 = (struct rt6_info *)dst;
|
||||
} else {
|
||||
|
Reference in New Issue
Block a user