X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmm_vnet_core.c;h=18720b10962b22c957a2641d91a8d39c3f46f2eb;hb=5e81abea907908ab9bdc0cb57a3537f05db77b5e;hp=60b5569b68a822d1254bf53a40ee88a4825e2f75;hpb=906a0bf4003eb267398462dbc834b0ab85bca13a;p=palacios.git diff --git a/palacios/src/palacios/vmm_vnet_core.c b/palacios/src/palacios/vmm_vnet_core.c index 60b5569..18720b1 100644 --- a/palacios/src/palacios/vmm_vnet_core.c +++ b/palacios/src/palacios/vmm_vnet_core.c @@ -264,6 +264,27 @@ int v3_vnet_add_route(struct v3_vnet_route route) { } +/* delete all route entries with specfied src or dst device id */ +static void inline del_routes(int dev_id){ + struct vnet_route_info * route = NULL; + unsigned long flags; + + flags = v3_lock_irqsave(vnet_state.lock); + + list_for_each_entry(route, &(vnet_state.routes), node) { + if((route->route_def.dst_type == LINK_INTERFACE && + route->route_def.dst_id == dev_id) || + (route->route_def.src_type == LINK_INTERFACE && + route->route_def.src_id == dev_id)){ + + list_del(&(route->node)); + list_del(&(route->match_node)); + V3_Free(route); + } + } + + v3_unlock_irqrestore(vnet_state.lock, flags); +} /* At the end allocate a route_list * This list will be inserted into the cache so we don't need to free it @@ -518,6 +539,7 @@ int v3_vnet_del_dev(int dev_id){ dev = find_dev_by_id(dev_id); if (dev != NULL){ list_del(&(dev->node)); + del_routes(dev_id); } v3_unlock_irqrestore(vnet_state.lock, flags);