]> git.proxmox.com Git - qemu.git/commitdiff
net: Provide VLAN client lookup helper
authorJan Kiszka <jan.kiszka@siemens.com>
Wed, 24 Jun 2009 12:42:31 +0000 (14:42 +0200)
committerAnthony Liguori <aliguori@us.ibm.com>
Mon, 29 Jun 2009 13:52:50 +0000 (08:52 -0500)
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>
hw/xen_nic.c
net.c
net.h

index e4f71f7f63f6762f94ef40c2514b594f9441de12..4377ed15d62263a8ed7ade97b3ed3a93e6505f2e 100644 (file)
@@ -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);
diff --git a/net.c b/net.c
index 4c434cfcb8120432fc60790a5582e337783b57e1..918379428cd606260e5ae2c06b0fe72c49736f7e 100644 (file)
--- 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)) {
diff --git a/net.h b/net.h
index 6702f4227902e62c113cd66512f4dc3248023966..a5ae730a5295c9baa7b7a5835049dcfd0b57b234 100644 (file)
--- a/net.h
+++ b/net.h
@@ -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,