diff --git a/ip/link_gre.c b/ip/link_gre.c index bc1cee8f..ede761b2 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 a6fe0b73..181b2eae 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 77ab8a3b..83ef3cae 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