Blame SOURCES/0128-ip-tunnel-Use-tnl_parse_key-to-parse-tunnel-key.patch

99be8f
From 8f2338a51859158b8699e0736f84ab1e42a3da97 Mon Sep 17 00:00:00 2001
99be8f
From: Andrea Claudi <aclaudi@redhat.com>
99be8f
Date: Wed, 5 Jun 2019 13:05:04 +0200
99be8f
Subject: [PATCH] ip/tunnel: Use tnl_parse_key() to parse tunnel key
99be8f
99be8f
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1714660
99be8f
Upstream Status: iproute2.git commit 1f44b93744f11
99be8f
Conflicts: context change due to missing commit 2a80154fde40b
99be8f
           ("vti6: fix local/remote any addr handling")
99be8f
99be8f
commit 1f44b93744f11f2a8249e3c13751ab7debebaa5f
99be8f
Author: Serhey Popovych <serhe.popovych@gmail.com>
99be8f
Date:   Mon Dec 18 19:48:03 2017 +0200
99be8f
99be8f
    ip/tunnel: Use tnl_parse_key() to parse tunnel key
99be8f
99be8f
    It is added with
99be8f
    commit a7ed1520ee96 ("ip/tunnel: introduce tnl_parse_key()")
99be8f
    to avoid code duplication in ip6?tunnel.c.
99be8f
99be8f
    Reuse it for gre/gre6 and vti/vti6 tunnel rtnl
99be8f
    configuration interface with the same purpose
99be8f
    it is used in tunnel ioctl interface in ip6?tunnel.c.
99be8f
99be8f
    While there change type of key variables from
99be8f
    unsigned integer to __be32 to reflect nature of the
99be8f
    value they store and place error message in
99be8f
    tnl_parse_key() on a single line to make single
99be8f
    call to fprintf().
99be8f
99be8f
    Signed-off-by: Serhey Popovych <serhe.popovych@gmail.com>
99be8f
    Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
99be8f
---
99be8f
 ip/link_gre.c  | 45 +++++----------------------------------------
99be8f
 ip/link_gre6.c | 45 +++++----------------------------------------
99be8f
 ip/link_vti.c  | 45 +++++----------------------------------------
99be8f
 ip/link_vti6.c | 45 +++++----------------------------------------
99be8f
 ip/tunnel.c    |  5 +++--
99be8f
 5 files changed, 23 insertions(+), 162 deletions(-)
99be8f
99be8f
diff --git a/ip/link_gre.c b/ip/link_gre.c
99be8f
index ced993692e6f6..1376d2e3af7de 100644
99be8f
--- a/ip/link_gre.c
99be8f
+++ b/ip/link_gre.c
99be8f
@@ -77,8 +77,8 @@ static int gre_parse_opt(struct link_util *lu, int argc, char **argv,
99be8f
 	struct rtattr *greinfo[IFLA_GRE_MAX + 1];
99be8f
 	__u16 iflags = 0;
99be8f
 	__u16 oflags = 0;
99be8f
-	unsigned int ikey = 0;
99be8f
-	unsigned int okey = 0;
99be8f
+	__be32 ikey = 0;
99be8f
+	__be32 okey = 0;
99be8f
 	unsigned int saddr = 0;
99be8f
 	unsigned int daddr = 0;
99be8f
 	unsigned int link = 0;
99be8f
@@ -167,53 +167,18 @@ get_failed:
99be8f
 
99be8f
 	while (argc > 0) {
99be8f
 		if (!matches(*argv, "key")) {
99be8f
-			unsigned int uval;
99be8f
-
99be8f
 			NEXT_ARG();
99be8f
 			iflags |= GRE_KEY;
99be8f
 			oflags |= GRE_KEY;
99be8f
-			if (strchr(*argv, '.'))
99be8f
-				uval = get_addr32(*argv);
99be8f
-			else {
99be8f
-				if (get_unsigned(&uval, *argv, 0) < 0) {
99be8f
-					fprintf(stderr,
99be8f
-						"Invalid value for \"key\": \"%s\"; it should be an unsigned integer\n", *argv);
99be8f
-					exit(-1);
99be8f
-				}
99be8f
-				uval = htonl(uval);
99be8f
-			}
99be8f
-
99be8f
-			ikey = okey = uval;
99be8f
+			ikey = okey = tnl_parse_key("key", *argv);
99be8f
 		} else if (!matches(*argv, "ikey")) {
99be8f
-			unsigned int uval;
99be8f
-
99be8f
 			NEXT_ARG();
99be8f
 			iflags |= GRE_KEY;
99be8f
-			if (strchr(*argv, '.'))
99be8f
-				uval = get_addr32(*argv);
99be8f
-			else {
99be8f
-				if (get_unsigned(&uval, *argv, 0) < 0) {
99be8f
-					fprintf(stderr, "invalid value for \"ikey\": \"%s\"; it should be an unsigned integer\n", *argv);
99be8f
-					exit(-1);
99be8f
-				}
99be8f
-				uval = htonl(uval);
99be8f
-			}
99be8f
-			ikey = uval;
99be8f
+			ikey = tnl_parse_key("ikey", *argv);
99be8f
 		} else if (!matches(*argv, "okey")) {
99be8f
-			unsigned int uval;
99be8f
-
99be8f
 			NEXT_ARG();
99be8f
 			oflags |= GRE_KEY;
99be8f
-			if (strchr(*argv, '.'))
99be8f
-				uval = get_addr32(*argv);
99be8f
-			else {
99be8f
-				if (get_unsigned(&uval, *argv, 0) < 0) {
99be8f
-					fprintf(stderr, "invalid value for \"okey\": \"%s\"; it should be an unsigned integer\n", *argv);
99be8f
-					exit(-1);
99be8f
-				}
99be8f
-				uval = htonl(uval);
99be8f
-			}
99be8f
-			okey = uval;
99be8f
+			okey = tnl_parse_key("okey", *argv);
99be8f
 		} else if (!matches(*argv, "seq")) {
99be8f
 			iflags |= GRE_SEQ;
99be8f
 			oflags |= GRE_SEQ;
99be8f
diff --git a/ip/link_gre6.c b/ip/link_gre6.c
99be8f
index a9d18ee954641..22e6e44aae29b 100644
99be8f
--- a/ip/link_gre6.c
99be8f
+++ b/ip/link_gre6.c
99be8f
@@ -89,8 +89,8 @@ static int gre_parse_opt(struct link_util *lu, int argc, char **argv,
99be8f
 	struct rtattr *greinfo[IFLA_GRE_MAX + 1];
99be8f
 	__u16 iflags = 0;
99be8f
 	__u16 oflags = 0;
99be8f
-	unsigned int ikey = 0;
99be8f
-	unsigned int okey = 0;
99be8f
+	__be32 ikey = 0;
99be8f
+	__be32 okey = 0;
99be8f
 	struct in6_addr raddr = IN6ADDR_ANY_INIT;
99be8f
 	struct in6_addr laddr = IN6ADDR_ANY_INIT;
99be8f
 	unsigned int link = 0;
99be8f
@@ -181,53 +181,18 @@ get_failed:
99be8f
 
99be8f
 	while (argc > 0) {
99be8f
 		if (!matches(*argv, "key")) {
99be8f
-			unsigned int uval;
99be8f
-
99be8f
 			NEXT_ARG();
99be8f
 			iflags |= GRE_KEY;
99be8f
 			oflags |= GRE_KEY;
99be8f
-			if (strchr(*argv, '.'))
99be8f
-				uval = get_addr32(*argv);
99be8f
-			else {
99be8f
-				if (get_unsigned(&uval, *argv, 0) < 0) {
99be8f
-					fprintf(stderr,
99be8f
-						"Invalid value for \"key\"\n");
99be8f
-					exit(-1);
99be8f
-				}
99be8f
-				uval = htonl(uval);
99be8f
-			}
99be8f
-
99be8f
-			ikey = okey = uval;
99be8f
+			ikey = okey = tnl_parse_key("key", *argv);
99be8f
 		} else if (!matches(*argv, "ikey")) {
99be8f
-			unsigned int uval;
99be8f
-
99be8f
 			NEXT_ARG();
99be8f
 			iflags |= GRE_KEY;
99be8f
-			if (strchr(*argv, '.'))
99be8f
-				uval = get_addr32(*argv);
99be8f
-			else {
99be8f
-				if (get_unsigned(&uval, *argv, 0) < 0) {
99be8f
-					fprintf(stderr, "invalid value of \"ikey\"\n");
99be8f
-					exit(-1);
99be8f
-				}
99be8f
-				uval = htonl(uval);
99be8f
-			}
99be8f
-			ikey = uval;
99be8f
+			ikey = tnl_parse_key("ikey", *argv);
99be8f
 		} else if (!matches(*argv, "okey")) {
99be8f
-			unsigned int uval;
99be8f
-
99be8f
 			NEXT_ARG();
99be8f
 			oflags |= GRE_KEY;
99be8f
-			if (strchr(*argv, '.'))
99be8f
-				uval = get_addr32(*argv);
99be8f
-			else {
99be8f
-				if (get_unsigned(&uval, *argv, 0) < 0) {
99be8f
-					fprintf(stderr, "invalid value of \"okey\"\n");
99be8f
-					exit(-1);
99be8f
-				}
99be8f
-				uval = htonl(uval);
99be8f
-			}
99be8f
-			okey = uval;
99be8f
+			okey = tnl_parse_key("okey", *argv);
99be8f
 		} else if (!matches(*argv, "seq")) {
99be8f
 			iflags |= GRE_SEQ;
99be8f
 			oflags |= GRE_SEQ;
99be8f
diff --git a/ip/link_vti.c b/ip/link_vti.c
99be8f
index d2aacbe78ded1..6e4234170bb50 100644
99be8f
--- a/ip/link_vti.c
99be8f
+++ b/ip/link_vti.c
99be8f
@@ -62,8 +62,8 @@ static int vti_parse_opt(struct link_util *lu, int argc, char **argv,
99be8f
 	struct rtattr *tb[IFLA_MAX + 1];
99be8f
 	struct rtattr *linkinfo[IFLA_INFO_MAX+1];
99be8f
 	struct rtattr *vtiinfo[IFLA_VTI_MAX + 1];
99be8f
-	unsigned int ikey = 0;
99be8f
-	unsigned int okey = 0;
99be8f
+	__be32 ikey = 0;
99be8f
+	__be32 okey = 0;
99be8f
 	unsigned int saddr = 0;
99be8f
 	unsigned int daddr = 0;
99be8f
 	unsigned int link = 0;
99be8f
@@ -116,49 +116,14 @@ get_failed:
99be8f
 
99be8f
 	while (argc > 0) {
99be8f
 		if (!matches(*argv, "key")) {
99be8f
-			unsigned int uval;
99be8f
-
99be8f
 			NEXT_ARG();
99be8f
-			if (strchr(*argv, '.'))
99be8f
-				uval = get_addr32(*argv);
99be8f
-			else {
99be8f
-				if (get_unsigned(&uval, *argv, 0) < 0) {
99be8f
-					fprintf(stderr,
99be8f
-						"Invalid value for \"key\": \"%s\"; it should be an unsigned integer\n", *argv);
99be8f
-					exit(-1);
99be8f
-				}
99be8f
-				uval = htonl(uval);
99be8f
-			}
99be8f
-
99be8f
-			ikey = okey = uval;
99be8f
+			ikey = okey = tnl_parse_key("key", *argv);
99be8f
 		} else if (!matches(*argv, "ikey")) {
99be8f
-			unsigned int uval;
99be8f
-
99be8f
 			NEXT_ARG();
99be8f
-			if (strchr(*argv, '.'))
99be8f
-				uval = get_addr32(*argv);
99be8f
-			else {
99be8f
-				if (get_unsigned(&uval, *argv, 0) < 0) {
99be8f
-					fprintf(stderr, "invalid value for \"ikey\": \"%s\"; it should be an unsigned integer\n", *argv);
99be8f
-					exit(-1);
99be8f
-				}
99be8f
-				uval = htonl(uval);
99be8f
-			}
99be8f
-			ikey = uval;
99be8f
+			ikey = tnl_parse_key("ikey", *argv);
99be8f
 		} else if (!matches(*argv, "okey")) {
99be8f
-			unsigned int uval;
99be8f
-
99be8f
 			NEXT_ARG();
99be8f
-			if (strchr(*argv, '.'))
99be8f
-				uval = get_addr32(*argv);
99be8f
-			else {
99be8f
-				if (get_unsigned(&uval, *argv, 0) < 0) {
99be8f
-					fprintf(stderr, "invalid value for \"okey\": \"%s\"; it should be an unsigned integer\n", *argv);
99be8f
-					exit(-1);
99be8f
-				}
99be8f
-				uval = htonl(uval);
99be8f
-			}
99be8f
-			okey = uval;
99be8f
+			okey = tnl_parse_key("okey", *argv);
99be8f
 		} else if (!matches(*argv, "remote")) {
99be8f
 			NEXT_ARG();
99be8f
 			if (!strcmp(*argv, "any")) {
99be8f
diff --git a/ip/link_vti6.c b/ip/link_vti6.c
99be8f
index aedfbeaeea0e1..e246cedbcb7a7 100644
99be8f
--- a/ip/link_vti6.c
99be8f
+++ b/ip/link_vti6.c
99be8f
@@ -59,8 +59,8 @@ static int vti6_parse_opt(struct link_util *lu, int argc, char **argv,
99be8f
 	struct rtattr *vtiinfo[IFLA_VTI_MAX + 1];
99be8f
 	struct in6_addr saddr;
99be8f
 	struct in6_addr daddr;
99be8f
-	unsigned int ikey = 0;
99be8f
-	unsigned int okey = 0;
99be8f
+	__be32 ikey = 0;
99be8f
+	__be32 okey = 0;
99be8f
 	unsigned int link = 0;
99be8f
 	int len;
99be8f
 
99be8f
@@ -111,49 +111,14 @@ get_failed:
99be8f
 
99be8f
 	while (argc > 0) {
99be8f
 		if (!matches(*argv, "key")) {
99be8f
-			unsigned int uval;
99be8f
-
99be8f
 			NEXT_ARG();
99be8f
-			if (strchr(*argv, '.'))
99be8f
-				uval = get_addr32(*argv);
99be8f
-			else {
99be8f
-				if (get_unsigned(&uval, *argv, 0) < 0) {
99be8f
-					fprintf(stderr,
99be8f
-						"Invalid value for \"key\": \"%s\"; it should be an unsigned integer\n", *argv);
99be8f
-					exit(-1);
99be8f
-				}
99be8f
-				uval = htonl(uval);
99be8f
-			}
99be8f
-
99be8f
-			ikey = okey = uval;
99be8f
+			ikey = okey = tnl_parse_key("key", *argv);
99be8f
 		} else if (!matches(*argv, "ikey")) {
99be8f
-			unsigned int uval;
99be8f
-
99be8f
 			NEXT_ARG();
99be8f
-			if (strchr(*argv, '.'))
99be8f
-				uval = get_addr32(*argv);
99be8f
-			else {
99be8f
-				if (get_unsigned(&uval, *argv, 0) < 0) {
99be8f
-					fprintf(stderr, "invalid value for \"ikey\": \"%s\"; it should be an unsigned integer\n", *argv);
99be8f
-					exit(-1);
99be8f
-				}
99be8f
-				uval = htonl(uval);
99be8f
-			}
99be8f
-			ikey = uval;
99be8f
+			ikey = tnl_parse_key("ikey", *argv);
99be8f
 		} else if (!matches(*argv, "okey")) {
99be8f
-			unsigned int uval;
99be8f
-
99be8f
 			NEXT_ARG();
99be8f
-			if (strchr(*argv, '.'))
99be8f
-				uval = get_addr32(*argv);
99be8f
-			else {
99be8f
-				if (get_unsigned(&uval, *argv, 0) < 0) {
99be8f
-					fprintf(stderr, "invalid value for \"okey\": \"%s\"; it should be an unsigned integer\n", *argv);
99be8f
-					exit(-1);
99be8f
-				}
99be8f
-				uval = htonl(uval);
99be8f
-			}
99be8f
-			okey = uval;
99be8f
+			okey = tnl_parse_key("okey", *argv);
99be8f
 		} else if (!matches(*argv, "remote")) {
99be8f
 			NEXT_ARG();
99be8f
 			if (!strcmp(*argv, "any")) {
99be8f
diff --git a/ip/tunnel.c b/ip/tunnel.c
99be8f
index 7956d71aa7334..3967d5df3ca1c 100644
99be8f
--- a/ip/tunnel.c
99be8f
+++ b/ip/tunnel.c
99be8f
@@ -189,8 +189,9 @@ __be32 tnl_parse_key(const char *name, const char *key)
99be8f
 		return get_addr32(key);
99be8f
 
99be8f
 	if (get_unsigned(&uval, key, 0) < 0) {
99be8f
-		fprintf(stderr, "invalid value for \"%s\": \"%s\";", name, key);
99be8f
-		fprintf(stderr, " it should be an unsigned integer\n");
99be8f
+		fprintf(stderr,
99be8f
+			"invalid value for \"%s\": \"%s\"; it should be an unsigned integer\n",
99be8f
+			name, key);
99be8f
 		exit(-1);
99be8f
 	}
99be8f
 	return htonl(uval);
99be8f
-- 
d30c09
2.21.0
99be8f