summaryrefslogtreecommitdiff
path: root/net.c
diff options
context:
space:
mode:
authorJan Kiszka <jan.kiszka@siemens.com>2009-06-24 14:42:31 +0200
committerAnthony Liguori <aliguori@us.ibm.com>2009-06-29 08:52:50 -0500
commit1a609520277c65a2b00bbbcca360f482e257d64d (patch)
treedd6a0cfc734009808ff41608b9be6026a0f1b468 /net.c
parent28432466f3a80e4d267754f426436c92c58921b5 (diff)
downloadqemu-1a609520277c65a2b00bbbcca360f482e257d64d.tar.gz
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>
Diffstat (limited to 'net.c')
-rw-r--r--net.c44
1 files changed, 32 insertions, 12 deletions
diff --git a/net.c b/net.c
index 4c434cfcb8..918379428c 100644
--- a/net.c
+++ b/net.c
@@ -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)) {