[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] Stimulating domains to send gratuitous ARPs



Ian Pratt wrote:
Whilst I might agree that from a purist point of view having netfront do
this is a violation of layering, it's already accepted in some other
upstream drivers

It's pretty clear it's not going to be accepted in the netfront that goes into 
upstream Linux, at least not without sedating various LKML folk first :)

Stephen Hemminger posted a patch to add this capability generically so it wouldn't be a netfront-specific piece of behaviour. I have not submitted it for upstream yet, mainly because nobody has confirmed/tested that it really does what we need. But it looks reasonable, and it should be accepted once we confirm its correct.

   J
Subject: ARP notify option

This adds another inet device option to enable gratuitous ARP
when device is brought up or address change. This is handy for
clusters or virtualization.

Tested on a normal device (not Xen).

Signed-off-by: Stephen Hemminger <shemminge@xxxxxxxxxxxxxxxxxxxx>

---
 Documentation/networking/ip-sysctl.txt |    6 ++++++
 include/linux/inetdevice.h             |    2 ++
 include/linux/sysctl.h                 |    1 +
 net/ipv4/devinet.c                     |   16 ++++++++++++++++
 4 files changed, 25 insertions(+)

===================================================================
--- net-2.6.22.orig/Documentation/networking/ip-sysctl.txt
+++ net-2.6.22/Documentation/networking/ip-sysctl.txt
@@ -732,6 +732,12 @@
        The max value from conf/{all,interface}/arp_ignore is used
        when ARP request is received on the {interface}
 
+arp_notify - BOOLEAN
+       Define mode for notification of address and device changes.
+       0 - (default): do nothing
+       1 - Generate gratuitous arp replies when device is brought up
+           or hardware address changes.
+
 arp_accept - BOOLEAN
        Define behavior when gratuitous arp replies are received:
        0 - drop gratuitous arp frames
===================================================================
--- net-2.6.22.orig/include/linux/inetdevice.h
+++ net-2.6.22/include/linux/inetdevice.h
@@ -26,6 +26,7 @@
        int     arp_announce;
        int     arp_ignore;
        int     arp_accept;
+       int     arp_notify;
        int     medium_id;
        int     no_xfrm;
        int     no_policy;
@@ -84,6 +85,7 @@
 #define IN_DEV_ARPFILTER(in_dev)       (ipv4_devconf.arp_filter || 
(in_dev)->cnf.arp_filter)
 #define IN_DEV_ARP_ANNOUNCE(in_dev)    (max(ipv4_devconf.arp_announce, 
(in_dev)->cnf.arp_announce))
 #define IN_DEV_ARP_IGNORE(in_dev)      (max(ipv4_devconf.arp_ignore, 
(in_dev)->cnf.arp_ignore))
+#define IN_DEV_ARP_NOTIFY(in_dev)      (ipv4_devconf.arp_notify || 
(in_dev)->cnf.arp_notify)
 
 struct in_ifaddr
 {
===================================================================
--- net-2.6.22.orig/include/linux/sysctl.h
+++ net-2.6.22/include/linux/sysctl.h
@@ -495,6 +495,7 @@
        NET_IPV4_CONF_ARP_IGNORE=19,
        NET_IPV4_CONF_PROMOTE_SECONDARIES=20,
        NET_IPV4_CONF_ARP_ACCEPT=21,
+       NET_IPV4_CONF_ARP_NOTIFY=22,
        __NET_IPV4_CONF_MAX
 };
 
===================================================================
--- net-2.6.22.orig/net/ipv4/devinet.c
+++ net-2.6.22/net/ipv4/devinet.c
@@ -1089,6 +1089,14 @@
                        }
                }
                ip_mc_up(in_dev);
+               /* fall through */
+       case NETDEV_CHANGEADDR:
+               if (IN_DEV_ARP_NOTIFY(in_dev))
+                       arp_send(ARPOP_REQUEST, ETH_P_ARP,
+                                in_dev->ifa_list->ifa_address,
+                                dev,
+                                in_dev->ifa_list->ifa_address,
+                                NULL, dev->dev_addr, NULL);
                break;
        case NETDEV_DOWN:
                ip_mc_down(in_dev);
@@ -1495,6 +1503,14 @@
                        .proc_handler   = &proc_dointvec,
                },
                {
+                       .ctl_name       = NET_IPV4_CONF_ARP_NOTIFY,
+                       .procname       = "arp_notify",
+                       .data           = &ipv4_devconf.arp_notify,
+                       .maxlen         = sizeof(int),
+                       .mode           = 0644,
+                       .proc_handler   = &proc_dointvec,
+               },
+               {
                        .ctl_name       = NET_IPV4_CONF_NOXFRM,
                        .procname       = "disable_xfrm",
                        .data           = &ipv4_devconf.no_xfrm,
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.