int check_allifname(CLISESSION *pSession, char *pszValue) { if (strcmp(pszValue, "all") == 0) return 1; return check_ifname(pSession, pszValue); }
/* buf is assumed to be IFNAMSIZ */ int get_ifname(char *buf, const char *name) { int ret; ret = check_ifname(name); if (ret == 0) strncpy(buf, name, IFNAMSIZ); return ret; }
static int do_prl(int argc, char **argv) { struct ip_tunnel_prl p = {}; int count = 0; int cmd = 0; const char *medium = NULL; while (argc > 0) { if (strcmp(*argv, "prl-default") == 0) { NEXT_ARG(); cmd = SIOCADDPRL; p.addr = get_addr32(*argv); p.flags |= PRL_DEFAULT; count++; } else if (strcmp(*argv, "prl-nodefault") == 0) { NEXT_ARG(); cmd = SIOCADDPRL; p.addr = get_addr32(*argv); count++; } else if (strcmp(*argv, "prl-delete") == 0) { NEXT_ARG(); cmd = SIOCDELPRL; p.addr = get_addr32(*argv); count++; } else if (strcmp(*argv, "dev") == 0) { NEXT_ARG(); if (check_ifname(*argv)) invarg("\"dev\" not a valid ifname", *argv); medium = *argv; } else { fprintf(stderr, "Invalid PRL parameter \"%s\"\n", *argv); exit(-1); } if (count > 1) { fprintf(stderr, "One PRL entry at a time\n"); exit(-1); } argc--; argv++; } if (!medium) { fprintf(stderr, "Must specify device\n"); exit(-1); } return tnl_prl_ioctl(cmd, medium, &p); }
const char *get_ifname_rta(int ifindex, const struct rtattr *rta) { const char *name; if (rta) { name = rta_getattr_str(rta); } else { fprintf(stderr, "BUG: device with ifindex %d has nil ifname\n", ifindex); name = ll_idx_n2a(ifindex); } if (check_ifname(name)) return NULL; return name; }
static int do_6rd(int argc, char **argv) { struct ip_tunnel_6rd ip6rd = {}; int cmd = 0; const char *medium = NULL; inet_prefix prefix; while (argc > 0) { if (strcmp(*argv, "6rd-prefix") == 0) { NEXT_ARG(); if (get_prefix(&prefix, *argv, AF_INET6)) invarg("invalid 6rd_prefix\n", *argv); cmd = SIOCADD6RD; memcpy(&ip6rd.prefix, prefix.data, 16); ip6rd.prefixlen = prefix.bitlen; } else if (strcmp(*argv, "6rd-relay_prefix") == 0) { NEXT_ARG(); if (get_prefix(&prefix, *argv, AF_INET)) invarg("invalid 6rd-relay_prefix\n", *argv); cmd = SIOCADD6RD; memcpy(&ip6rd.relay_prefix, prefix.data, 4); ip6rd.relay_prefixlen = prefix.bitlen; } else if (strcmp(*argv, "6rd-reset") == 0) { cmd = SIOCDEL6RD; } else if (strcmp(*argv, "dev") == 0) { NEXT_ARG(); if (check_ifname(*argv)) invarg("\"dev\" not a valid ifname", *argv); medium = *argv; } else { fprintf(stderr, "Invalid 6RD parameter \"%s\"\n", *argv); exit(-1); } argc--; argv++; } if (!medium) { fprintf(stderr, "Must specify device\n"); exit(-1); } return tnl_6rd_ioctl(cmd, medium, &ip6rd); }
static int parse_args(int argc, char **argv, int cmd, struct l2tp_parm *p) { memset(p, 0, sizeof(*p)); if (argc == 0) usage(); /* Defaults */ p->l2spec_type = L2TP_L2SPECTYPE_DEFAULT; p->l2spec_len = 4; p->udp6_csum_rx = 1; p->udp6_csum_tx = 1; while (argc > 0) { if (strcmp(*argv, "encap") == 0) { NEXT_ARG(); if (strcmp(*argv, "ip") == 0) { p->encap = L2TP_ENCAPTYPE_IP; } else if (strcmp(*argv, "udp") == 0) { p->encap = L2TP_ENCAPTYPE_UDP; } else { fprintf(stderr, "Unknown tunnel encapsulation \"%s\"\n", *argv); exit(-1); } } else if (strcmp(*argv, "name") == 0) { NEXT_ARG(); if (check_ifname(*argv)) invarg("\"name\" not a valid ifname", *argv); p->ifname = *argv; } else if (strcmp(*argv, "remote") == 0) { NEXT_ARG(); if (get_addr(&p->peer_ip, *argv, AF_UNSPEC)) invarg("invalid remote address\n", *argv); } else if (strcmp(*argv, "local") == 0) { NEXT_ARG(); if (get_addr(&p->local_ip, *argv, AF_UNSPEC)) invarg("invalid local address\n", *argv); } else if ((strcmp(*argv, "tunnel_id") == 0) || (strcmp(*argv, "tid") == 0)) { __u32 uval; NEXT_ARG(); if (get_u32(&uval, *argv, 0)) invarg("invalid ID\n", *argv); p->tunnel_id = uval; } else if ((strcmp(*argv, "peer_tunnel_id") == 0) || (strcmp(*argv, "ptid") == 0)) { __u32 uval; NEXT_ARG(); if (get_u32(&uval, *argv, 0)) invarg("invalid ID\n", *argv); p->peer_tunnel_id = uval; } else if ((strcmp(*argv, "session_id") == 0) || (strcmp(*argv, "sid") == 0)) { __u32 uval; NEXT_ARG(); if (get_u32(&uval, *argv, 0)) invarg("invalid ID\n", *argv); p->session_id = uval; } else if ((strcmp(*argv, "peer_session_id") == 0) || (strcmp(*argv, "psid") == 0)) { __u32 uval; NEXT_ARG(); if (get_u32(&uval, *argv, 0)) invarg("invalid ID\n", *argv); p->peer_session_id = uval; } else if (strcmp(*argv, "udp_sport") == 0) { __u16 uval; NEXT_ARG(); if (get_u16(&uval, *argv, 0)) invarg("invalid port\n", *argv); p->local_udp_port = uval; } else if (strcmp(*argv, "udp_dport") == 0) { __u16 uval; NEXT_ARG(); if (get_u16(&uval, *argv, 0)) invarg("invalid port\n", *argv); p->peer_udp_port = uval; } else if (strcmp(*argv, "udp_csum") == 0) { NEXT_ARG(); if (strcmp(*argv, "on") == 0) p->udp_csum = 1; else if (strcmp(*argv, "off") == 0) p->udp_csum = 0; else invarg("invalid option for udp_csum\n", *argv); } else if (strcmp(*argv, "udp6_csum_rx") == 0) { NEXT_ARG(); if (strcmp(*argv, "on") == 0) p->udp6_csum_rx = 1; else if (strcmp(*argv, "off") == 0) p->udp6_csum_rx = 0; else invarg("invalid option for udp6_csum_rx\n" , *argv); } else if (strcmp(*argv, "udp6_csum_tx") == 0) { NEXT_ARG(); if (strcmp(*argv, "on") == 0) p->udp6_csum_tx = 1; else if (strcmp(*argv, "off") == 0) p->udp6_csum_tx = 0; else invarg("invalid option for udp6_csum_tx\n" , *argv); } else if (strcmp(*argv, "offset") == 0) { __u8 uval; NEXT_ARG(); if (get_u8(&uval, *argv, 0)) invarg("invalid offset\n", *argv); p->offset = uval; } else if (strcmp(*argv, "peer_offset") == 0) { __u8 uval; NEXT_ARG(); if (get_u8(&uval, *argv, 0)) invarg("invalid offset\n", *argv); p->peer_offset = uval; } else if (strcmp(*argv, "cookie") == 0) { int slen; NEXT_ARG(); slen = strlen(*argv); if ((slen != 8) && (slen != 16)) invarg("cookie must be either 8 or 16 hex digits\n", *argv); p->cookie_len = slen / 2; if (hex2mem(*argv, p->cookie, p->cookie_len) < 0) invarg("cookie must be a hex string\n", *argv); } else if (strcmp(*argv, "peer_cookie") == 0) { int slen; NEXT_ARG(); slen = strlen(*argv); if ((slen != 8) && (slen != 16)) invarg("cookie must be either 8 or 16 hex digits\n", *argv); p->peer_cookie_len = slen / 2; if (hex2mem(*argv, p->peer_cookie, p->peer_cookie_len) < 0) invarg("cookie must be a hex string\n", *argv); } else if (strcmp(*argv, "l2spec_type") == 0) { NEXT_ARG(); if (strcasecmp(*argv, "default") == 0) { p->l2spec_type = L2TP_L2SPECTYPE_DEFAULT; p->l2spec_len = 4; } else if (strcasecmp(*argv, "none") == 0) { p->l2spec_type = L2TP_L2SPECTYPE_NONE; p->l2spec_len = 0; } else { fprintf(stderr, "Unknown layer2specific header type \"%s\"\n", *argv); exit(-1); } } else if (strcmp(*argv, "seq") == 0) { NEXT_ARG(); if (strcasecmp(*argv, "both") == 0) { p->recv_seq = 1; p->send_seq = 1; } else if (strcasecmp(*argv, "recv") == 0) { p->recv_seq = 1; } else if (strcasecmp(*argv, "send") == 0) { p->send_seq = 1; } else if (strcasecmp(*argv, "none") == 0) { p->recv_seq = 0; p->send_seq = 0; } else { fprintf(stderr, "Unknown seq value \"%s\"\n", *argv); exit(-1); } } else if (strcmp(*argv, "tunnel") == 0) { p->tunnel = 1; } else if (strcmp(*argv, "session") == 0) { p->session = 1; } else if (matches(*argv, "help") == 0) { usage(); } else { fprintf(stderr, "Unknown command: %s\n", *argv); usage(); } argc--; argv++; } return 0; }
void load_interface_lane_map() { SWSS_LOG_ENTER(); if (g_interface_lane_map_file == NULL) { SWSS_LOG_NOTICE("no interface lane map"); return; } std::ifstream lanemap(g_interface_lane_map_file); if (!lanemap.is_open()) { SWSS_LOG_ERROR("failed to open lane map file: %s", g_interface_lane_map_file); return; } std::string line; while(getline(lanemap, line)) { if (line.size() > 0 && (line[0] == '#' || line[0] == ';')) { continue; } auto tokens = swss::tokenize(line, ':'); if (tokens.size() != 2) { SWSS_LOG_ERROR("expected 2 tokens in line %s, got %zu", line.c_str(), tokens.size()); continue; } auto ifname = tokens.at(0); auto lanes = tokens.at(1); if (!check_ifname(ifname)) { continue; } if (g_ifname_to_lanes.find(ifname) != g_ifname_to_lanes.end()) { SWSS_LOG_ERROR("interface %s was already defined", ifname.c_str()); continue; } tokens = swss::tokenize(lanes,','); size_t n = tokens.size(); if (n != 1 && n != 2 && n != 4) { SWSS_LOG_ERROR("invalid number of lanes (%zu) assigned to interface %s", n, ifname.c_str()); continue; } std::vector<uint32_t> lanevec; for (auto l: tokens) { uint32_t lanenumber; if (sscanf(l.c_str(), "%u", &lanenumber) != 1) { SWSS_LOG_ERROR("failed to parse lane number: %s", l.c_str()); continue; } if (g_lane_to_ifname.find(lanenumber) != g_lane_to_ifname.end()) { SWSS_LOG_ERROR("lane number %u used on %s was already defined on %s", lanenumber, ifname.c_str(), g_lane_to_ifname.at(lanenumber).c_str()); continue; } lanevec.push_back(lanenumber); g_lane_order.push_back(lanenumber); g_lane_to_ifname[lanenumber] = ifname; } g_ifname_to_lanes[ifname] = lanevec; g_laneMap.push_back(lanevec); } SWSS_LOG_NOTICE("loaded %zu lanes and %zu interfaces", g_lane_to_ifname.size(), g_ifname_to_lanes.size()); }