From a61e73fd586f032efe11a99c0a195fefa53fb2d6 Mon Sep 17 00:00:00 2001 From: Ville Nuorvala Date: Tue, 19 Aug 2003 21:28:56 -0700 Subject: [IPV6]: Protect proxied addresses against DAD. --- net/ipv6/ndisc.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) (limited to 'net') diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c index b2a7d9d9d40a..554ad18af0cd 100644 --- a/net/ipv6/ndisc.c +++ b/net/ipv6/ndisc.c @@ -861,7 +861,8 @@ static void ndisc_recv_ns(struct sk_buff *skb) struct inet6_dev *in6_dev = in6_dev_get(dev); if (in6_dev && in6_dev->cnf.forwarding && - (addr_type & IPV6_ADDR_UNICAST) && + (addr_type & IPV6_ADDR_UNICAST || + addr_type == IPV6_ADDR_ANY) && pneigh_lookup(&nd_tbl, &msg->target, dev, 0)) { int inc = ipv6_addr_type(daddr)&IPV6_ADDR_MULTICAST; @@ -874,12 +875,20 @@ static void ndisc_recv_ns(struct sk_buff *skb) else nd_tbl.stats.rcv_probes_ucast++; - neigh = neigh_event_ns(&nd_tbl, lladdr, saddr, dev); + if (addr_type & IPV6_ADDR_UNICAST) { + neigh = neigh_event_ns(&nd_tbl, lladdr, saddr, dev); - if (neigh) { - ndisc_send_na(dev, neigh, saddr, &msg->target, - 0, 1, 0, 1); - neigh_release(neigh); + if (neigh) { + ndisc_send_na(dev, neigh, saddr, &msg->target, + 0, 1, 0, 1); + neigh_release(neigh); + } + } else { + /* proxy should also protect against DAD */ + struct in6_addr maddr; + ipv6_addr_all_nodes(&maddr); + ndisc_send_na(dev, NULL, &maddr, &msg->target, + 0, 0, 0, 1); } } else { struct sk_buff *n = skb_clone(skb, GFP_ATOMIC); -- cgit v1.2.3