Blame SOURCES/0145-tc-introduce-support-for-block-handle-for-filter-ope.patch

99be8f
From 13e1ae7b588c723091f81538bb5834b274f0b0c7 Mon Sep 17 00:00:00 2001
99be8f
From: Andrea Claudi <aclaudi@redhat.com>
99be8f
Date: Tue, 18 Jun 2019 20:02:54 +0200
99be8f
Subject: [PATCH] tc: introduce support for block-handle for filter operations
99be8f
99be8f
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1721291
99be8f
Upstream Status: iproute2.git commit 0c7cef9669a82
99be8f
Conflicts: context change due to missing commit 485d0c6001c4a
99be8f
           ("tc: Add batchsize feature for filter and actions"),
99be8f
           also adjust code to use fprintf instead of print_string
99be8f
           due to missing commit 249284ff5a44a ("tc: jsonify filter core")
99be8f
99be8f
commit 0c7cef9669a82d4ad0438922f7ce57c18100d6b8
99be8f
Author: Jiri Pirko <jiri@mellanox.com>
99be8f
Date:   Sat Jan 20 11:00:28 2018 +0100
99be8f
99be8f
    tc: introduce support for block-handle for filter operations
99be8f
99be8f
    So far, qdisc was the only handle that could be used to manipulate
99be8f
    filters. Kernel added support for using block to manipulate it. So add
99be8f
    the support to use block index to manipulate filters. The magic
99be8f
    TCM_IFINDEX_MAGIC_BLOCK indicates the block index is in use.
99be8f
99be8f
    Signed-off-by: Jiri Pirko <jiri@mellanox.com>
99be8f
    Signed-off-by: David Ahern <dsahern@gmail.com>
99be8f
---
99be8f
 man/man8/tc.8  |  18 +++++++++
99be8f
 tc/tc_filter.c | 102 +++++++++++++++++++++++++++++++++++++++++--------
99be8f
 2 files changed, 104 insertions(+), 16 deletions(-)
99be8f
99be8f
diff --git a/man/man8/tc.8 b/man/man8/tc.8
99be8f
index a341a8f995f85..c493ccfa7c900 100644
99be8f
--- a/man/man8/tc.8
99be8f
+++ b/man/man8/tc.8
99be8f
@@ -41,6 +41,19 @@ tc \- show / manipulate traffic control settings
99be8f
 .B flowid
99be8f
 \fIflow-id\fR
99be8f
 
99be8f
+.B tc
99be8f
+.RI "[ " OPTIONS " ]"
99be8f
+.B filter [ add | change | replace | delete | get ] block
99be8f
+\fIBLOCK_INDEX\fR
99be8f
+.B [ handle \fIfilter-id\fR ]
99be8f
+.B protocol
99be8f
+\fIprotocol\fR
99be8f
+.B prio
99be8f
+\fIpriority\fR filtertype
99be8f
+[ filtertype specific parameters ]
99be8f
+.B flowid
99be8f
+\fIflow-id\fR
99be8f
+
99be8f
 .B tc
99be8f
 .RI "[ " OPTIONS " ]"
99be8f
 .RI "[ " FORMAT " ]"
99be8f
@@ -58,6 +71,11 @@ tc \- show / manipulate traffic control settings
99be8f
 .RI "[ " OPTIONS " ]"
99be8f
 .B filter show dev
99be8f
 \fIDEV\fR
99be8f
+.P
99be8f
+.B tc
99be8f
+.RI "[ " OPTIONS " ]"
99be8f
+.B filter show block
99be8f
+\fIBLOCK_INDEX\fR
99be8f
 
99be8f
 .P
99be8f
 .ti 8
99be8f
diff --git a/tc/tc_filter.c b/tc/tc_filter.c
99be8f
index e479039159df6..5676ed3a74383 100644
99be8f
--- a/tc/tc_filter.c
99be8f
+++ b/tc/tc_filter.c
99be8f
@@ -29,14 +29,17 @@
99be8f
 static void usage(void)
99be8f
 {
99be8f
 	fprintf(stderr,
99be8f
-		"Usage: tc filter [ add | del | change | replace | show ] dev STRING\n"
99be8f
-		"Usage: tc filter get dev STRING parent CLASSID protocol PROTO handle FILTERID pref PRIO FILTER_TYPE\n"
99be8f
+		"Usage: tc filter [ add | del | change | replace | show ] [ dev STRING ]\n"
99be8f
+		"       tc filter [ add | del | change | replace | show ] [ block BLOCK_INDEX ]\n"
99be8f
+		"       tc filter get dev STRING parent CLASSID protocol PROTO handle FILTERID pref PRIO FILTER_TYPE\n"
99be8f
+		"       tc filter get block BLOCK_INDEX protocol PROTO handle FILTERID pref PRIO FILTER_TYPE\n"
99be8f
 		"       [ pref PRIO ] protocol PROTO [ chain CHAIN_INDEX ]\n"
99be8f
 		"       [ estimator INTERVAL TIME_CONSTANT ]\n"
99be8f
 		"       [ root | ingress | egress | parent CLASSID ]\n"
99be8f
 		"       [ handle FILTERID ] [ [ FILTER_TYPE ] [ help | OPTIONS ] ]\n"
99be8f
 		"\n"
99be8f
 		"       tc filter show [ dev STRING ] [ root | ingress | egress | parent CLASSID ]\n"
99be8f
+		"       tc filter show [ block BLOCK_INDEX ]\n"
99be8f
 		"Where:\n"
99be8f
 		"FILTER_TYPE := { rsvp | u32 | bpf | fw | route | etc. }\n"
99be8f
 		"FILTERID := ... format depends on classifier, see there\n"
99be8f
@@ -61,6 +64,7 @@ static int tc_filter_modify(int cmd, unsigned int flags, int argc, char **argv)
99be8f
 	int protocol_set = 0;
99be8f
 	__u32 chain_index;
99be8f
 	int chain_index_set = 0;
99be8f
+	__u32 block_index = 0;
99be8f
 	char *fhandle = NULL;
99be8f
 	char  d[16] = {};
99be8f
 	char  k[16] = {};
99be8f
@@ -74,7 +78,21 @@ static int tc_filter_modify(int cmd, unsigned int flags, int argc, char **argv)
99be8f
 			NEXT_ARG();
99be8f
 			if (d[0])
99be8f
 				duparg("dev", *argv);
99be8f
+			if (block_index) {
99be8f
+				fprintf(stderr, "Error: \"dev\" and \"block\" are mutually exlusive\n");
99be8f
+				return -1;
99be8f
+			}
99be8f
 			strncpy(d, *argv, sizeof(d)-1);
99be8f
+		} else if (matches(*argv, "block") == 0) {
99be8f
+			NEXT_ARG();
99be8f
+			if (block_index)
99be8f
+				duparg("block", *argv);
99be8f
+			if (d[0]) {
99be8f
+				fprintf(stderr, "Error: \"dev\" and \"block\" are mutually exlusive\n");
99be8f
+				return -1;
99be8f
+			}
99be8f
+			if (get_u32(&block_index, *argv, 0) || !block_index)
99be8f
+				invarg("invalid block index value", *argv);
99be8f
 		} else if (strcmp(*argv, "root") == 0) {
99be8f
 			if (req.t.tcm_parent) {
99be8f
 				fprintf(stderr,
99be8f
@@ -169,6 +187,9 @@ static int tc_filter_modify(int cmd, unsigned int flags, int argc, char **argv)
99be8f
 			fprintf(stderr, "Cannot find device \"%s\"\n", d);
99be8f
 			return 1;
99be8f
 		}
99be8f
+	} else if (block_index) {
99be8f
+		req.t.tcm_ifindex = TCM_IFINDEX_MAGIC_BLOCK;
99be8f
+		req.t.tcm_block_index = block_index;
99be8f
 	}
99be8f
 
99be8f
 	if (q) {
99be8f
@@ -207,6 +228,7 @@ static __u32 filter_prio;
99be8f
 static __u32 filter_protocol;
99be8f
 static __u32 filter_chain_index;
99be8f
 static int filter_chain_index_set;
99be8f
+static __u32 filter_block_index;
99be8f
 __u16 f_proto;
99be8f
 
99be8f
 int print_filter(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
99be8f
@@ -251,19 +273,25 @@ int print_filter(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
99be8f
 		fprintf(fp, "added ");
99be8f
 
99be8f
 	fprintf(fp, "filter ");
99be8f
-	if (!filter_ifindex || filter_ifindex != t->tcm_ifindex)
99be8f
-		fprintf(fp, "dev %s ", ll_index_to_name(t->tcm_ifindex));
99be8f
-
99be8f
-	if (!filter_parent || filter_parent != t->tcm_parent) {
99be8f
-		if (t->tcm_parent == TC_H_ROOT)
99be8f
-			fprintf(fp, "root ");
99be8f
-		else if (t->tcm_parent == TC_H_MAKE(TC_H_CLSACT, TC_H_MIN_INGRESS))
99be8f
-			fprintf(fp, "ingress ");
99be8f
-		else if (t->tcm_parent == TC_H_MAKE(TC_H_CLSACT, TC_H_MIN_EGRESS))
99be8f
-			fprintf(fp, "egress ");
99be8f
-		else {
99be8f
-			print_tc_classid(abuf, sizeof(abuf), t->tcm_parent);
99be8f
-			fprintf(fp, "parent %s ", abuf);
99be8f
+	if (t->tcm_ifindex == TCM_IFINDEX_MAGIC_BLOCK) {
99be8f
+		if (!filter_block_index ||
99be8f
+		    filter_block_index != t->tcm_block_index)
99be8f
+			fprintf(fp, "block %u ", t->tcm_block_index);
99be8f
+	} else {
99be8f
+		if (!filter_ifindex || filter_ifindex != t->tcm_ifindex)
99be8f
+			fprintf(fp, "dev %s ", ll_index_to_name(t->tcm_ifindex));
99be8f
+
99be8f
+		if (!filter_parent || filter_parent != t->tcm_parent) {
99be8f
+			if (t->tcm_parent == TC_H_ROOT)
99be8f
+				fprintf(fp, "root ");
99be8f
+			else if (t->tcm_parent == TC_H_MAKE(TC_H_CLSACT, TC_H_MIN_INGRESS))
99be8f
+				fprintf(fp, "ingress ");
99be8f
+			else if (t->tcm_parent == TC_H_MAKE(TC_H_CLSACT, TC_H_MIN_EGRESS))
99be8f
+				fprintf(fp, "egress ");
99be8f
+			else {
99be8f
+				print_tc_classid(abuf, sizeof(abuf), t->tcm_parent);
99be8f
+				fprintf(fp, "parent %s ", abuf);
99be8f
+			}
99be8f
 		}
99be8f
 	}
99be8f
 
99be8f
@@ -337,6 +365,7 @@ static int tc_filter_get(int cmd, unsigned int flags, int argc, char **argv)
99be8f
 	int protocol_set = 0;
99be8f
 	__u32 chain_index;
99be8f
 	int chain_index_set = 0;
99be8f
+	__u32 block_index = 0;
99be8f
 	__u32 parent_handle = 0;
99be8f
 	char *fhandle = NULL;
99be8f
 	char  d[16] = {};
99be8f
@@ -347,7 +376,21 @@ static int tc_filter_get(int cmd, unsigned int flags, int argc, char **argv)
99be8f
 			NEXT_ARG();
99be8f
 			if (d[0])
99be8f
 				duparg("dev", *argv);
99be8f
+			if (block_index) {
99be8f
+				fprintf(stderr, "Error: \"dev\" and \"block\" are mutually exlusive\n");
99be8f
+				return -1;
99be8f
+			}
99be8f
 			strncpy(d, *argv, sizeof(d)-1);
99be8f
+		} else if (matches(*argv, "block") == 0) {
99be8f
+			NEXT_ARG();
99be8f
+			if (block_index)
99be8f
+				duparg("block", *argv);
99be8f
+			if (d[0]) {
99be8f
+				fprintf(stderr, "Error: \"dev\" and \"block\" are mutually exlusive\n");
99be8f
+				return -1;
99be8f
+			}
99be8f
+			if (get_u32(&block_index, *argv, 0) || !block_index)
99be8f
+				invarg("invalid block index value", *argv);
99be8f
 		} else if (strcmp(*argv, "root") == 0) {
99be8f
 			if (req.t.tcm_parent) {
99be8f
 				fprintf(stderr,
99be8f
@@ -461,8 +504,12 @@ static int tc_filter_get(int cmd, unsigned int flags, int argc, char **argv)
99be8f
 			return 1;
99be8f
 		}
99be8f
 		filter_ifindex = req.t.tcm_ifindex;
99be8f
+	} else if (block_index) {
99be8f
+		req.t.tcm_ifindex = TCM_IFINDEX_MAGIC_BLOCK;
99be8f
+		req.t.tcm_block_index = block_index;
99be8f
+		filter_block_index = block_index;
99be8f
 	} else {
99be8f
-		fprintf(stderr, "Must specify netdevice \"dev\"\n");
99be8f
+		fprintf(stderr, "Must specify netdevice \"dev\" or block index \"block\"\n");
99be8f
 		return -1;
99be8f
 	}
99be8f
 
99be8f
@@ -510,6 +557,7 @@ static int tc_filter_list(int argc, char **argv)
99be8f
 	__u32 prio = 0;
99be8f
 	__u32 protocol = 0;
99be8f
 	__u32 chain_index;
99be8f
+	__u32 block_index = 0;
99be8f
 	char *fhandle = NULL;
99be8f
 
99be8f
 	while (argc > 0) {
99be8f
@@ -517,7 +565,21 @@ static int tc_filter_list(int argc, char **argv)
99be8f
 			NEXT_ARG();
99be8f
 			if (d[0])
99be8f
 				duparg("dev", *argv);
99be8f
+			if (block_index) {
99be8f
+				fprintf(stderr, "Error: \"dev\" cannot be used in the same time as \"block\"\n");
99be8f
+				return -1;
99be8f
+			}
99be8f
 			strncpy(d, *argv, sizeof(d)-1);
99be8f
+		} else if (matches(*argv, "block") == 0) {
99be8f
+			NEXT_ARG();
99be8f
+			if (block_index)
99be8f
+				duparg("block", *argv);
99be8f
+			if (d[0]) {
99be8f
+				fprintf(stderr, "Error: \"block\" cannot be used in the same time as \"dev\"\n");
99be8f
+				return -1;
99be8f
+			}
99be8f
+			if (get_u32(&block_index, *argv, 0) || !block_index)
99be8f
+				invarg("invalid block index value", *argv);
99be8f
 		} else if (strcmp(*argv, "root") == 0) {
99be8f
 			if (req.t.tcm_parent) {
99be8f
 				fprintf(stderr,
99be8f
@@ -606,6 +668,14 @@ static int tc_filter_list(int argc, char **argv)
99be8f
 			return 1;
99be8f
 		}
99be8f
 		filter_ifindex = req.t.tcm_ifindex;
99be8f
+	} else if (block_index) {
99be8f
+		if (!tc_qdisc_block_exists(block_index)) {
99be8f
+			fprintf(stderr, "Cannot find block \"%u\"\n", block_index);
99be8f
+			return 1;
99be8f
+		}
99be8f
+		req.t.tcm_ifindex = TCM_IFINDEX_MAGIC_BLOCK;
99be8f
+		req.t.tcm_block_index = block_index;
99be8f
+		filter_block_index = block_index;
99be8f
 	}
99be8f
 
99be8f
 	if (filter_chain_index_set)
99be8f
-- 
99be8f
2.20.1
99be8f