From: jianhai luan <jianhai.luan@oracle.com>
To: Jan Beulich <JBeulich@suse.com>
Cc: xen-devel@lists.xensource.com, netdev@vger.kernel.org,
Jan Beulich <JBeulich@suse.com>,
Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: Re: [Xen-devel] xen-netback notify DomU to send ARP.
Date: Wed, 09 Jan 2013 20:28:05 +0800 [thread overview]
Message-ID: <50ED6255.7020006@oracle.com> (raw)
In-Reply-To: <50ED4F1D02000078000B3F87@nat28.tlf.novell.com>
[-- Attachment #1: Type: text/plain, Size: 2654 bytes --]
On 2013-1-9 18:06, Jan Beulich wrote:
>>>> On 09.01.13 at 08:39, jianhai luan <jianhai.luan@oracle.com> wrote:
>> @@ -34,11 +35,42 @@ static void connect(struct backend_info *);
>> static void backend_create_xenvif(struct backend_info *be);
>> static void unregister_hotplug_status_watch(struct backend_info *be);
>>
>> +#define nb_to_backend(nb) container_of(nb, struct backend_info, vif_notifier)
>> +/**
>> + * When network condition of vif change, notify the frontend.
>> + */
>> +static int netback_netdev_event(struct notifier_block *this,
>> + unsigned long event, void *ptr)
>> +{
>> + struct net_device *event_dev = (struct net_device *)ptr;
> Pointless cast.
>
>> + struct backend_info *be = nb_to_backend(this);
>> +
>> + pr_debug("event_dev: %s, event: %lx\n",
>> + event_dev ? event_dev->name : "None", event);
>> +
>> + if (!be->vif)
>> + goto out;
>> +
>> + switch (event) {
>> + case NETDEV_NOTIFY_PEERS:
>> + /* Notify frontend to Send gratuitous ARP */
>> + xenbus_switch_state(be->dev, XenbusStateInitialised);
>> + xenbus_switch_state(be->dev, );
> This is the sort of change that clearly isn't acceptable, as I don't
> think you have ways to check _all_ existing frontends for their
> compatibility with this. A connected -> connected transition
> might be acceptable (that was done in the block frontend too, for
> implementing dynamic resize), but will likely need to be
> accompanied by a frontend side patch to handle that (which so
> far should be a no-op).
The latest xen net-frontent driver have handled the condition. State
XenbusStateInitialised will do nothing,
but change to XenbusStateConnected will trigger
netdev_notify_peers(netdev) to send ARP.
>
>> + break;
>> + default:
>> + break;
> Pointless default case.
>
>> + }
>> +
>> +out:
> I don't think you really need the label (and the goto above) - just
> put a return there.
>
>> + return NOTIFY_DONE;
>> +}
>> +
>> static int netback_remove(struct xenbus_device *dev)
>> {
>> struct backend_info *be = dev_get_drvdata(&dev->dev);
>>
>> unregister_hotplug_status_watch(be);
>> + unregister_netdevice_notifier(&be->vif_notifier);
>> if (be->vif) {
>> kobject_uevent(&dev->dev.kobj, KOBJ_OFFLINE);
>> xenbus_rm(XBT_NIL, dev->nodename, "hotplug-status");
>> @@ -129,6 +161,10 @@ static int netback_probe(struct xenbus_device *dev,
>> /* This kicks hotplug scripts, so do it immediately. */
>> backend_create_xenvif(be);
>>
>> + /* Event Notify */
>> + (be->vif_notifier).notifier_call = netback_netdev_event;
> Pointless parentheses.
>
> Jan
>
>> + register_netdevice_notifier(&be->vif_notifier);
>> +
>> return 0;
>>
>> abort_transaction:
>
[-- Attachment #2: 0001-xen-netback-notify-DomU-to-send-ARP.patch --]
[-- Type: text/plain, Size: 3126 bytes --]
>From a64d80cc0c780bee7a8d6e842126cb5f7d17f0d2 Mon Sep 17 00:00:00 2001
From: Jason Luan <jianhai.luan@oracle.com>
Date: Fri, 28 Dec 2012 15:43:06 +0800
Subject: [PATCH] xen-netback notify DomU to send ARP.
When Xen Dom0's network circumstance changed, DomU
should be notified in some special condition. For
example the below circumstance:
ping from Guest A to DomU:
Guest A --> eth0 - bond0 - xenbr0 --VIF(DOMU)
eth1 /
when eth0 inactive, and eth1 active.
Guest A --> eth0 bond0 - xenbr0 --VIF(DOMU)
eth1 /
Guest A will don't reach to DomU. After Guest A
send ARP request and DomU respond, Guest A will
reach DomU. But some more second will be elapsed.
eth0 bond0 - xenbr0 --VIF(DOMU)
Guest A --> eth1/
If Xen netback watch the network change, will notify
DomU by change it own status. So netfront will watch
netback's change, and DomU send ARP initiative.
Signed-off-by: Jason Luan <jianhai.luan@oracle.com>
---
drivers/net/xen-netback/xenbus.c | 33 +++++++++++++++++++++++++++++++++
1 files changed, 33 insertions(+), 0 deletions(-)
diff --git a/drivers/net/xen-netback/xenbus.c b/drivers/net/xen-netback/xenbus.c
index 410018c..17a3990 100644
--- a/drivers/net/xen-netback/xenbus.c
+++ b/drivers/net/xen-netback/xenbus.c
@@ -26,6 +26,7 @@ struct backend_info {
struct xenvif *vif;
enum xenbus_state frontend_state;
struct xenbus_watch hotplug_status_watch;
+ struct notifier_block vif_notifier;
u8 have_hotplug_status_watch:1;
};
@@ -34,11 +35,39 @@ static void connect(struct backend_info *);
static void backend_create_xenvif(struct backend_info *be);
static void unregister_hotplug_status_watch(struct backend_info *be);
+#define nb_to_backend(nb) container_of(nb, struct backend_info, vif_notifier)
+/**
+ * When network condition of vif change, notify the frontend.
+ */
+static int netback_netdev_event(struct notifier_block *this,
+ unsigned long event, void *ptr)
+{
+ struct net_device *event_dev = ptr;
+ struct backend_info *be = nb_to_backend(this);
+
+ pr_debug("event_dev: %s, event: %lx\n",
+ event_dev ? event_dev->name : "None", event);
+
+ if (!be->vif)
+ return NOTIFY_DONE;
+
+ switch (event) {
+ case NETDEV_NOTIFY_PEERS:
+ /* Notify frontend to Send gratuitous ARP */
+ xenbus_switch_state(be->dev, XenbusStateInitialised);
+ xenbus_switch_state(be->dev, XenbusStateConnected);
+ break;
+ }
+
+ return NOTIFY_DONE;
+}
+
static int netback_remove(struct xenbus_device *dev)
{
struct backend_info *be = dev_get_drvdata(&dev->dev);
unregister_hotplug_status_watch(be);
+ unregister_netdevice_notifier(&be->vif_notifier);
if (be->vif) {
kobject_uevent(&dev->dev.kobj, KOBJ_OFFLINE);
xenbus_rm(XBT_NIL, dev->nodename, "hotplug-status");
@@ -129,6 +158,10 @@ static int netback_probe(struct xenbus_device *dev,
/* This kicks hotplug scripts, so do it immediately. */
backend_create_xenvif(be);
+ /* Register Frontend Event Notify */
+ be->vif_notifier.notifier_call = netback_netdev_event;
+ register_netdevice_notifier(&be->vif_notifier);
+
return 0;
abort_transaction:
--
1.7.6.5
WARNING: multiple messages have this Message-ID (diff)
From: jianhai luan <jianhai.luan@oracle.com>
Cc: xen-devel@lists.xensource.com, netdev@vger.kernel.org,
Jan Beulich <JBeulich@suse.com>,
Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: Re: [Xen-devel] xen-netback notify DomU to send ARP.
Date: Wed, 09 Jan 2013 20:28:05 +0800 [thread overview]
Message-ID: <50ED6255.7020006@oracle.com> (raw)
In-Reply-To: <50ED4F1D02000078000B3F87@nat28.tlf.novell.com>
[-- Attachment #1: Type: text/plain, Size: 2654 bytes --]
On 2013-1-9 18:06, Jan Beulich wrote:
>>>> On 09.01.13 at 08:39, jianhai luan <jianhai.luan@oracle.com> wrote:
>> @@ -34,11 +35,42 @@ static void connect(struct backend_info *);
>> static void backend_create_xenvif(struct backend_info *be);
>> static void unregister_hotplug_status_watch(struct backend_info *be);
>>
>> +#define nb_to_backend(nb) container_of(nb, struct backend_info, vif_notifier)
>> +/**
>> + * When network condition of vif change, notify the frontend.
>> + */
>> +static int netback_netdev_event(struct notifier_block *this,
>> + unsigned long event, void *ptr)
>> +{
>> + struct net_device *event_dev = (struct net_device *)ptr;
> Pointless cast.
>
>> + struct backend_info *be = nb_to_backend(this);
>> +
>> + pr_debug("event_dev: %s, event: %lx\n",
>> + event_dev ? event_dev->name : "None", event);
>> +
>> + if (!be->vif)
>> + goto out;
>> +
>> + switch (event) {
>> + case NETDEV_NOTIFY_PEERS:
>> + /* Notify frontend to Send gratuitous ARP */
>> + xenbus_switch_state(be->dev, XenbusStateInitialised);
>> + xenbus_switch_state(be->dev, );
> This is the sort of change that clearly isn't acceptable, as I don't
> think you have ways to check _all_ existing frontends for their
> compatibility with this. A connected -> connected transition
> might be acceptable (that was done in the block frontend too, for
> implementing dynamic resize), but will likely need to be
> accompanied by a frontend side patch to handle that (which so
> far should be a no-op).
The latest xen net-frontent driver have handled the condition. State
XenbusStateInitialised will do nothing,
but change to XenbusStateConnected will trigger
netdev_notify_peers(netdev) to send ARP.
>
>> + break;
>> + default:
>> + break;
> Pointless default case.
>
>> + }
>> +
>> +out:
> I don't think you really need the label (and the goto above) - just
> put a return there.
>
>> + return NOTIFY_DONE;
>> +}
>> +
>> static int netback_remove(struct xenbus_device *dev)
>> {
>> struct backend_info *be = dev_get_drvdata(&dev->dev);
>>
>> unregister_hotplug_status_watch(be);
>> + unregister_netdevice_notifier(&be->vif_notifier);
>> if (be->vif) {
>> kobject_uevent(&dev->dev.kobj, KOBJ_OFFLINE);
>> xenbus_rm(XBT_NIL, dev->nodename, "hotplug-status");
>> @@ -129,6 +161,10 @@ static int netback_probe(struct xenbus_device *dev,
>> /* This kicks hotplug scripts, so do it immediately. */
>> backend_create_xenvif(be);
>>
>> + /* Event Notify */
>> + (be->vif_notifier).notifier_call = netback_netdev_event;
> Pointless parentheses.
>
> Jan
>
>> + register_netdevice_notifier(&be->vif_notifier);
>> +
>> return 0;
>>
>> abort_transaction:
>
[-- Attachment #2: 0001-xen-netback-notify-DomU-to-send-ARP.patch --]
[-- Type: text/plain, Size: 3126 bytes --]
>From a64d80cc0c780bee7a8d6e842126cb5f7d17f0d2 Mon Sep 17 00:00:00 2001
From: Jason Luan <jianhai.luan@oracle.com>
Date: Fri, 28 Dec 2012 15:43:06 +0800
Subject: [PATCH] xen-netback notify DomU to send ARP.
When Xen Dom0's network circumstance changed, DomU
should be notified in some special condition. For
example the below circumstance:
ping from Guest A to DomU:
Guest A --> eth0 - bond0 - xenbr0 --VIF(DOMU)
eth1 /
when eth0 inactive, and eth1 active.
Guest A --> eth0 bond0 - xenbr0 --VIF(DOMU)
eth1 /
Guest A will don't reach to DomU. After Guest A
send ARP request and DomU respond, Guest A will
reach DomU. But some more second will be elapsed.
eth0 bond0 - xenbr0 --VIF(DOMU)
Guest A --> eth1/
If Xen netback watch the network change, will notify
DomU by change it own status. So netfront will watch
netback's change, and DomU send ARP initiative.
Signed-off-by: Jason Luan <jianhai.luan@oracle.com>
---
drivers/net/xen-netback/xenbus.c | 33 +++++++++++++++++++++++++++++++++
1 files changed, 33 insertions(+), 0 deletions(-)
diff --git a/drivers/net/xen-netback/xenbus.c b/drivers/net/xen-netback/xenbus.c
index 410018c..17a3990 100644
--- a/drivers/net/xen-netback/xenbus.c
+++ b/drivers/net/xen-netback/xenbus.c
@@ -26,6 +26,7 @@ struct backend_info {
struct xenvif *vif;
enum xenbus_state frontend_state;
struct xenbus_watch hotplug_status_watch;
+ struct notifier_block vif_notifier;
u8 have_hotplug_status_watch:1;
};
@@ -34,11 +35,39 @@ static void connect(struct backend_info *);
static void backend_create_xenvif(struct backend_info *be);
static void unregister_hotplug_status_watch(struct backend_info *be);
+#define nb_to_backend(nb) container_of(nb, struct backend_info, vif_notifier)
+/**
+ * When network condition of vif change, notify the frontend.
+ */
+static int netback_netdev_event(struct notifier_block *this,
+ unsigned long event, void *ptr)
+{
+ struct net_device *event_dev = ptr;
+ struct backend_info *be = nb_to_backend(this);
+
+ pr_debug("event_dev: %s, event: %lx\n",
+ event_dev ? event_dev->name : "None", event);
+
+ if (!be->vif)
+ return NOTIFY_DONE;
+
+ switch (event) {
+ case NETDEV_NOTIFY_PEERS:
+ /* Notify frontend to Send gratuitous ARP */
+ xenbus_switch_state(be->dev, XenbusStateInitialised);
+ xenbus_switch_state(be->dev, XenbusStateConnected);
+ break;
+ }
+
+ return NOTIFY_DONE;
+}
+
static int netback_remove(struct xenbus_device *dev)
{
struct backend_info *be = dev_get_drvdata(&dev->dev);
unregister_hotplug_status_watch(be);
+ unregister_netdevice_notifier(&be->vif_notifier);
if (be->vif) {
kobject_uevent(&dev->dev.kobj, KOBJ_OFFLINE);
xenbus_rm(XBT_NIL, dev->nodename, "hotplug-status");
@@ -129,6 +158,10 @@ static int netback_probe(struct xenbus_device *dev,
/* This kicks hotplug scripts, so do it immediately. */
backend_create_xenvif(be);
+ /* Register Frontend Event Notify */
+ be->vif_notifier.notifier_call = netback_netdev_event;
+ register_netdevice_notifier(&be->vif_notifier);
+
return 0;
abort_transaction:
--
1.7.6.5
next prev parent reply other threads:[~2013-01-09 12:28 UTC|newest]
Thread overview: 51+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-01-08 11:57 xen-netback notify DomU to send ARP jianhai luan
2013-01-08 13:13 ` [Xen-devel] " Jan Beulich
2013-01-08 13:13 ` Jan Beulich
2013-01-08 13:42 ` Ian Campbell
2013-01-08 15:40 ` jianhai luan
2013-01-08 15:40 ` jianhai luan
2013-01-08 16:00 ` [Xen-devel] " Ian Campbell
2013-01-09 1:07 ` Jason Luan
2013-01-09 12:03 ` [Xen-devel] " Ian Campbell
2013-01-09 7:39 ` jianhai luan
2013-01-09 10:06 ` Jan Beulich
2013-01-09 10:06 ` Jan Beulich
2013-01-09 12:28 ` jianhai luan [this message]
2013-01-09 12:28 ` jianhai luan
2013-01-09 13:44 ` Jan Beulich
2013-01-09 13:44 ` Jan Beulich
2013-01-09 15:37 ` Jason Luan
2013-01-09 15:44 ` [Xen-devel] " Jan Beulich
2013-01-09 15:44 ` Jan Beulich
[not found] ` <50ED950A.6010203@163.com>
2013-01-09 16:25 ` Jan Beulich
[not found] ` <50EDA624.1010008@163.com>
2013-01-10 7:00 ` [Xen-devel] " jianhai luan
2013-01-10 15:20 ` Jason Luan
2013-01-13 1:51 ` Jason Luan
2013-01-14 12:16 ` Ian Campbell
2013-01-14 13:39 ` Jason Luan
2013-01-14 14:24 ` Jan Beulich
2013-01-14 14:43 ` Jason Luan
2013-01-14 15:52 ` Jan Beulich
[not found] ` <50EF7106.7000302@oracle.com>
2013-01-21 7:26 ` [V2] " jianhai luan
2013-01-21 11:04 ` David Vrabel
2013-01-21 11:33 ` Jason Luan
2013-01-21 11:55 ` Jan Beulich
2013-01-21 12:23 ` Ian Campbell
2013-01-21 12:30 ` Ian Campbell
2013-01-21 12:38 ` [Xen-devel] " Jason Luan
2013-01-21 12:38 ` Jason Luan
2013-01-21 13:49 ` Jason Luan
2013-01-21 13:52 ` Ian Campbell
2013-01-21 14:02 ` Jason Luan
2013-01-21 14:09 ` Ian Campbell
2013-01-21 14:16 ` Jan Beulich
2013-01-21 14:31 ` Jason Luan
2013-01-21 14:54 ` Jason Luan
2013-01-21 15:20 ` Jan Beulich
2013-01-21 15:30 ` Jason Luan
2013-01-21 15:44 ` Jan Beulich
2013-01-21 15:56 ` Jason Luan
2013-01-21 15:59 ` Jan Beulich
2013-01-21 16:02 ` Jason Luan
2013-01-21 15:59 ` Ian Campbell
2013-01-21 12:25 ` Jason Luan
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=50ED6255.7020006@oracle.com \
--to=jianhai.luan@oracle.com \
--cc=JBeulich@suse.com \
--cc=konrad.wilk@oracle.com \
--cc=netdev@vger.kernel.org \
--cc=xen-devel@lists.xensource.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.