Commit fe82b330 authored by Robert Shearman's avatar Robert Shearman Committed by David S. Miller

mpls: fix sending of local encapped packets

Locally generated IPv4 and (probably) IPv6 packets are dropped because
skb->protocol isn't set. We could write wrappers to lwtunnel_output
for IPv4 and IPv6 that set the protocol accordingly and then call
lwtunnel_output, but mpls_output relies on the AF-specific type of dst
anyway to get the via address.

Therefore, make use of dst->dst_ops->family in mpls_output to
determine the type of nexthop and thus protocol of the packet instead
of checking skb->protocol.

Fixes: 61adedf3 ("route: move lwtunnel state to dst_entry")
Reported-by: default avatarSam Russell <sam.h.russell@gmail.com>
Signed-off-by: default avatarRobert Shearman <rshearma@brocade.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent d445ed9b
...@@ -54,10 +54,10 @@ int mpls_output(struct net *net, struct sock *sk, struct sk_buff *skb) ...@@ -54,10 +54,10 @@ int mpls_output(struct net *net, struct sock *sk, struct sk_buff *skb)
unsigned int ttl; unsigned int ttl;
/* Obtain the ttl */ /* Obtain the ttl */
if (skb->protocol == htons(ETH_P_IP)) { if (dst->ops->family == AF_INET) {
ttl = ip_hdr(skb)->ttl; ttl = ip_hdr(skb)->ttl;
rt = (struct rtable *)dst; 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; ttl = ipv6_hdr(skb)->hop_limit;
rt6 = (struct rt6_info *)dst; rt6 = (struct rt6_info *)dst;
} else { } else {
......
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