void f_ifconfig_v6(struct cli_conn *conn, const char *s) { char dev[16]; uint8_t addr6[16]; int prefix, port, vlan; const char *tk; const char *tk_end; const char *err; /*get DEV*/ tk = s; tk_end = strstr(tk, " "); if (!tk_end || ((int)(tk_end - tk) > (int)(sizeof(dev) - 1))) { ofp_sendf(conn->fd, "Invalid device name.\r\n"); sendcrlf(conn); return; } memcpy(dev, tk, tk_end - tk); dev[tk_end - tk] = 0; port = ofp_name_to_port_vlan(dev, &vlan); if (port == -1 || port == GRE_PORTS) { ofp_sendf(conn->fd, "Invalid device name.\r\n"); sendcrlf(conn); return; } /*get IP6NET address*/ tk = tk_end + 1; tk_end = strstr(tk, "/"); if (!tk_end || tk_end - tk > 40) { ofp_sendf(conn->fd, "Invalid IP6NET address.\r\n"); sendcrlf(conn); return; } if (!ip6addr_get(tk, tk_end - tk, addr6)) { ofp_sendf(conn->fd, "Invalid IP6NET address.\r\n"); sendcrlf(conn); return; } /* get IP6NET prefix len*/ tk = tk_end + 1; if (sscanf(tk, "%d", &prefix) < 1) { ofp_sendf(conn->fd, "Invalid IP6NET prefix.\r\n"); sendcrlf(conn); return; } if (port == LOCAL_PORTS) err = ofp_config_interface_up_local_v6(vlan, addr6, prefix); else err = ofp_config_interface_up_v6(port, vlan, addr6, prefix); if (err != NULL) ofp_sendf(conn->fd, err); sendcrlf(conn); }
void f_route_del_v6(struct cli_conn *conn, const char *s) { uint8_t dst6[16]; uint8_t gw6[16]; int mlen; const char *tk; const char *tk_end; const char *last; last = s + strlen(s); /* get IP6NET address*/ tk = s; tk_end = strstr(tk, "/"); if (!tk_end) { ofp_sendf(conn->fd, "Invalid IP6NET\r\n"); sendcrlf(conn); return; } if (!ip6addr_get(tk, tk_end - tk, dst6)) { ofp_sendf(conn->fd, "Invalid IP6NET\r\n"); sendcrlf(conn); return; } /* get IP6NET prefix len*/ tk = tk_end + 1; if (tk >= last) { ofp_sendf(conn->fd, "Invalid IP6NET\r\n"); sendcrlf(conn); return; } tk_end = last; if (tk == tk_end) { ofp_sendf(conn->fd, "Invalid IP6NET\r\n"); sendcrlf(conn); return; } mlen = atoi(tk); ofp_set_route6_params(OFP_ROUTE6_DEL, 0 /*vrf*/, 0 /*vlan*/, 0 /*port*/, dst6, mlen, gw6); sendcrlf(conn); }
void f_route_add_v6(struct cli_conn *conn, const char *s) { uint8_t dst6[16]; uint8_t gw6[16]; int port, vlan, mlen; const char *tk; const char *tk_end; const char *last; last = s + strlen(s); /* get IP6NET address*/ tk = s; tk_end = strstr(tk, "/"); if (!tk_end) { ofp_sendf(conn->fd, "Invalid IP6NET\r\n"); sendcrlf(conn); return; } if (!ip6addr_get(tk, tk_end - tk, dst6)) { ofp_sendf(conn->fd, "Invalid IP6NET\r\n"); sendcrlf(conn); return; } /* get IP6NET prefix len*/ tk = tk_end + 1; if (tk >= last) { ofp_sendf(conn->fd, "Invalid IP6NET\r\n"); sendcrlf(conn); return; } tk_end = strstr(tk, " "); if (!tk_end || (tk == tk_end)) { ofp_sendf(conn->fd, "Invalid IP6NET\r\n"); sendcrlf(conn); return; } mlen = atoi(tk); /* get IP6ADDR */ tk = tk_end + 1; if (tk >= last) { ofp_sendf(conn->fd, "Invalid IP6NET\r\n"); sendcrlf(conn); return; } tk_end = strstr(tk, " "); if (tk_end == NULL) { ofp_sendf(conn->fd, "Invalid IP6ADDR\r\n"); sendcrlf(conn); return; } if (!ip6addr_get(tk, tk_end - tk, gw6)) { ofp_sendf(conn->fd, "Invalid IP6NET\r\n"); sendcrlf(conn); return; } /* get DEV */ tk = tk_end + 1; if (tk >= last) { ofp_sendf(conn->fd, "Invalid DEV\r\n"); sendcrlf(conn); return; } tk_end = last; port = ofp_name_to_port_vlan(tk, &vlan); if (port < 0 || port >= ofp_get_num_ports()) { ofp_sendf(conn->fd, "Invalid port!\r\n"); sendcrlf(conn); return; } ofp_set_route6_params(OFP_ROUTE6_ADD, 0 /*vrf*/, vlan, port, dst6, mlen, gw6); sendcrlf(conn); }