/* "ifconfig [-A inet 4] DEV IP4NET";*/ void f_ifconfig(struct cli_conn *conn, const char *s) { char dev[16]; int port, a, b, c, d, m, vlan, vrf = 0; uint32_t addr; const char *err; if (sscanf(s, "%s %d.%d.%d.%d/%d %d", dev, &a, &b, &c, &d, &m, &vrf) < 6) return; addr = odp_cpu_to_be_32((a << 24) | (b << 16) | (c << 8) | d); port = ofp_name_to_port_vlan(dev, &vlan); if (port == GRE_PORTS || port == VXLAN_PORTS) { ofp_sendf(conn->fd, "Invalid device name.\r\n"); return; } if (PHYS_PORT(port)) err = ofp_config_interface_up_v4(port, vlan, vrf, addr, m); else err = ofp_config_interface_up_local(vlan, vrf, addr, m); if (err != NULL) ofp_sendf(conn->fd, err); sendcrlf(conn); }
/* route -A inet4 add vrf NUMBER IP4NET gw IP4ADDR dev DEV */ void f_route_add_vrf(struct cli_conn *conn, const char *s) { uint32_t gwaddr, destaddr; int a, b, c, d, e, f, g, h, port, mlen, vrf, vlan; char dev[16]; if (sscanf(s, "%d %d.%d.%d.%d/%d %d.%d.%d.%d %s", &vrf, &a, &b, &c, &d, &mlen, &e, &f, &g, &h, dev) != 11) return; destaddr = odp_cpu_to_be_32((a << 24) | (b << 16) | (c << 8) | d); gwaddr = odp_cpu_to_be_32((e << 24) | (f << 16) | (g << 8) | h); port = ofp_name_to_port_vlan(dev, &vlan); if (port < 0 || port >= ofp_get_num_ports()) { ofp_sendf(conn->fd, "Invalid port!\r\n"); sendcrlf(conn); return; } ofp_set_route_params(OFP_ROUTE_ADD, vrf, vlan, port, destaddr, mlen, gwaddr); sendcrlf(conn); }
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); }
/* "ifconfig tunnel gre DEV local IP4ADDR remote IP4ADDR peer IP4ADDR IP4ADDR vrf NUMBER";*/ void f_ifconfig_tun(struct cli_conn *conn, const char *s) { char dev[16], loc[16], rem[16], ip[16], peer[16]; uint32_t tun_loc, tun_rem, addr, p2p; int port, vlan, vrf = 0, masklen = 32; const char *err; if (sscanf(s, "%s %s %s %s %s %d", dev, loc, rem, peer, ip, &vrf) < 5) return; port = ofp_name_to_port_vlan(dev, &vlan); if (port != GRE_PORTS) { ofp_sendf(conn->fd, "Invalid device name.\r\n"); sendcrlf(conn); return; } if (!ip4addr_get(loc, &tun_loc)) return; if (!ip4addr_get(rem, &tun_rem)) return; if (!ip4addr_get(peer, &p2p)) return; if (!ip4addr_get(ip, &addr)) return; err = ofp_config_interface_up_tun(port, vlan, vrf, tun_loc, tun_rem, p2p, addr, masklen); if (err != NULL) ofp_sendf(conn->fd, err); sendcrlf(conn); }
/* route add from DEV to DEV */ void f_route_add_dev_to_dev(struct cli_conn *conn, const char *s) { char dev[16], from[16]; int from_port, to_port, vlan; if (sscanf(s, "%s %s", from, dev) != 2) return; from_port = ofp_name_to_port_vlan(from, &vlan); to_port = ofp_name_to_port_vlan(dev, &vlan); from_port = from_port; /* remove warnings*/ to_port = to_port; /*set_port_params(16, ofp_ifnet_data[32].address, ufp_ifnet_data[32].masklen, ufp_ifnet_data[32].mac, ufp_ifnet_data[32].link_local); add_to_next_hop_table(ADD_ENTRY, ufp_ifnet_data[to_port].address, from_port, ufp_ifnet_data[to_port].masklen, NH_FLAGS_TO_LOCAL_SEGMENT, to_port, 0, to_port, NULL, 0);*/ sendcrlf(conn); }
/* ifconfig vxlan DEV group IP4ADDR dev DEV IP4NET */ void f_ifconfig_vxlan(struct cli_conn *conn, const char *s) { char dev[16], physdev[16], group[16]; uint32_t vxlan_group, addr; int n, port, vlan, physport, physvlan, a, b, c, d, m; const char *err; if ((n = sscanf(s, "%s %s %s %d.%d.%d.%d/%d", dev, group, physdev, &a, &b, &c, &d, &m)) != 8) { return; } addr = odp_cpu_to_be_32((a << 24) | (b << 16) | (c << 8) | d); port = ofp_name_to_port_vlan(dev, &vlan); if (port != VXLAN_PORTS) { ofp_sendf(conn->fd, "Invalid device name %s.\r\n", dev); sendcrlf(conn); return; } physport = ofp_name_to_port_vlan(physdev, &physvlan); if (!ip4addr_get(group, &vxlan_group)) { ofp_sendf(conn->fd, "Invalid group address.\r\n"); sendcrlf(conn); return; } /* vrf is copied from the physical port */ err = ofp_config_interface_up_vxlan(0, addr, m, vlan, vxlan_group, physport, physvlan); if (err != NULL) ofp_sendf(conn->fd, err); sendcrlf(conn); }
void f_ifconfig_down(struct cli_conn *conn, const char *s) { /* "ifconfig DEV down"; */ char dev[16]; int port, vlan; const char *err; if (sscanf(s, "%s", dev) < 1) return; port = ofp_name_to_port_vlan(dev, &vlan); err = ofp_config_interface_down(port, vlan); if (err != NULL) ofp_sendf(conn->fd, err); 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); }