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;
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;
}
}
// dst link
- token = strsep(&str, " ");
+ token = skip_blank(&str);
if (!token) {
return -1;
}
route->src_type = -1;
// src LINK
- token = strsep(&str, " ");
+ token = skip_blank(&str);
INFO("SRC type = %s\n", token);
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;
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;
}
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;
}
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");
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;
}
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");
} 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");
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");
}
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);