From: Lei Xia Date: Thu, 27 Jan 2011 17:38:20 +0000 (-0600) Subject: Deinit code of VNET and VNET-NIC device X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=commitdiff_plain;h=906a0bf4003eb267398462dbc834b0ab85bca13a;p=palacios.git Deinit code of VNET and VNET-NIC device --- diff --git a/palacios/include/palacios/vmm_vnet.h b/palacios/include/palacios/vmm_vnet.h index baeb15a..040006d 100644 --- a/palacios/include/palacios/vmm_vnet.h +++ b/palacios/include/palacios/vmm_vnet.h @@ -13,7 +13,7 @@ * All rights reserved. * * Author: Lei Xia - * Yuan Tang + * Yuan Tang * * This is free software. You are permitted to use, * redistribute, and modify it as specified in the file "V3VEE_LICENSE". @@ -101,7 +101,10 @@ struct v3_vnet_bridge_ops { }; int v3_init_vnet(void); +void v3_deinit_vnet(void); + int v3_vnet_send_pkt(struct v3_vnet_pkt * pkt, void * private_data); + void v3_vnet_poll(struct v3_vm_info * vm); int v3_vnet_add_route(struct v3_vnet_route route); @@ -109,9 +112,12 @@ int v3_vnet_add_bridge(struct v3_vm_info * vm, struct v3_vnet_bridge_ops * ops, uint8_t type, void * priv_data); + + int v3_vnet_add_dev(struct v3_vm_info * info, uint8_t mac[6], struct v3_vnet_dev_ops * ops, void * priv_data); +int v3_vnet_del_dev(int dev_id); #endif diff --git a/palacios/src/devices/nic_bridge.c b/palacios/src/devices/nic_bridge.c index 87993cb..e70d7a1 100644 --- a/palacios/src/devices/nic_bridge.c +++ b/palacios/src/devices/nic_bridge.c @@ -37,7 +37,6 @@ struct nic_bridge_state { static int bridge_send(uint8_t * buf, uint32_t len, void * private_data) { - //struct nic_bridge_state *bridge = (struct nic_bridge_state *)private_data; #ifdef CONFIG_DEBUG_NIC_BRIDGE { diff --git a/palacios/src/devices/vnet_nic.c b/palacios/src/devices/vnet_nic.c index 526da07..2a2ae6d 100644 --- a/palacios/src/devices/vnet_nic.c +++ b/palacios/src/devices/vnet_nic.c @@ -72,7 +72,7 @@ static int vnet_nic_send(uint8_t * buf, uint32_t len, { PrintDebug("VNET-NIC: send pkt (size: %d, src_id: %d, src_type: %d)\n", pkt.size, pkt.src_id, pkt.src_type); - //v3_hexdump(buf, len, NULL, 0); + v3_hexdump(buf, len, NULL, 0); } #endif @@ -118,9 +118,10 @@ static void stop_tx(void * private_data){ static int vnet_nic_free(struct vnet_nic_state * vnetnic) { - + v3_vnet_del_dev(vnetnic->vnet_dev_id); V3_Free(vnetnic); + return 0; } @@ -136,17 +137,6 @@ static struct v3_vnet_dev_ops vnet_dev_ops = { .stop_tx = stop_tx, }; - -static int register_to_vnet(struct v3_vm_info * vm, - struct vnet_nic_state * vnet_nic, - char * dev_name, uchar_t mac[6]) { - - PrintDebug("Vnet-nic: register Vnet-nic device %s, state %p to VNET\n", dev_name, vnet_nic); - - return v3_vnet_add_dev(vm, mac, &vnet_dev_ops, (void *)vnet_nic); -} - - static int str2mac(char * macstr, char mac[6]){ char hex[2], *s = macstr; int i = 0; @@ -172,9 +162,8 @@ static int vnet_nic_init(struct v3_vm_info * vm, v3_cfg_tree_t * cfg) { v3_cfg_tree_t * frontend_cfg = v3_cfg_subtree(cfg, "frontend"); macstr = v3_cfg_val(frontend_cfg, "mac"); - if (macstr == NULL) { - PrintDebug("Vnet-nic: No Mac specified\n"); - } else { + if (macstr != NULL) { + PrintDebug("Vnet-nic: Mac specified %s\n", macstr); str2mac(macstr, mac); } @@ -182,7 +171,6 @@ static int vnet_nic_init(struct v3_vm_info * vm, v3_cfg_tree_t * cfg) { memset(vnetnic, 0, sizeof(struct vnet_nic_state)); struct vm_device * dev = v3_add_device(vm, dev_id, &dev_ops, vnetnic); - if (dev == NULL) { PrintError("Could not attach device %s\n", dev_id); V3_Free(vnetnic); @@ -206,12 +194,11 @@ static int vnet_nic_init(struct v3_vm_info * vm, v3_cfg_tree_t * cfg) { PrintDebug("Vnet-nic: Connect %s to frontend %s\n", dev_id, v3_cfg_val(frontend_cfg, "tag")); - if ((vnet_dev_id = register_to_vnet(vm, vnetnic, dev_id, vnetnic->mac)) == -1) { + if ((vnet_dev_id = v3_vnet_add_dev(vm, vnetnic->mac, &vnet_dev_ops, (void *)vnetnic)) == -1) { PrintError("Vnet-nic device %s (mac: %s) fails to registered to VNET\n", dev_id, macstr); v3_remove_device(dev); return 0; } - vnetnic->vnet_dev_id = vnet_dev_id; PrintDebug("Vnet-nic device %s (mac: %s, %ld) registered to VNET\n", @@ -219,7 +206,7 @@ static int vnet_nic_init(struct v3_vm_info * vm, v3_cfg_tree_t * cfg) { //for temporary hack for vnet bridge test -#if 1 +#if 0 { uchar_t zeromac[6] = {0,0,0,0,0,0}; diff --git a/palacios/src/palacios/vmm_vnet_core.c b/palacios/src/palacios/vmm_vnet_core.c index 2412120..60b5569 100644 --- a/palacios/src/palacios/vmm_vnet_core.c +++ b/palacios/src/palacios/vmm_vnet_core.c @@ -498,7 +498,7 @@ int v3_vnet_add_dev(struct v3_vm_info * vm, uint8_t mac[6], /* if the device was found previosly the id should still be 0 */ if (new_dev->dev_id == 0) { - PrintError("Device Alrady exists\n"); + PrintError("Device Already exists\n"); return -1; } @@ -508,6 +508,48 @@ int v3_vnet_add_dev(struct v3_vm_info * vm, uint8_t mac[6], } + +int v3_vnet_del_dev(int dev_id){ + struct vnet_dev * dev = NULL; + unsigned long flags; + + flags = v3_lock_irqsave(vnet_state.lock); + + dev = find_dev_by_id(dev_id); + if (dev != NULL){ + list_del(&(dev->node)); + } + + v3_unlock_irqrestore(vnet_state.lock, flags); + + V3_Free(dev); + + PrintDebug("Vnet: Remove Device: dev_id %d\n", dev_id); + + return 0; +} + + +static void free_devices(){ + struct vnet_dev * dev = NULL; + + list_for_each_entry(dev, &(vnet_state.devs), node) { + list_del(&(dev->node)); + V3_Free(dev); + } +} + +static void free_routes(){ + struct vnet_route_info * route = NULL; + + list_for_each_entry(route, &(vnet_state.routes), node) { + list_del(&(route->node)); + list_del(&(route->match_node)); + V3_Free(route); + } +} + + void v3_vnet_poll(struct v3_vm_info * vm){ struct vnet_dev * dev = NULL; struct vnet_brg_dev *bridge = vnet_state.bridge; @@ -604,3 +646,17 @@ int v3_init_vnet() { return 0; } + + +void v3_deinit_vnet(){ + + v3_lock_deinit(&(vnet_state.lock)); + + free_devices(); + free_routes(); + + v3_free_htable(vnet_state.route_cache, 1, 1); + V3_Free(vnet_state.bridge); +} + +