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; }
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; } } }
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; }