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 ---