diff options
Diffstat (limited to '')
-rw-r--r-- | tc/e_bpf.c | 2 | ||||
-rw-r--r-- | tc/f_basic.c | 4 | ||||
-rw-r--r-- | tc/f_bpf.c | 4 | ||||
-rw-r--r-- | tc/f_cgroup.c | 4 | ||||
-rw-r--r-- | tc/f_flow.c | 4 | ||||
-rw-r--r-- | tc/f_flower.c | 4 | ||||
-rw-r--r-- | tc/f_fw.c | 4 | ||||
-rw-r--r-- | tc/f_matchall.c | 4 | ||||
-rw-r--r-- | tc/f_route.c | 4 | ||||
-rw-r--r-- | tc/f_u32.c | 6 | ||||
-rw-r--r-- | tc/m_action.c | 31 | ||||
-rw-r--r-- | tc/m_bpf.c | 4 | ||||
-rw-r--r-- | tc/m_connmark.c | 4 | ||||
-rw-r--r-- | tc/m_csum.c | 4 | ||||
-rw-r--r-- | tc/m_ct.c | 4 | ||||
-rw-r--r-- | tc/m_ctinfo.c | 4 | ||||
-rw-r--r-- | tc/m_gact.c | 4 | ||||
-rw-r--r-- | tc/m_gate.c | 8 | ||||
-rw-r--r-- | tc/m_ife.c | 4 | ||||
-rw-r--r-- | tc/m_mirred.c | 67 | ||||
-rw-r--r-- | tc/m_mpls.c | 4 | ||||
-rw-r--r-- | tc/m_nat.c | 4 | ||||
-rw-r--r-- | tc/m_pedit.c | 10 | ||||
-rw-r--r-- | tc/m_police.c | 8 | ||||
-rw-r--r-- | tc/m_sample.c | 11 | ||||
-rw-r--r-- | tc/m_simple.c | 12 | ||||
-rw-r--r-- | tc/m_skbedit.c | 4 | ||||
-rw-r--r-- | tc/m_skbmod.c | 41 | ||||
-rw-r--r-- | tc/m_tunnel_key.c | 4 | ||||
-rw-r--r-- | tc/m_vlan.c | 4 | ||||
-rw-r--r-- | tc/q_cake.c | 6 | ||||
-rw-r--r-- | tc/q_cbs.c | 4 | ||||
-rw-r--r-- | tc/q_choke.c | 6 | ||||
-rw-r--r-- | tc/q_clsact.c | 4 | ||||
-rw-r--r-- | tc/q_codel.c | 6 | ||||
-rw-r--r-- | tc/q_drr.c | 8 | ||||
-rw-r--r-- | tc/q_etf.c | 4 | ||||
-rw-r--r-- | tc/q_ets.c | 8 | ||||
-rw-r--r-- | tc/q_fifo.c | 4 | ||||
-rw-r--r-- | tc/q_fq.c | 6 | ||||
-rw-r--r-- | tc/q_fq_codel.c | 6 | ||||
-rw-r--r-- | tc/q_fq_pie.c | 6 | ||||
-rw-r--r-- | tc/q_gred.c | 6 | ||||
-rw-r--r-- | tc/q_hfsc.c | 10 | ||||
-rw-r--r-- | tc/q_hhf.c | 6 | ||||
-rw-r--r-- | tc/q_htb.c | 8 | ||||
-rw-r--r-- | tc/q_ingress.c | 4 | ||||
-rw-r--r-- | tc/q_mqprio.c | 4 | ||||
-rw-r--r-- | tc/q_multiq.c | 4 | ||||
-rw-r--r-- | tc/q_netem.c | 86 | ||||
-rw-r--r-- | tc/q_pie.c | 6 | ||||
-rw-r--r-- | tc/q_plug.c | 4 | ||||
-rw-r--r-- | tc/q_prio.c | 4 | ||||
-rw-r--r-- | tc/q_qfq.c | 6 | ||||
-rw-r--r-- | tc/q_red.c | 8 | ||||
-rw-r--r-- | tc/q_sfb.c | 6 | ||||
-rw-r--r-- | tc/q_sfq.c | 6 | ||||
-rw-r--r-- | tc/q_skbprio.c | 4 | ||||
-rw-r--r-- | tc/q_taprio.c | 6 | ||||
-rw-r--r-- | tc/q_tbf.c | 4 | ||||
-rw-r--r-- | tc/tc.c | 20 | ||||
-rw-r--r-- | tc/tc_class.c | 6 | ||||
-rw-r--r-- | tc/tc_core.c | 15 | ||||
-rw-r--r-- | tc/tc_core.h | 2 | ||||
-rw-r--r-- | tc/tc_exec.c | 2 | ||||
-rw-r--r-- | tc/tc_filter.c | 14 | ||||
-rw-r--r-- | tc/tc_qdisc.c | 6 | ||||
-rw-r--r-- | tc/tc_util.c | 33 | ||||
-rw-r--r-- | tc/tc_util.h | 36 |
69 files changed, 363 insertions, 297 deletions
@@ -49,7 +49,7 @@ static int bpf_num_env_entries(void) return num; } -static int parse_bpf(struct exec_util *eu, int argc, char **argv) +static int parse_bpf(const struct exec_util *eu, int argc, char **argv) { char **argv_run = argv_default, **envp_run, *tmp; int ret, i, env_old, env_num, env_map; diff --git a/tc/f_basic.c b/tc/f_basic.c index 1ceb15d..a1db5ba 100644 --- a/tc/f_basic.c +++ b/tc/f_basic.c @@ -32,7 +32,7 @@ static void explain(void) "NOTE: CLASSID is parsed as hexadecimal input.\n"); } -static int basic_parse_opt(struct filter_util *qu, char *handle, +static int basic_parse_opt(const struct filter_util *qu, char *handle, int argc, char **argv, struct nlmsghdr *n) { struct tcmsg *t = NLMSG_DATA(n); @@ -103,7 +103,7 @@ static int basic_parse_opt(struct filter_util *qu, char *handle, return 0; } -static int basic_print_opt(struct filter_util *qu, FILE *f, +static int basic_print_opt(const struct filter_util *qu, FILE *f, struct rtattr *opt, __u32 handle) { struct rtattr *tb[TCA_BASIC_MAX+1]; @@ -71,7 +71,7 @@ static const struct bpf_cfg_ops bpf_cb_ops = { .ebpf_cb = bpf_ebpf_cb, }; -static int bpf_parse_opt(struct filter_util *qu, char *handle, +static int bpf_parse_opt(const struct filter_util *qu, char *handle, int argc, char **argv, struct nlmsghdr *n) { const char *bpf_obj = NULL, *bpf_uds_name = NULL; @@ -187,7 +187,7 @@ opt_bpf: return ret; } -static int bpf_print_opt(struct filter_util *qu, FILE *f, +static int bpf_print_opt(const struct filter_util *qu, FILE *f, struct rtattr *opt, __u32 handle) { struct rtattr *tb[TCA_BPF_MAX + 1]; diff --git a/tc/f_cgroup.c b/tc/f_cgroup.c index 291d6e7..4aba4ba 100644 --- a/tc/f_cgroup.c +++ b/tc/f_cgroup.c @@ -17,7 +17,7 @@ static void explain(void) fprintf(stderr, " [ action ACTION_SPEC ]\n"); } -static int cgroup_parse_opt(struct filter_util *qu, char *handle, +static int cgroup_parse_opt(const struct filter_util *qu, char *handle, int argc, char **argv, struct nlmsghdr *n) { struct tcmsg *t = NLMSG_DATA(n); @@ -75,7 +75,7 @@ static int cgroup_parse_opt(struct filter_util *qu, char *handle, return 0; } -static int cgroup_print_opt(struct filter_util *qu, FILE *f, +static int cgroup_print_opt(const struct filter_util *qu, FILE *f, struct rtattr *opt, __u32 handle) { struct rtattr *tb[TCA_CGROUP_MAX+1]; diff --git a/tc/f_flow.c b/tc/f_flow.c index 4a29af2..07ecb84 100644 --- a/tc/f_flow.c +++ b/tc/f_flow.c @@ -126,7 +126,7 @@ out: return 0; } -static int flow_parse_opt(struct filter_util *fu, char *handle, +static int flow_parse_opt(const struct filter_util *fu, char *handle, int argc, char **argv, struct nlmsghdr *n) { struct tcmsg *t = NLMSG_DATA(n); @@ -273,7 +273,7 @@ static const char *flow_mode2str(__u32 mode) } } -static int flow_print_opt(struct filter_util *fu, FILE *f, struct rtattr *opt, +static int flow_print_opt(const struct filter_util *fu, FILE *f, struct rtattr *opt, __u32 handle) { struct rtattr *tb[TCA_FLOW_MAX+1]; diff --git a/tc/f_flower.c b/tc/f_flower.c index 53188f1..cfcd7b2 100644 --- a/tc/f_flower.c +++ b/tc/f_flower.c @@ -1535,7 +1535,7 @@ static int flower_parse_cfm(int *argc_p, char ***argv_p, __be16 eth_type, return 0; } -static int flower_parse_opt(struct filter_util *qu, char *handle, +static int flower_parse_opt(const struct filter_util *qu, char *handle, int argc, char **argv, struct nlmsghdr *n) { int ret; @@ -2882,7 +2882,7 @@ static void flower_print_cfm(struct rtattr *attr) close_json_object(); } -static int flower_print_opt(struct filter_util *qu, FILE *f, +static int flower_print_opt(const struct filter_util *qu, FILE *f, struct rtattr *opt, __u32 handle) { struct rtattr *tb[TCA_FLOWER_MAX + 1]; @@ -29,7 +29,7 @@ static void explain(void) " FWMASK is 0xffffffff by default.\n"); } -static int fw_parse_opt(struct filter_util *qu, char *handle, int argc, char **argv, struct nlmsghdr *n) +static int fw_parse_opt(const struct filter_util *qu, char *handle, int argc, char **argv, struct nlmsghdr *n) { struct tcmsg *t = NLMSG_DATA(n); struct rtattr *tail; @@ -112,7 +112,7 @@ static int fw_parse_opt(struct filter_util *qu, char *handle, int argc, char **a return 0; } -static int fw_print_opt(struct filter_util *qu, FILE *f, struct rtattr *opt, __u32 handle) +static int fw_print_opt(const struct filter_util *qu, FILE *f, struct rtattr *opt, __u32 handle) { struct rtattr *tb[TCA_FW_MAX+1]; diff --git a/tc/f_matchall.c b/tc/f_matchall.c index 38b68d7..e595ac3 100644 --- a/tc/f_matchall.c +++ b/tc/f_matchall.c @@ -31,7 +31,7 @@ static void explain(void) "NOTE: CLASSID is parsed as hexadecimal input.\n"); } -static int matchall_parse_opt(struct filter_util *qu, char *handle, +static int matchall_parse_opt(const struct filter_util *qu, char *handle, int argc, char **argv, struct nlmsghdr *n) { struct tcmsg *t = NLMSG_DATA(n); @@ -107,7 +107,7 @@ static int matchall_parse_opt(struct filter_util *qu, char *handle, return 0; } -static int matchall_print_opt(struct filter_util *qu, FILE *f, +static int matchall_print_opt(const struct filter_util *qu, FILE *f, struct rtattr *opt, __u32 handle) { struct rtattr *tb[TCA_MATCHALL_MAX+1]; diff --git a/tc/f_route.c b/tc/f_route.c index ca8a8dd..87d865b 100644 --- a/tc/f_route.c +++ b/tc/f_route.c @@ -30,7 +30,7 @@ static void explain(void) "NOTE: CLASSID is parsed as hexadecimal input.\n"); } -static int route_parse_opt(struct filter_util *qu, char *handle, int argc, char **argv, struct nlmsghdr *n) +static int route_parse_opt(const struct filter_util *qu, char *handle, int argc, char **argv, struct nlmsghdr *n) { struct tcmsg *t = NLMSG_DATA(n); struct rtattr *tail; @@ -134,7 +134,7 @@ static int route_parse_opt(struct filter_util *qu, char *handle, int argc, char return 0; } -static int route_print_opt(struct filter_util *qu, FILE *f, struct rtattr *opt, __u32 handle) +static int route_print_opt(const struct filter_util *qu, FILE *f, struct rtattr *opt, __u32 handle) { struct rtattr *tb[TCA_ROUTE4_MAX+1]; @@ -663,7 +663,7 @@ static int parse_mark(int *argc_p, char ***argv_p, struct nlmsghdr *n) struct tc_u32_mark mark; if (argc <= 1) - return -1; + missarg("mark"); if (get_u32(&mark.val, *argv, 0)) { fprintf(stderr, "Illegal \"mark\" value\n"); @@ -1018,7 +1018,7 @@ static __u32 u32_hash_fold(struct tc_u32_key *key) return ntohl(key->val & key->mask) >> fshift; } -static int u32_parse_opt(struct filter_util *qu, char *handle, +static int u32_parse_opt(const struct filter_util *qu, char *handle, int argc, char **argv, struct nlmsghdr *n) { struct { @@ -1232,7 +1232,7 @@ static int u32_parse_opt(struct filter_util *qu, char *handle, return 0; } -static int u32_print_opt(struct filter_util *qu, FILE *f, struct rtattr *opt, +static int u32_print_opt(const struct filter_util *qu, FILE *f, struct rtattr *opt, __u32 handle) { struct rtattr *tb[TCA_U32_MAX + 1]; diff --git a/tc/m_action.c b/tc/m_action.c index f180ba0..36bb59e 100644 --- a/tc/m_action.c +++ b/tc/m_action.c @@ -41,7 +41,7 @@ static void act_usage(void) */ fprintf(stderr, "usage: tc actions <ACTSPECOP>*\n" - "Where: ACTSPECOP := ACR | GD | FL\n" + "Where: ACTSPECOP := ACR | GD | FL\n" " ACR := add | change | replace <ACTSPEC>*\n" " GD := get | delete | <ACTISPEC>*\n" " FL := ls | list | flush | <ACTNAMESPEC>\n" @@ -59,7 +59,7 @@ static void act_usage(void) exit(-1); } -static int print_noaopt(struct action_util *au, FILE *f, struct rtattr *opt) +static int print_noaopt(const struct action_util *au, FILE *f, struct rtattr *opt) { if (opt && RTA_PAYLOAD(opt)) fprintf(stderr, "[Unknown action, optlen=%u] ", @@ -67,7 +67,7 @@ static int print_noaopt(struct action_util *au, FILE *f, struct rtattr *opt) return 0; } -static int parse_noaopt(struct action_util *au, int *argc_p, +static int parse_noaopt(const struct action_util *au, int *argc_p, char ***argv_p, int code, struct nlmsghdr *n) { int argc = *argc_p; @@ -688,7 +688,16 @@ static int tc_action_gd(int cmd, unsigned int flags, req.n.nlmsg_seq = rth.dump = ++rth.seq; - if (rtnl_talk(&rth, &req.n, cmd == RTM_DELACTION ? NULL : &ans) < 0) { + if (cmd == RTM_DELACTION) { + if (echo_request) + ret = rtnl_echo_talk(&rth, &req.n, json, print_action); + else + ret = rtnl_talk(&rth, &req.n, NULL); + } else { + ret = rtnl_talk(&rth, &req.n, &ans); + } + + if (ret < 0) { fprintf(stderr, "We have an error talking to the kernel\n"); return 1; } @@ -738,7 +747,12 @@ static int tc_action_modify(int cmd, unsigned int flags, } tail->rta_len = (void *) NLMSG_TAIL(&req.n) - (void *) tail; - if (rtnl_talk(&rth, &req.n, NULL) < 0) { + if (echo_request) + ret = rtnl_echo_talk(&rth, &req.n, json, print_action); + else + ret = rtnl_talk(&rth, &req.n, NULL); + + if (ret < 0) { fprintf(stderr, "We have an error talking to the kernel\n"); ret = -1; } @@ -836,7 +850,12 @@ static int tc_act_list_or_flush(int *argc_p, char ***argv_p, int event) req.n.nlmsg_type = RTM_DELACTION; req.n.nlmsg_flags |= NLM_F_ROOT; req.n.nlmsg_flags |= NLM_F_REQUEST; - if (rtnl_talk(&rth, &req.n, NULL) < 0) { + + if (echo_request) + ret = rtnl_echo_talk(&rth, &req.n, json, print_action); + else + ret = rtnl_talk(&rth, &req.n, NULL); + if (ret < 0) { fprintf(stderr, "We have an error flushing\n"); return 1; } @@ -69,7 +69,7 @@ static const struct bpf_cfg_ops bpf_cb_ops = { .ebpf_cb = bpf_ebpf_cb, }; -static int bpf_parse_opt(struct action_util *a, int *ptr_argc, char ***ptr_argv, +static int bpf_parse_opt(const struct action_util *a, int *ptr_argc, char ***ptr_argv, int tca_id, struct nlmsghdr *n) { const char *bpf_obj = NULL, *bpf_uds_name = NULL; @@ -151,7 +151,7 @@ opt_bpf: return ret; } -static int bpf_print_opt(struct action_util *au, FILE *f, struct rtattr *arg) +static int bpf_print_opt(const struct action_util *au, FILE *f, struct rtattr *arg) { struct rtattr *tb[TCA_ACT_BPF_MAX + 1]; struct tc_act_bpf *parm; diff --git a/tc/m_connmark.c b/tc/m_connmark.c index 8506d95..8b5630f 100644 --- a/tc/m_connmark.c +++ b/tc/m_connmark.c @@ -32,7 +32,7 @@ usage(void) } static int -parse_connmark(struct action_util *a, int *argc_p, char ***argv_p, int tca_id, +parse_connmark(const struct action_util *a, int *argc_p, char ***argv_p, int tca_id, struct nlmsghdr *n) { struct tc_connmark sel = {}; @@ -94,7 +94,7 @@ parse_connmark(struct action_util *a, int *argc_p, char ***argv_p, int tca_id, return 0; } -static int print_connmark(struct action_util *au, FILE *f, struct rtattr *arg) +static int print_connmark(const struct action_util *au, FILE *f, struct rtattr *arg) { struct rtattr *tb[TCA_CONNMARK_MAX + 1]; struct tc_connmark *ci; diff --git a/tc/m_csum.c b/tc/m_csum.c index f5fe8f5..21204e5 100644 --- a/tc/m_csum.c +++ b/tc/m_csum.c @@ -81,7 +81,7 @@ parse_csum_args(int *argc_p, char ***argv_p, struct tc_csum *sel) } static int -parse_csum(struct action_util *a, int *argc_p, +parse_csum(const struct action_util *a, int *argc_p, char ***argv_p, int tca_id, struct nlmsghdr *n) { struct tc_csum sel = {}; @@ -148,7 +148,7 @@ skip_args: } static int -print_csum(struct action_util *au, FILE *f, struct rtattr *arg) +print_csum(const struct action_util *au, FILE *f, struct rtattr *arg) { struct tc_csum *sel; @@ -225,7 +225,7 @@ static int ct_parse_labels(char *str, struct nlmsghdr *n) } static int -parse_ct(struct action_util *a, int *argc_p, char ***argv_p, int tca_id, +parse_ct(const struct action_util *a, int *argc_p, char ***argv_p, int tca_id, struct nlmsghdr *n) { struct tc_ct sel = {}; @@ -488,7 +488,7 @@ static void ct_print_helper(struct rtattr *family, struct rtattr *proto, struct print_string(PRINT_ANY, "helper", " helper %s", helper); } -static int print_ct(struct action_util *au, FILE *f, struct rtattr *arg) +static int print_ct(const struct action_util *au, FILE *f, struct rtattr *arg) { struct rtattr *tb[TCA_CT_MAX + 1]; const char *commit; diff --git a/tc/m_ctinfo.c b/tc/m_ctinfo.c index 996a362..dbd5c0b 100644 --- a/tc/m_ctinfo.c +++ b/tc/m_ctinfo.c @@ -35,7 +35,7 @@ usage(void) } static int -parse_ctinfo(struct action_util *a, int *argc_p, char ***argv_p, int tca_id, +parse_ctinfo(const struct action_util *a, int *argc_p, char ***argv_p, int tca_id, struct nlmsghdr *n) { unsigned int cpmarkmask = 0, dscpmask = 0, dscpstatemask = 0; @@ -181,7 +181,7 @@ static void print_ctinfo_stats(FILE *f, struct rtattr *tb[TCA_CTINFO_MAX + 1]) rta_getattr_u64(tb[TCA_CTINFO_STATS_CPMARK_SET])); } -static int print_ctinfo(struct action_util *au, FILE *f, struct rtattr *arg) +static int print_ctinfo(const struct action_util *au, FILE *f, struct rtattr *arg) { unsigned int cpmarkmask = ~0, dscpmask = 0, dscpstatemask = 0; struct rtattr *tb[TCA_CTINFO_MAX + 1]; diff --git a/tc/m_gact.c b/tc/m_gact.c index 225ffce..670d59f 100644 --- a/tc/m_gact.c +++ b/tc/m_gact.c @@ -66,7 +66,7 @@ usage(void) } static int -parse_gact(struct action_util *a, int *argc_p, char ***argv_p, +parse_gact(const struct action_util *a, int *argc_p, char ***argv_p, int tca_id, struct nlmsghdr *n) { int argc = *argc_p; @@ -157,7 +157,7 @@ skip_args: } static int -print_gact(struct action_util *au, FILE *f, struct rtattr *arg) +print_gact(const struct action_util *au, FILE *f, struct rtattr *arg) { #ifdef CONFIG_GACT_PROB struct tc_gact_p *pp = NULL; diff --git a/tc/m_gate.c b/tc/m_gate.c index 37afa42..33ee63b 100644 --- a/tc/m_gate.c +++ b/tc/m_gate.c @@ -56,9 +56,9 @@ static void explain_entry_format(void) fprintf(stderr, "Usage: sched-entry <open | close> <interval> [ <interval ipv> <octets max bytes> ]\n"); } -static int parse_gate(struct action_util *a, int *argc_p, char ***argv_p, +static int parse_gate(const struct action_util *a, int *argc_p, char ***argv_p, int tca_id, struct nlmsghdr *n); -static int print_gate(struct action_util *au, FILE *f, struct rtattr *arg); +static int print_gate(const struct action_util *au, FILE *f, struct rtattr *arg); struct action_util gate_action_util = { .id = "gate", @@ -135,7 +135,7 @@ static void free_entries(struct list_head *gate_entries) } } -static int parse_gate(struct action_util *a, int *argc_p, char ***argv_p, +static int parse_gate(const struct action_util *a, int *argc_p, char ***argv_p, int tca_id, struct nlmsghdr *n) { struct tc_gate parm = {.action = TC_ACT_PIPE}; @@ -441,7 +441,7 @@ static int print_gate_list(struct rtattr *list) return 0; } -static int print_gate(struct action_util *au, FILE *f, struct rtattr *arg) +static int print_gate(const struct action_util *au, FILE *f, struct rtattr *arg) { struct tc_gate *parm; struct rtattr *tb[TCA_GATE_MAX + 1]; @@ -44,7 +44,7 @@ static void ife_usage(void) exit(-1); } -static int parse_ife(struct action_util *a, int *argc_p, char ***argv_p, +static int parse_ife(const struct action_util *a, int *argc_p, char ***argv_p, int tca_id, struct nlmsghdr *n) { int argc = *argc_p; @@ -211,7 +211,7 @@ skip_encode: return 0; } -static int print_ife(struct action_util *au, FILE *f, struct rtattr *arg) +static int print_ife(const struct action_util *au, FILE *f, struct rtattr *arg) { struct tc_ife *p; struct rtattr *tb[TCA_IFE_MAX + 1]; diff --git a/tc/m_mirred.c b/tc/m_mirred.c index e5653e6..cfecd59 100644 --- a/tc/m_mirred.c +++ b/tc/m_mirred.c @@ -24,12 +24,16 @@ static void explain(void) { fprintf(stderr, - "Usage: mirred <DIRECTION> <ACTION> [index INDEX] <dev DEVICENAME>\n" + "Usage: mirred <DIRECTION> <ACTION> [index INDEX] <TARGET>\n" "where:\n" "\tDIRECTION := <ingress | egress>\n" "\tACTION := <mirror | redirect>\n" "\tINDEX is the specific policy instance id\n" - "\tDEVICENAME is the devicename\n"); + "\tTARGET := <BLOCK | DEVICE>\n" + "\tDEVICE := dev DEVICENAME\n" + "\tDEVICENAME is the devicename\n" + "\tBLOCK := blockid BLOCKID\n" + "\tBLOCKID := 32-bit unsigned block ID\n"); } static void @@ -84,7 +88,7 @@ static const char *mirred_action(int action) } static int -parse_direction(struct action_util *a, int *argc_p, char ***argv_p, +parse_direction(const struct action_util *a, int *argc_p, char ***argv_p, int tca_id, struct nlmsghdr *n) { @@ -94,6 +98,7 @@ parse_direction(struct action_util *a, int *argc_p, char ***argv_p, struct tc_mirred p = {}; struct rtattr *tail; char d[IFNAMSIZ] = {}; + __u32 blockid = 0; while (argc > 0) { @@ -162,15 +167,37 @@ parse_direction(struct action_util *a, int *argc_p, char ***argv_p, TCA_INGRESS_REDIR; p.action = TC_ACT_STOLEN; ok++; - } else if ((redir || mirror) && - matches(*argv, "dev") == 0) { - NEXT_ARG(); - if (strlen(d)) - duparg("dev", *argv); - - strncpy(d, *argv, sizeof(d)-1); - argc--; - argv++; + } else if ((redir || mirror)) { + if (strcmp(*argv, "blockid") == 0) { + if (strlen(d)) { + fprintf(stderr, + "blockid and device are mutually exclusive.\n"); + return -1; + } + NEXT_ARG(); + if (get_u32(&blockid, *argv, 0) || + !blockid) { + fprintf(stderr, + "invalid block ID"); + return -1; + } + argc--; + argv++; + } + if (argc && matches(*argv, "dev") == 0) { + if (blockid) { + fprintf(stderr, + "blockid and device are mutually exclusive.\n"); + return -1; + } + NEXT_ARG(); + if (strlen(d)) + duparg("dev", *argv); + + strncpy(d, *argv, sizeof(d)-1); + argc--; + argv++; + } break; @@ -220,6 +247,8 @@ parse_direction(struct action_util *a, int *argc_p, char ***argv_p, tail = addattr_nest(n, MAX_MSG, tca_id); addattr_l(n, MAX_MSG, TCA_MIRRED_PARMS, &p, sizeof(p)); + if (blockid) + addattr32(n, MAX_MSG, TCA_MIRRED_BLOCKID, blockid); addattr_nest_end(n, tail); *argc_p = argc; @@ -229,7 +258,7 @@ parse_direction(struct action_util *a, int *argc_p, char ***argv_p, static int -parse_mirred(struct action_util *a, int *argc_p, char ***argv_p, +parse_mirred(const struct action_util *a, int *argc_p, char ***argv_p, int tca_id, struct nlmsghdr *n) { @@ -270,7 +299,7 @@ parse_mirred(struct action_util *a, int *argc_p, char ***argv_p, } static int -print_mirred(struct action_util *au, FILE *f, struct rtattr *arg) +print_mirred(const struct action_util *au, FILE *f, struct rtattr *arg) { struct tc_mirred *p; struct rtattr *tb[TCA_MIRRED_MAX + 1]; @@ -299,7 +328,15 @@ print_mirred(struct action_util *au, FILE *f, struct rtattr *arg) mirred_action(p->eaction)); print_string(PRINT_JSON, "direction", NULL, mirred_direction(p->eaction)); - print_string(PRINT_ANY, "to_dev", " to device %s)", dev); + if (tb[TCA_MIRRED_BLOCKID]) { + const __u32 *blockid = RTA_DATA(tb[TCA_MIRRED_BLOCKID]); + + print_uint(PRINT_ANY, "to_blockid", " to blockid %u)", + *blockid); + } else { + print_string(PRINT_ANY, "to_dev", " to device %s)", dev); + } + print_action_control(f, " ", p->action, ""); print_nl(); diff --git a/tc/m_mpls.c b/tc/m_mpls.c index dda4680..ca3a18a 100644 --- a/tc/m_mpls.c +++ b/tc/m_mpls.c @@ -72,7 +72,7 @@ static bool check_double_action(unsigned int action, const char *arg) return true; } -static int parse_mpls(struct action_util *a, int *argc_p, char ***argv_p, +static int parse_mpls(const struct action_util *a, int *argc_p, char ***argv_p, int tca_id, struct nlmsghdr *n) { struct tc_mpls parm = {}; @@ -211,7 +211,7 @@ skip_args: return 0; } -static int print_mpls(struct action_util *au, FILE *f, struct rtattr *arg) +static int print_mpls(const struct action_util *au, FILE *f, struct rtattr *arg) { struct rtattr *tb[TCA_MPLS_MAX + 1]; struct tc_mpls *parm; @@ -76,7 +76,7 @@ bad_val: } static int -parse_nat(struct action_util *a, int *argc_p, char ***argv_p, int tca_id, struct nlmsghdr *n) +parse_nat(const struct action_util *a, int *argc_p, char ***argv_p, int tca_id, struct nlmsghdr *n) { struct tc_nat sel = {}; @@ -136,7 +136,7 @@ skip_args: } static int -print_nat(struct action_util *au, FILE * f, struct rtattr *arg) +print_nat(const struct action_util *au, FILE * f, struct rtattr *arg) { struct tc_nat *sel; struct rtattr *tb[TCA_NAT_MAX + 1]; diff --git a/tc/m_pedit.c b/tc/m_pedit.c index 32f0341..5c84a90 100644 --- a/tc/m_pedit.c +++ b/tc/m_pedit.c @@ -620,7 +620,7 @@ static int pedit_keys_ex_addattr(struct m_pedit_sel *sel, struct nlmsghdr *n) return 0; } -static int parse_pedit(struct action_util *a, int *argc_p, char ***argv_p, +static int parse_pedit(const struct action_util *a, int *argc_p, char ***argv_p, int tca_id, struct nlmsghdr *n) { struct m_pedit_sel sel = {}; @@ -745,7 +745,7 @@ static int print_pedit_location(FILE *f, return 0; } -static int print_pedit(struct action_util *au, FILE *f, struct rtattr *arg) +static int print_pedit(const struct action_util *au, FILE *f, struct rtattr *arg) { struct tc_pedit_sel *sel; struct rtattr *tb[TCA_PEDIT_MAX + 1]; @@ -771,20 +771,20 @@ static int print_pedit(struct action_util *au, FILE *f, struct rtattr *arg) sel = RTA_DATA(tb[TCA_PEDIT_PARMS_EX]); if (!tb[TCA_PEDIT_KEYS_EX]) { - fprintf(f, "Netlink error\n"); + fprintf(stderr, "Netlink error\n"); return -1; } keys_ex = calloc(sel->nkeys, sizeof(*keys_ex)); if (!keys_ex) { - fprintf(f, "Out of memory\n"); + fprintf(stderr, "Out of memory\n"); return -1; } err = pedit_keys_ex_getattr(tb[TCA_PEDIT_KEYS_EX], keys_ex, sel->nkeys); if (err) { - fprintf(f, "Netlink error\n"); + fprintf(stderr, "Netlink error\n"); free(keys_ex); return -1; diff --git a/tc/m_police.c b/tc/m_police.c index 46c39a8..8d6887e 100644 --- a/tc/m_police.c +++ b/tc/m_police.c @@ -17,9 +17,9 @@ #include "utils.h" #include "tc_util.h" -static int act_parse_police(struct action_util *a, int *argc_p, +static int act_parse_police(const struct action_util *a, int *argc_p, char ***argv_p, int tca_id, struct nlmsghdr *n); -static int print_police(struct action_util *a, FILE *f, struct rtattr *tb); +static int print_police(const struct action_util *a, FILE *f, struct rtattr *tb); struct action_util police_action_util = { .id = "police", @@ -42,7 +42,7 @@ static void usage(void) exit(-1); } -static int act_parse_police(struct action_util *a, int *argc_p, char ***argv_p, +static int act_parse_police(const struct action_util *a, int *argc_p, char ***argv_p, int tca_id, struct nlmsghdr *n) { int argc = *argc_p; @@ -260,7 +260,7 @@ int parse_police(int *argc_p, char ***argv_p, int tca_id, struct nlmsghdr *n) return act_parse_police(NULL, argc_p, argv_p, tca_id, n); } -static int print_police(struct action_util *a, FILE *f, struct rtattr *arg) +static int print_police(const struct action_util *a, FILE *f, struct rtattr *arg) { SPRINT_BUF(b2); struct tc_police *p; diff --git a/tc/m_sample.c b/tc/m_sample.c index 769de14..3baf1d5 100644 --- a/tc/m_sample.c +++ b/tc/m_sample.c @@ -31,7 +31,7 @@ static void usage(void) exit(-1); } -static int parse_sample(struct action_util *a, int *argc_p, char ***argv_p, +static int parse_sample(const struct action_util *a, int *argc_p, char ***argv_p, int tca_id, struct nlmsghdr *n) { struct tc_sample p = { 0 }; @@ -45,11 +45,8 @@ static int parse_sample(struct action_util *a, int *argc_p, char ***argv_p, __u32 group; __u32 rate; - if (argc <= 1) { - fprintf(stderr, "sample bad argument count %d\n", argc); - usage(); - return -1; - } + if (argc <= 1) + missarg("sample count"); if (matches(*argv, "sample") == 0) { NEXT_ARG(); @@ -133,7 +130,7 @@ static int parse_sample(struct action_util *a, int *argc_p, char ***argv_p, return 0; } -static int print_sample(struct action_util *au, FILE *f, struct rtattr *arg) +static int print_sample(const struct action_util *au, FILE *f, struct rtattr *arg) { struct rtattr *tb[TCA_SAMPLE_MAX + 1]; struct tc_sample *p; diff --git a/tc/m_simple.c b/tc/m_simple.c index fe2bca2..55f3444 100644 --- a/tc/m_simple.c +++ b/tc/m_simple.c @@ -90,7 +90,7 @@ static void usage(void) } static int -parse_simple(struct action_util *a, int *argc_p, char ***argv_p, int tca_id, +parse_simple(const struct action_util *a, int *argc_p, char ***argv_p, int tca_id, struct nlmsghdr *n) { struct tc_defact sel = {}; @@ -155,7 +155,7 @@ parse_simple(struct action_util *a, int *argc_p, char ***argv_p, int tca_id, return 0; } -static int print_simple(struct action_util *au, FILE *f, struct rtattr *arg) +static int print_simple(const struct action_util *au, FILE *f, struct rtattr *arg) { struct tc_defact *sel; struct rtattr *tb[TCA_DEF_MAX + 1]; @@ -179,9 +179,11 @@ static int print_simple(struct action_util *au, FILE *f, struct rtattr *arg) simpdata = RTA_DATA(tb[TCA_DEF_DATA]); - fprintf(f, "Simple <%s>\n", simpdata); - fprintf(f, "\t index %u ref %d bind %d", sel->index, - sel->refcnt, sel->bindcnt); + print_string(PRINT_ANY, "simple", "Simple <%s>", simpdata); + print_nl(); + print_uint(PRINT_ANY, "index", "\t index %u ", sel->index); + print_int(PRINT_ANY, "ref", "ref %d ", sel->refcnt); + print_int(PRINT_ANY, "bind","bind %d", sel->bindcnt); if (show_stats) { if (tb[TCA_DEF_TM]) { diff --git a/tc/m_skbedit.c b/tc/m_skbedit.c index d55a612..b55c324 100644 --- a/tc/m_skbedit.c +++ b/tc/m_skbedit.c @@ -41,7 +41,7 @@ usage(void) } static int -parse_skbedit(struct action_util *a, int *argc_p, char ***argv_p, int tca_id, +parse_skbedit(const struct action_util *a, int *argc_p, char ***argv_p, int tca_id, struct nlmsghdr *n) { int argc = *argc_p; @@ -177,7 +177,7 @@ parse_skbedit(struct action_util *a, int *argc_p, char ***argv_p, int tca_id, return 0; } -static int print_skbedit(struct action_util *au, FILE *f, struct rtattr *arg) +static int print_skbedit(const struct action_util *au, FILE *f, struct rtattr *arg) { struct rtattr *tb[TCA_SKBEDIT_MAX + 1]; diff --git a/tc/m_skbmod.c b/tc/m_skbmod.c index b1c8d00..af64e99 100644 --- a/tc/m_skbmod.c +++ b/tc/m_skbmod.c @@ -40,7 +40,7 @@ static void skbmod_usage(void) exit(-1); } -static int parse_skbmod(struct action_util *a, int *argc_p, char ***argv_p, +static int parse_skbmod(const struct action_util *a, int *argc_p, char ***argv_p, int tca_id, struct nlmsghdr *n) { int argc = *argc_p; @@ -156,7 +156,7 @@ static int parse_skbmod(struct action_util *a, int *argc_p, char ***argv_p, return 0; } -static int print_skbmod(struct action_util *au, FILE *f, struct rtattr *arg) +static int print_skbmod(const struct action_util *au, FILE *f, struct rtattr *arg) { struct tc_skbmod *p; struct rtattr *tb[TCA_SKBMOD_MAX + 1]; @@ -177,43 +177,48 @@ static int print_skbmod(struct action_util *au, FILE *f, struct rtattr *arg) p = RTA_DATA(tb[TCA_SKBMOD_PARMS]); - fprintf(f, "skbmod "); + print_string(PRINT_FP, NULL, "skbmod ", NULL); print_action_control(f, "", p->action, " "); if (tb[TCA_SKBMOD_ETYPE]) { skbmod_etype = rta_getattr_u16(tb[TCA_SKBMOD_ETYPE]); has_optional = 1; - fprintf(f, "set etype 0x%X ", skbmod_etype); + print_0xhex(PRINT_ANY, "etype", "set etype 0x%X ", skbmod_etype); } if (has_optional) - fprintf(f, "\n\t "); + print_string(PRINT_FP, NULL, "%s\t ", _SL_); if (tb[TCA_SKBMOD_DMAC]) { has_optional = 1; - fprintf(f, "set dmac %s ", - ll_addr_n2a(RTA_DATA(tb[TCA_SKBMOD_DMAC]), - RTA_PAYLOAD(tb[TCA_SKBMOD_DMAC]), 0, b1, - sizeof(b1))); + print_color_string(PRINT_ANY, COLOR_MAC, "dmac", + "set dmac %s ", + ll_addr_n2a(RTA_DATA(tb[TCA_SKBMOD_DMAC]), + RTA_PAYLOAD(tb[TCA_SKBMOD_DMAC]), 0, b1, + sizeof(b1))); } if (tb[TCA_SKBMOD_SMAC]) { has_optional = 1; - fprintf(f, "set smac %s ", - ll_addr_n2a(RTA_DATA(tb[TCA_SKBMOD_SMAC]), - RTA_PAYLOAD(tb[TCA_SKBMOD_SMAC]), 0, b2, - sizeof(b2))); + print_color_string(PRINT_ANY, COLOR_MAC, "smac", + "set smac %s ", + ll_addr_n2a(RTA_DATA(tb[TCA_SKBMOD_SMAC]), + RTA_PAYLOAD(tb[TCA_SKBMOD_SMAC]), 0, b2, + sizeof(b2))); } if (p->flags & SKBMOD_F_SWAPMAC) - fprintf(f, "swap mac "); + print_null(PRINT_ANY, "swapmac", "swap mac ", NULL); if (p->flags & SKBMOD_F_ECN) - fprintf(f, "ecn "); + print_null(PRINT_ANY, "ecn", "ecn ", NULL); + + print_nl(); + print_uint(PRINT_ANY, "index", "\t index %u ", p->index); + print_int(PRINT_ANY, "ref", "ref %d ", p->refcnt); + print_int(PRINT_ANY, "bind", "bind %d", p->bindcnt); - fprintf(f, "\n\t index %u ref %d bind %d", p->index, p->refcnt, - p->bindcnt); if (show_stats) { if (tb[TCA_SKBMOD_TM]) { struct tcf_t *tm = RTA_DATA(tb[TCA_SKBMOD_TM]); @@ -222,7 +227,7 @@ static int print_skbmod(struct action_util *au, FILE *f, struct rtattr *arg) } } - fprintf(f, "\n"); + print_string(PRINT_FP, NULL, "\n", NULL); return 0; } diff --git a/tc/m_tunnel_key.c b/tc/m_tunnel_key.c index ff699cc..2032a72 100644 --- a/tc/m_tunnel_key.c +++ b/tc/m_tunnel_key.c @@ -311,7 +311,7 @@ static int tunnel_key_parse_tos_ttl(char *str, int type, struct nlmsghdr *n) return 0; } -static int parse_tunnel_key(struct action_util *a, int *argc_p, char ***argv_p, +static int parse_tunnel_key(const struct action_util *a, int *argc_p, char ***argv_p, int tca_id, struct nlmsghdr *n) { struct tc_tunnel_key parm = {}; @@ -688,7 +688,7 @@ static void tunnel_key_print_tos_ttl(FILE *f, char *name, } } -static int print_tunnel_key(struct action_util *au, FILE *f, struct rtattr *arg) +static int print_tunnel_key(const struct action_util *au, FILE *f, struct rtattr *arg) { struct rtattr *tb[TCA_TUNNEL_KEY_MAX + 1]; struct tc_tunnel_key *parm; diff --git a/tc/m_vlan.c b/tc/m_vlan.c index c1dc8b4..40d62fa 100644 --- a/tc/m_vlan.c +++ b/tc/m_vlan.c @@ -56,7 +56,7 @@ static void unexpected(const char *arg) explain(); } -static int parse_vlan(struct action_util *a, int *argc_p, char ***argv_p, +static int parse_vlan(const struct action_util *a, int *argc_p, char ***argv_p, int tca_id, struct nlmsghdr *n) { int argc = *argc_p; @@ -227,7 +227,7 @@ static int parse_vlan(struct action_util *a, int *argc_p, char ***argv_p, return 0; } -static int print_vlan(struct action_util *au, FILE *f, struct rtattr *arg) +static int print_vlan(const struct action_util *au, FILE *f, struct rtattr *arg) { SPRINT_BUF(b1); struct rtattr *tb[TCA_VLAN_MAX + 1]; diff --git a/tc/q_cake.c b/tc/q_cake.c index c438b76..e2b8de5 100644 --- a/tc/q_cake.c +++ b/tc/q_cake.c @@ -88,7 +88,7 @@ static void explain(void) " (* marks defaults)\n"); } -static int cake_parse_opt(struct qdisc_util *qu, int argc, char **argv, +static int cake_parse_opt(const struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n, const char *dev) { struct cake_preset *preset, *preset_set = NULL; @@ -415,7 +415,7 @@ static void cake_print_mode(unsigned int value, unsigned int max, } } -static int cake_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) +static int cake_print_opt(const struct qdisc_util *qu, FILE *f, struct rtattr *opt) { struct rtattr *tb[TCA_CAKE_MAX + 1]; unsigned int interval = 0; @@ -614,7 +614,7 @@ static void cake_print_json_tin(struct rtattr **tstat) #undef PRINT_TSTAT_JSON } -static int cake_print_xstats(struct qdisc_util *qu, FILE *f, +static int cake_print_xstats(const struct qdisc_util *qu, FILE *f, struct rtattr *xstats) { struct rtattr *st[TCA_CAKE_STATS_MAX + 1]; @@ -29,7 +29,7 @@ static void explain1(const char *arg, const char *val) fprintf(stderr, "cbs: illegal value for \"%s\": \"%s\"\n", arg, val); } -static int cbs_parse_opt(struct qdisc_util *qu, int argc, +static int cbs_parse_opt(const struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n, const char *dev) { struct tc_cbs_qopt opt = {}; @@ -103,7 +103,7 @@ static int cbs_parse_opt(struct qdisc_util *qu, int argc, return 0; } -static int cbs_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) +static int cbs_print_opt(const struct qdisc_util *qu, FILE *f, struct rtattr *opt) { struct rtattr *tb[TCA_CBS_MAX+1]; struct tc_cbs_qopt *qopt; diff --git a/tc/q_choke.c b/tc/q_choke.c index 7653eb7..a16f5f6 100644 --- a/tc/q_choke.c +++ b/tc/q_choke.c @@ -27,7 +27,7 @@ static void explain(void) " [ min PACKETS ] [ max PACKETS ] [ burst PACKETS ]\n"); } -static int choke_parse_opt(struct qdisc_util *qu, int argc, char **argv, +static int choke_parse_opt(const struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n, const char *dev) { struct tc_red_qopt opt = {}; @@ -162,7 +162,7 @@ static int choke_parse_opt(struct qdisc_util *qu, int argc, char **argv, return 0; } -static int choke_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) +static int choke_print_opt(const struct qdisc_util *qu, FILE *f, struct rtattr *opt) { struct rtattr *tb[TCA_CHOKE_MAX+1]; const struct tc_red_qopt *qopt; @@ -203,7 +203,7 @@ static int choke_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) return 0; } -static int choke_print_xstats(struct qdisc_util *qu, FILE *f, +static int choke_print_xstats(const struct qdisc_util *qu, FILE *f, struct rtattr *xstats) { struct tc_choke_xstats *st; diff --git a/tc/q_clsact.c b/tc/q_clsact.c index 341f653..5bd9eb2 100644 --- a/tc/q_clsact.c +++ b/tc/q_clsact.c @@ -10,7 +10,7 @@ static void explain(void) fprintf(stderr, "Usage: ... clsact\n"); } -static int clsact_parse_opt(struct qdisc_util *qu, int argc, char **argv, +static int clsact_parse_opt(const struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n, const char *dev) { if (argc > 0) { @@ -22,7 +22,7 @@ static int clsact_parse_opt(struct qdisc_util *qu, int argc, char **argv, return 0; } -static int clsact_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) +static int clsact_print_opt(const struct qdisc_util *qu, FILE *f, struct rtattr *opt) { return 0; } diff --git a/tc/q_codel.c b/tc/q_codel.c index 03b6f92..15029b4 100644 --- a/tc/q_codel.c +++ b/tc/q_codel.c @@ -28,7 +28,7 @@ static void explain(void) " [ ce_threshold TIME ]\n"); } -static int codel_parse_opt(struct qdisc_util *qu, int argc, char **argv, +static int codel_parse_opt(const struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n, const char *dev) { unsigned int limit = 0; @@ -95,7 +95,7 @@ static int codel_parse_opt(struct qdisc_util *qu, int argc, char **argv, return 0; } -static int codel_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) +static int codel_print_opt(const struct qdisc_util *qu, FILE *f, struct rtattr *opt) { struct rtattr *tb[TCA_CODEL_MAX + 1]; unsigned int limit; @@ -147,7 +147,7 @@ static int codel_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) return 0; } -static int codel_print_xstats(struct qdisc_util *qu, FILE *f, +static int codel_print_xstats(const struct qdisc_util *qu, FILE *f, struct rtattr *xstats) { struct tc_codel_xstats _st = {}, *st; @@ -28,7 +28,7 @@ static void explain2(void) } -static int drr_parse_opt(struct qdisc_util *qu, int argc, char **argv, +static int drr_parse_opt(const struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n, const char *dev) { while (argc) { @@ -44,7 +44,7 @@ static int drr_parse_opt(struct qdisc_util *qu, int argc, char **argv, return 0; } -static int drr_parse_class_opt(struct qdisc_util *qu, int argc, char **argv, +static int drr_parse_class_opt(const struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n, const char *dev) { struct rtattr *tail; @@ -75,7 +75,7 @@ static int drr_parse_class_opt(struct qdisc_util *qu, int argc, char **argv, return 0; } -static int drr_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) +static int drr_print_opt(const struct qdisc_util *qu, FILE *f, struct rtattr *opt) { struct rtattr *tb[TCA_DRR_MAX + 1]; @@ -90,7 +90,7 @@ static int drr_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) return 0; } -static int drr_print_xstats(struct qdisc_util *qu, FILE *f, struct rtattr *xstats) +static int drr_print_xstats(const struct qdisc_util *qu, FILE *f, struct rtattr *xstats) { struct tc_drr_stats *x; @@ -39,7 +39,7 @@ static void explain_clockid(const char *val) val); } -static int etf_parse_opt(struct qdisc_util *qu, int argc, +static int etf_parse_opt(const struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n, const char *dev) { struct tc_etf_qopt opt = { @@ -107,7 +107,7 @@ static int etf_parse_opt(struct qdisc_util *qu, int argc, return 0; } -static int etf_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) +static int etf_print_opt(const struct qdisc_util *qu, FILE *f, struct rtattr *opt) { struct rtattr *tb[TCA_ETF_MAX+1]; struct tc_etf_qopt *qopt; @@ -57,7 +57,7 @@ static int parse_nbands(const char *arg, __u8 *pnbands, const char *what) return 0; } -static int ets_parse_opt(struct qdisc_util *qu, int argc, char **argv, +static int ets_parse_opt(const struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n, const char *dev) { __u8 nbands = 0; @@ -182,7 +182,7 @@ parse_priomap: return 0; } -static int ets_parse_copt(struct qdisc_util *qu, int argc, char **argv, +static int ets_parse_copt(const struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n, const char *dev) { unsigned int quantum = 0; @@ -276,7 +276,7 @@ static int ets_print_opt_priomap(struct rtattr *opt) return 0; } -static int ets_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) +static int ets_print_opt(const struct qdisc_util *qu, FILE *f, struct rtattr *opt) { struct rtattr *tb[TCA_ETS_MAX + 1]; __u8 nbands; @@ -310,7 +310,7 @@ static int ets_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) return ets_print_opt_priomap(tb[TCA_ETS_PRIOMAP]); } -static int ets_print_copt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) +static int ets_print_copt(const struct qdisc_util *qu, FILE *f, struct rtattr *opt) { struct rtattr *tb[TCA_ETS_MAX + 1]; __u32 quantum; diff --git a/tc/q_fifo.c b/tc/q_fifo.c index 9b2c534..489208d 100644 --- a/tc/q_fifo.c +++ b/tc/q_fifo.c @@ -22,7 +22,7 @@ static void explain(void) fprintf(stderr, "Usage: ... <[p|b]fifo | pfifo_head_drop> [ limit NUMBER ]\n"); } -static int fifo_parse_opt(struct qdisc_util *qu, int argc, char **argv, +static int fifo_parse_opt(const struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n, const char *dev) { int ok = 0; @@ -52,7 +52,7 @@ static int fifo_parse_opt(struct qdisc_util *qu, int argc, char **argv, return 0; } -static int fifo_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) +static int fifo_print_opt(const struct qdisc_util *qu, FILE *f, struct rtattr *opt) { struct tc_fifo_qopt *qopt; @@ -47,7 +47,7 @@ static unsigned int ilog2(unsigned int val) return res; } -static int fq_parse_opt(struct qdisc_util *qu, int argc, char **argv, +static int fq_parse_opt(const struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n, const char *dev) { struct tc_prio_qopt prio2band; @@ -337,7 +337,7 @@ static int fq_parse_opt(struct qdisc_util *qu, int argc, char **argv, return 0; } -static int fq_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) +static int fq_print_opt(const struct qdisc_util *qu, FILE *f, struct rtattr *opt) { struct rtattr *tb[TCA_FQ_MAX + 1]; unsigned int plimit, flow_plimit; @@ -490,7 +490,7 @@ static int fq_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) return 0; } -static int fq_print_xstats(struct qdisc_util *qu, FILE *f, +static int fq_print_xstats(const struct qdisc_util *qu, FILE *f, struct rtattr *xstats) { struct tc_fq_qd_stats *st, _st; diff --git a/tc/q_fq_codel.c b/tc/q_fq_codel.c index 9c9d7bc..a619d2b 100644 --- a/tc/q_fq_codel.c +++ b/tc/q_fq_codel.c @@ -29,7 +29,7 @@ static void explain(void) "[ drop_batch SIZE ]\n"); } -static int fq_codel_parse_opt(struct qdisc_util *qu, int argc, char **argv, +static int fq_codel_parse_opt(const struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n, const char *dev) { unsigned int drop_batch = 0; @@ -157,7 +157,7 @@ static int fq_codel_parse_opt(struct qdisc_util *qu, int argc, char **argv, return 0; } -static int fq_codel_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) +static int fq_codel_print_opt(const struct qdisc_util *qu, FILE *f, struct rtattr *opt) { struct rtattr *tb[TCA_FQ_CODEL_MAX + 1]; unsigned int limit; @@ -250,7 +250,7 @@ static int fq_codel_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt return 0; } -static int fq_codel_print_xstats(struct qdisc_util *qu, FILE *f, +static int fq_codel_print_xstats(const struct qdisc_util *qu, FILE *f, struct rtattr *xstats) { struct tc_fq_codel_xstats _st = {}, *st; diff --git a/tc/q_fq_pie.c b/tc/q_fq_pie.c index 9cbef47..dc2710c 100644 --- a/tc/q_fq_pie.c +++ b/tc/q_fq_pie.c @@ -36,7 +36,7 @@ static void explain(void) #define ALPHA_MAX 32 #define BETA_MAX 32 -static int fq_pie_parse_opt(struct qdisc_util *qu, int argc, char **argv, +static int fq_pie_parse_opt(const struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n, const char *dev) { unsigned int limit = 0; @@ -172,7 +172,7 @@ static int fq_pie_parse_opt(struct qdisc_util *qu, int argc, char **argv, return 0; } -static int fq_pie_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) +static int fq_pie_print_opt(const struct qdisc_util *qu, FILE *f, struct rtattr *opt) { struct rtattr *tb[TCA_FQ_PIE_MAX + 1]; unsigned int limit = 0; @@ -269,7 +269,7 @@ static int fq_pie_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) return 0; } -static int fq_pie_print_xstats(struct qdisc_util *qu, FILE *f, +static int fq_pie_print_xstats(const struct qdisc_util *qu, FILE *f, struct rtattr *xstats) { struct tc_fq_pie_xstats _st = {}, *st; diff --git a/tc/q_gred.c b/tc/q_gred.c index f6a3f05..84fc912 100644 --- a/tc/q_gred.c +++ b/tc/q_gred.c @@ -39,7 +39,7 @@ static void explain(void) " [ probability PROBABILITY ] [ bandwidth KBPS ] [ecn] [harddrop]\n"); } -static int init_gred(struct qdisc_util *qu, int argc, char **argv, +static int init_gred(const struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n) { @@ -115,7 +115,7 @@ static int init_gred(struct qdisc_util *qu, int argc, char **argv, /* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */ -static int gred_parse_opt(struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n, const char *dev) +static int gred_parse_opt(const struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n, const char *dev) { struct rtattr *tail, *entry, *vqs; int ok = 0; @@ -406,7 +406,7 @@ gred_print_stats(struct tc_gred_info *info, struct tc_gred_qopt *qopt) print_size(PRINT_ANY, "bytes", "(%s) ", bytes); } -static int gred_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) +static int gred_print_opt(const struct qdisc_util *qu, FILE *f, struct rtattr *opt) { struct tc_gred_info infos[MAX_DPs] = {}; struct rtattr *tb[TCA_GRED_MAX + 1]; diff --git a/tc/q_hfsc.c b/tc/q_hfsc.c index 609d925..aed7130 100644 --- a/tc/q_hfsc.c +++ b/tc/q_hfsc.c @@ -65,7 +65,7 @@ explain1(char *arg) } static int -hfsc_parse_opt(struct qdisc_util *qu, int argc, char **argv, +hfsc_parse_opt(const struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n, const char *dev) { struct tc_hfsc_qopt qopt = {}; @@ -97,7 +97,7 @@ hfsc_parse_opt(struct qdisc_util *qu, int argc, char **argv, } static int -hfsc_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) +hfsc_print_opt(const struct qdisc_util *qu, FILE *f, struct rtattr *opt) { struct tc_hfsc_qopt *qopt; @@ -114,7 +114,7 @@ hfsc_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) } static int -hfsc_print_xstats(struct qdisc_util *qu, FILE *f, struct rtattr *xstats) +hfsc_print_xstats(const struct qdisc_util *qu, FILE *f, struct rtattr *xstats) { struct tc_hfsc_stats *st; @@ -136,7 +136,7 @@ hfsc_print_xstats(struct qdisc_util *qu, FILE *f, struct rtattr *xstats) } static int -hfsc_parse_class_opt(struct qdisc_util *qu, int argc, char **argv, +hfsc_parse_class_opt(const struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n, const char *dev) { struct tc_service_curve rsc = {}, fsc = {}, usc = {}; @@ -220,7 +220,7 @@ hfsc_print_sc(FILE *f, char *name, struct tc_service_curve *sc) } static int -hfsc_print_class_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) +hfsc_print_class_opt(const struct qdisc_util *qu, FILE *f, struct rtattr *opt) { struct rtattr *tb[TCA_HFSC_MAX+1]; struct tc_service_curve *rsc = NULL, *fsc = NULL, *usc = NULL; @@ -26,7 +26,7 @@ static void explain(void) " [ non_hh_weight NUMBER ]\n"); } -static int hhf_parse_opt(struct qdisc_util *qu, int argc, char **argv, +static int hhf_parse_opt(const struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n, const char *dev) { unsigned int limit = 0; @@ -117,7 +117,7 @@ static int hhf_parse_opt(struct qdisc_util *qu, int argc, char **argv, return 0; } -static int hhf_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) +static int hhf_print_opt(const struct qdisc_util *qu, FILE *f, struct rtattr *opt) { struct rtattr *tb[TCA_HHF_MAX + 1]; unsigned int limit; @@ -179,7 +179,7 @@ static int hhf_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) return 0; } -static int hhf_print_xstats(struct qdisc_util *qu, FILE *f, +static int hhf_print_xstats(const struct qdisc_util *qu, FILE *f, struct rtattr *xstats) { struct tc_hhf_xstats *st; @@ -53,7 +53,7 @@ static void explain1(char *arg) explain(); } -static int htb_parse_opt(struct qdisc_util *qu, int argc, +static int htb_parse_opt(const struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n, const char *dev) { unsigned int direct_qlen = ~0U; @@ -107,7 +107,7 @@ static int htb_parse_opt(struct qdisc_util *qu, int argc, return 0; } -static int htb_parse_class_opt(struct qdisc_util *qu, int argc, char **argv, +static int htb_parse_class_opt(const struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n, const char *dev) { struct tc_htb_opt opt = {}; @@ -263,7 +263,7 @@ static int htb_parse_class_opt(struct qdisc_util *qu, int argc, char **argv, return 0; } -static int htb_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) +static int htb_print_opt(const struct qdisc_util *qu, FILE *f, struct rtattr *opt) { struct rtattr *tb[TCA_HTB_MAX + 1]; struct tc_htb_opt *hopt; @@ -354,7 +354,7 @@ static int htb_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) return 0; } -static int htb_print_xstats(struct qdisc_util *qu, FILE *f, struct rtattr *xstats) +static int htb_print_xstats(const struct qdisc_util *qu, FILE *f, struct rtattr *xstats) { struct tc_htb_xstats *st; diff --git a/tc/q_ingress.c b/tc/q_ingress.c index 3df4914..294b005 100644 --- a/tc/q_ingress.c +++ b/tc/q_ingress.c @@ -16,7 +16,7 @@ static void explain(void) fprintf(stderr, "Usage: ... ingress\n"); } -static int ingress_parse_opt(struct qdisc_util *qu, int argc, char **argv, +static int ingress_parse_opt(const struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n, const char *dev) { while (argc > 0) { @@ -33,7 +33,7 @@ static int ingress_parse_opt(struct qdisc_util *qu, int argc, char **argv, return 0; } -static int ingress_print_opt(struct qdisc_util *qu, FILE *f, +static int ingress_print_opt(const struct qdisc_util *qu, FILE *f, struct rtattr *opt) { print_string(PRINT_FP, NULL, "---------------- ", NULL); diff --git a/tc/q_mqprio.c b/tc/q_mqprio.c index 7a4417f..493c6eb 100644 --- a/tc/q_mqprio.c +++ b/tc/q_mqprio.c @@ -46,7 +46,7 @@ static void add_tc_entries(struct nlmsghdr *n, __u32 fp[TC_QOPT_MAX_QUEUE], } } -static int mqprio_parse_opt(struct qdisc_util *qu, int argc, +static int mqprio_parse_opt(const struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n, const char *dev) { int idx; @@ -314,7 +314,7 @@ static void dump_tc_entries(FILE *f, struct rtattr *opt, int len) } } -static int mqprio_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) +static int mqprio_print_opt(const struct qdisc_util *qu, FILE *f, struct rtattr *opt) { int i; struct tc_mqprio_qopt *qopt; diff --git a/tc/q_multiq.c b/tc/q_multiq.c index b1e6c9a..63fffed 100644 --- a/tc/q_multiq.c +++ b/tc/q_multiq.c @@ -28,7 +28,7 @@ static void explain(void) fprintf(stderr, "Usage: ... multiq [help]\n"); } -static int multiq_parse_opt(struct qdisc_util *qu, int argc, char **argv, +static int multiq_parse_opt(const struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n, const char *dev) { struct tc_multiq_qopt opt = {}; @@ -48,7 +48,7 @@ static int multiq_parse_opt(struct qdisc_util *qu, int argc, char **argv, return 0; } -static int multiq_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) +static int multiq_print_opt(const struct qdisc_util *qu, FILE *f, struct rtattr *opt) { struct tc_multiq_qopt *qopt; diff --git a/tc/q_netem.c b/tc/q_netem.c index 4ce9ab6..90b2613 100644 --- a/tc/q_netem.c +++ b/tc/q_netem.c @@ -170,27 +170,8 @@ static int get_distribution(const char *type, __s16 *data, int maxdata) #define NEXT_IS_SIGNED_NUMBER() \ (NEXT_ARG_OK() && (isdigit(argv[1][0]) || argv[1][0] == '-')) -/* - * Adjust for the fact that psched_ticks aren't always usecs - * (based on kernel PSCHED_CLOCK configuration - */ -static int get_ticks(__u32 *ticks, const char *str) -{ - unsigned int t; - - if (get_time(&t, str)) - return -1; - - if (tc_core_time2big(t)) { - fprintf(stderr, "Illegal %u time (too large)\n", t); - return -1; - } - *ticks = tc_core_time2tick(t); - return 0; -} - -static int netem_parse_opt(struct qdisc_util *qu, int argc, char **argv, +static int netem_parse_opt(const struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n, const char *dev) { int dist_size = 0; @@ -208,6 +189,8 @@ static int netem_parse_opt(struct qdisc_util *qu, int argc, char **argv, __s16 *slot_dist_data = NULL; __u16 loss_type = NETEM_LOSS_UNSPEC; int present[__TCA_NETEM_MAX] = {}; + __s64 latency64 = 0; + __s64 jitter64 = 0; __u64 rate64 = 0; __u64 seed = 0; @@ -221,14 +204,20 @@ static int netem_parse_opt(struct qdisc_util *qu, int argc, char **argv, } else if (matches(*argv, "latency") == 0 || matches(*argv, "delay") == 0) { NEXT_ARG(); - if (get_ticks(&opt.latency, *argv)) { + + /* Old latency value in opt is no longer used. */ + present[TCA_NETEM_LATENCY64] = 1; + + if (get_time64(&latency64, *argv)) { explain1("latency"); return -1; } if (NEXT_IS_NUMBER()) { NEXT_ARG(); - if (get_ticks(&opt.jitter, *argv)) { + + present[TCA_NETEM_JITTER64] = 1; + if (get_time64(&jitter64, *argv)) { explain1("latency"); return -1; } @@ -552,7 +541,7 @@ random_loss_model: tail = NLMSG_TAIL(n); if (reorder.probability) { - if (opt.latency == 0) { + if (latency64 == 0) { fprintf(stderr, "reordering not possible without specifying some delay\n"); explain(); return -1; @@ -573,7 +562,7 @@ random_loss_model: } } - if (dist_data && (opt.latency == 0 || opt.jitter == 0)) { + if (dist_data && (latency64 == 0 || jitter64 == 0)) { fprintf(stderr, "distribution specified but no latency and jitter values\n"); explain(); return -1; @@ -582,6 +571,14 @@ random_loss_model: if (addattr_l(n, 1024, TCA_OPTIONS, &opt, sizeof(opt)) < 0) return -1; + if (present[TCA_NETEM_LATENCY64] && + addattr_l(n, 1024, TCA_NETEM_LATENCY64, &latency64, sizeof(latency64)) < 0) + return -1; + + if (present[TCA_NETEM_JITTER64] && + addattr_l(n, 1024, TCA_NETEM_JITTER64, &jitter64, sizeof(jitter64)) < 0) + return -1; + if (present[TCA_NETEM_CORR] && addattr_l(n, 1024, TCA_NETEM_CORR, &cor, sizeof(cor)) < 0) return -1; @@ -661,7 +658,7 @@ random_loss_model: return 0; } -static int netem_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) +static int netem_print_opt(const struct qdisc_util *qu, FILE *f, struct rtattr *opt) { const struct tc_netem_corr *cor = NULL; const struct tc_netem_reorder *reorder = NULL; @@ -676,6 +673,8 @@ static int netem_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) __u64 seed = 0; int len; __u64 rate64 = 0; + __u64 latency64 = 0; + __u64 jitter64 = 0; SPRINT_BUF(b1); @@ -734,6 +733,18 @@ static int netem_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) return -1; rate64 = rta_getattr_u64(tb[TCA_NETEM_RATE64]); } + if (tb[TCA_NETEM_LATENCY64]) { + if (RTA_PAYLOAD(tb[TCA_NETEM_LATENCY64]) < sizeof(latency64)) + return -1; + latency64 = rta_getattr_u64(tb[TCA_NETEM_LATENCY64]); + + } + if (tb[TCA_NETEM_JITTER64]) { + if (RTA_PAYLOAD(tb[TCA_NETEM_JITTER64]) < sizeof(jitter64)) + return -1; + jitter64 = rta_getattr_u64(tb[TCA_NETEM_JITTER64]); + + } if (tb[TCA_NETEM_SLOT]) { if (RTA_PAYLOAD(tb[TCA_NETEM_SLOT]) < sizeof(*slot)) return -1; @@ -749,24 +760,23 @@ static int netem_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) print_uint(PRINT_ANY, "limit", "limit %d", qopt.limit); - if (qopt.latency) { + + if (latency64 != 0) { open_json_object("delay"); - if (!is_json_context()) { - print_string(PRINT_FP, NULL, " delay %s", - sprint_ticks(qopt.latency, b1)); - if (qopt.jitter) - print_string(PRINT_FP, NULL, " %s", - sprint_ticks(qopt.jitter, b1)); - } else { + if (is_json_context()) { print_float(PRINT_JSON, "delay", NULL, - tc_core_tick2time(qopt.latency) / - 1000000.); + (double)latency64 / 1000000000.); print_float(PRINT_JSON, "jitter", NULL, - tc_core_tick2time(qopt.jitter) / - 1000000.); + (double)jitter64 / 1000000000.); + } else { + print_string(PRINT_FP, NULL, " delay %s", + sprint_time64(latency64, b1)); + if (jitter64 != 0) + print_string(PRINT_FP, NULL, " %s", + sprint_time64(jitter64, b1)); } - print_corr(qopt.jitter && cor && cor->delay_corr, + print_corr(jitter64 && cor && cor->delay_corr, cor ? cor->delay_corr : 0); close_json_object(); } @@ -30,7 +30,7 @@ static void explain(void) #define ALPHA_MAX 32 #define BETA_MAX 32 -static int pie_parse_opt(struct qdisc_util *qu, int argc, char **argv, +static int pie_parse_opt(const struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n, const char *dev) { unsigned int limit = 0; @@ -124,7 +124,7 @@ static int pie_parse_opt(struct qdisc_util *qu, int argc, char **argv, return 0; } -static int pie_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) +static int pie_print_opt(const struct qdisc_util *qu, FILE *f, struct rtattr *opt) { struct rtattr *tb[TCA_PIE_MAX + 1]; unsigned int limit; @@ -198,7 +198,7 @@ static int pie_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) return 0; } -static int pie_print_xstats(struct qdisc_util *qu, FILE *f, +static int pie_print_xstats(const struct qdisc_util *qu, FILE *f, struct rtattr *xstats) { struct tc_pie_xstats *st; diff --git a/tc/q_plug.c b/tc/q_plug.c index 8adf9b9..257735a 100644 --- a/tc/q_plug.c +++ b/tc/q_plug.c @@ -22,7 +22,7 @@ static void explain(void) fprintf(stderr, "Usage: ... plug [block | release | release_indefinite | limit NUMBER]\n"); } -static int plug_parse_opt(struct qdisc_util *qu, int argc, char **argv, +static int plug_parse_opt(const struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n, const char *dev) { struct tc_plug_qopt opt = {}; @@ -62,7 +62,7 @@ static int plug_parse_opt(struct qdisc_util *qu, int argc, char **argv, return 0; } -static int plug_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) +static int plug_print_opt(const struct qdisc_util *qu, FILE *f, struct rtattr *opt) { /* dummy implementation as sch_plug does not implement a dump op */ return 0; diff --git a/tc/q_prio.c b/tc/q_prio.c index a3781ff..41bd98a 100644 --- a/tc/q_prio.c +++ b/tc/q_prio.c @@ -22,7 +22,7 @@ static void explain(void) fprintf(stderr, "Usage: ... prio bands NUMBER priomap P1 P2...[multiqueue]\n"); } -static int prio_parse_opt(struct qdisc_util *qu, int argc, char **argv, +static int prio_parse_opt(const struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n, const char *dev) { int pmap_mode = 0; @@ -89,7 +89,7 @@ static int prio_parse_opt(struct qdisc_util *qu, int argc, char **argv, return 0; } -int prio_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) +int prio_print_opt(const struct qdisc_util *qu, FILE *f, struct rtattr *opt) { int i; struct tc_prio_qopt *qopt; @@ -30,7 +30,7 @@ static void explain_class(void) fprintf(stderr, "Usage: ... qfq weight NUMBER maxpkt BYTES\n"); } -static int qfq_parse_opt(struct qdisc_util *qu, int argc, char **argv, +static int qfq_parse_opt(const struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n, const char *dev) { if (argc > 0) { @@ -43,7 +43,7 @@ static int qfq_parse_opt(struct qdisc_util *qu, int argc, char **argv, return 0; } -static int qfq_parse_class_opt(struct qdisc_util *qu, int argc, char **argv, +static int qfq_parse_class_opt(const struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n, const char *dev) { struct rtattr *tail; @@ -80,7 +80,7 @@ static int qfq_parse_class_opt(struct qdisc_util *qu, int argc, char **argv, return 0; } -static int qfq_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) +static int qfq_print_opt(const struct qdisc_util *qu, FILE *f, struct rtattr *opt) { struct rtattr *tb[TCA_QFQ_MAX + 1]; @@ -40,7 +40,7 @@ static struct qevent_util qevents[] = { {}, }; -static int red_parse_opt(struct qdisc_util *qu, int argc, char **argv, +static int red_parse_opt(const struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n, const char *dev) { struct nla_bitfield32 flags_bf = { @@ -180,7 +180,7 @@ static int red_parse_opt(struct qdisc_util *qu, int argc, char **argv, return 0; } -static int red_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) +static int red_print_opt(const struct qdisc_util *qu, FILE *f, struct rtattr *opt) { struct rtattr *tb[TCA_RED_MAX + 1]; struct nla_bitfield32 *flags_bf; @@ -232,7 +232,7 @@ static int red_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) return 0; } -static int red_print_xstats(struct qdisc_util *qu, FILE *f, struct rtattr *xstats) +static int red_print_xstats(const struct qdisc_util *qu, FILE *f, struct rtattr *xstats) { #ifdef TC_RED_ECN struct tc_red_xstats *st; @@ -252,7 +252,7 @@ static int red_print_xstats(struct qdisc_util *qu, FILE *f, struct rtattr *xstat return 0; } -static int red_has_block(struct qdisc_util *qu, struct rtattr *opt, __u32 block_idx, bool *p_has) +static int red_has_block(const struct qdisc_util *qu, struct rtattr *opt, __u32 block_idx, bool *p_has) { struct rtattr *tb[TCA_RED_MAX + 1]; @@ -40,7 +40,7 @@ static int get_prob(__u32 *val, const char *arg) return 0; } -static int sfb_parse_opt(struct qdisc_util *qu, int argc, char **argv, +static int sfb_parse_opt(const struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n, const char *dev) { struct tc_sfb_qopt opt = { @@ -131,7 +131,7 @@ static int sfb_parse_opt(struct qdisc_util *qu, int argc, char **argv, return 0; } -static int sfb_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) +static int sfb_print_opt(const struct qdisc_util *qu, FILE *f, struct rtattr *opt) { struct rtattr *tb[__TCA_SFB_MAX]; struct tc_sfb_qopt *qopt; @@ -173,7 +173,7 @@ static int sfb_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) return 0; } -static int sfb_print_xstats(struct qdisc_util *qu, FILE *f, +static int sfb_print_xstats(const struct qdisc_util *qu, FILE *f, struct rtattr *xstats) { struct tc_sfb_xstats *st; @@ -30,7 +30,7 @@ static void explain(void) " [ ecn ] [ harddrop ]\n"); } -static int sfq_parse_opt(struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n, const char *dev) +static int sfq_parse_opt(const struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n, const char *dev) { int ok = 0, red = 0; struct tc_sfq_qopt_v1 opt = {}; @@ -196,7 +196,7 @@ static int sfq_parse_opt(struct qdisc_util *qu, int argc, char **argv, struct nl return 0; } -static int sfq_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) +static int sfq_print_opt(const struct qdisc_util *qu, FILE *f, struct rtattr *opt) { struct tc_sfq_qopt *qopt; struct tc_sfq_qopt_v1 *qopt_ext = NULL; @@ -255,7 +255,7 @@ static int sfq_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) return 0; } -static int sfq_print_xstats(struct qdisc_util *qu, FILE *f, +static int sfq_print_xstats(const struct qdisc_util *qu, FILE *f, struct rtattr *xstats) { struct tc_sfq_xstats *st; diff --git a/tc/q_skbprio.c b/tc/q_skbprio.c index b0ba180..910ea99 100644 --- a/tc/q_skbprio.c +++ b/tc/q_skbprio.c @@ -23,7 +23,7 @@ static void explain(void) fprintf(stderr, "Usage: ... <skbprio> [ limit NUMBER ]\n"); } -static int skbprio_parse_opt(struct qdisc_util *qu, int argc, char **argv, +static int skbprio_parse_opt(const struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n, const char *dev) { int ok = 0; @@ -58,7 +58,7 @@ static int skbprio_parse_opt(struct qdisc_util *qu, int argc, char **argv, return 0; } -static int skbprio_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) +static int skbprio_print_opt(const struct qdisc_util *qu, FILE *f, struct rtattr *opt) { struct tc_skbprio_qopt *qopt; diff --git a/tc/q_taprio.c b/tc/q_taprio.c index c47fe24..416a222 100644 --- a/tc/q_taprio.c +++ b/tc/q_taprio.c @@ -134,7 +134,7 @@ static void add_tc_entries(struct nlmsghdr *n, __u32 max_sdu[TC_QOPT_MAX_QUEUE], } } -static int taprio_parse_opt(struct qdisc_util *qu, int argc, +static int taprio_parse_opt(const struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n, const char *dev) { __u32 max_sdu[TC_QOPT_MAX_QUEUE] = { }; @@ -545,7 +545,7 @@ static void dump_tc_entries(FILE *f, struct rtattr *opt) } } -static int taprio_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) +static int taprio_print_opt(const struct qdisc_util *qu, FILE *f, struct rtattr *opt) { struct rtattr *tb[TCA_TAPRIO_ATTR_MAX + 1]; struct tc_mqprio_qopt *qopt = 0; @@ -623,7 +623,7 @@ static int taprio_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) return 0; } -static int taprio_print_xstats(struct qdisc_util *qu, FILE *f, +static int taprio_print_xstats(const struct qdisc_util *qu, FILE *f, struct rtattr *xstats) { struct rtattr *tb[TCA_TAPRIO_OFFLOAD_STATS_MAX + 1], *nla; @@ -31,7 +31,7 @@ static void explain1(const char *arg, const char *val) } -static int tbf_parse_opt(struct qdisc_util *qu, int argc, char **argv, +static int tbf_parse_opt(const struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n, const char *dev) { struct tc_tbf_qopt opt = {}; @@ -245,7 +245,7 @@ static int tbf_parse_opt(struct qdisc_util *qu, int argc, char **argv, return 0; } -static int tbf_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) +static int tbf_print_opt(const struct qdisc_util *qu, FILE *f, struct rtattr *opt) { struct rtattr *tb[TCA_TBF_MAX+1]; struct tc_tbf_qopt *qopt; @@ -38,6 +38,8 @@ int json; int oneline; int brief; +int echo_request; + static char *conf_file; struct rtnl_handle rth; @@ -46,7 +48,7 @@ static void *BODY; /* cached handle dlopen(NULL) */ static struct qdisc_util *qdisc_list; static struct filter_util *filter_list; -static int print_noqopt(struct qdisc_util *qu, FILE *f, +static int print_noqopt(const struct qdisc_util *qu, FILE *f, struct rtattr *opt) { if (opt && RTA_PAYLOAD(opt)) @@ -55,7 +57,7 @@ static int print_noqopt(struct qdisc_util *qu, FILE *f, return 0; } -static int parse_noqopt(struct qdisc_util *qu, int argc, char **argv, +static int parse_noqopt(const struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n, const char *dev) { if (argc) { @@ -67,7 +69,7 @@ static int parse_noqopt(struct qdisc_util *qu, int argc, char **argv, return 0; } -static int print_nofopt(struct filter_util *qu, FILE *f, struct rtattr *opt, __u32 fhandle) +static int print_nofopt(const struct filter_util *qu, FILE *f, struct rtattr *opt, __u32 fhandle) { if (opt && RTA_PAYLOAD(opt)) fprintf(f, "fh %08x [Unknown filter, optlen=%u] ", @@ -77,7 +79,7 @@ static int print_nofopt(struct filter_util *qu, FILE *f, struct rtattr *opt, __u return 0; } -static int parse_nofopt(struct filter_util *qu, char *fhandle, +static int parse_nofopt(const struct filter_util *qu, char *fhandle, int argc, char **argv, struct nlmsghdr *n) { __u32 handle; @@ -100,7 +102,7 @@ static int parse_nofopt(struct filter_util *qu, char *fhandle, return 0; } -struct qdisc_util *get_qdisc_kind(const char *str) +const struct qdisc_util *get_qdisc_kind(const char *str) { void *dlh; char buf[256]; @@ -144,7 +146,7 @@ noexist: } -struct filter_util *get_filter_kind(const char *str) +const struct filter_util *get_filter_kind(const char *str) { void *dlh; char buf[256]; @@ -196,7 +198,7 @@ static void usage(void) " -o[neline] | -j[son] | -p[retty] | -c[olor]\n" " -b[atch] [filename] | -n[etns] name | -N[umeric] |\n" " -nm | -nam[es] | { -cf | -conf } path\n" - " -br[ief] }\n"); + " -br[ief] | -echo }\n"); } static int do_cmd(int argc, char **argv) @@ -287,7 +289,7 @@ int main(int argc, char **argv) } else if (matches(argv[1], "-batch") == 0) { argc--; argv++; if (argc <= 1) - usage(); + missarg("batch file"); batch_file = argv[1]; } else if (matches(argv[1], "-netns") == 0) { NEXT_ARG(); @@ -314,6 +316,8 @@ int main(int argc, char **argv) ++oneline; } else if (matches(argv[1], "-brief") == 0) { ++brief; + } else if (strcmp(argv[1], "-echo") == 0) { + ++echo_request; } else { fprintf(stderr, "Option \"%s\" is unknown, try \"tc -help\".\n", diff --git a/tc/tc_class.c b/tc/tc_class.c index f6a3d13..6d707d8 100644 --- a/tc/tc_class.c +++ b/tc/tc_class.c @@ -61,7 +61,7 @@ static int tc_class_modify(int cmd, unsigned int flags, int argc, char **argv) .n.nlmsg_type = cmd, .t.tcm_family = AF_UNSPEC, }; - struct qdisc_util *q = NULL; + const struct qdisc_util *q = NULL; struct tc_estimator est = {}; char d[IFNAMSIZ] = {}; char k[FILTER_NAMESZ] = {}; @@ -213,7 +213,7 @@ static void graph_cls_show(FILE *fp, char *buf, struct hlist_head *root_list, struct hlist_node *n, *tmp_cls; char cls_id_str[256] = {}; struct rtattr *tb[TCA_MAX + 1]; - struct qdisc_util *q; + const struct qdisc_util *q; char str[300] = {}; hlist_for_each_safe(n, tmp_cls, root_list) { @@ -298,7 +298,7 @@ int print_class(struct nlmsghdr *n, void *arg) struct tcmsg *t = NLMSG_DATA(n); int len = n->nlmsg_len; struct rtattr *tb[TCA_MAX + 1]; - struct qdisc_util *q; + const struct qdisc_util *q; char abuf[256]; if (n->nlmsg_type != RTM_NEWTCLASS && n->nlmsg_type != RTM_DELTCLASS) { diff --git a/tc/tc_core.c b/tc/tc_core.c index 871ceb4..37547e9 100644 --- a/tc/tc_core.c +++ b/tc/tc_core.c @@ -23,23 +23,14 @@ static double tick_in_usec = 1; static double clock_factor = 1; -int tc_core_time2big(unsigned int time) +static unsigned int tc_core_time2tick(unsigned int time) { - __u64 t = time; - - t *= tick_in_usec; - return (t >> 32) != 0; -} - - -unsigned int tc_core_time2tick(unsigned int time) -{ - return time*tick_in_usec; + return time * tick_in_usec; } unsigned int tc_core_tick2time(unsigned int tick) { - return tick/tick_in_usec; + return tick / tick_in_usec; } unsigned int tc_core_time2ktime(unsigned int time) diff --git a/tc/tc_core.h b/tc/tc_core.h index 6dab272..7a986ac 100644 --- a/tc/tc_core.h +++ b/tc/tc_core.h @@ -12,8 +12,6 @@ enum link_layer { }; -int tc_core_time2big(unsigned time); -unsigned tc_core_time2tick(unsigned time); unsigned tc_core_tick2time(unsigned tick); unsigned tc_core_time2ktime(unsigned time); unsigned tc_core_ktime2time(unsigned ktime); diff --git a/tc/tc_exec.c b/tc/tc_exec.c index 182fbb4..fe9fdb1 100644 --- a/tc/tc_exec.c +++ b/tc/tc_exec.c @@ -26,7 +26,7 @@ static void usage(void) "OPTIONS := ... try tc exec <desired EXEC_KIND> help\n"); } -static int parse_noeopt(struct exec_util *eu, int argc, char **argv) +static int parse_noeopt(const struct exec_util *eu, int argc, char **argv) { if (argc) { fprintf(stderr, "Unknown exec \"%s\", hence option \"%s\" is unparsable\n", diff --git a/tc/tc_filter.c b/tc/tc_filter.c index eb45c58..7db850b 100644 --- a/tc/tc_filter.c +++ b/tc/tc_filter.c @@ -65,7 +65,7 @@ static int tc_filter_modify(int cmd, unsigned int flags, int argc, char **argv) .n.nlmsg_type = cmd, .t.tcm_family = AF_UNSPEC, }; - struct filter_util *q = NULL; + const struct filter_util *q = NULL; __u32 prio = 0; __u32 protocol = 0; int protocol_set = 0; @@ -76,6 +76,7 @@ static int tc_filter_modify(int cmd, unsigned int flags, int argc, char **argv) char d[IFNAMSIZ] = {}; char k[FILTER_NAMESZ] = {}; struct tc_estimator est = {}; + int ret; if (cmd == RTM_NEWTFILTER && flags & NLM_F_CREATE) protocol = htons(ETH_P_ALL); @@ -221,7 +222,12 @@ static int tc_filter_modify(int cmd, unsigned int flags, int argc, char **argv) if (est.ewma_log) addattr_l(&req.n, sizeof(req), TCA_RATE, &est, sizeof(est)); - if (rtnl_talk(&rth, &req.n, NULL) < 0) { + if (echo_request) + ret = rtnl_echo_talk(&rth, &req.n, json, print_filter); + else + ret = rtnl_talk(&rth, &req.n, NULL); + + if (ret < 0) { fprintf(stderr, "We have an error talking to the kernel\n"); return 2; } @@ -244,7 +250,7 @@ int print_filter(struct nlmsghdr *n, void *arg) struct tcmsg *t = NLMSG_DATA(n); int len = n->nlmsg_len; struct rtattr *tb[TCA_MAX+1]; - struct filter_util *q; + const struct filter_util *q; char abuf[256]; if (n->nlmsg_type != RTM_NEWTFILTER && @@ -392,7 +398,7 @@ static int tc_filter_get(int cmd, unsigned int flags, int argc, char **argv) .t.tcm_family = AF_UNSPEC, }; struct nlmsghdr *answer; - struct filter_util *q = NULL; + const struct filter_util *q = NULL; __u32 prio = 0; __u32 protocol = 0; int protocol_set = 0; diff --git a/tc/tc_qdisc.c b/tc/tc_qdisc.c index 84fd659..7eb9a31 100644 --- a/tc/tc_qdisc.c +++ b/tc/tc_qdisc.c @@ -42,7 +42,7 @@ static int usage(void) static int tc_qdisc_modify(int cmd, unsigned int flags, int argc, char **argv) { - struct qdisc_util *q = NULL; + const struct qdisc_util *q = NULL; struct tc_estimator est = {}; struct { struct tc_sizespec szopts; @@ -217,7 +217,7 @@ int print_qdisc(struct nlmsghdr *n, void *arg) struct tcmsg *t = NLMSG_DATA(n); int len = n->nlmsg_len; struct rtattr *tb[TCA_MAX+1]; - struct qdisc_util *q; + const struct qdisc_util *q; char abuf[256]; if (n->nlmsg_type != RTM_NEWQDISC && n->nlmsg_type != RTM_DELQDISC) { @@ -476,7 +476,7 @@ static int tc_qdisc_block_exists_cb(struct nlmsghdr *n, void *arg) struct tcmsg *t = NLMSG_DATA(n); struct rtattr *tb[TCA_MAX+1]; int len = n->nlmsg_len; - struct qdisc_util *q; + const struct qdisc_util *q; const char *kind; int err; diff --git a/tc/tc_util.c b/tc/tc_util.c index aa7cf60..a347a2d 100644 --- a/tc/tc_util.c +++ b/tc/tc_util.c @@ -257,11 +257,6 @@ tc_print_rate(enum output_type t, const char *key, const char *fmt, print_rate(use_iec, t, key, fmt, rate); } -char *sprint_ticks(__u32 ticks, char *buf) -{ - return sprint_time(tc_core_tick2time(ticks), buf); -} - int get_size_and_cell(unsigned int *size, int *cell_log, char *str) { char *slash = strchr(str, '/'); @@ -804,28 +799,30 @@ void print_tcstats_attr(FILE *fp, struct rtattr *tb[], const char *prefix, memcpy(&st, RTA_DATA(tb[TCA_STATS]), MIN(RTA_PAYLOAD(tb[TCA_STATS]), sizeof(st))); - fprintf(fp, - "%sSent %llu bytes %u pkts (dropped %u, overlimits %u) ", - prefix, (unsigned long long)st.bytes, - st.packets, st.drops, st.overlimits); + print_string(PRINT_FP, NULL, "%s", prefix); + print_lluint(PRINT_ANY, "bytes", "Sent %llu bytes", + (unsigned long long)st.bytes); + print_uint(PRINT_ANY, "packets", " %u pkts", st.packets); + print_uint(PRINT_ANY, "dropped", " (dropped %u,", st.drops); + print_uint(PRINT_ANY, "overlimits", " overlimits %u) ", st.overlimits); if (st.bps || st.pps || st.qlen || st.backlog) { - fprintf(fp, "\n%s", prefix); + print_nl(); + print_string(PRINT_FP, NULL, "%s", prefix); + if (st.bps || st.pps) { - fprintf(fp, "rate "); + print_string(PRINT_FP, NULL, "rate ", NULL); if (st.bps) - tc_print_rate(PRINT_FP, NULL, "%s ", - st.bps); + tc_print_rate(PRINT_ANY, "rate", "%s ", st.bps); if (st.pps) - fprintf(fp, "%upps ", st.pps); + print_uint(PRINT_ANY, "pps", "%upps ", st.pps); } if (st.qlen || st.backlog) { - fprintf(fp, "backlog "); + print_string(PRINT_FP, NULL, "backlog ", NULL); if (st.backlog) - print_size(PRINT_FP, NULL, "%s ", - st.backlog); + print_size(PRINT_ANY, "backlog", "%s ", st.backlog); if (st.qlen) - fprintf(fp, "%up ", st.qlen); + print_uint(PRINT_ANY, "qlen", "%up ", st.qlen); } } } diff --git a/tc/tc_util.h b/tc/tc_util.h index 623d988..250cf33 100644 --- a/tc/tc_util.h +++ b/tc/tc_util.h @@ -29,51 +29,52 @@ enum #define FILTER_NAMESZ 16 struct qdisc_util { - struct qdisc_util *next; + struct qdisc_util *next; const char *id; - int (*parse_qopt)(struct qdisc_util *qu, int argc, + int (*parse_qopt)(const struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n, const char *dev); - int (*print_qopt)(struct qdisc_util *qu, + int (*print_qopt)(const struct qdisc_util *qu, FILE *f, struct rtattr *opt); - int (*print_xstats)(struct qdisc_util *qu, + int (*print_xstats)(const struct qdisc_util *qu, FILE *f, struct rtattr *xstats); - int (*parse_copt)(struct qdisc_util *qu, int argc, + int (*parse_copt)(const struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n, const char *dev); - int (*print_copt)(struct qdisc_util *qu, FILE *f, struct rtattr *opt); - int (*has_block)(struct qdisc_util *qu, struct rtattr *opt, __u32 block_idx, bool *p_has); + int (*print_copt)(const struct qdisc_util *qu, FILE *f, struct rtattr *opt); + int (*has_block)(const struct qdisc_util *qu, struct rtattr *opt, + __u32 block_idx, bool *p_has); }; extern __u16 f_proto; struct filter_util { struct filter_util *next; char id[FILTER_NAMESZ]; - int (*parse_fopt)(struct filter_util *qu, char *fhandle, + int (*parse_fopt)(const struct filter_util *qu, char *fhandle, int argc, char **argv, struct nlmsghdr *n); - int (*print_fopt)(struct filter_util *qu, + int (*print_fopt)(const struct filter_util *qu, FILE *f, struct rtattr *opt, __u32 fhandle); }; struct action_util { struct action_util *next; char id[FILTER_NAMESZ]; - int (*parse_aopt)(struct action_util *a, int *argc, + int (*parse_aopt)(const struct action_util *a, int *argc, char ***argv, int code, struct nlmsghdr *n); - int (*print_aopt)(struct action_util *au, FILE *f, struct rtattr *opt); - int (*print_xstats)(struct action_util *au, + int (*print_aopt)(const struct action_util *au, FILE *f, struct rtattr *opt); + int (*print_xstats)(const struct action_util *au, FILE *f, struct rtattr *xstats); }; struct exec_util { struct exec_util *next; char id[FILTER_NAMESZ]; - int (*parse_eopt)(struct exec_util *eu, int argc, char **argv); + int (*parse_eopt)(const struct exec_util *eu, int argc, char **argv); }; const char *get_tc_lib(void); -struct qdisc_util *get_qdisc_kind(const char *str); -struct filter_util *get_filter_kind(const char *str); +const struct qdisc_util *get_qdisc_kind(const char *str); +const struct filter_util *get_filter_kind(const char *str); int get_qdisc_handle(__u32 *h, const char *str); int get_percent_rate(unsigned int *rate, const char *str, const char *dev); @@ -86,7 +87,6 @@ void tc_print_rate(enum output_type t, const char *key, const char *fmt, void print_devname(enum output_type type, int ifindex); char *sprint_tc_classid(__u32 h, char *buf); -char *sprint_ticks(__u32 ticks, char *buf); char *sprint_linklayer(unsigned int linklayer, char *buf); void print_tcstats_attr(FILE *fp, struct rtattr *tb[], @@ -111,11 +111,11 @@ int parse_action_control_slash(int *argc_p, char ***argv_p, int *result1_p, int *result2_p, bool allow_num); void print_action_control(FILE *f, const char *prefix, int action, const char *suffix); -int police_print_xstats(struct action_util *a, FILE *f, struct rtattr *tb); +int police_print_xstats(const struct action_util *a, FILE *f, struct rtattr *tb); int tc_print_action(FILE *f, const struct rtattr *tb, unsigned short tot_acts); int parse_action(int *argc_p, char ***argv_p, int tca_id, struct nlmsghdr *n); void print_tm(FILE *f, const struct tcf_t *tm); -int prio_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt); +int prio_print_opt(const struct qdisc_util *qu, FILE *f, struct rtattr *opt); int cls_names_init(char *path); void cls_names_uninit(void); |