diff options
Diffstat (limited to 'net/ipv4/devinet.c')
| -rw-r--r-- | net/ipv4/devinet.c | 30 | 
1 files changed, 20 insertions, 10 deletions
diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c index 748cb5b337b..df4616fce92 100644 --- a/net/ipv4/devinet.c +++ b/net/ipv4/devinet.c @@ -1030,6 +1030,21 @@ static inline bool inetdev_valid_mtu(unsigned mtu)  	return mtu >= 68;  } +static void inetdev_send_gratuitous_arp(struct net_device *dev, +					struct in_device *in_dev) + +{ +	struct in_ifaddr *ifa = in_dev->ifa_list; + +	if (!ifa) +		return; + +	arp_send(ARPOP_REQUEST, ETH_P_ARP, +		 ifa->ifa_address, dev, +		 ifa->ifa_address, NULL, +		 dev->dev_addr, NULL); +} +  /* Called only under RTNL semaphore */  static int inetdev_event(struct notifier_block *this, unsigned long event, @@ -1082,18 +1097,13 @@ static int inetdev_event(struct notifier_block *this, unsigned long event,  		}  		ip_mc_up(in_dev);  		/* fall through */ -	case NETDEV_NOTIFY_PEERS:  	case NETDEV_CHANGEADDR: +		if (!IN_DEV_ARP_NOTIFY(in_dev)) +			break; +		/* fall through */ +	case NETDEV_NOTIFY_PEERS:  		/* Send gratuitous ARP to notify of link change */ -		if (IN_DEV_ARP_NOTIFY(in_dev)) { -			struct in_ifaddr *ifa = in_dev->ifa_list; - -			if (ifa) -				arp_send(ARPOP_REQUEST, ETH_P_ARP, -					 ifa->ifa_address, dev, -					 ifa->ifa_address, NULL, -					 dev->dev_addr, NULL); -		} +		inetdev_send_gratuitous_arp(dev, in_dev);  		break;  	case NETDEV_DOWN:  		ip_mc_down(in_dev);  |