diff options
author | Jan Kiszka <jan.kiszka@siemens.com> | 2009-06-24 14:42:31 +0200 |
---|---|---|
committer | Anthony Liguori <aliguori@us.ibm.com> | 2009-06-29 08:52:50 -0500 |
commit | 1a609520277c65a2b00bbbcca360f482e257d64d (patch) | |
tree | dd6a0cfc734009808ff41608b9be6026a0f1b468 | |
parent | 28432466f3a80e4d267754f426436c92c58921b5 (diff) |
net: Provide VLAN client lookup helper
Introduce qemu_find_vlan_client_by_name for VLANClientState lookup based
on VLAN ID and client name. This is useful for monitor commands.
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
-rw-r--r-- | hw/xen_nic.c | 2 | ||||
-rw-r--r-- | net.c | 44 | ||||
-rw-r--r-- | net.h | 2 |
3 files changed, 34 insertions, 14 deletions
diff --git a/hw/xen_nic.c b/hw/xen_nic.c index e4f71f7f63..4377ed15d6 100644 --- a/hw/xen_nic.c +++ b/hw/xen_nic.c @@ -301,7 +301,7 @@ static int net_init(struct XenDevice *xendev) if (netdev->mac == NULL) return -1; - vlan = qemu_find_vlan(netdev->xendev.dev); + vlan = qemu_find_vlan(netdev->xendev.dev, 1); netdev->vs = qemu_new_vlan_client(vlan, "xen", NULL, net_rx_ok, net_rx_packet, NULL, NULL, netdev); @@ -389,6 +389,32 @@ VLANClientState *qemu_find_vlan_client(VLANState *vlan, void *opaque) return NULL; } +static VLANClientState * +qemu_find_vlan_client_by_name(Monitor *mon, int vlan_id, + const char *client_str) +{ + VLANState *vlan; + VLANClientState *vc; + + vlan = qemu_find_vlan(vlan_id, 0); + if (!vlan) { + monitor_printf(mon, "unknown VLAN %d\n", vlan_id); + return NULL; + } + + for (vc = vlan->first_client; vc != NULL; vc = vc->next) { + if (!strcmp(vc->name, client_str)) { + break; + } + } + if (!vc) { + monitor_printf(mon, "can't find device %s on VLAN %d\n", + client_str, vlan_id); + } + + return vc; +} + int qemu_can_send_packet(VLANClientState *sender) { VLANState *vlan = sender->vlan; @@ -2255,13 +2281,16 @@ static int net_dump_init(Monitor *mon, VLANState *vlan, const char *device, } /* find or alloc a new VLAN */ -VLANState *qemu_find_vlan(int id) +VLANState *qemu_find_vlan(int id, int allocate) { VLANState **pvlan, *vlan; for(vlan = first_vlan; vlan != NULL; vlan = vlan->next) { if (vlan->id == id) return vlan; } + if (!allocate) { + return NULL; + } vlan = qemu_mallocz(sizeof(VLANState)); vlan->id = id; vlan->next = NULL; @@ -2327,7 +2356,7 @@ int net_client_init(Monitor *mon, const char *device, const char *p) if (get_param_value(buf, sizeof(buf), "vlan", p)) { vlan_id = strtol(buf, NULL, 0); } - vlan = qemu_find_vlan(vlan_id); + vlan = qemu_find_vlan(vlan_id, 1); if (get_param_value(buf, sizeof(buf), "name", p)) { name = qemu_strdup(buf); @@ -2740,19 +2769,10 @@ void net_host_device_add(Monitor *mon, const char *device, const char *opts) void net_host_device_remove(Monitor *mon, int vlan_id, const char *device) { - VLANState *vlan; VLANClientState *vc; - vlan = qemu_find_vlan(vlan_id); - - for (vc = vlan->first_client; vc != NULL; vc = vc->next) { - if (!strcmp(vc->name, device)) { - break; - } - } - + vc = qemu_find_vlan_client_by_name(mon, vlan_id, device); if (!vc) { - monitor_printf(mon, "can't find device %s\n", device); return; } if (!net_host_check_device(vc->model)) { @@ -51,7 +51,7 @@ struct VLANState { int delivering; }; -VLANState *qemu_find_vlan(int id); +VLANState *qemu_find_vlan(int id, int allocate); VLANClientState *qemu_new_vlan_client(VLANState *vlan, const char *model, const char *name, |