On Tue, 2019-11-05 at 18:06 -0600, Thomas Falcon wrote: > After a migration, it is necessary to send a gratuitous ARP > from all running interfaces so that the rest of the network > is aware of its new location. However, some supported network > devices are unaware that they have been migrated. To avoid network > interruptions and other unwanted behavior, force a GARP on all > valid, running interfaces as part of the post_mobility_fixup > routine. > > Signed-off-by: Thomas Falcon <tlfal...@linux.ibm.com>
Hi Thomas, > --- > arch/powerpc/platforms/pseries/mobility.c | 20 ++++++++++++++++++++ > 1 file changed, 20 insertions(+) > > diff --git a/arch/powerpc/platforms/pseries/mobility.c > b/arch/powerpc/platforms/pseries/mobility.c > index b571285f6c14..c1abc14cf2bb 100644 > --- a/arch/powerpc/platforms/pseries/mobility.c > +++ b/arch/powerpc/platforms/pseries/mobility.c > @@ -17,6 +17,9 @@ > #include <linux/delay.h> > #include <linux/slab.h> > #include <linux/stringify.h> > +#include <linux/netdevice.h> > +#include <linux/rtnetlink.h> > +#include <net/net_namespace.h> > > #include <asm/machdep.h> > #include <asm/rtas.h> > @@ -331,6 +334,8 @@ void post_mobility_fixup(void) > { > int rc; > int activate_fw_token; > + struct net_device *netdev; > + struct net *net; > > activate_fw_token = rtas_token("ibm,activate-firmware"); > if (activate_fw_token == RTAS_UNKNOWN_SERVICE) { > @@ -371,6 +376,21 @@ void post_mobility_fixup(void) > /* Possibly switch to a new RFI flush type */ > pseries_setup_rfi_flush(); > > + /* need to force a gratuitous ARP on running interfaces */ > + rtnl_lock(); > + for_each_net(net) { > + for_each_netdev(net, netdev) { > + if (netif_device_present(netdev) && > + netif_running(netdev) && > + !(netdev->flags & (IFF_NOARP | > IFF_LOOPBACK))) > + call_netdevice_notifiers(NETDEV_NOTIFY_ > PEERS, > + netdev); Without curly braces following the "if" statment, the second line (below) will be executed unconditionally, which I assume with this indentation isn't what you want. (reported by snowpatch) - Russell > + call_netdevice_notifiers(NETDEV_RESEND_ > IGMP, > + netdev); > + } > + } > + rtnl_unlock(); > + > return; > } >