X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fvnet%2Fvnet_core.c;h=b82c905b6aa1f8954a0c025e01dc3146c39d7d61;hb=b21326f1dd2bcd45a3067169e0a328316312b3f1;hp=946de1fa1ff48a3d30f8b2642336210016aacd16;hpb=6cff7c8b0ec58e3b94d9583f709ca9056ae928dd;p=palacios.git diff --git a/palacios/src/vnet/vnet_core.c b/palacios/src/vnet/vnet_core.c index 946de1f..b82c905 100644 --- a/palacios/src/vnet/vnet_core.c +++ b/palacios/src/vnet/vnet_core.c @@ -29,7 +29,7 @@ #define Vnet_Debug(fmt, args...) #endif -int vnet_debug = 0; +int net_debug = 0; struct eth_hdr { uint8_t dst_mac[ETH_ALEN]; @@ -66,6 +66,8 @@ struct vnet_route_info { struct vnet_dev * dst_dev; struct vnet_dev * src_dev; + uint32_t idx; + struct list_head node; struct list_head match_node; // used for route matching }; @@ -88,18 +90,22 @@ struct queue_entry{ #define VNET_QUEUE_SIZE 1024 struct vnet_queue { - struct queue_entry buf[VNET_QUEUE_SIZE]; - int head, tail; - int count; - vnet_lock_t lock; + struct queue_entry buf[VNET_QUEUE_SIZE]; + int head, tail; + int count; + vnet_lock_t lock; }; static struct { struct list_head routes; struct list_head devs; - - int num_routes; - int num_devs; + + uint8_t status; + + uint32_t num_routes; + uint32_t route_idx; + uint32_t num_devs; + uint32_t dev_idx; struct vnet_brg_dev * bridge; @@ -115,7 +121,7 @@ static struct { #ifdef V3_CONFIG_DEBUG_VNET -static inline void mac_to_string(uint8_t * mac, char * buf) { +static inline void mac2str(uint8_t * mac, char * buf) { snprintf(buf, 100, "%2x:%2x:%2x:%2x:%2x:%2x", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); @@ -124,10 +130,10 @@ static inline void mac_to_string(uint8_t * mac, char * buf) { static void print_route(struct v3_vnet_route * route){ char str[50]; - mac_to_string(route->src_mac, str); + mac2str(route->src_mac, str); Vnet_Debug("Src Mac (%s), src_qual (%d)\n", str, route->src_mac_qual); - mac_to_string(route->dst_mac, str); + mac2str(route->dst_mac, str); Vnet_Debug("Dst Mac (%s), dst_qual (%d)\n", str, route->dst_mac_qual); Vnet_Debug("Src dev id (%d), src type (%d)", @@ -141,10 +147,9 @@ static void print_route(struct v3_vnet_route * route){ static void dump_routes(){ struct vnet_route_info *route; - int i = 0; Vnet_Debug("\n========Dump routes starts ============\n"); list_for_each_entry(route, &(vnet_state.routes), node) { - Vnet_Debug("\nroute %d:\n", i++); + Vnet_Debug("\nroute %d:\n", route->idx); print_route(&(route->route_def)); if (route->route_def.dst_type == LINK_INTERFACE) { @@ -274,16 +279,42 @@ int v3_vnet_add_route(struct v3_vnet_route route) { flags = vnet_lock_irqsave(vnet_state.lock); list_add(&(new_route->node), &(vnet_state.routes)); - clear_hash_cache(); - + new_route->idx = ++ vnet_state.route_idx; + vnet_state.num_routes ++; + vnet_unlock_irqrestore(vnet_state.lock, flags); - + + clear_hash_cache(); #ifdef V3_CONFIG_DEBUG_VNET dump_routes(); #endif - return 0; + return new_route->idx; +} + + +void v3_vnet_del_route(uint32_t route_idx){ + struct vnet_route_info * route = NULL; + unsigned long flags; + + flags = vnet_lock_irqsave(vnet_state.lock); + + list_for_each_entry(route, &(vnet_state.routes), node) { + V3_Print("v3_vnet_del_route, route idx: %d\n", route->idx); + if(route->idx == route_idx){ + list_del(&(route->node)); + Vnet_Free(route); + break; + } + } + + vnet_unlock_irqrestore(vnet_state.lock, flags); + clear_hash_cache(); + +#ifdef V3_CONFIG_DEBUG_VNET + dump_routes(); +#endif } @@ -319,7 +350,7 @@ static struct route_list * match_route(const struct v3_vnet_pkt * pkt) { int max_rank = 0; struct list_head match_list; struct eth_hdr * hdr = (struct eth_hdr *)(pkt->data); - // uint8_t src_type = pkt->src_type; + // uint8_t src_type = pkt->src_type; // uint32_t src_link = pkt->src_id; #ifdef V3_CONFIG_DEBUG_VNET @@ -327,8 +358,8 @@ static struct route_list * match_route(const struct v3_vnet_pkt * pkt) { char dst_str[100]; char src_str[100]; - mac_to_string(hdr->src_mac, src_str); - mac_to_string(hdr->dst_mac, dst_str); + mac2str(hdr->src_mac, src_str); + mac2str(hdr->dst_mac, dst_str); Vnet_Debug("VNET/P Core: match_route. pkt: SRC(%s), DEST(%s)\n", src_str, dst_str); } #endif @@ -423,7 +454,7 @@ static struct route_list * match_route(const struct v3_vnet_pkt * pkt) { } matches = (struct route_list *)Vnet_Malloc(sizeof(struct route_list) + - (sizeof(struct vnet_route_info *) * num_matches)); + (sizeof(struct vnet_route_info *) * num_matches)); matches->num_routes = num_matches; @@ -447,7 +478,7 @@ int vnet_tx_one_pkt(struct v3_vnet_pkt * pkt, void * private_data) { Vnet_Print(2, "VNET/P Core: cpu %d: pkt (size %d, src_id:%d, src_type: %d, dst_id: %d, dst_type: %d)\n", cpu, pkt->size, pkt->src_id, pkt->src_type, pkt->dst_id, pkt->dst_type); - if(vnet_debug >= 4){ + if(net_debug >= 4){ v3_hexdump(pkt->data, pkt->size, NULL, 0); } @@ -485,7 +516,7 @@ int vnet_tx_one_pkt(struct v3_vnet_pkt * pkt, void * private_data) { if (bridge == NULL) { Vnet_Print(2, "VNET/P Core: No active bridge to sent data to\n"); - continue; + continue; } if(bridge->brg_ops.input(bridge->vm, pkt, bridge->private_data) < 0){ @@ -567,7 +598,7 @@ int v3_vnet_send_pkt(struct v3_vnet_pkt * pkt, void * private_data, int synchron vnet_tx_one_pkt(pkt, NULL); }else { vnet_pkt_enqueue(pkt); - Vnet_Print(2, "VNET/P Core: Put pkt into Queue: pkt size %d\n", pkt->size); + Vnet_Print(2, "VNET/P Core: Put pkt into Queue: pkt size %d\n", pkt->size); } return 0; @@ -596,7 +627,8 @@ int v3_vnet_add_dev(struct v3_vm_info * vm, uint8_t * mac, if (dev_by_mac(mac) == NULL) { list_add(&(new_dev->node), &(vnet_state.devs)); - new_dev->dev_id = ++vnet_state.num_devs; + new_dev->dev_id = ++ vnet_state.dev_idx; + vnet_state.num_devs ++; } vnet_unlock_irqrestore(vnet_state.lock, flags); @@ -622,7 +654,8 @@ int v3_vnet_del_dev(int dev_id){ dev = dev_by_id(dev_id); if (dev != NULL){ list_del(&(dev->node)); - del_routes_by_dev(dev_id); + //del_routes_by_dev(dev_id); + vnet_state.num_devs --; } vnet_unlock_irqrestore(vnet_state.lock, flags); @@ -636,7 +669,6 @@ int v3_vnet_del_dev(int dev_id){ int v3_vnet_stat(struct vnet_stat * stats){ - stats->rx_bytes = vnet_state.stats.rx_bytes; stats->rx_pkts = vnet_state.stats.rx_pkts; stats->tx_bytes = vnet_state.stats.tx_bytes; @@ -645,7 +677,7 @@ int v3_vnet_stat(struct vnet_stat * stats){ return 0; } -static void free_devices(){ +static void deinit_devices_list(){ struct vnet_dev * dev = NULL; list_for_each_entry(dev, &(vnet_state.devs), node) { @@ -654,7 +686,7 @@ static void free_devices(){ } } -static void free_routes(){ +static void deinit_routes_list(){ struct vnet_route_info * route = NULL; list_for_each_entry(route, &(vnet_state.routes), node) { @@ -706,6 +738,26 @@ int v3_vnet_add_bridge(struct v3_vm_info * vm, return 0; } + +void v3_vnet_del_bridge(uint8_t type) { + unsigned long flags; + struct vnet_brg_dev * tmp_bridge = NULL; + + flags = vnet_lock_irqsave(vnet_state.lock); + + if (vnet_state.bridge != NULL && vnet_state.bridge->type == type) { + tmp_bridge = vnet_state.bridge; + vnet_state.bridge = NULL; + } + + vnet_unlock_irqrestore(vnet_state.lock, flags); + + if (tmp_bridge) { + Vnet_Free(tmp_bridge); + } +} + + static int vnet_tx_flush(void *args){ unsigned long flags; struct queue_entry * entry; @@ -774,8 +826,8 @@ void v3_deinit_vnet(){ vnet_lock_deinit(&(vnet_state.lock)); - free_devices(); - free_routes(); + deinit_devices_list(); + deinit_routes_list(); vnet_free_htable(vnet_state.route_cache, 1, 1); Vnet_Free(vnet_state.bridge);