static int parse_bfifo_opts(struct rtnl_qdisc *qdisc, char *argv[], int argc)
{
	int err, limit;

	if (argc > 0) {
		if (argc != 2 || strcasecmp(argv[0], "limit")) {
			fprintf(stderr, "Usage: ... bfifo limit <limit>\n");
			return -1;
		}

		limit = nl_size2int(argv[1]);
		if (limit < 0) {
			fprintf(stderr, "Invalid value for limit.\n");
			return -1;
		}

		err = rtnl_qdisc_fifo_set_limit(qdisc, limit);
		if (err < 0) {
			fprintf(stderr, "%s\n", nl_geterror());
			return -1;
		}
	}

	return 0;
}
static int parse_pfifo_opts(struct rtnl_qdisc *qdisc, char *argv[], int argc)
{
	int err, limit;

	if (argc > 0) {
		if (argc != 2 || strcasecmp(argv[0], "limit")) {
			fprintf(stderr, "Usage: ... pfifo limit <limit>\n");
			return -1;
		}

		limit = strtoul(argv[1], NULL, 0);
		err = rtnl_qdisc_fifo_set_limit(qdisc, limit);
		if (err < 0) {
			fprintf(stderr, "%s\n", nl_geterror());
			return -1;
		}
	}

	return 0;
}
Example #3
0
static void bfifo_parse_argv(struct rtnl_tc *tc, int argc, char **argv)
{
	struct rtnl_qdisc *qdisc = (struct rtnl_qdisc *) tc;
	int limit;

	for (;;) {
		int c, optidx = 0;
		enum {
			ARG_LIMIT = 257,
		};
		static struct option long_opts[] = {
			{ "help", 0, 0, 'h' },
			{ "limit", 1, 0, ARG_LIMIT },
			{ 0, 0, 0, 0 }
		};

		c = getopt_long(argc, argv, "h", long_opts, &optidx);
		if (c == -1)
			break;

		switch (c) {
		case 'h':
			print_usage();
			return;

		case ARG_LIMIT:
			limit = nl_size2int(optarg);
			if (limit < 0) {
				nl_cli_fatal(limit, "Unable to parse bfifo limit "
					"\"%s\": Invalid format.", optarg);
			}

			rtnl_qdisc_fifo_set_limit(qdisc, limit);
			break;
		}
	}
}
Example #4
0
TError TNlQdisc::Create(const TNl &nl) {
    TError error = TError::Success();
    int ret;
    struct rtnl_qdisc *qdisc;

    if (Kind == "")
        return Delete(nl);

    qdisc = rtnl_qdisc_alloc();
    if (!qdisc)
        return TError(EError::Unknown, std::string("Unable to allocate qdisc object"));

    rtnl_tc_set_ifindex(TC_CAST(qdisc), Index);
    rtnl_tc_set_parent(TC_CAST(qdisc), Parent);
    rtnl_tc_set_handle(TC_CAST(qdisc), Handle);

    ret = rtnl_tc_set_kind(TC_CAST(qdisc), Kind.c_str());
    if (ret < 0) {
        error = nl.Error(ret, "Cannot to set qdisc type: " + Kind);
        goto free_qdisc;
    }

    if (Kind == "bfifo" || Kind == "pfifo") {
        if (Limit)
            rtnl_qdisc_fifo_set_limit(qdisc, Limit);
    }

    if (Kind == "htb") {
        if (Default)
            rtnl_htb_set_defcls(qdisc, Default);
        if (Quantum)
            rtnl_htb_set_rate2quantum(qdisc, Quantum);
    }

    if (Kind == "hfsc") {
        if (Default)
            rtnl_qdisc_hfsc_set_defcls(qdisc, Default);
    }

    if (Kind == "sfq") {
        if (Limit)
            rtnl_sfq_set_limit(qdisc, Limit);
        if (Quantum)
            rtnl_sfq_set_quantum(qdisc, Quantum);
    }

    if (Kind == "fq_codel") {
        if (Limit)
            rtnl_qdisc_fq_codel_set_limit(qdisc, Limit);
        if (Quantum)
            rtnl_qdisc_fq_codel_set_quantum(qdisc, Quantum);
    }

    nl.Dump("create", qdisc);

    ret = rtnl_qdisc_add(nl.GetSock(), qdisc, NLM_F_CREATE  | NLM_F_REPLACE);
    if (ret < 0)
        error = nl.Error(ret, "Cannot create qdisc");

free_qdisc:
    rtnl_qdisc_put(qdisc);

    return error;
}