Ejemplo n.º 1
0
int check_allifname(CLISESSION *pSession, char *pszValue)
{
	if (strcmp(pszValue, "all") == 0)
		return 1;
	
	return check_ifname(pSession, pszValue);
}
Ejemplo n.º 2
0
Archivo: utils.c Proyecto: dtaht/tc-adv
/* 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;
}
Ejemplo n.º 3
0
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);
}
Ejemplo n.º 4
0
Archivo: utils.c Proyecto: dtaht/tc-adv
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;
}
Ejemplo n.º 5
0
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);
}
Ejemplo n.º 6
0
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;
}
Ejemplo n.º 7
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());
}