Commit da13c59b authored by Vishwanath Pai's avatar Vishwanath Pai Committed by David S. Miller

net: display hw address of source machine during ipv6 DAD failure

This patch updates the error messages displayed in kernel log to include
hwaddress of the source machine that caused ipv6 duplicate address
detection failures.

Examples:

a) When we receive a NA packet from another machine advertising our
address:

ICMPv6: NA: 34:ab:cd:56:11:e8 advertised our address 2001:db8:: on eth0!

b) When we detect DAD failure during address assignment to an interface:

IPv6: eth0: IPv6 duplicate address 2001:db8:: used by 34:ab:cd:56:11:e8
detected!

v2:
    Changed %pI6 to %pI6c in ndisc_recv_na()
    Chaged the v6 address in the commit message to 2001:db8::
Suggested-by: default avatarIgor Lubashev <ilubashe@akamai.com>
Signed-off-by: default avatarVishwanath Pai <vpai@akamai.com>
Acked-by: default avatarDavid Ahern <dsahern@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent cdb583cf
...@@ -208,7 +208,7 @@ void ipv6_mc_remap(struct inet6_dev *idev); ...@@ -208,7 +208,7 @@ void ipv6_mc_remap(struct inet6_dev *idev);
void ipv6_mc_init_dev(struct inet6_dev *idev); void ipv6_mc_init_dev(struct inet6_dev *idev);
void ipv6_mc_destroy_dev(struct inet6_dev *idev); void ipv6_mc_destroy_dev(struct inet6_dev *idev);
int ipv6_mc_check_mld(struct sk_buff *skb, struct sk_buff **skb_trimmed); int ipv6_mc_check_mld(struct sk_buff *skb, struct sk_buff **skb_trimmed);
void addrconf_dad_failure(struct inet6_ifaddr *ifp); void addrconf_dad_failure(struct sk_buff *skb, struct inet6_ifaddr *ifp);
bool ipv6_chk_mcast_addr(struct net_device *dev, const struct in6_addr *group, bool ipv6_chk_mcast_addr(struct net_device *dev, const struct in6_addr *group,
const struct in6_addr *src_addr); const struct in6_addr *src_addr);
......
...@@ -1987,7 +1987,7 @@ static int addrconf_dad_end(struct inet6_ifaddr *ifp) ...@@ -1987,7 +1987,7 @@ static int addrconf_dad_end(struct inet6_ifaddr *ifp)
return err; return err;
} }
void addrconf_dad_failure(struct inet6_ifaddr *ifp) void addrconf_dad_failure(struct sk_buff *skb, struct inet6_ifaddr *ifp)
{ {
struct inet6_dev *idev = ifp->idev; struct inet6_dev *idev = ifp->idev;
struct net *net = dev_net(ifp->idev->dev); struct net *net = dev_net(ifp->idev->dev);
...@@ -1997,8 +1997,8 @@ void addrconf_dad_failure(struct inet6_ifaddr *ifp) ...@@ -1997,8 +1997,8 @@ void addrconf_dad_failure(struct inet6_ifaddr *ifp)
return; return;
} }
net_info_ratelimited("%s: IPv6 duplicate address %pI6c detected!\n", net_info_ratelimited("%s: IPv6 duplicate address %pI6c used by %pM detected!\n",
ifp->idev->dev->name, &ifp->addr); ifp->idev->dev->name, &ifp->addr, eth_hdr(skb)->h_source);
spin_lock_bh(&ifp->lock); spin_lock_bh(&ifp->lock);
......
...@@ -46,6 +46,7 @@ ...@@ -46,6 +46,7 @@
#endif #endif
#include <linux/if_addr.h> #include <linux/if_addr.h>
#include <linux/if_ether.h>
#include <linux/if_arp.h> #include <linux/if_arp.h>
#include <linux/ipv6.h> #include <linux/ipv6.h>
#include <linux/icmpv6.h> #include <linux/icmpv6.h>
...@@ -822,7 +823,7 @@ static void ndisc_recv_ns(struct sk_buff *skb) ...@@ -822,7 +823,7 @@ static void ndisc_recv_ns(struct sk_buff *skb)
* who is doing DAD * who is doing DAD
* so fail our DAD process * so fail our DAD process
*/ */
addrconf_dad_failure(ifp); addrconf_dad_failure(skb, ifp);
return; return;
} else { } else {
/* /*
...@@ -975,7 +976,7 @@ static void ndisc_recv_na(struct sk_buff *skb) ...@@ -975,7 +976,7 @@ static void ndisc_recv_na(struct sk_buff *skb)
if (ifp) { if (ifp) {
if (skb->pkt_type != PACKET_LOOPBACK if (skb->pkt_type != PACKET_LOOPBACK
&& (ifp->flags & IFA_F_TENTATIVE)) { && (ifp->flags & IFA_F_TENTATIVE)) {
addrconf_dad_failure(ifp); addrconf_dad_failure(skb, ifp);
return; return;
} }
/* What should we make now? The advertisement /* What should we make now? The advertisement
...@@ -989,8 +990,8 @@ static void ndisc_recv_na(struct sk_buff *skb) ...@@ -989,8 +990,8 @@ static void ndisc_recv_na(struct sk_buff *skb)
*/ */
if (skb->pkt_type != PACKET_LOOPBACK) if (skb->pkt_type != PACKET_LOOPBACK)
ND_PRINTK(1, warn, ND_PRINTK(1, warn,
"NA: someone advertises our address %pI6 on %s!\n", "NA: %pM advertised our address %pI6c on %s!\n",
&ifp->addr, ifp->idev->dev->name); eth_hdr(skb)->h_source, &ifp->addr, ifp->idev->dev->name);
in6_ifa_put(ifp); in6_ifa_put(ifp);
return; return;
} }
......
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