]> git.proxmox.com Git - mirror_iproute2.git/commitdiff
ip: link_gre: Do not send ERSPAN attributes to GRE tunnels
authorPetr Machata <petrm@mellanox.com>
Fri, 3 Apr 2020 22:55:34 +0000 (01:55 +0300)
committerStephen Hemminger <stephen@networkplumber.org>
Mon, 13 Apr 2020 21:02:54 +0000 (14:02 -0700)
In the commit referenced below, ip link started sending ERSPAN-specific
attributes even for GRE and gretap tunnels. Fix by more carefully
distinguishing between the GRE/tap and ERSPAN modes. Do not show
ERSPAN-related help in GRE/tap mode, likewise do not accept ERSPAN
arguments, or send ERSPAN attributes.

Fixes: 83c543af872e ("erspan: set erspan_ver to 1 by default")
Signed-off-by: Petr Machata <petrm@mellanox.com>
Acked-by: William Tu <u9012063@gmail.com>
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
ip/link_gre.c

index e42f21ae4556ce712e88df77de3b14b9076f030f..d616a970e9a28cf637326508373515616efc40c3 100644 (file)
 #include "ip_common.h"
 #include "tunnel.h"
 
+static bool gre_is_erspan(struct link_util *lu)
+{
+       return !strcmp(lu->id, "erspan");
+}
+
 static void gre_print_help(struct link_util *lu, int argc, char **argv, FILE *f)
 {
+       bool is_erspan = gre_is_erspan(lu);
+
        fprintf(f,
                "Usage: ... %-9s        [ remote ADDR ]\n"
                "                       [ local ADDR ]\n"
@@ -44,18 +51,20 @@ static void gre_print_help(struct link_util *lu, int argc, char **argv, FILE *f)
                "                       [ encap-dport PORT ]\n"
                "                       [ [no]encap-csum ]\n"
                "                       [ [no]encap-csum6 ]\n"
-               "                       [ [no]encap-remcsum ]\n"
-               "                       [ erspan_ver version ]\n"
-               "                       [ erspan IDX ]\n"
-               "                       [ erspan_dir { ingress | egress } ]\n"
-               "                       [ erspan_hwid hwid ]\n"
+               "                       [ [no]encap-remcsum ]\n", lu->id);
+       if (is_erspan)
+               fprintf(f,
+                       "                       [ erspan_ver version ]\n"
+                       "                       [ erspan IDX ]\n"
+                       "                       [ erspan_dir { ingress | egress } ]\n"
+                       "                       [ erspan_hwid hwid ]\n");
+       fprintf(f,
                "\n"
                "Where: ADDR := { IP_ADDRESS | any }\n"
                "       TOS  := { NUMBER | inherit }\n"
                "       TTL  := { 1..255 | inherit }\n"
                "       KEY  := { DOTTED_QUAD | NUMBER }\n"
-               "       MARK := { 0x0..0xffffffff }\n",
-               lu->id);
+               "       MARK := { 0x0..0xffffffff }\n");
 }
 
 static int gre_parse_opt(struct link_util *lu, int argc, char **argv,
@@ -93,6 +102,7 @@ static int gre_parse_opt(struct link_util *lu, int argc, char **argv,
        __u16 encapdport = 0;
        __u8 metadata = 0;
        __u32 fwmark = 0;
+       bool is_erspan = gre_is_erspan(lu);
        __u32 erspan_idx = 0;
        __u8 erspan_ver = 1;
        __u8 erspan_dir = 0;
@@ -334,19 +344,19 @@ get_failed:
                        NEXT_ARG();
                        if (get_u32(&fwmark, *argv, 0))
                                invarg("invalid fwmark\n", *argv);
-               } else if (strcmp(*argv, "erspan") == 0) {
+               } else if (is_erspan && strcmp(*argv, "erspan") == 0) {
                        NEXT_ARG();
                        if (get_u32(&erspan_idx, *argv, 0))
                                invarg("invalid erspan index\n", *argv);
                        if (erspan_idx & ~((1<<20) - 1) || erspan_idx == 0)
                                invarg("erspan index must be > 0 and <= 20-bit\n", *argv);
-               } else if (strcmp(*argv, "erspan_ver") == 0) {
+               } else if (is_erspan && strcmp(*argv, "erspan_ver") == 0) {
                        NEXT_ARG();
                        if (get_u8(&erspan_ver, *argv, 0))
                                invarg("invalid erspan version\n", *argv);
                        if (erspan_ver != 1 && erspan_ver != 2)
                                invarg("erspan version must be 1 or 2\n", *argv);
-               } else if (strcmp(*argv, "erspan_dir") == 0) {
+               } else if (is_erspan && strcmp(*argv, "erspan_dir") == 0) {
                        NEXT_ARG();
                        if (matches(*argv, "ingress") == 0)
                                erspan_dir = 0;
@@ -354,7 +364,7 @@ get_failed:
                                erspan_dir = 1;
                        else
                                invarg("Invalid erspan direction.", *argv);
-               } else if (strcmp(*argv, "erspan_hwid") == 0) {
+               } else if (is_erspan && strcmp(*argv, "erspan_hwid") == 0) {
                        NEXT_ARG();
                        if (get_u16(&erspan_hwid, *argv, 0))
                                invarg("invalid erspan hwid\n", *argv);
@@ -402,7 +412,7 @@ get_failed:
                addattr32(n, 1024, IFLA_GRE_LINK, link);
        addattr_l(n, 1024, IFLA_GRE_TTL, &ttl, 1);
        addattr32(n, 1024, IFLA_GRE_FWMARK, fwmark);
-       if (erspan_ver) {
+       if (is_erspan) {
                addattr8(n, 1024, IFLA_GRE_ERSPAN_VER, erspan_ver);
                if (erspan_ver == 1 && erspan_idx != 0) {
                        addattr32(n, 1024, IFLA_GRE_ERSPAN_INDEX, erspan_idx);