Commit 436e5e53c97d8fb469306b18a0c31dc60f5e546c
1 parent
d6aa671f
Add 'set_link' monitor command (Mark McLoughlin)
Add a monitor command to setting a given network device's link status to 'up' or 'down'. Allows simulation of network cable disconnect. Signed-off-by: Mark McLoughlin <markmc@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6247 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
3 changed files
with
33 additions
and
1 deletions
monitor.c
@@ -1516,6 +1516,7 @@ static const term_cmd_t term_cmds[] = { | @@ -1516,6 +1516,7 @@ static const term_cmd_t term_cmds[] = { | ||
1516 | "value", "set maximum speed (in bytes) for migrations" }, | 1516 | "value", "set maximum speed (in bytes) for migrations" }, |
1517 | { "balloon", "i", do_balloon, | 1517 | { "balloon", "i", do_balloon, |
1518 | "target", "request VM to change it's memory allocation (in MB)" }, | 1518 | "target", "request VM to change it's memory allocation (in MB)" }, |
1519 | + { "set_link", "ss", do_set_link, "name [up|down]" }, | ||
1519 | { NULL, NULL, }, | 1520 | { NULL, NULL, }, |
1520 | }; | 1521 | }; |
1521 | 1522 |
net.c
@@ -387,12 +387,15 @@ void qemu_send_packet(VLANClientState *vc1, const uint8_t *buf, int size) | @@ -387,12 +387,15 @@ void qemu_send_packet(VLANClientState *vc1, const uint8_t *buf, int size) | ||
387 | VLANState *vlan = vc1->vlan; | 387 | VLANState *vlan = vc1->vlan; |
388 | VLANClientState *vc; | 388 | VLANClientState *vc; |
389 | 389 | ||
390 | + if (vc1->link_down) | ||
391 | + return; | ||
392 | + | ||
390 | #ifdef DEBUG_NET | 393 | #ifdef DEBUG_NET |
391 | printf("vlan %d send:\n", vlan->id); | 394 | printf("vlan %d send:\n", vlan->id); |
392 | hex_dump(stdout, buf, size); | 395 | hex_dump(stdout, buf, size); |
393 | #endif | 396 | #endif |
394 | for(vc = vlan->first_client; vc != NULL; vc = vc->next) { | 397 | for(vc = vlan->first_client; vc != NULL; vc = vc->next) { |
395 | - if (vc != vc1) { | 398 | + if (vc != vc1 && !vc->link_down) { |
396 | vc->fd_read(vc->opaque, buf, size); | 399 | vc->fd_read(vc->opaque, buf, size); |
397 | } | 400 | } |
398 | } | 401 | } |
@@ -1692,6 +1695,32 @@ void do_info_network(void) | @@ -1692,6 +1695,32 @@ void do_info_network(void) | ||
1692 | } | 1695 | } |
1693 | } | 1696 | } |
1694 | 1697 | ||
1698 | +int do_set_link(const char *name, const char *up_or_down) | ||
1699 | +{ | ||
1700 | + VLANState *vlan; | ||
1701 | + VLANClientState *vc = NULL; | ||
1702 | + | ||
1703 | + for (vlan = first_vlan; vlan != NULL; vlan = vlan->next) | ||
1704 | + for (vc = vlan->first_client; vc != NULL; vc = vc->next) | ||
1705 | + if (strcmp(vc->name, name) == 0) | ||
1706 | + break; | ||
1707 | + | ||
1708 | + if (!vc) { | ||
1709 | + term_printf("could not find network device '%s'", name); | ||
1710 | + return 0; | ||
1711 | + } | ||
1712 | + | ||
1713 | + if (strcmp(up_or_down, "up") == 0) | ||
1714 | + vc->link_down = 0; | ||
1715 | + else if (strcmp(up_or_down, "down") == 0) | ||
1716 | + vc->link_down = 1; | ||
1717 | + else | ||
1718 | + term_printf("invalid link status '%s'; only 'up' or 'down' valid\n", | ||
1719 | + up_or_down); | ||
1720 | + | ||
1721 | + return 1; | ||
1722 | +} | ||
1723 | + | ||
1695 | void net_cleanup(void) | 1724 | void net_cleanup(void) |
1696 | { | 1725 | { |
1697 | VLANState *vlan; | 1726 | VLANState *vlan; |
net.h
@@ -15,6 +15,7 @@ struct VLANClientState { | @@ -15,6 +15,7 @@ struct VLANClientState { | ||
15 | /* Packets may still be sent if this returns zero. It's used to | 15 | /* Packets may still be sent if this returns zero. It's used to |
16 | rate-limit the slirp code. */ | 16 | rate-limit the slirp code. */ |
17 | IOCanRWHandler *fd_can_read; | 17 | IOCanRWHandler *fd_can_read; |
18 | + int link_down; | ||
18 | void *opaque; | 19 | void *opaque; |
19 | struct VLANClientState *next; | 20 | struct VLANClientState *next; |
20 | struct VLANState *vlan; | 21 | struct VLANState *vlan; |
@@ -46,6 +47,7 @@ void qemu_format_nic_info_str(VLANClientState *vc, uint8_t macaddr[6]); | @@ -46,6 +47,7 @@ void qemu_format_nic_info_str(VLANClientState *vc, uint8_t macaddr[6]); | ||
46 | void qemu_handler_true(void *opaque); | 47 | void qemu_handler_true(void *opaque); |
47 | 48 | ||
48 | void do_info_network(void); | 49 | void do_info_network(void); |
50 | +int do_set_link(const char *name, const char *up_or_down); | ||
49 | 51 | ||
50 | /* NIC info */ | 52 | /* NIC info */ |
51 | 53 |