naccyde / rpms / iproute

Forked from rpms/iproute 6 months ago
Clone

Blame SOURCES/0045-ip-rule-Add-ipproto-and-port-range-to-filter-list.patch

8def76
From ec8d7120bf3b8fd47937e9297468e0bb7c1f270c Mon Sep 17 00:00:00 2001
8def76
From: Andrea Claudi <aclaudi@redhat.com>
8def76
Date: Wed, 29 May 2019 17:40:35 +0200
8def76
Subject: [PATCH] ip rule: Add ipproto and port range to filter list
8def76
8def76
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1678111
8def76
Upstream Status: iproute2.git commit b2e8bf1584605
8def76
8def76
commit b2e8bf158460568ec5b48cba69f657f95891c901
8def76
Author: David Ahern <dsahern@gmail.com>
8def76
Date:   Tue Oct 30 15:03:30 2018 -0700
8def76
8def76
    ip rule: Add ipproto and port range to filter list
8def76
8def76
    Allow ip rule dumps and flushes to filter based on ipproto, sport
8def76
    and dport. Example:
8def76
8def76
    $ ip ru ls ipproto udp
8def76
    99:     from all to 8.8.8.8 ipproto udp dport 53 lookup 1001
8def76
    $ ip ru ls dport 53
8def76
    99:     from all to 8.8.8.8 ipproto udp dport 53 lookup 1001
8def76
8def76
    Signed-off-by: David Ahern <dsahern@gmail.com>
8def76
---
8def76
 ip/iprule.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++++
8def76
 1 file changed, 66 insertions(+)
8def76
8def76
diff --git a/ip/iprule.c b/ip/iprule.c
8def76
index 744d6d88e3433..33160eafa2b33 100644
8def76
--- a/ip/iprule.c
8def76
+++ b/ip/iprule.c
8def76
@@ -78,6 +78,9 @@ static struct
8def76
 	inet_prefix dst;
8def76
 	int protocol;
8def76
 	int protocolmask;
8def76
+	struct fib_rule_port_range sport;
8def76
+	struct fib_rule_port_range dport;
8def76
+	__u8 ipproto;
8def76
 } filter;
8def76
 
8def76
 static inline int frh_get_table(struct fib_rule_hdr *frh, struct rtattr **tb)
8def76
@@ -174,6 +177,39 @@ static bool filter_nlmsg(struct nlmsghdr *n, struct rtattr **tb, int host_len)
8def76
 			return false;
8def76
 	}
8def76
 
8def76
+	if (filter.ipproto) {
8def76
+		__u8 ipproto = 0;
8def76
+
8def76
+		if (tb[FRA_IP_PROTO])
8def76
+			ipproto = rta_getattr_u8(tb[FRA_IP_PROTO]);
8def76
+		if (filter.ipproto != ipproto)
8def76
+			return false;
8def76
+	}
8def76
+
8def76
+	if (filter.sport.start) {
8def76
+		const struct fib_rule_port_range *r;
8def76
+
8def76
+		if (!tb[FRA_SPORT_RANGE])
8def76
+			return false;
8def76
+
8def76
+		r = RTA_DATA(tb[FRA_SPORT_RANGE]);
8def76
+		if (r->start != filter.sport.start ||
8def76
+		    r->end != filter.sport.end)
8def76
+			return false;
8def76
+	}
8def76
+
8def76
+	if (filter.dport.start) {
8def76
+		const struct fib_rule_port_range *r;
8def76
+
8def76
+		if (!tb[FRA_DPORT_RANGE])
8def76
+			return false;
8def76
+
8def76
+		r = RTA_DATA(tb[FRA_DPORT_RANGE]);
8def76
+		if (r->start != filter.dport.start ||
8def76
+		    r->end != filter.dport.end)
8def76
+			return false;
8def76
+	}
8def76
+
8def76
 	table = frh_get_table(frh, tb);
8def76
 	if (filter.tb > 0 && filter.tb ^ table)
8def76
 		return false;
8def76
@@ -604,6 +640,36 @@ static int iprule_list_flush_or_save(int argc, char **argv, int action)
8def76
 				filter.protocolmask = 0;
8def76
 			}
8def76
 			filter.protocol = prot;
8def76
+		} else if (strcmp(*argv, "ipproto") == 0) {
8def76
+			int ipproto;
8def76
+
8def76
+			NEXT_ARG();
8def76
+			ipproto = inet_proto_a2n(*argv);
8def76
+			if (ipproto < 0)
8def76
+				invarg("Invalid \"ipproto\" value\n", *argv);
8def76
+			filter.ipproto = ipproto;
8def76
+		} else if (strcmp(*argv, "sport") == 0) {
8def76
+			struct fib_rule_port_range r;
8def76
+			int ret;
8def76
+
8def76
+			NEXT_ARG();
8def76
+			ret = sscanf(*argv, "%hu-%hu", &r.start, &r.end);
8def76
+			if (ret == 1)
8def76
+				r.end = r.start;
8def76
+			else if (ret != 2)
8def76
+				invarg("invalid port range\n", *argv);
8def76
+			filter.sport = r;
8def76
+		} else if (strcmp(*argv, "dport") == 0) {
8def76
+			struct fib_rule_port_range r;
8def76
+			int ret;
8def76
+
8def76
+			NEXT_ARG();
8def76
+			ret = sscanf(*argv, "%hu-%hu", &r.start, &r.end);
8def76
+			if (ret == 1)
8def76
+				r.end = r.start;
8def76
+			else if (ret != 2)
8def76
+				invarg("invalid dport range\n", *argv);
8def76
+			filter.dport = r;
8def76
 		} else{
8def76
 			if (matches(*argv, "dst") == 0 ||
8def76
 			    matches(*argv, "to") == 0) {
8def76
-- 
8def76
2.20.1
8def76