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
This commit is contained in:
		
							parent
							
								
									d6aa671f18
								
							
						
					
					
						commit
						436e5e53c9
					
				@ -1516,6 +1516,7 @@ static const term_cmd_t term_cmds[] = {
 | 
				
			|||||||
      "value", "set maximum speed (in bytes) for migrations" },
 | 
					      "value", "set maximum speed (in bytes) for migrations" },
 | 
				
			||||||
    { "balloon", "i", do_balloon,
 | 
					    { "balloon", "i", do_balloon,
 | 
				
			||||||
      "target", "request VM to change it's memory allocation (in MB)" },
 | 
					      "target", "request VM to change it's memory allocation (in MB)" },
 | 
				
			||||||
 | 
					    { "set_link", "ss", do_set_link, "name [up|down]" },
 | 
				
			||||||
    { NULL, NULL, },
 | 
					    { NULL, NULL, },
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										31
									
								
								net.c
									
									
									
									
									
								
							
							
						
						
									
										31
									
								
								net.c
									
									
									
									
									
								
							@ -387,12 +387,15 @@ void qemu_send_packet(VLANClientState *vc1, const uint8_t *buf, int size)
 | 
				
			|||||||
    VLANState *vlan = vc1->vlan;
 | 
					    VLANState *vlan = vc1->vlan;
 | 
				
			||||||
    VLANClientState *vc;
 | 
					    VLANClientState *vc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (vc1->link_down)
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef DEBUG_NET
 | 
					#ifdef DEBUG_NET
 | 
				
			||||||
    printf("vlan %d send:\n", vlan->id);
 | 
					    printf("vlan %d send:\n", vlan->id);
 | 
				
			||||||
    hex_dump(stdout, buf, size);
 | 
					    hex_dump(stdout, buf, size);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
    for(vc = vlan->first_client; vc != NULL; vc = vc->next) {
 | 
					    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);
 | 
					            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)
 | 
					void net_cleanup(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    VLANState *vlan;
 | 
					    VLANState *vlan;
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										2
									
								
								net.h
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								net.h
									
									
									
									
									
								
							@ -15,6 +15,7 @@ struct VLANClientState {
 | 
				
			|||||||
    /* Packets may still be sent if this returns zero.  It's used to
 | 
					    /* Packets may still be sent if this returns zero.  It's used to
 | 
				
			||||||
       rate-limit the slirp code.  */
 | 
					       rate-limit the slirp code.  */
 | 
				
			||||||
    IOCanRWHandler *fd_can_read;
 | 
					    IOCanRWHandler *fd_can_read;
 | 
				
			||||||
 | 
					    int link_down;
 | 
				
			||||||
    void *opaque;
 | 
					    void *opaque;
 | 
				
			||||||
    struct VLANClientState *next;
 | 
					    struct VLANClientState *next;
 | 
				
			||||||
    struct VLANState *vlan;
 | 
					    struct VLANState *vlan;
 | 
				
			||||||
@ -46,6 +47,7 @@ void qemu_format_nic_info_str(VLANClientState *vc, uint8_t macaddr[6]);
 | 
				
			|||||||
void qemu_handler_true(void *opaque);
 | 
					void qemu_handler_true(void *opaque);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void do_info_network(void);
 | 
					void do_info_network(void);
 | 
				
			||||||
 | 
					int do_set_link(const char *name, const char *up_or_down);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* NIC info */
 | 
					/* NIC info */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user