Revert "ipv6: ndisc: inherit metadata dst when creating ndisc requests"
This reverts commit ab450605b3
.
In IPv6, we cannot inherit the dst of the original dst. ndisc packets
are IPv6 packets and may take another route than the original packet.
This patch breaks the following scenario: a packet comes from eth0 and
is forwarded through vxlan1. The encapsulated packet triggers an NS
which cannot be sent because of the wrong route.
CC: Jiri Benc <jbenc@redhat.com>
CC: Thomas Graf <tgraf@suug.ch>
Signed-off-by: Nicolas Dichtel <nicolas.dichtel@6wind.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
142a2e7ece
commit
304d888b29
4 changed files with 6 additions and 11 deletions
|
@ -181,8 +181,7 @@ void ndisc_cleanup(void);
|
|||
int ndisc_rcv(struct sk_buff *skb);
|
||||
|
||||
void ndisc_send_ns(struct net_device *dev, const struct in6_addr *solicit,
|
||||
const struct in6_addr *daddr, const struct in6_addr *saddr,
|
||||
struct sk_buff *oskb);
|
||||
const struct in6_addr *daddr, const struct in6_addr *saddr);
|
||||
|
||||
void ndisc_send_rs(struct net_device *dev,
|
||||
const struct in6_addr *saddr, const struct in6_addr *daddr);
|
||||
|
|
|
@ -3642,7 +3642,7 @@ static void addrconf_dad_work(struct work_struct *w)
|
|||
|
||||
/* send a neighbour solicitation for our addr */
|
||||
addrconf_addr_solict_mult(&ifp->addr, &mcaddr);
|
||||
ndisc_send_ns(ifp->idev->dev, &ifp->addr, &mcaddr, &in6addr_any, NULL);
|
||||
ndisc_send_ns(ifp->idev->dev, &ifp->addr, &mcaddr, &in6addr_any);
|
||||
out:
|
||||
in6_ifa_put(ifp);
|
||||
rtnl_unlock();
|
||||
|
|
|
@ -556,8 +556,7 @@ static void ndisc_send_unsol_na(struct net_device *dev)
|
|||
}
|
||||
|
||||
void ndisc_send_ns(struct net_device *dev, const struct in6_addr *solicit,
|
||||
const struct in6_addr *daddr, const struct in6_addr *saddr,
|
||||
struct sk_buff *oskb)
|
||||
const struct in6_addr *daddr, const struct in6_addr *saddr)
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
struct in6_addr addr_buf;
|
||||
|
@ -593,9 +592,6 @@ void ndisc_send_ns(struct net_device *dev, const struct in6_addr *solicit,
|
|||
ndisc_fill_addr_option(skb, ND_OPT_SOURCE_LL_ADDR,
|
||||
dev->dev_addr);
|
||||
|
||||
if (!(dev->priv_flags & IFF_XMIT_DST_RELEASE) && oskb)
|
||||
skb_dst_copy(skb, oskb);
|
||||
|
||||
ndisc_send_skb(skb, daddr, saddr);
|
||||
}
|
||||
|
||||
|
@ -682,12 +678,12 @@ static void ndisc_solicit(struct neighbour *neigh, struct sk_buff *skb)
|
|||
"%s: trying to ucast probe in NUD_INVALID: %pI6\n",
|
||||
__func__, target);
|
||||
}
|
||||
ndisc_send_ns(dev, target, target, saddr, skb);
|
||||
ndisc_send_ns(dev, target, target, saddr);
|
||||
} else if ((probes -= NEIGH_VAR(neigh->parms, APP_PROBES)) < 0) {
|
||||
neigh_app_ns(neigh);
|
||||
} else {
|
||||
addrconf_addr_solict_mult(target, &mcaddr);
|
||||
ndisc_send_ns(dev, target, &mcaddr, saddr, skb);
|
||||
ndisc_send_ns(dev, target, &mcaddr, saddr);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -523,7 +523,7 @@ static void rt6_probe_deferred(struct work_struct *w)
|
|||
container_of(w, struct __rt6_probe_work, work);
|
||||
|
||||
addrconf_addr_solict_mult(&work->target, &mcaddr);
|
||||
ndisc_send_ns(work->dev, &work->target, &mcaddr, NULL, NULL);
|
||||
ndisc_send_ns(work->dev, &work->target, &mcaddr, NULL);
|
||||
dev_put(work->dev);
|
||||
kfree(work);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue