ndisc.c (fe83fe739df7e08a24e961f04fd026f0447f38cb) | ndisc.c (18ac597af25e9760b76471524096f5b29eb820e6) |
---|---|
1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * Neighbour Discovery for IPv6 4 * Linux INET6 implementation 5 * 6 * Authors: 7 * Pedro Roque <roque@di.fc.ul.pt> 8 * Mike Shaver <shaver@ingenia.com> --- 1780 unchanged lines hidden (view full) --- 1789} 1790 1791static int ndisc_netdev_event(struct notifier_block *this, unsigned long event, void *ptr) 1792{ 1793 struct net_device *dev = netdev_notifier_info_to_dev(ptr); 1794 struct netdev_notifier_change_info *change_info; 1795 struct net *net = dev_net(dev); 1796 struct inet6_dev *idev; | 1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * Neighbour Discovery for IPv6 4 * Linux INET6 implementation 5 * 6 * Authors: 7 * Pedro Roque <roque@di.fc.ul.pt> 8 * Mike Shaver <shaver@ingenia.com> --- 1780 unchanged lines hidden (view full) --- 1789} 1790 1791static int ndisc_netdev_event(struct notifier_block *this, unsigned long event, void *ptr) 1792{ 1793 struct net_device *dev = netdev_notifier_info_to_dev(ptr); 1794 struct netdev_notifier_change_info *change_info; 1795 struct net *net = dev_net(dev); 1796 struct inet6_dev *idev; |
1797 bool evict_nocarrier; |
|
1797 1798 switch (event) { 1799 case NETDEV_CHANGEADDR: 1800 neigh_changeaddr(&nd_tbl, dev); 1801 fib6_run_gc(0, net, false); 1802 fallthrough; 1803 case NETDEV_UP: 1804 idev = in6_dev_get(dev); 1805 if (!idev) 1806 break; 1807 if (idev->cnf.ndisc_notify || 1808 net->ipv6.devconf_all->ndisc_notify) 1809 ndisc_send_unsol_na(dev); 1810 in6_dev_put(idev); 1811 break; 1812 case NETDEV_CHANGE: | 1798 1799 switch (event) { 1800 case NETDEV_CHANGEADDR: 1801 neigh_changeaddr(&nd_tbl, dev); 1802 fib6_run_gc(0, net, false); 1803 fallthrough; 1804 case NETDEV_UP: 1805 idev = in6_dev_get(dev); 1806 if (!idev) 1807 break; 1808 if (idev->cnf.ndisc_notify || 1809 net->ipv6.devconf_all->ndisc_notify) 1810 ndisc_send_unsol_na(dev); 1811 in6_dev_put(idev); 1812 break; 1813 case NETDEV_CHANGE: |
1814 idev = in6_dev_get(dev); 1815 if (!idev) 1816 evict_nocarrier = true; 1817 else { 1818 evict_nocarrier = idev->cnf.ndisc_evict_nocarrier && 1819 net->ipv6.devconf_all->ndisc_evict_nocarrier; 1820 in6_dev_put(idev); 1821 } 1822 |
|
1813 change_info = ptr; 1814 if (change_info->flags_changed & IFF_NOARP) 1815 neigh_changeaddr(&nd_tbl, dev); | 1823 change_info = ptr; 1824 if (change_info->flags_changed & IFF_NOARP) 1825 neigh_changeaddr(&nd_tbl, dev); |
1816 if (!netif_carrier_ok(dev)) | 1826 if (evict_nocarrier && !netif_carrier_ok(dev)) |
1817 neigh_carrier_down(&nd_tbl, dev); 1818 break; 1819 case NETDEV_DOWN: 1820 neigh_ifdown(&nd_tbl, dev); 1821 fib6_run_gc(0, net, false); 1822 break; 1823 case NETDEV_NOTIFY_PEERS: 1824 ndisc_send_unsol_na(dev); --- 149 unchanged lines hidden --- | 1827 neigh_carrier_down(&nd_tbl, dev); 1828 break; 1829 case NETDEV_DOWN: 1830 neigh_ifdown(&nd_tbl, dev); 1831 fib6_run_gc(0, net, false); 1832 break; 1833 case NETDEV_NOTIFY_PEERS: 1834 ndisc_send_unsol_na(dev); --- 149 unchanged lines hidden --- |