* [PATCH iproute2 1/2] tc filters: display handle in events when a filter is deleted
@ 2016-10-17 9:34 Jamal Hadi Salim
2016-10-17 9:34 ` [PATCH iproute2 2/2] tc filters: fix filters to display handle when deleted even when no option Jamal Hadi Salim
0 siblings, 1 reply; 3+ messages in thread
From: Jamal Hadi Salim @ 2016-10-17 9:34 UTC (permalink / raw)
To: stephen; +Cc: netdev, daniel, xiyou.wangcong, mrv, Jamal Hadi Salim
From: Jamal Hadi Salim <jhs@mojatatu.com>
An event being displayed via "tc mon" should display the filter handle.
The filter handle is a required parameter when deleting a filter and
therefore the delete event should mimic/mirror the command sent.
A simple test, run tc monitor on one window, on another try adding
a filter:
..
sudo $TC filter add dev $ETH parent ffff: protocol ip pref 1 \
u32 match ip protocol 1 0xff \
flowid 1:1 \
action ok
..
.. get its handle by dumping ...
sudo $TC -s filter ls dev $ETH parent ffff: protocol ip
... find out the handle (say it was 800::800)
... go delete it..
sudo $TC filter del dev $ETH handle 800::800 parent ffff: \
protocol ip prio 1 u32
now see tc monitor reporting it without handle. After this patch
with a handle.
Signed-off-by: Jamal Hadi Salim <jhs@mojatatu.com>
---
tc/tc_filter.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/tc/tc_filter.c b/tc/tc_filter.c
index 2413cef..4efc44f 100644
--- a/tc/tc_filter.c
+++ b/tc/tc_filter.c
@@ -253,12 +253,13 @@ int print_filter(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
}
fprintf(fp, "%s ", rta_getattr_str(tb[TCA_KIND]));
q = get_filter_kind(RTA_DATA(tb[TCA_KIND]));
- if (tb[TCA_OPTIONS]) {
+ if (tb[TCA_OPTIONS] || n->nlmsg_type == RTM_DELTFILTER) {
if (q)
q->print_fopt(q, fp, tb[TCA_OPTIONS], t->tcm_handle);
else
fprintf(fp, "[cannot parse parameters]");
}
+
fprintf(fp, "\n");
if (show_stats && (tb[TCA_STATS] || tb[TCA_STATS2])) {
--
1.9.1
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [PATCH iproute2 2/2] tc filters: fix filters to display handle when deleted even when no option
2016-10-17 9:34 [PATCH iproute2 1/2] tc filters: display handle in events when a filter is deleted Jamal Hadi Salim
@ 2016-10-17 9:34 ` Jamal Hadi Salim
2016-10-26 17:57 ` Stephen Hemminger
0 siblings, 1 reply; 3+ messages in thread
From: Jamal Hadi Salim @ 2016-10-17 9:34 UTC (permalink / raw)
To: stephen; +Cc: netdev, daniel, xiyou.wangcong, mrv, Jamal Hadi Salim
From: Jamal Hadi Salim <jhs@mojatatu.com>
Fix a few stylistic things that hurt my eyes while at it.
Signed-off-by: Jamal Hadi Salim <jhs@mojatatu.com>
---
tc/f_basic.c | 6 +++---
tc/f_bpf.c | 6 +++---
tc/f_cgroup.c | 7 +++----
tc/f_flow.c | 4 ++--
tc/f_flower.c | 5 +++--
tc/f_fw.c | 38 ++++++++++++++++++++++----------------
tc/f_matchall.c | 6 +++---
tc/f_route.c | 29 ++++++++++++++++++-----------
tc/f_rsvp.c | 28 ++++++++++++++++++----------
tc/f_tcindex.c | 4 +++-
tc/f_u32.c | 9 ++++-----
11 files changed, 82 insertions(+), 60 deletions(-)
diff --git a/tc/f_basic.c b/tc/f_basic.c
index d663668..317dca1 100644
--- a/tc/f_basic.c
+++ b/tc/f_basic.c
@@ -112,14 +112,14 @@ static int basic_print_opt(struct filter_util *qu, FILE *f,
{
struct rtattr *tb[TCA_BASIC_MAX+1];
+ if (handle)
+ fprintf(f, "handle 0x%x ", handle);
+
if (opt == NULL)
return 0;
parse_rtattr_nested(tb, TCA_BASIC_MAX, opt);
- if (handle)
- fprintf(f, "handle 0x%x ", handle);
-
if (tb[TCA_BASIC_CLASSID]) {
SPRINT_BUF(b1);
fprintf(f, "flowid %s ",
diff --git a/tc/f_bpf.c b/tc/f_bpf.c
index 5c97c86..a7dd2f2 100644
--- a/tc/f_bpf.c
+++ b/tc/f_bpf.c
@@ -152,14 +152,14 @@ static int bpf_print_opt(struct filter_util *qu, FILE *f,
{
struct rtattr *tb[TCA_BPF_MAX + 1];
+ if (handle)
+ fprintf(f, "handle 0x%x ", handle);
+
if (opt == NULL)
return 0;
parse_rtattr_nested(tb, TCA_BPF_MAX, opt);
- if (handle)
- fprintf(f, "handle 0x%x ", handle);
-
if (tb[TCA_BPF_CLASSID]) {
SPRINT_BUF(b1);
fprintf(f, "flowid %s ",
diff --git a/tc/f_cgroup.c b/tc/f_cgroup.c
index ecf9909..ae798db 100644
--- a/tc/f_cgroup.c
+++ b/tc/f_cgroup.c
@@ -85,14 +85,13 @@ static int cgroup_print_opt(struct filter_util *qu, FILE *f,
{
struct rtattr *tb[TCA_CGROUP_MAX+1];
+ if (handle)
+ fprintf(f, "handle 0x%x ", handle);
+
if (opt == NULL)
return 0;
parse_rtattr_nested(tb, TCA_CGROUP_MAX, opt);
-
- if (handle)
- fprintf(f, "handle 0x%x ", handle);
-
if (tb[TCA_CGROUP_EMATCHES])
print_ematch(f, tb[TCA_CGROUP_EMATCHES]);
diff --git a/tc/f_flow.c b/tc/f_flow.c
index 09ddcaa..5a9948f 100644
--- a/tc/f_flow.c
+++ b/tc/f_flow.c
@@ -272,13 +272,13 @@ static int flow_print_opt(struct filter_util *fu, FILE *f, struct rtattr *opt,
unsigned int i;
__u32 mask = ~0, val = 0;
+ fprintf(f, "handle 0x%x ", handle);
+
if (opt == NULL)
return -EINVAL;
parse_rtattr_nested(tb, TCA_FLOW_MAX, opt);
- fprintf(f, "handle 0x%x ", handle);
-
if (tb[TCA_FLOW_MODE]) {
__u32 mode = rta_getattr_u32(tb[TCA_FLOW_MODE]);
diff --git a/tc/f_flower.c b/tc/f_flower.c
index 791ade7..2f566ec 100644
--- a/tc/f_flower.c
+++ b/tc/f_flower.c
@@ -456,13 +456,14 @@ static int flower_print_opt(struct filter_util *qu, FILE *f,
__be16 eth_type = 0;
__u8 ip_proto = 0xff;
+ if (handle)
+ fprintf(f, "handle 0x%x ", handle);
+
if (!opt)
return 0;
parse_rtattr_nested(tb, TCA_FLOWER_MAX, opt);
- if (handle)
- fprintf(f, "handle 0x%x ", handle);
if (tb[TCA_FLOWER_CLASSID]) {
SPRINT_BUF(b1);
diff --git a/tc/f_fw.c b/tc/f_fw.c
index 29c9854..f779c16 100644
--- a/tc/f_fw.c
+++ b/tc/f_fw.c
@@ -115,37 +115,42 @@ 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(struct filter_util *qu, FILE *f, struct rtattr *opt,
+ __u32 handle)
{
struct rtattr *tb[TCA_FW_MAX+1];
+ __u32 mark = 0, mask = 0;
- if (opt == NULL)
- return 0;
+ if (opt) {
+ parse_rtattr_nested(tb, TCA_FW_MAX, opt);
+ if (tb[TCA_FW_MASK]) {
+ __u32 tmask = rta_getattr_u32(tb[TCA_FW_MASK]);
- parse_rtattr_nested(tb, TCA_FW_MAX, opt);
+ if (tmask != 0xFFFFFFFF)
+ mask = tmask;
+ }
+ }
- if (handle || tb[TCA_FW_MASK]) {
- __u32 mark = 0, mask = 0;
+ if (mask)
+ fprintf(f, "handle 0x%x/0x%x ", mark, mask);
+ else
+ fprintf(f, "handle 0x%x ", handle);
- if (handle)
- mark = handle;
- if (tb[TCA_FW_MASK] &&
- (mask = rta_getattr_u32(tb[TCA_FW_MASK])) != 0xFFFFFFFF)
- fprintf(f, "handle 0x%x/0x%x ", mark, mask);
- else
- fprintf(f, "handle 0x%x ", handle);
- }
+ if (opt == NULL)
+ return 0;
if (tb[TCA_FW_CLASSID]) {
SPRINT_BUF(b1);
- fprintf(f, "classid %s ", sprint_tc_classid(rta_getattr_u32(tb[TCA_FW_CLASSID]), b1));
+ fprintf(f, "classid %s ",
+ sprint_tc_classid(rta_getattr_u32(tb[TCA_FW_CLASSID]),
+ b1));
}
if (tb[TCA_FW_POLICE])
tc_print_police(f, tb[TCA_FW_POLICE]);
+
if (tb[TCA_FW_INDEV]) {
struct rtattr *idev = tb[TCA_FW_INDEV];
-
fprintf(f, "input dev %s ", rta_getattr_str(idev));
}
@@ -153,6 +158,7 @@ static int fw_print_opt(struct filter_util *qu, FILE *f, struct rtattr *opt, __u
fprintf(f, "\n");
tc_print_action(f, tb[TCA_FW_ACT]);
}
+
return 0;
}
diff --git a/tc/f_matchall.c b/tc/f_matchall.c
index 04e524e..006eb70 100644
--- a/tc/f_matchall.c
+++ b/tc/f_matchall.c
@@ -116,14 +116,14 @@ static int matchall_print_opt(struct filter_util *qu, FILE *f,
{
struct rtattr *tb[TCA_MATCHALL_MAX+1];
+ if (handle)
+ fprintf(f, "handle 0x%x ", handle);
+
if (opt == NULL)
return 0;
parse_rtattr_nested(tb, TCA_MATCHALL_MAX, opt);
- if (handle)
- fprintf(f, "handle 0x%x ", handle);
-
if (tb[TCA_MATCHALL_CLASSID]) {
SPRINT_BUF(b1);
fprintf(f, "flowid %s ",
diff --git a/tc/f_route.c b/tc/f_route.c
index 5c600b9..5d1ea17 100644
--- a/tc/f_route.c
+++ b/tc/f_route.c
@@ -34,7 +34,8 @@ static void explain(void)
fprintf(stderr, "\nNOTE: 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(struct filter_util *qu, char *handle, int argc,
+ char **argv, struct nlmsghdr *n)
{
struct tcmsg *t = NLMSG_DATA(n);
struct rtattr *tail;
@@ -139,32 +140,38 @@ 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(struct filter_util *qu, FILE *f, struct rtattr *opt,
+ __u32 handle)
{
struct rtattr *tb[TCA_ROUTE4_MAX+1];
SPRINT_BUF(b1);
- if (opt == NULL)
- return 0;
-
- parse_rtattr_nested(tb, TCA_ROUTE4_MAX, opt);
-
if (handle)
fprintf(f, "fh 0x%08x ", handle);
if (handle&0x7F00)
fprintf(f, "order %d ", (handle>>8)&0x7F);
+ if (opt == NULL)
+ return 0;
+
+ parse_rtattr_nested(tb, TCA_ROUTE4_MAX, opt);
if (tb[TCA_ROUTE4_CLASSID]) {
SPRINT_BUF(b1);
- fprintf(f, "flowid %s ", sprint_tc_classid(rta_getattr_u32(tb[TCA_ROUTE4_CLASSID]), b1));
+ fprintf(f, "flowid %s ",
+ sprint_tc_classid(rta_getattr_u32(tb[TCA_ROUTE4_CLASSID]), b1));
}
if (tb[TCA_ROUTE4_TO])
- fprintf(f, "to %s ", rtnl_rtrealm_n2a(rta_getattr_u32(tb[TCA_ROUTE4_TO]), b1, sizeof(b1)));
+ fprintf(f, "to %s ",
+ rtnl_rtrealm_n2a(rta_getattr_u32(tb[TCA_ROUTE4_TO]),
+ b1, sizeof(b1)));
if (tb[TCA_ROUTE4_FROM])
- fprintf(f, "from %s ", rtnl_rtrealm_n2a(rta_getattr_u32(tb[TCA_ROUTE4_FROM]), b1, sizeof(b1)));
+ fprintf(f, "from %s ",
+ rtnl_rtrealm_n2a(rta_getattr_u32(tb[TCA_ROUTE4_FROM]),
+ b1, sizeof(b1)));
if (tb[TCA_ROUTE4_IIF])
- fprintf(f, "fromif %s", ll_index_to_name(*(int *)RTA_DATA(tb[TCA_ROUTE4_IIF])));
+ fprintf(f, "fromif %s",
+ ll_index_to_name(*(int *)RTA_DATA(tb[TCA_ROUTE4_IIF])));
if (tb[TCA_ROUTE4_POLICE])
tc_print_police(f, tb[TCA_ROUTE4_POLICE]);
if (tb[TCA_ROUTE4_ACT])
diff --git a/tc/f_rsvp.c b/tc/f_rsvp.c
index 94bfbef..fae70cc 100644
--- a/tc/f_rsvp.c
+++ b/tc/f_rsvp.c
@@ -325,20 +325,21 @@ static char *sprint_spi(struct tc_rsvp_gpi *pi, int dir, char *buf)
return buf;
}
-static int rsvp_print_opt(struct filter_util *qu, FILE *f, struct rtattr *opt, __u32 handle)
+static int rsvp_print_opt(struct filter_util *qu, FILE *f, struct rtattr *opt,
+ __u32 handle)
{
int family = strcmp(qu->id, "rsvp") == 0 ? AF_INET : AF_INET6;
struct rtattr *tb[TCA_RSVP_MAX+1];
struct tc_rsvp_pinfo *pinfo = NULL;
+ if (handle)
+ fprintf(f, "fh 0x%08x ", handle);
+
if (opt == NULL)
return 0;
parse_rtattr_nested(tb, TCA_RSVP_MAX, opt);
- if (handle)
- fprintf(f, "fh 0x%08x ", handle);
-
if (tb[TCA_RSVP_PINFO]) {
if (RTA_PAYLOAD(tb[TCA_RSVP_PINFO]) < sizeof(*pinfo))
return -1;
@@ -349,9 +350,12 @@ static int rsvp_print_opt(struct filter_util *qu, FILE *f, struct rtattr *opt, _
if (tb[TCA_RSVP_CLASSID]) {
SPRINT_BUF(b1);
if (!pinfo || pinfo->tunnelhdr == 0)
- fprintf(f, "flowid %s ", sprint_tc_classid(rta_getattr_u32(tb[TCA_RSVP_CLASSID]), b1));
+ fprintf(f, "flowid %s ",
+ sprint_tc_classid(rta_getattr_u32(tb[TCA_RSVP_CLASSID]), b1));
else
- fprintf(f, "tunnel %d skip %d ", rta_getattr_u32(tb[TCA_RSVP_CLASSID]), pinfo->tunnelhdr);
+ fprintf(f, "tunnel %d skip %d ",
+ rta_getattr_u32(tb[TCA_RSVP_CLASSID]),
+ pinfo->tunnelhdr);
} else if (pinfo && pinfo->tunnelhdr)
fprintf(f, "tunnel [BAD] skip %d ", pinfo->tunnelhdr);
@@ -359,7 +363,8 @@ static int rsvp_print_opt(struct filter_util *qu, FILE *f, struct rtattr *opt, _
char buf[128];
fprintf(f, "session ");
- if (inet_ntop(family, RTA_DATA(tb[TCA_RSVP_DST]), buf, sizeof(buf)) == 0)
+ if (inet_ntop(family, RTA_DATA(tb[TCA_RSVP_DST]), buf,
+ sizeof(buf)) == 0)
fprintf(f, " [INVALID DADDR] ");
else
fprintf(f, "%s", buf);
@@ -371,14 +376,16 @@ static int rsvp_print_opt(struct filter_util *qu, FILE *f, struct rtattr *opt, _
} else {
if (pinfo && pinfo->dpi.mask) {
SPRINT_BUF(b2);
- fprintf(f, "session [NONE]%s ", sprint_spi(&pinfo->dpi, 1, b2));
+ fprintf(f, "session [NONE]%s ",
+ sprint_spi(&pinfo->dpi, 1, b2));
} else
fprintf(f, "session NONE ");
}
if (pinfo && pinfo->protocol) {
SPRINT_BUF(b1);
- fprintf(f, "ipproto %s ", inet_proto_n2a(pinfo->protocol, b1, sizeof(b1)));
+ fprintf(f, "ipproto %s ", inet_proto_n2a(pinfo->protocol, b1,
+ sizeof(b1)));
}
if (pinfo && pinfo->tunnelid)
fprintf(f, "tunnelid %d ", pinfo->tunnelid);
@@ -386,7 +393,8 @@ static int rsvp_print_opt(struct filter_util *qu, FILE *f, struct rtattr *opt, _
char buf[128];
fprintf(f, "sender ");
- if (inet_ntop(family, RTA_DATA(tb[TCA_RSVP_SRC]), buf, sizeof(buf)) == 0) {
+ if (inet_ntop(family, RTA_DATA(tb[TCA_RSVP_SRC]), buf,
+ sizeof(buf)) == 0) {
fprintf(f, "[BAD]");
} else {
fprintf(f, " %s", buf);
diff --git a/tc/f_tcindex.c b/tc/f_tcindex.c
index 32bccb0..8b6f0e8 100644
--- a/tc/f_tcindex.c
+++ b/tc/f_tcindex.c
@@ -123,12 +123,14 @@ static int tcindex_print_opt(struct filter_util *qu, FILE *f,
{
struct rtattr *tb[TCA_TCINDEX_MAX+1];
+ if (handle != ~0)
+ fprintf(f, "handle 0x%04x ", handle);
+
if (opt == NULL)
return 0;
parse_rtattr_nested(tb, TCA_TCINDEX_MAX, opt);
- if (handle != ~0) fprintf(f, "handle 0x%04x ", handle);
if (tb[TCA_TCINDEX_HASH]) {
__u16 hash;
diff --git a/tc/f_u32.c b/tc/f_u32.c
index 0ad7ed2..3b107cc 100644
--- a/tc/f_u32.c
+++ b/tc/f_u32.c
@@ -1210,16 +1210,15 @@ static int u32_print_opt(struct filter_util *qu, FILE *f, struct rtattr *opt,
struct tc_u32_sel *sel = NULL;
struct tc_u32_pcnt *pf = NULL;
- if (opt == NULL)
- return 0;
-
- parse_rtattr_nested(tb, TCA_U32_MAX, opt);
-
if (handle) {
SPRINT_BUF(b1);
fprintf(f, "fh %s ", sprint_u32_handle(handle, b1));
}
+ if (opt == NULL)
+ return 0;
+
+ parse_rtattr_nested(tb, TCA_U32_MAX, opt);
if (TC_U32_NODE(handle))
fprintf(f, "order %d ", TC_U32_NODE(handle));
--
1.9.1
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH iproute2 2/2] tc filters: fix filters to display handle when deleted even when no option
2016-10-17 9:34 ` [PATCH iproute2 2/2] tc filters: fix filters to display handle when deleted even when no option Jamal Hadi Salim
@ 2016-10-26 17:57 ` Stephen Hemminger
0 siblings, 0 replies; 3+ messages in thread
From: Stephen Hemminger @ 2016-10-26 17:57 UTC (permalink / raw)
To: Jamal Hadi Salim; +Cc: netdev, daniel, xiyou.wangcong, mrv
On Mon, 17 Oct 2016 05:34:45 -0400
Jamal Hadi Salim <jhs@mojatatu.com> wrote:
> From: Jamal Hadi Salim <jhs@mojatatu.com>
>
> Fix a few stylistic things that hurt my eyes while at it.
>
> Signed-off-by: Jamal Hadi Salim <jhs@mojatatu.com>
This patch has whitespace issues, please fix and resubmit.
ARNING: suspect code indent for conditional statements (16, 19)
#127: FILE: tc/f_fw.c:126:
+ if (tb[TCA_FW_MASK]) {
+ __u32 tmask = rta_getattr_u32(tb[TCA_FW_MASK]);
WARNING: Statements should start on a tabstop
#131: FILE: tc/f_fw.c:129:
+ if (tmask != 0xFFFFFFFF)
WARNING: suspect code indent for conditional statements (19, 27)
#131: FILE: tc/f_fw.c:129:
+ if (tmask != 0xFFFFFFFF)
+ mask = tmask;
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2016-10-26 17:57 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-10-17 9:34 [PATCH iproute2 1/2] tc filters: display handle in events when a filter is deleted Jamal Hadi Salim
2016-10-17 9:34 ` [PATCH iproute2 2/2] tc filters: fix filters to display handle when deleted even when no option Jamal Hadi Salim
2016-10-26 17:57 ` Stephen Hemminger
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).