X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=linux_module%2Fpalacios-vnet-ctrl.c;h=723dccd971a2e186fa86e67d665079935602438d;hb=af11d9f15d9f8061aec0e7752a5497e2df28c7ff;hp=f8043b7bfe40e6a1f6fbcfc3c1088bd73e9f3f7c;hpb=07aa8f3c18a33af0961e7546980a63ab5f6fba4f;p=palacios.git diff --git a/linux_module/palacios-vnet-ctrl.c b/linux_module/palacios-vnet-ctrl.c index f8043b7..723dccd 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; } @@ -584,9 +607,9 @@ 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; } @@ -618,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"); @@ -692,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; } @@ -710,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"); @@ -751,8 +775,9 @@ link_write(struct file * file, const char * buf, size_t size, loff_t * ppos) { } 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"); @@ -761,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"); } @@ -808,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);