|
|
@@ -1037,7 +1037,7 @@ int ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev, __u8 dsfield,
|
|
|
struct ip6_tnl *t = netdev_priv(dev);
|
|
|
struct net *net = t->net;
|
|
|
struct net_device_stats *stats = &t->dev->stats;
|
|
|
- struct ipv6hdr *ipv6h = ipv6_hdr(skb);
|
|
|
+ struct ipv6hdr *ipv6h;
|
|
|
struct ipv6_tel_txoption opt;
|
|
|
struct dst_entry *dst = NULL, *ndst = NULL;
|
|
|
struct net_device *tdev;
|
|
|
@@ -1057,26 +1057,28 @@ int ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev, __u8 dsfield,
|
|
|
|
|
|
/* NBMA tunnel */
|
|
|
if (ipv6_addr_any(&t->parms.raddr)) {
|
|
|
- struct in6_addr *addr6;
|
|
|
- struct neighbour *neigh;
|
|
|
- int addr_type;
|
|
|
+ if (skb->protocol == htons(ETH_P_IPV6)) {
|
|
|
+ struct in6_addr *addr6;
|
|
|
+ struct neighbour *neigh;
|
|
|
+ int addr_type;
|
|
|
|
|
|
- if (!skb_dst(skb))
|
|
|
- goto tx_err_link_failure;
|
|
|
+ if (!skb_dst(skb))
|
|
|
+ goto tx_err_link_failure;
|
|
|
|
|
|
- neigh = dst_neigh_lookup(skb_dst(skb),
|
|
|
- &ipv6_hdr(skb)->daddr);
|
|
|
- if (!neigh)
|
|
|
- goto tx_err_link_failure;
|
|
|
+ neigh = dst_neigh_lookup(skb_dst(skb),
|
|
|
+ &ipv6_hdr(skb)->daddr);
|
|
|
+ if (!neigh)
|
|
|
+ goto tx_err_link_failure;
|
|
|
|
|
|
- addr6 = (struct in6_addr *)&neigh->primary_key;
|
|
|
- addr_type = ipv6_addr_type(addr6);
|
|
|
+ addr6 = (struct in6_addr *)&neigh->primary_key;
|
|
|
+ addr_type = ipv6_addr_type(addr6);
|
|
|
|
|
|
- if (addr_type == IPV6_ADDR_ANY)
|
|
|
- addr6 = &ipv6_hdr(skb)->daddr;
|
|
|
+ if (addr_type == IPV6_ADDR_ANY)
|
|
|
+ addr6 = &ipv6_hdr(skb)->daddr;
|
|
|
|
|
|
- memcpy(&fl6->daddr, addr6, sizeof(fl6->daddr));
|
|
|
- neigh_release(neigh);
|
|
|
+ memcpy(&fl6->daddr, addr6, sizeof(fl6->daddr));
|
|
|
+ neigh_release(neigh);
|
|
|
+ }
|
|
|
} else if (!(t->parms.flags &
|
|
|
(IP6_TNL_F_USE_ORIG_TCLASS | IP6_TNL_F_USE_ORIG_FWMARK))) {
|
|
|
/* enable the cache only only if the routing decision does
|