diff options
author | aliguori <aliguori@c046a42c-6fe2-441c-8c8c-71466251a162> | 2009-01-08 19:44:06 +0000 |
---|---|---|
committer | aliguori <aliguori@c046a42c-6fe2-441c-8c8c-71466251a162> | 2009-01-08 19:44:06 +0000 |
commit | 436e5e53c97d8fb469306b18a0c31dc60f5e546c (patch) | |
tree | 9d363b2f113f5323fbf7f8f5afbb3792283b2d44 /net.c | |
parent | d6aa671f1853cc5589c180861c720ff04af13738 (diff) |
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
Diffstat (limited to 'net.c')
-rw-r--r-- | net.c | 31 |
1 files changed, 30 insertions, 1 deletions
@@ -387,12 +387,15 @@ void qemu_send_packet(VLANClientState *vc1, const uint8_t *buf, int size) VLANState *vlan = vc1->vlan; VLANClientState *vc; + if (vc1->link_down) + return; + #ifdef DEBUG_NET printf("vlan %d send:\n", vlan->id); hex_dump(stdout, buf, size); #endif for(vc = vlan->first_client; vc != NULL; vc = vc->next) { - if (vc != vc1) { + if (vc != vc1 && !vc->link_down) { vc->fd_read(vc->opaque, buf, size); } } @@ -1692,6 +1695,32 @@ void do_info_network(void) } } +int do_set_link(const char *name, const char *up_or_down) +{ + VLANState *vlan; + VLANClientState *vc = NULL; + + for (vlan = first_vlan; vlan != NULL; vlan = vlan->next) + for (vc = vlan->first_client; vc != NULL; vc = vc->next) + if (strcmp(vc->name, name) == 0) + break; + + if (!vc) { + term_printf("could not find network device '%s'", name); + return 0; + } + + if (strcmp(up_or_down, "up") == 0) + vc->link_down = 0; + else if (strcmp(up_or_down, "down") == 0) + vc->link_down = 1; + else + term_printf("invalid link status '%s'; only 'up' or 'down' valid\n", + up_or_down); + + return 1; +} + void net_cleanup(void) { VLANState *vlan; |