0a122b
From 6fa94ac455819e37a16ed8439be4bbf0b869884c Mon Sep 17 00:00:00 2001
0a122b
Message-Id: <6fa94ac455819e37a16ed8439be4bbf0b869884c.1387276076.git.minovotn@redhat.com>
0a122b
In-Reply-To: <e610718166120379517e80d1a7aa12d60294209b.1387276076.git.minovotn@redhat.com>
0a122b
References: <e610718166120379517e80d1a7aa12d60294209b.1387276076.git.minovotn@redhat.com>
0a122b
From: Vlad Yasevich <vyasevic@redhat.com>
0a122b
Date: Wed, 11 Dec 2013 21:40:06 +0100
0a122b
Subject: [PATCH 16/16] net: Update netdev peer on link change
0a122b
0a122b
RH-Author: Vlad Yasevich <vyasevic@redhat.com>
0a122b
Message-id: <1386798006-31753-1-git-send-email-vyasevic@redhat.com>
0a122b
Patchwork-id: 56241
0a122b
O-Subject: [RHEL 7.0 qemu PATCH] net: Update netdev peer on link change
0a122b
Bugzilla: 1027571
0a122b
RH-Acked-by: Amos Kong <akong@redhat.com>
0a122b
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
0a122b
RH-Acked-by: Xiao Wang <jasowang@redhat.com>
0a122b
0a122b
BZ: https://bugzilla.redhat.com/show_bug.cgi?id=1027571
0a122b
Brew: http://brewweb.devel.redhat.com/brew/taskinfo?taskID=6714640
0a122b
0a122b
When a link change occurs on a backend (like tap), we currently do
0a122b
not propage such change to the nic.  As a result, when someone turns
0a122b
off a link on a tap device, for instance, then a guest doesn't see
0a122b
that change and continues to try to send traffic or run DHCP even
0a122b
though the lower-layer is disconnected.  This is OK when the network
0a122b
is set up as a HUB since the the guest may be connected to other HUB
0a122b
ports too, but when it's set up as a netdev, it makes thinkgs worse.
0a122b
0a122b
The patch addresses this by setting the peers link down only when the
0a122b
peer is not a HUBPORT device.  With this patch, in the following config
0a122b
  -netdev tap,id=net0 -device e1000,mac=XXXXX,netdev=net0
0a122b
when net0 link is turned off, the guest e1000 shows lower-layer link
0a122b
down. This allows guests to boot much faster in such configurations.
0a122b
With windows guest, it also allows the network to recover properly
0a122b
since windows will not configure the link-local IPv4 address, and
0a122b
when the link is turned on, the proper address address is configured.
0a122b
0a122b
Signed-off-by: Vlad Yasevich <vyasevic@redhat.com>
0a122b
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
0a122b
(cherry picked from commit 02d38fcb2caa4454cf4ed728d5908c3cc9ba47be)
0a122b
---
0a122b
 net/net.c | 26 +++++++++++++++++---------
0a122b
 1 file changed, 17 insertions(+), 9 deletions(-)
0a122b
0a122b
Signed-off-by: Michal Novotny <minovotn@redhat.com>
0a122b
---
0a122b
 net/net.c | 26 +++++++++++++++++---------
0a122b
 1 file changed, 17 insertions(+), 9 deletions(-)
0a122b
0a122b
diff --git a/net/net.c b/net/net.c
0a122b
index c0d61bf..a8c49fc 100644
0a122b
--- a/net/net.c
0a122b
+++ b/net/net.c
0a122b
@@ -1059,15 +1059,23 @@ void qmp_set_link(const char *name, bool up, Error **errp)
0a122b
         nc->info->link_status_changed(nc);
0a122b
     }
0a122b
 
0a122b
-    /* Notify peer. Don't update peer link status: this makes it possible to
0a122b
-     * disconnect from host network without notifying the guest.
0a122b
-     * FIXME: is disconnected link status change operation useful?
0a122b
-     *
0a122b
-     * Current behaviour is compatible with qemu vlans where there could be
0a122b
-     * multiple clients that can still communicate with each other in
0a122b
-     * disconnected mode. For now maintain this compatibility. */
0a122b
-    if (nc->peer && nc->peer->info->link_status_changed) {
0a122b
-        nc->peer->info->link_status_changed(nc->peer);
0a122b
+    if (nc->peer) {
0a122b
+        /* Change peer link only if the peer is NIC and then notify peer.
0a122b
+         * If the peer is a HUBPORT or a backend, we do not change the
0a122b
+         * link status.
0a122b
+         *
0a122b
+         * This behavior is compatible with qemu vlans where there could be
0a122b
+         * multiple clients that can still communicate with each other in
0a122b
+         * disconnected mode. For now maintain this compatibility.
0a122b
+         */
0a122b
+        if (nc->peer->info->type == NET_CLIENT_OPTIONS_KIND_NIC) {
0a122b
+            for (i = 0; i < queues; i++) {
0a122b
+                ncs[i]->peer->link_down = !up;
0a122b
+            }
0a122b
+        }
0a122b
+        if (nc->peer->info->link_status_changed) {
0a122b
+            nc->peer->info->link_status_changed(nc->peer);
0a122b
+        }
0a122b
     }
0a122b
 }
0a122b
 
0a122b
-- 
0a122b
1.7.11.7
0a122b