1
The following changes since commit 122e6d2a9c1bf8aa1d51409c15809a82621515b1:
1
The following changes since commit 23895cbd82be95428e90168b12e925d0d3ca2f06:
2
2
3
Merge remote-tracking branch 'remotes/gkurz/tags/9p-fix-2019-11-23' into staging (2019-11-25 13:39:45 +0000)
3
Merge remote-tracking branch 'remotes/awilliam/tags/vfio-update-20201123.0' into staging (2020-11-23 18:51:13 +0000)
4
4
5
are available in the git repository at:
5
are available in the git repository at:
6
6
7
https://github.com/jasowang/qemu.git tags/net-pull-request
7
https://github.com/jasowang/qemu.git tags/net-pull-request
8
8
9
for you to fetch changes up to 4d0e59ace29277b2faa5b33c719be9baaa659093:
9
for you to fetch changes up to 9925990d01a92564af55f6f69d0f5f59b47609b1:
10
10
11
net/virtio: return error when device_opts arg is NULL (2019-11-25 23:30:29 +0800)
11
net: Use correct default-path macro for downscript (2020-11-24 10:40:17 +0800)
12
12
13
----------------------------------------------------------------
13
----------------------------------------------------------------
14
14
15
----------------------------------------------------------------
15
----------------------------------------------------------------
16
Jens Freimann (4):
16
Keqian Zhu (1):
17
net/virtio: fix dev_unplug_pending
17
net: Use correct default-path macro for downscript
18
net/virtio: return early when failover primary alread added
19
net/virtio: fix re-plugging of primary device
20
net/virtio: return error when device_opts arg is NULL
21
18
22
hw/net/virtio-net.c | 58 +++++++++++++++++++++++++++++++++++------------------
19
Paolo Bonzini (1):
23
migration/savevm.c | 3 ++-
20
net: do not exit on "netdev_add help" monitor command
24
2 files changed, 40 insertions(+), 21 deletions(-)
25
21
26
2.5.0
22
Prasad J Pandit (1):
23
hw/net/e1000e: advance desc_offset in case of null descriptor
24
25
Yuri Benditovich (1):
26
net: purge queued rx packets on queue deletion
27
28
yuanjungong (1):
29
tap: fix a memory leak
30
31
hw/net/e1000e_core.c | 8 +++---
32
include/net/net.h | 1 +
33
monitor/hmp-cmds.c | 6 ++++
34
net/net.c | 80 +++++++++++++++++++++++++++-------------------------
35
net/tap.c | 5 +++-
36
5 files changed, 57 insertions(+), 43 deletions(-)
27
37
28
38
diff view generated by jsdifflib
New patch
1
From: Prasad J Pandit <pjp@fedoraproject.org>
1
2
3
While receiving packets via e1000e_write_packet_to_guest() routine,
4
'desc_offset' is advanced only when RX descriptor is processed. And
5
RX descriptor is not processed if it has NULL buffer address.
6
This may lead to an infinite loop condition. Increament 'desc_offset'
7
to process next descriptor in the ring to avoid infinite loop.
8
9
Reported-by: Cheol-woo Myung <330cjfdn@gmail.com>
10
Signed-off-by: Prasad J Pandit <pjp@fedoraproject.org>
11
Signed-off-by: Jason Wang <jasowang@redhat.com>
12
---
13
hw/net/e1000e_core.c | 8 ++++----
14
1 file changed, 4 insertions(+), 4 deletions(-)
15
16
diff --git a/hw/net/e1000e_core.c b/hw/net/e1000e_core.c
17
index XXXXXXX..XXXXXXX 100644
18
--- a/hw/net/e1000e_core.c
19
+++ b/hw/net/e1000e_core.c
20
@@ -XXX,XX +XXX,XX @@ e1000e_write_packet_to_guest(E1000ECore *core, struct NetRxPkt *pkt,
21
(const char *) &fcs_pad, e1000x_fcs_len(core->mac));
22
}
23
}
24
- desc_offset += desc_size;
25
- if (desc_offset >= total_size) {
26
- is_last = true;
27
- }
28
} else { /* as per intel docs; skip descriptors with null buf addr */
29
trace_e1000e_rx_null_descriptor();
30
}
31
+ desc_offset += desc_size;
32
+ if (desc_offset >= total_size) {
33
+ is_last = true;
34
+ }
35
36
e1000e_write_rx_descr(core, desc, is_last ? core->rx_pkt : NULL,
37
rss_info, do_ps ? ps_hdr_len : 0, &bastate.written);
38
--
39
2.7.4
40
41
diff view generated by jsdifflib
1
From: Jens Freimann <jfreimann@redhat.com>
1
From: Paolo Bonzini <pbonzini@redhat.com>
2
2
3
failover_replug_primary was returning true on failure which lead to
3
"netdev_add help" is causing QEMU to exit because the code that
4
re-plug not working when a migration failed. Fix this by returning
4
invokes show_netdevs is shared between CLI and HMP processing.
5
success when hotplug worked. This is a bug that was missed in last
5
Move the check to the callers so that exit(0) remains only
6
round of testing but was tested succesfully with this version. Also
6
in the CLI flow.
7
make sure we don't pass NULL to qdev_set_parent_bus().
8
7
9
This fixes CID 1407224.
8
"netdev_add help" is not fixed by this patch; that is left for
9
later work.
10
10
11
Fixes: 9711cd0dfc3f ("net/virtio: add failover support")
11
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
12
Signed-off-by: Jens Freimann <jfreimann@redhat.com>
13
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
14
Signed-off-by: Jason Wang <jasowang@redhat.com>
12
Signed-off-by: Jason Wang <jasowang@redhat.com>
15
---
13
---
16
hw/net/virtio-net.c | 42 +++++++++++++++++++++++++-----------------
14
include/net/net.h | 1 +
17
1 file changed, 25 insertions(+), 17 deletions(-)
15
monitor/hmp-cmds.c | 6 +++++
16
net/net.c | 68 +++++++++++++++++++++++++++---------------------------
17
3 files changed, 41 insertions(+), 34 deletions(-)
18
18
19
diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
19
diff --git a/include/net/net.h b/include/net/net.h
20
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
21
--- a/hw/net/virtio-net.c
21
--- a/include/net/net.h
22
+++ b/hw/net/virtio-net.c
22
+++ b/include/net/net.h
23
@@ -XXX,XX +XXX,XX @@ static bool failover_replug_primary(VirtIONet *n, Error **errp)
23
@@ -XXX,XX +XXX,XX @@ extern const char *host_net_devices[];
24
n->primary_device_opts = qemu_opts_from_qdict(
24
25
qemu_find_opts("device"),
25
/* from net.c */
26
n->primary_device_dict, errp);
26
int net_client_parse(QemuOptsList *opts_list, const char *str);
27
- }
27
+void show_netdevs(void);
28
- if (n->primary_device_opts) {
28
int net_init_clients(Error **errp);
29
- if (n->primary_dev) {
29
void net_check_clients(void);
30
- n->primary_bus = n->primary_dev->parent_bus;
30
void net_cleanup(void);
31
- }
31
diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c
32
- qdev_set_parent_bus(n->primary_dev, n->primary_bus);
32
index XXXXXXX..XXXXXXX 100644
33
- n->primary_should_be_hidden = false;
33
--- a/monitor/hmp-cmds.c
34
- qemu_opt_set_bool(n->primary_device_opts,
34
+++ b/monitor/hmp-cmds.c
35
- "partially_hotplugged", true, errp);
35
@@ -XXX,XX +XXX,XX @@
36
- hotplug_ctrl = qdev_get_hotplug_handler(n->primary_dev);
36
#include "qemu/option.h"
37
- if (hotplug_ctrl) {
37
#include "qemu/timer.h"
38
- hotplug_handler_pre_plug(hotplug_ctrl, n->primary_dev, errp);
38
#include "qemu/sockets.h"
39
- hotplug_handler_plug(hotplug_ctrl, n->primary_dev, errp);
39
+#include "qemu/help_option.h"
40
+ if (!n->primary_device_opts) {
40
#include "monitor/monitor-internal.h"
41
+ error_setg(errp, "virtio_net: couldn't find primary device opts");
41
#include "qapi/error.h"
42
#include "qapi/clone-visitor.h"
43
@@ -XXX,XX +XXX,XX @@ void hmp_netdev_add(Monitor *mon, const QDict *qdict)
44
{
45
Error *err = NULL;
46
QemuOpts *opts;
47
+ const char *type = qdict_get_try_str(qdict, "type");
48
49
+ if (type && is_help_option(type)) {
50
+ show_netdevs();
51
+ return;
52
+ }
53
opts = qemu_opts_from_qdict(qemu_find_opts("netdev"), qdict, &err);
54
if (err) {
55
goto out;
56
diff --git a/net/net.c b/net/net.c
57
index XXXXXXX..XXXXXXX 100644
58
--- a/net/net.c
59
+++ b/net/net.c
60
@@ -XXX,XX +XXX,XX @@
61
#include "qemu/config-file.h"
62
#include "qemu/ctype.h"
63
#include "qemu/iov.h"
64
+#include "qemu/qemu-print.h"
65
#include "qemu/main-loop.h"
66
#include "qemu/option.h"
67
#include "qapi/error.h"
68
@@ -XXX,XX +XXX,XX @@ static int net_client_init1(const Netdev *netdev, bool is_netdev, Error **errp)
69
return 0;
70
}
71
72
-static void show_netdevs(void)
73
+void show_netdevs(void)
74
{
75
int idx;
76
const char *available_netdevs[] = {
77
@@ -XXX,XX +XXX,XX @@ static void show_netdevs(void)
78
#endif
79
};
80
81
- printf("Available netdev backend types:\n");
82
+ qemu_printf("Available netdev backend types:\n");
83
for (idx = 0; idx < ARRAY_SIZE(available_netdevs); idx++) {
84
- puts(available_netdevs[idx]);
85
+ qemu_printf("%s\n", available_netdevs[idx]);
86
}
87
}
88
89
@@ -XXX,XX +XXX,XX @@ static int net_client_init(QemuOpts *opts, bool is_netdev, Error **errp)
90
int ret = -1;
91
Visitor *v = opts_visitor_new(opts);
92
93
- const char *type = qemu_opt_get(opts, "type");
94
-
95
- if (is_netdev && type && is_help_option(type)) {
96
- show_netdevs();
97
- exit(0);
98
- } else {
99
- /* Parse convenience option format ip6-net=fec0::0[/64] */
100
- const char *ip6_net = qemu_opt_get(opts, "ipv6-net");
101
+ /* Parse convenience option format ip6-net=fec0::0[/64] */
102
+ const char *ip6_net = qemu_opt_get(opts, "ipv6-net");
103
104
- if (ip6_net) {
105
- char *prefix_addr;
106
- unsigned long prefix_len = 64; /* Default 64bit prefix length. */
107
+ if (ip6_net) {
108
+ char *prefix_addr;
109
+ unsigned long prefix_len = 64; /* Default 64bit prefix length. */
110
111
- substrings = g_strsplit(ip6_net, "/", 2);
112
- if (!substrings || !substrings[0]) {
113
- error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "ipv6-net",
114
- "a valid IPv6 prefix");
115
- goto out;
116
- }
117
+ substrings = g_strsplit(ip6_net, "/", 2);
118
+ if (!substrings || !substrings[0]) {
119
+ error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "ipv6-net",
120
+ "a valid IPv6 prefix");
121
+ goto out;
122
+ }
123
124
- prefix_addr = substrings[0];
125
+ prefix_addr = substrings[0];
126
127
- /* Handle user-specified prefix length. */
128
- if (substrings[1] &&
129
- qemu_strtoul(substrings[1], NULL, 10, &prefix_len))
130
- {
131
- error_setg(errp, QERR_INVALID_PARAMETER_VALUE,
132
- "ipv6-prefixlen", "a number");
133
- goto out;
134
- }
135
-
136
- qemu_opt_set(opts, "ipv6-prefix", prefix_addr, &error_abort);
137
- qemu_opt_set_number(opts, "ipv6-prefixlen", prefix_len,
138
- &error_abort);
139
- qemu_opt_unset(opts, "ipv6-net");
140
+ /* Handle user-specified prefix length. */
141
+ if (substrings[1] &&
142
+ qemu_strtoul(substrings[1], NULL, 10, &prefix_len))
143
+ {
144
+ error_setg(errp, QERR_INVALID_PARAMETER_VALUE,
145
+ "ipv6-prefixlen", "a number");
42
+ goto out;
146
+ goto out;
43
}
147
}
44
- if (!n->primary_dev) {
148
+
149
+ qemu_opt_set(opts, "ipv6-prefix", prefix_addr, &error_abort);
150
+ qemu_opt_set_number(opts, "ipv6-prefixlen", prefix_len,
151
+ &error_abort);
152
+ qemu_opt_unset(opts, "ipv6-net");
153
}
154
155
/* Create an ID for -net if the user did not specify one */
156
@@ -XXX,XX +XXX,XX @@ static int net_init_client(void *dummy, QemuOpts *opts, Error **errp)
157
158
static int net_init_netdev(void *dummy, QemuOpts *opts, Error **errp)
159
{
160
+ const char *type = qemu_opt_get(opts, "type");
161
+
162
+ if (type && is_help_option(type)) {
163
+ show_netdevs();
164
+ exit(0);
45
+ }
165
+ }
46
+ if (!n->primary_dev) {
166
return net_client_init(opts, true, errp);
47
error_setg(errp, "virtio_net: couldn't find primary device");
48
- }
49
+ goto out;
50
}
51
- return *errp != NULL;
52
+
53
+ n->primary_bus = n->primary_dev->parent_bus;
54
+ if (!n->primary_bus) {
55
+ error_setg(errp, "virtio_net: couldn't find primary bus");
56
+ goto out;
57
+ }
58
+ qdev_set_parent_bus(n->primary_dev, n->primary_bus);
59
+ n->primary_should_be_hidden = false;
60
+ qemu_opt_set_bool(n->primary_device_opts,
61
+ "partially_hotplugged", true, errp);
62
+ hotplug_ctrl = qdev_get_hotplug_handler(n->primary_dev);
63
+ if (hotplug_ctrl) {
64
+ hotplug_handler_pre_plug(hotplug_ctrl, n->primary_dev, errp);
65
+ hotplug_handler_plug(hotplug_ctrl, n->primary_dev, errp);
66
+ }
67
+
68
+out:
69
+ return *errp == NULL;
70
}
167
}
71
168
72
static void virtio_net_handle_migration_primary(VirtIONet *n,
73
@@ -XXX,XX +XXX,XX @@ static void virtio_net_handle_migration_primary(VirtIONet *n,
74
warn_report("couldn't unplug primary device");
75
}
76
} else if (migration_has_failed(s)) {
77
- /* We already unplugged the device let's plugged it back */
78
+ /* We already unplugged the device let's plug it back */
79
if (!failover_replug_primary(n, &err)) {
80
if (err) {
81
error_report_err(err);
82
--
169
--
83
2.5.0
170
2.7.4
84
171
85
172
diff view generated by jsdifflib
1
From: Jens Freimann <jfreimann@redhat.com>
1
From: Yuri Benditovich <yuri.benditovich@daynix.com>
2
2
3
.dev_unplug_pending is set up by virtio-net code indepent of failover
3
https://bugzilla.redhat.com/show_bug.cgi?id=1829272
4
support was set for the device or not. This gives a wrong result when
4
When deleting queue pair, purge pending RX packets if any.
5
we check for existing primary devices in migration code.
5
Example of problematic flow:
6
1. Bring up q35 VM with tap (vhost off) and virtio-net or e1000e
7
2. Run ping flood to the VM NIC ( 1 ms interval)
8
3. Hot unplug the NIC device (device_del)
9
During unplug process one or more packets come, the NIC
10
can't receive, tap disables read_poll
11
4. Hot plug the device (device_add) with the same netdev
12
The tap stays with read_poll disabled and does not receive
13
any packets anymore (tap_send never triggered)
6
14
7
Fix this by actually calling dev_unplug_pending() instead of just
15
Signed-off-by: Yuri Benditovich <yuri.benditovich@daynix.com>
8
checking if the function pointer was set. When the feature was not
9
negotiated dev_unplug_pending() will always return false. This prevents
10
us from going into the wait-unplug state when there's no primary device
11
present.
12
13
Fixes: 9711cd0dfc3f ("net/virtio: add failover support")
14
Signed-off-by: Jens Freimann <jfreimann@redhat.com>
15
Reported-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
16
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
17
Signed-off-by: Jason Wang <jasowang@redhat.com>
16
Signed-off-by: Jason Wang <jasowang@redhat.com>
18
---
17
---
19
hw/net/virtio-net.c | 3 +++
18
net/net.c | 12 ++++++++----
20
migration/savevm.c | 3 ++-
19
1 file changed, 8 insertions(+), 4 deletions(-)
21
2 files changed, 5 insertions(+), 1 deletion(-)
22
20
23
diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
21
diff --git a/net/net.c b/net/net.c
24
index XXXXXXX..XXXXXXX 100644
22
index XXXXXXX..XXXXXXX 100644
25
--- a/hw/net/virtio-net.c
23
--- a/net/net.c
26
+++ b/hw/net/virtio-net.c
24
+++ b/net/net.c
27
@@ -XXX,XX +XXX,XX @@ static bool primary_unplug_pending(void *opaque)
25
@@ -XXX,XX +XXX,XX @@ void qemu_del_nic(NICState *nic)
28
VirtIODevice *vdev = VIRTIO_DEVICE(dev);
26
29
VirtIONet *n = VIRTIO_NET(vdev);
27
qemu_macaddr_set_free(&nic->conf->macaddr);
30
28
31
+ if (!virtio_vdev_has_feature(vdev, VIRTIO_NET_F_STANDBY)) {
29
- /* If this is a peer NIC and peer has already been deleted, free it now. */
32
+ return false;
30
- if (nic->peer_deleted) {
33
+ }
31
- for (i = 0; i < queues; i++) {
34
return n->primary_dev ? n->primary_dev->pending_deleted_event : false;
32
- qemu_free_net_client(qemu_get_subqueue(nic, i)->peer);
35
}
33
+ for (i = 0; i < queues; i++) {
36
34
+ NetClientState *nc = qemu_get_subqueue(nic, i);
37
diff --git a/migration/savevm.c b/migration/savevm.c
35
+ /* If this is a peer NIC and peer has already been deleted, free it now. */
38
index XXXXXXX..XXXXXXX 100644
36
+ if (nic->peer_deleted) {
39
--- a/migration/savevm.c
37
+ qemu_free_net_client(nc->peer);
40
+++ b/migration/savevm.c
38
+ } else if (nc->peer) {
41
@@ -XXX,XX +XXX,XX @@ int qemu_savevm_nr_failover_devices(void)
39
+ /* if there are RX packets pending, complete them */
42
int n = 0;
40
+ qemu_purge_queued_packets(nc->peer);
43
44
QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
45
- if (se->vmsd && se->vmsd->dev_unplug_pending) {
46
+ if (se->vmsd && se->vmsd->dev_unplug_pending &&
47
+ se->vmsd->dev_unplug_pending(se->opaque)) {
48
n++;
49
}
41
}
50
}
42
}
43
51
--
44
--
52
2.5.0
45
2.7.4
53
46
54
47
diff view generated by jsdifflib
1
From: Jens Freimann <jfreimann@redhat.com>
1
From: yuanjungong <ruc_gongyuanjun@163.com>
2
2
3
This fixes CID 1407222.
3
Close fd before returning.
4
4
5
Fixes: 9711cd0dfc3f ("net/virtio: add failover support")
5
Buglink: https://bugs.launchpad.net/qemu/+bug/1904486
6
Signed-off-by: Jens Freimann <jfreimann@redhat.com>
6
7
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
7
Signed-off-by: yuanjungong <ruc_gongyuanjun@163.com>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Jason Wang <jasowang@redhat.com>
9
Signed-off-by: Jason Wang <jasowang@redhat.com>
9
---
10
---
10
hw/net/virtio-net.c | 9 ++++++---
11
net/tap.c | 2 ++
11
1 file changed, 6 insertions(+), 3 deletions(-)
12
1 file changed, 2 insertions(+)
12
13
13
diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
14
diff --git a/net/tap.c b/net/tap.c
14
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/net/virtio-net.c
16
--- a/net/tap.c
16
+++ b/hw/net/virtio-net.c
17
+++ b/net/tap.c
17
@@ -XXX,XX +XXX,XX @@ static int virtio_net_primary_should_be_hidden(DeviceListener *listener,
18
@@ -XXX,XX +XXX,XX @@ int net_init_tap(const Netdev *netdev, const char *name,
18
QemuOpts *device_opts)
19
if (ret < 0) {
19
{
20
error_setg_errno(errp, -ret, "%s: Can't use file descriptor %d",
20
VirtIONet *n = container_of(listener, VirtIONet, primary_listener);
21
name, fd);
21
- bool match_found;
22
+ close(fd);
22
- bool hide;
23
return -1;
23
+ bool match_found = false;
24
}
24
+ bool hide = false;
25
25
26
@@ -XXX,XX +XXX,XX @@ int net_init_tap(const Netdev *netdev, const char *name,
26
+ if (!device_opts) {
27
vhostfdname, vnet_hdr, fd, &err);
27
+ return -1;
28
if (err) {
28
+ }
29
error_propagate(errp, err);
29
n->primary_device_dict = qemu_opts_to_qdict(device_opts,
30
+ close(fd);
30
n->primary_device_dict);
31
return -1;
31
if (n->primary_device_dict) {
32
}
32
@@ -XXX,XX +XXX,XX @@ static int virtio_net_primary_should_be_hidden(DeviceListener *listener,
33
} else if (tap->has_fds) {
33
n->standby_id = g_strdup(qdict_get_try_str(n->primary_device_dict,
34
"failover_pair_id"));
35
}
36
- if (device_opts && g_strcmp0(n->standby_id, n->netclient_name) == 0) {
37
+ if (g_strcmp0(n->standby_id, n->netclient_name) == 0) {
38
match_found = true;
39
} else {
40
match_found = false;
41
--
34
--
42
2.5.0
35
2.7.4
43
36
44
37
diff view generated by jsdifflib
1
From: Jens Freimann <jfreimann@redhat.com>
1
From: Keqian Zhu <zhukeqian1@huawei.com>
2
2
3
Bail out when primary device was already added before.
3
Fixes: 63c4db4c2e6d (net: relocate paths to helpers and scripts)
4
This avoids printing a wrong warning message during reboot.
4
Signed-off-by: Keqian Zhu <zhukeqian1@huawei.com>
5
6
Fixes: 9711cd0dfc3f ("net/virtio: add failover support")
7
Signed-off-by: Jens Freimann <jfreimann@redhat.com>
8
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
9
Signed-off-by: Jason Wang <jasowang@redhat.com>
5
Signed-off-by: Jason Wang <jasowang@redhat.com>
10
---
6
---
11
hw/net/virtio-net.c | 4 ++++
7
net/tap.c | 3 ++-
12
1 file changed, 4 insertions(+)
8
1 file changed, 2 insertions(+), 1 deletion(-)
13
9
14
diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
10
diff --git a/net/tap.c b/net/tap.c
15
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/net/virtio-net.c
12
--- a/net/tap.c
17
+++ b/hw/net/virtio-net.c
13
+++ b/net/tap.c
18
@@ -XXX,XX +XXX,XX @@ static void failover_add_primary(VirtIONet *n, Error **errp)
14
@@ -XXX,XX +XXX,XX @@ free_fail:
19
{
15
script = default_script = get_relocated_path(DEFAULT_NETWORK_SCRIPT);
20
Error *err = NULL;
16
}
21
17
if (!downscript) {
22
+ if (n->primary_dev) {
18
- downscript = default_downscript = get_relocated_path(DEFAULT_NETWORK_SCRIPT);
23
+ return;
19
+ downscript = default_downscript =
24
+ }
20
+ get_relocated_path(DEFAULT_NETWORK_DOWN_SCRIPT);
25
+
21
}
26
n->primary_device_opts = qemu_opts_find(qemu_find_opts("device"),
22
27
n->primary_device_id);
23
if (tap->has_ifname) {
28
if (n->primary_device_opts) {
29
--
24
--
30
2.5.0
25
2.7.4
31
26
32
27
diff view generated by jsdifflib