X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=linux_module%2Fpalacios-vnet-ctrl.c;h=6dae6bbf7730736448ba7a0162dbbe840ff9aa7a;hb=c8b23e99efde3aa5a2c26d1b8e9bc7dc914e6113;hp=9495cb47e670bb40020d2a83a4b97e8cbac32c53;hpb=139d7b7b65f1a5d7c335fca4abb6d61d12b8aaff;p=palacios.git diff --git a/linux_module/palacios-vnet-ctrl.c b/linux_module/palacios-vnet-ctrl.c index 9495cb4..6dae6bb 100644 --- a/linux_module/palacios-vnet-ctrl.c +++ b/linux_module/palacios-vnet-ctrl.c @@ -62,6 +62,29 @@ struct vnet_ctrl_state { static struct vnet_ctrl_state vnet_ctrl_s; +char *skip_blank(char **start) +{ + char *cur; + + do { + cur = strsep(start, " \t"); + } while (cur != NULL && *cur=='\0'); + + return cur; +} + +char *skip_lines(char **start) +{ + char *cur; + + do { + cur = strsep(start, "\r\n"); + } while (cur != NULL && *cur=='\0'); + + return cur; +} + + static int parse_mac_str(char * str, uint8_t * qual, uint8_t * mac) { char * token; @@ -162,21 +185,21 @@ static int parse_route_str(char * str, struct v3_vnet_route * route) { struct vnet_link_iter * link = NULL; // src MAC - token = strsep(&str, " "); + token = skip_blank(&str); if (!token) { return -1; } parse_mac_str(token, &(route->src_mac_qual), route->src_mac); - // dst MAC - token = strsep(&str, " "); + // Dst MAC + token = skip_blank(&str); if (!token) { return -1; } parse_mac_str(token, &(route->dst_mac_qual), route->dst_mac); // dst LINK type - token = strsep(&str, " "); + token = skip_blank(&str); if (!token) { return -1; } @@ -192,7 +215,7 @@ static int parse_route_str(char * str, struct v3_vnet_route * route) { } // dst link - token = strsep(&str, " "); + token = skip_blank(&str); if (!token) { return -1; } @@ -239,7 +262,7 @@ static int parse_route_str(char * str, struct v3_vnet_route * route) { route->src_type = -1; // src LINK - token = strsep(&str, " "); + token = skip_blank(&str); INFO("SRC type = %s\n", token); @@ -263,7 +286,7 @@ static int parse_route_str(char * str, struct v3_vnet_route * route) { route->src_id = -1; } else if (route->src_type == LINK_EDGE) { uint32_t src_ip; - token = strsep(&str, " "); + token = skip_blank(&str); if (!token) { return -1; @@ -399,13 +422,13 @@ static int route_seq_show(struct seq_file * s, void * v) { break; case MAC_NOT: seq_printf(s, "not-%x:%x:%x:%x:%x:%x ", - route->src_mac[0], route->src_mac[1], route->src_mac[2], - route->src_mac[3], route->src_mac[4], route->src_mac[5]); + route->dst_mac[0], route->dst_mac[1], route->dst_mac[2], + route->dst_mac[3], route->dst_mac[4], route->dst_mac[5]); break; default: seq_printf(s, "%x:%x:%x:%x:%x:%x ", - route->src_mac[0], route->src_mac[1], route->src_mac[2], - route->src_mac[3], route->src_mac[4], route->src_mac[5]); + route->dst_mac[0], route->dst_mac[1], route->dst_mac[2], + route->dst_mac[3], route->dst_mac[4], route->dst_mac[5]); break; } @@ -521,10 +544,10 @@ static int inject_route(struct vnet_route_iter * route) { route->idx = v3_vnet_add_route(route->route); - spin_lock_irqsave(&(vnet_ctrl_s.lock), flags); + palacios_spinlock_lock_irqsave(&(vnet_ctrl_s.lock), flags); list_add(&(route->node), &(vnet_ctrl_s.route_list)); vnet_ctrl_s.num_routes ++; - spin_unlock_irqrestore(&(vnet_ctrl_s.lock), flags); + palacios_spinlock_unlock_irqrestore(&(vnet_ctrl_s.lock), flags); INFO("VNET Control: One route added to VNET core\n"); @@ -537,14 +560,14 @@ static void delete_route(struct vnet_route_iter * route) { v3_vnet_del_route(route->idx); - spin_lock_irqsave(&(vnet_ctrl_s.lock), flags); + palacios_spinlock_lock_irqsave(&(vnet_ctrl_s.lock), flags); list_del(&(route->node)); vnet_ctrl_s.num_routes --; - spin_unlock_irqrestore(&(vnet_ctrl_s.lock), flags); + palacios_spinlock_unlock_irqrestore(&(vnet_ctrl_s.lock), flags); INFO("VNET Control: Route %d deleted from VNET\n", route->idx); - kfree(route); + palacios_free(route); route = NULL; } @@ -584,30 +607,33 @@ route_write(struct file * file, route_buf[size] = '\0'; INFO("Route written: %s\n", route_buf); - while ((buf_iter = strsep(&line_str, "\r\n"))) { + while ((buf_iter = skip_lines(&line_str))) { - token = strsep(&buf_iter, " "); + token = skip_blank(&buf_iter); if (!token) { return -EFAULT; } if (strnicmp("ADD", token, strlen("ADD")) == 0) { struct vnet_route_iter * new_route = NULL; - new_route = kmalloc(sizeof(struct vnet_route_iter), GFP_KERNEL); + new_route = palacios_alloc(sizeof(struct vnet_route_iter)); if (!new_route) { + ERROR("Cannot allocate new route\n"); return -ENOMEM; } memset(new_route, 0, sizeof(struct vnet_route_iter)); if (parse_route_str(buf_iter, &(new_route->route)) == -1) { - kfree(new_route); + ERROR("Cannot parse new route\n"); + palacios_free(new_route); return -EFAULT; } if (inject_route(new_route) != 0) { - kfree(new_route); + ERROR("Cannot inject new route\n"); + palacios_free(new_route); return -EFAULT; } } else if (strnicmp("DEL", token, strlen("DEL")) == 0) { @@ -615,7 +641,7 @@ route_write(struct file * file, uint32_t d_idx; struct vnet_route_iter * route = NULL; - idx_str = strsep(&buf_iter, " "); + idx_str = skip_blank(&buf_iter); if (!idx_str) { WARNING("Missing route idx in DEL Route command\n"); @@ -646,12 +672,12 @@ static void delete_link(struct vnet_link_iter * link){ vnet_brg_delete_link(link->idx); - spin_lock_irqsave(&(vnet_ctrl_s.lock), flags); + palacios_spinlock_lock_irqsave(&(vnet_ctrl_s.lock), flags); list_del(&(link->node)); vnet_ctrl_s.num_links --; - spin_unlock_irqrestore(&(vnet_ctrl_s.lock), flags); + palacios_spinlock_unlock_irqrestore(&(vnet_ctrl_s.lock), flags); - kfree(link); + palacios_free(link); link = NULL; } @@ -689,11 +715,12 @@ link_write(struct file * file, const char * buf, size_t size, loff_t * ppos) { return -EFAULT; } - while ((link_iter = strsep(&line_str, "\r\n"))) { - DEBUG("Link written: %s\n", link_buf); - - token = strsep(&link_iter, " "); + link_buf[size] = '\0'; + INFO("Link written: %s\n", link_buf); + + while ((link_iter = skip_lines(&line_str))) { + token = skip_blank(&link_iter); if (!token) { return -EFAULT; } @@ -707,7 +734,7 @@ link_write(struct file * file, const char * buf, size_t size, loff_t * ppos) { int link_idx; unsigned long flags; - ip_str = strsep(&link_iter, " "); + ip_str = skip_blank(&link_iter); if ((!ip_str) || (!link_iter)) { WARNING("Missing fields in ADD Link command\n"); @@ -728,7 +755,12 @@ link_write(struct file * file, const char * buf, size_t size, loff_t * ppos) { return -EFAULT; } - link = kmalloc(sizeof(struct vnet_link_iter), GFP_KERNEL); + link = palacios_alloc(sizeof(struct vnet_link_iter)); + if (!link) { + WARNING("VNET Control: Cannot allocate link\n"); + return -EFAULT; + } + memset(link, 0, sizeof(struct vnet_link_iter)); link->dst_ip = d_ip; @@ -736,15 +768,16 @@ link_write(struct file * file, const char * buf, size_t size, loff_t * ppos) { link->proto = d_proto; link->idx = link_idx; - spin_lock_irqsave(&(vnet_ctrl_s.lock), flags); + palacios_spinlock_lock_irqsave(&(vnet_ctrl_s.lock), flags); list_add(&(link->node), &(vnet_ctrl_s.link_iter_list)); vnet_ctrl_s.num_links ++; - spin_unlock_irqrestore(&(vnet_ctrl_s.lock), flags); + palacios_spinlock_unlock_irqrestore(&(vnet_ctrl_s.lock), flags); } else if (strnicmp("DEL", token, strlen("DEL")) == 0) { char * idx_str = NULL; uint32_t d_idx; + struct vnet_link_iter * link = NULL; - idx_str = strsep(&link_iter, " "); + idx_str = skip_blank(&link_iter); if (!idx_str) { WARNING("Missing link idx in DEL Link command\n"); @@ -753,9 +786,17 @@ link_write(struct file * file, const char * buf, size_t size, loff_t * ppos) { d_idx = simple_strtoul(idx_str, &idx_str, 10); - vnet_brg_delete_link(d_idx); - + INFO("VNET: deleting link %d\n", d_idx); + + list_for_each_entry(link, &(vnet_ctrl_s.link_iter_list), node) { + if (link->idx == d_idx) { + delete_link(link); + break; + } + } + DEBUG("VNET Control: One link deleted\n"); + } else { WARNING("Invalid Link command string\n"); } @@ -800,7 +841,7 @@ debug_write(struct file * file, const char * buf, size_t size, loff_t * ppos) { return -EFAULT; } - in_iter = strsep(&line_str, "\r\n"); + in_iter = skip_lines(&line_str); level = simple_strtol(in_iter, &in_iter, 10); DEBUG("VNET Control: Set VNET Debug level to %d\n", level); @@ -884,34 +925,33 @@ static int init_proc_files(void) { return -1; } - route_entry = create_proc_entry("routes", 0, vnet_root); + + PAL_PROC_CREATE(route_entry,"routes",0644, vnet_root,&route_fops); + if (route_entry == NULL) { remove_proc_entry("vnet", NULL); return -1; } - route_entry->proc_fops = &route_fops; + PAL_PROC_CREATE(link_entry,"links", 0644, vnet_root,&link_fops); - link_entry = create_proc_entry("links", 0, vnet_root); if (link_entry == NULL) { remove_proc_entry("routes", vnet_root); remove_proc_entry("vnet", NULL); return -1; } - link_entry->proc_fops = &link_fops; - - stat_entry = create_proc_entry("stats", 0, vnet_root); + PAL_PROC_CREATE(stat_entry,"stats", 0644, vnet_root, &stat_fops); + if(stat_entry == NULL) { remove_proc_entry("links", vnet_root); remove_proc_entry("routes", vnet_root); remove_proc_entry("vnet", NULL); return -1; } - stat_entry->proc_fops = &stat_fops; + PAL_PROC_CREATE(debug_entry,"debug", 0644, vnet_root,&debug_fops); - debug_entry = create_proc_entry("debug", 0, vnet_root); if(debug_entry == NULL) { remove_proc_entry("links", vnet_root); remove_proc_entry("routes", vnet_root); @@ -919,7 +959,6 @@ static int init_proc_files(void) { remove_proc_entry("vnet", NULL); return -1; } - debug_entry->proc_fops = &debug_fops; vnet_ctrl_s.vnet_proc_root = vnet_root; @@ -934,7 +973,7 @@ static void destroy_proc_files(void) { remove_proc_entry("links", vnet_root); remove_proc_entry("routes", vnet_root); remove_proc_entry("stats", vnet_root); - remove_proc_entry("vnet", NULL); + remove_proc_entry("vnet", palacios_get_procdir()); } @@ -948,7 +987,7 @@ int vnet_ctrl_init(void) { INIT_LIST_HEAD(&(vnet_ctrl_s.link_iter_list)); INIT_LIST_HEAD(&(vnet_ctrl_s.route_list)); - spin_lock_init(&(vnet_ctrl_s.lock)); + palacios_spinlock_init(&(vnet_ctrl_s.lock)); init_proc_files(); @@ -969,6 +1008,8 @@ void vnet_ctrl_deinit(void){ vnet_ctrl_s.status = 0; + palacios_spinlock_deinit(&(vnet_ctrl_s.lock)); + INFO("VNET Control Deinit Finished\n"); }