From: Sabrina Dubroca Date: Fri, 20 Apr 2018 08:32:00 +0000 (+0200) Subject: gre/gre6: allow clearing {,i,o}{key,seq,csum} flags X-Git-Tag: v4.18.0~24^2~22 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7f520601f59ee35da2fc48b3f1b39ed2b80c9efa;p=thirdparty%2Fiproute2.git gre/gre6: allow clearing {,i,o}{key,seq,csum} flags Currently, iproute allows setting those flags, but it's impossible to clear them, since their current value is fetched from the kernel and then we OR in the additional flags passed on the command line. Add no* variants to allow clearing them. Signed-off-by: Sabrina Dubroca Signed-off-by: David Ahern --- diff --git a/ip/link_gre.c b/ip/link_gre.c index bc1cee8fb..ede761b23 100644 --- a/ip/link_gre.c +++ b/ip/link_gre.c @@ -31,9 +31,9 @@ static void gre_print_help(struct link_util *lu, int argc, char **argv, FILE *f) ); fprintf(f, " [ local ADDR ]\n" - " [ [i|o]seq ]\n" - " [ [i|o]key KEY ]\n" - " [ [i|o]csum ]\n" + " [ [no][i|o]seq ]\n" + " [ [i|o]key KEY | no[i|o]key ]\n" + " [ [no][i|o]csum ]\n" " [ ttl TTL ]\n" " [ tos TOS ]\n" " [ [no]pmtudisc ]\n" @@ -210,28 +210,52 @@ get_failed: iflags |= GRE_KEY; oflags |= GRE_KEY; ikey = okey = tnl_parse_key("key", *argv); + } else if (!matches(*argv, "nokey")) { + iflags &= ~GRE_KEY; + oflags &= ~GRE_KEY; + ikey = okey = 0; } else if (!matches(*argv, "ikey")) { NEXT_ARG(); iflags |= GRE_KEY; ikey = tnl_parse_key("ikey", *argv); + } else if (!matches(*argv, "noikey")) { + iflags &= ~GRE_KEY; + ikey = 0; } else if (!matches(*argv, "okey")) { NEXT_ARG(); oflags |= GRE_KEY; okey = tnl_parse_key("okey", *argv); + } else if (!matches(*argv, "nookey")) { + oflags &= ~GRE_KEY; + okey = 0; } else if (!matches(*argv, "seq")) { iflags |= GRE_SEQ; oflags |= GRE_SEQ; + } else if (!matches(*argv, "noseq")) { + iflags &= ~GRE_SEQ; + oflags &= ~GRE_SEQ; } else if (!matches(*argv, "iseq")) { iflags |= GRE_SEQ; + } else if (!matches(*argv, "noiseq")) { + iflags &= ~GRE_SEQ; } else if (!matches(*argv, "oseq")) { oflags |= GRE_SEQ; + } else if (!matches(*argv, "nooseq")) { + oflags &= ~GRE_SEQ; } else if (!matches(*argv, "csum")) { iflags |= GRE_CSUM; oflags |= GRE_CSUM; + } else if (!matches(*argv, "nocsum")) { + iflags &= ~GRE_CSUM; + oflags &= ~GRE_CSUM; } else if (!matches(*argv, "icsum")) { iflags |= GRE_CSUM; + } else if (!matches(*argv, "noicsum")) { + iflags &= ~GRE_CSUM; } else if (!matches(*argv, "ocsum")) { oflags |= GRE_CSUM; + } else if (!matches(*argv, "noocsum")) { + oflags &= ~GRE_CSUM; } else if (!matches(*argv, "nopmtudisc")) { pmtudisc = 0; } else if (!matches(*argv, "pmtudisc")) { diff --git a/ip/link_gre6.c b/ip/link_gre6.c index a6fe0b73d..181b2eae8 100644 --- a/ip/link_gre6.c +++ b/ip/link_gre6.c @@ -38,9 +38,9 @@ static void gre_print_help(struct link_util *lu, int argc, char **argv, FILE *f) ); fprintf(f, " [ local ADDR ]\n" - " [ [i|o]seq ]\n" - " [ [i|o]key KEY ]\n" - " [ [i|o]csum ]\n" + " [ [no][i|o]seq ]\n" + " [ [i|o]key KEY | no[i|o]key ]\n" + " [ [no][i|o]csum ]\n" " [ hoplimit TTL ]\n" " [ encaplimit ELIM ]\n" " [ tclass TCLASS ]\n" @@ -220,28 +220,52 @@ get_failed: iflags |= GRE_KEY; oflags |= GRE_KEY; ikey = okey = tnl_parse_key("key", *argv); + } else if (!matches(*argv, "nokey")) { + iflags &= ~GRE_KEY; + oflags &= ~GRE_KEY; + ikey = okey = 0; } else if (!matches(*argv, "ikey")) { NEXT_ARG(); iflags |= GRE_KEY; ikey = tnl_parse_key("ikey", *argv); + } else if (!matches(*argv, "noikey")) { + iflags &= ~GRE_KEY; + ikey = 0; } else if (!matches(*argv, "okey")) { NEXT_ARG(); oflags |= GRE_KEY; okey = tnl_parse_key("okey", *argv); + } else if (!matches(*argv, "nookey")) { + oflags &= ~GRE_KEY; + okey = 0; } else if (!matches(*argv, "seq")) { iflags |= GRE_SEQ; oflags |= GRE_SEQ; + } else if (!matches(*argv, "noseq")) { + iflags &= ~GRE_SEQ; + oflags &= ~GRE_SEQ; } else if (!matches(*argv, "iseq")) { iflags |= GRE_SEQ; + } else if (!matches(*argv, "noiseq")) { + iflags &= ~GRE_SEQ; } else if (!matches(*argv, "oseq")) { oflags |= GRE_SEQ; + } else if (!matches(*argv, "nooseq")) { + oflags &= ~GRE_SEQ; } else if (!matches(*argv, "csum")) { iflags |= GRE_CSUM; oflags |= GRE_CSUM; + } else if (!matches(*argv, "nocsum")) { + iflags &= ~GRE_CSUM; + oflags &= ~GRE_CSUM; } else if (!matches(*argv, "icsum")) { iflags |= GRE_CSUM; + } else if (!matches(*argv, "noicsum")) { + iflags &= ~GRE_CSUM; } else if (!matches(*argv, "ocsum")) { oflags |= GRE_CSUM; + } else if (!matches(*argv, "noocsum")) { + oflags &= ~GRE_CSUM; } else if (!matches(*argv, "remote")) { NEXT_ARG(); get_addr(&daddr, *argv, AF_INET6); diff --git a/man/man8/ip-link.8.in b/man/man8/ip-link.8.in index 77ab8a3b9..83ef3cae5 100644 --- a/man/man8/ip-link.8.in +++ b/man/man8/ip-link.8.in @@ -775,12 +775,14 @@ the following additional arguments are supported: .BR type " { " gre " | " gretap " }" .BI " remote " ADDR " local " ADDR [ -.RB [ i | o ] seq +.RB [ no ] "" [ i | o ] seq ] [ .RB [ i | o ] key .I KEY +| +.BR no [ i | o ] key ] [ -.RB [ i | o ] csum +.RB [ no ] "" [ i | o ] csum ] [ .BI ttl " TTL " ] [ @@ -816,7 +818,7 @@ the following additional arguments are supported: It must be an address on another interface on this host. .sp -.RB [ i | o ] seq +.RB [ no ] "" [ i | o ] seq - serialize packets. The .B oseq @@ -828,6 +830,8 @@ flag requires that all input packets are serialized. .sp .RB [ i | o ] key .I KEY +| +.BR no [ i | o ] key - use keyed GRE with key .IR KEY ". "KEY is either a number or an IPv4 address-like dotted quad. @@ -839,7 +843,7 @@ The parameters specify different keys for input and output. .sp -.RB [ i | o ] csum +.RB [ no ] "" [ i | o ] csum - generate/require checksums for tunneled packets. The .B ocsum @@ -920,12 +924,14 @@ the following additional arguments are supported: .BR type " { " ip6gre " | " ip6gretap " }" .BI remote " ADDR " local " ADDR" [ -.RB [ i | o ] seq +.RB [ no ] "" [ i | o ] seq ] [ .RB [ i | o ] key .I KEY +| +.BR no [ i | o ] key ] [ -.RB [ i | o ] csum +.RB [ no ] "" [ i | o ] csum ] [ .BI hoplimit " TTL " ] [ @@ -955,7 +961,7 @@ the following additional arguments are supported: It must be an address on another interface on this host. .sp -.RB [ i | o ] seq +.RB [ no ] "" [ i | o ] seq - serialize packets. The .B oseq @@ -965,7 +971,10 @@ The flag requires that all input packets are serialized. .sp -.RB [ i | o ] key " \fIKEY" +.RB [ i | o ] key +.I KEY +| +.BR no [ i | o ] key - use keyed GRE with key .IR KEY ". "KEY is either a number or an IPv4 address-like dotted quad. @@ -977,7 +986,7 @@ The parameters specify different keys for input and output. .sp -.RB [ i | o ] csum +.RB [ no ] "" [ i | o ] csum - generate/require checksums for tunneled packets. The .B ocsum