summaryrefslogtreecommitdiffstats
path: root/tc
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--tc/e_bpf.c2
-rw-r--r--tc/f_basic.c4
-rw-r--r--tc/f_bpf.c4
-rw-r--r--tc/f_cgroup.c4
-rw-r--r--tc/f_flow.c4
-rw-r--r--tc/f_flower.c4
-rw-r--r--tc/f_fw.c4
-rw-r--r--tc/f_matchall.c4
-rw-r--r--tc/f_route.c4
-rw-r--r--tc/f_u32.c6
-rw-r--r--tc/m_action.c31
-rw-r--r--tc/m_bpf.c4
-rw-r--r--tc/m_connmark.c4
-rw-r--r--tc/m_csum.c4
-rw-r--r--tc/m_ct.c4
-rw-r--r--tc/m_ctinfo.c4
-rw-r--r--tc/m_gact.c4
-rw-r--r--tc/m_gate.c8
-rw-r--r--tc/m_ife.c4
-rw-r--r--tc/m_mirred.c67
-rw-r--r--tc/m_mpls.c4
-rw-r--r--tc/m_nat.c4
-rw-r--r--tc/m_pedit.c10
-rw-r--r--tc/m_police.c8
-rw-r--r--tc/m_sample.c11
-rw-r--r--tc/m_simple.c12
-rw-r--r--tc/m_skbedit.c4
-rw-r--r--tc/m_skbmod.c41
-rw-r--r--tc/m_tunnel_key.c4
-rw-r--r--tc/m_vlan.c4
-rw-r--r--tc/q_cake.c6
-rw-r--r--tc/q_cbs.c4
-rw-r--r--tc/q_choke.c6
-rw-r--r--tc/q_clsact.c4
-rw-r--r--tc/q_codel.c6
-rw-r--r--tc/q_drr.c8
-rw-r--r--tc/q_etf.c4
-rw-r--r--tc/q_ets.c8
-rw-r--r--tc/q_fifo.c4
-rw-r--r--tc/q_fq.c6
-rw-r--r--tc/q_fq_codel.c6
-rw-r--r--tc/q_fq_pie.c6
-rw-r--r--tc/q_gred.c6
-rw-r--r--tc/q_hfsc.c10
-rw-r--r--tc/q_hhf.c6
-rw-r--r--tc/q_htb.c8
-rw-r--r--tc/q_ingress.c4
-rw-r--r--tc/q_mqprio.c4
-rw-r--r--tc/q_multiq.c4
-rw-r--r--tc/q_netem.c86
-rw-r--r--tc/q_pie.c6
-rw-r--r--tc/q_plug.c4
-rw-r--r--tc/q_prio.c4
-rw-r--r--tc/q_qfq.c6
-rw-r--r--tc/q_red.c8
-rw-r--r--tc/q_sfb.c6
-rw-r--r--tc/q_sfq.c6
-rw-r--r--tc/q_skbprio.c4
-rw-r--r--tc/q_taprio.c6
-rw-r--r--tc/q_tbf.c4
-rw-r--r--tc/tc.c20
-rw-r--r--tc/tc_class.c6
-rw-r--r--tc/tc_core.c15
-rw-r--r--tc/tc_core.h2
-rw-r--r--tc/tc_exec.c2
-rw-r--r--tc/tc_filter.c14
-rw-r--r--tc/tc_qdisc.c6
-rw-r--r--tc/tc_util.c33
-rw-r--r--tc/tc_util.h36
69 files changed, 363 insertions, 297 deletions
diff --git a/tc/e_bpf.c b/tc/e_bpf.c
index 79cddac..cca853f 100644
--- a/tc/e_bpf.c
+++ b/tc/e_bpf.c
@@ -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];
diff --git a/tc/f_bpf.c b/tc/f_bpf.c
index a6d4875..3e53c56 100644
--- a/tc/f_bpf.c
+++ b/tc/f_bpf.c
@@ -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];
diff --git a/tc/f_fw.c b/tc/f_fw.c
index 5e72e52..cf4abe1 100644
--- a/tc/f_fw.c
+++ b/tc/f_fw.c
@@ -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];
diff --git a/tc/f_u32.c b/tc/f_u32.c
index 59aa4e3..d7679e7 100644
--- a/tc/f_u32.c
+++ b/tc/f_u32.c
@@ -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;
}
diff --git a/tc/m_bpf.c b/tc/m_bpf.c
index da50c05..9dba4be 100644
--- a/tc/m_bpf.c
+++ b/tc/m_bpf.c
@@ -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;
diff --git a/tc/m_ct.c b/tc/m_ct.c
index 8c47148..4b7d322 100644
--- a/tc/m_ct.c
+++ b/tc/m_ct.c
@@ -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];
diff --git a/tc/m_ife.c b/tc/m_ife.c
index 162607c..dfd8556 100644
--- a/tc/m_ife.c
+++ b/tc/m_ife.c
@@ -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;
diff --git a/tc/m_nat.c b/tc/m_nat.c
index 95b3558..a3f86e1 100644
--- a/tc/m_nat.c
+++ b/tc/m_nat.c
@@ -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];
diff --git a/tc/q_cbs.c b/tc/q_cbs.c
index 788535c..5adfee7 100644
--- a/tc/q_cbs.c
+++ b/tc/q_cbs.c
@@ -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;
diff --git a/tc/q_drr.c b/tc/q_drr.c
index 03c4744..add684d 100644
--- a/tc/q_drr.c
+++ b/tc/q_drr.c
@@ -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;
diff --git a/tc/q_etf.c b/tc/q_etf.c
index d16188d..4e89f72 100644
--- a/tc/q_etf.c
+++ b/tc/q_etf.c
@@ -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;
diff --git a/tc/q_ets.c b/tc/q_ets.c
index 7380bb2..dea5f04 100644
--- a/tc/q_ets.c
+++ b/tc/q_ets.c
@@ -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;
diff --git a/tc/q_fq.c b/tc/q_fq.c
index 7f8a2b8..f549be2 100644
--- a/tc/q_fq.c
+++ b/tc/q_fq.c
@@ -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;
diff --git a/tc/q_hhf.c b/tc/q_hhf.c
index 95e49f3..939e490 100644
--- a/tc/q_hhf.c
+++ b/tc/q_hhf.c
@@ -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;
diff --git a/tc/q_htb.c b/tc/q_htb.c
index 9afb293..545152f 100644
--- a/tc/q_htb.c
+++ b/tc/q_htb.c
@@ -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();
}
diff --git a/tc/q_pie.c b/tc/q_pie.c
index 177cdca..04c9aa6 100644
--- a/tc/q_pie.c
+++ b/tc/q_pie.c
@@ -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;
diff --git a/tc/q_qfq.c b/tc/q_qfq.c
index c9955cc..d4c0a59 100644
--- a/tc/q_qfq.c
+++ b/tc/q_qfq.c
@@ -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];
diff --git a/tc/q_red.c b/tc/q_red.c
index f760253..1aa6d2b 100644
--- a/tc/q_red.c
+++ b/tc/q_red.c
@@ -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];
diff --git a/tc/q_sfb.c b/tc/q_sfb.c
index a2eef28..6a26b71 100644
--- a/tc/q_sfb.c
+++ b/tc/q_sfb.c
@@ -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;
diff --git a/tc/q_sfq.c b/tc/q_sfq.c
index 17bf8f6..37ebd97 100644
--- a/tc/q_sfq.c
+++ b/tc/q_sfq.c
@@ -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;
diff --git a/tc/q_tbf.c b/tc/q_tbf.c
index f621756..9356dfd 100644
--- a/tc/q_tbf.c
+++ b/tc/q_tbf.c
@@ -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;
diff --git a/tc/tc.c b/tc/tc.c
index 575157a..26e6f69 100644
--- a/tc/tc.c
+++ b/tc/tc.c
@@ -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);