]> git.proxmox.com Git - mirror_iproute2.git/commitdiff
ingress, clsact: don't add TCA_OPTIONS to nl msg
authorDaniel Borkmann <daniel@iogearbox.net>
Sun, 15 May 2016 16:36:03 +0000 (18:36 +0200)
committerStephen Hemminger <shemming@brocade.com>
Mon, 16 May 2016 18:20:50 +0000 (11:20 -0700)
In ingress and clsact qdisc TCA_OPTIONS are ignored, since it's
parameterless. In tc, we add an empty addattr_l(... TCA_OPTIONS,
NULL, 0) to the netlink message nevertheless. This has the
side effect that when someone tries a 'tc qdisc replace' and
already an existing such qdisc is present, tc fails with
EINVAL here.

Reason is that in the kernel, this invokes qdisc_change() when
such requested qdisc is already present. When TCA_OPTIONS are
passed to modify parameters, it looks whether qdisc implements
.change() callback, and if not present (like in both cases here)
it returns with error. Rather than adding an empty stub to the
kernel that ignores TCA_OPTIONS again, just don't add TCA_OPTIONS
to the netlink message in the first place.

Before:

  # tc qdisc replace dev foo clsact    # first try
  # tc qdisc replace dev foo clsact    # second one
  RTNETLINK answers: Invalid argument

After:

  # tc qdisc replace dev foo clsact
  # tc qdisc replace dev foo clsact
  # tc qdisc replace dev foo clsact

Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
tc/q_clsact.c
tc/q_ingress.c

index 0c05dbd3350c10a027a7e0b7e49a19fc42ca4412..e2a1a7100c3086d178e30b30d887177c662ae70d 100644 (file)
@@ -18,7 +18,6 @@ static int clsact_parse_opt(struct qdisc_util *qu, int argc, char **argv,
                return -1;
        }
 
-       addattr_l(n, 1024, TCA_OPTIONS, NULL, 0);
        return 0;
 }
 
index c3c9b4031d548d7228976f4a454e4a01e43863ab..31699a81f3fdaa0c373b27f4fc0548b126880c78 100644 (file)
@@ -34,7 +34,6 @@ static int ingress_parse_opt(struct qdisc_util *qu, int argc, char **argv,
                }
        }
 
-       addattr_l(n, 1024, TCA_OPTIONS, NULL, 0);
        return 0;
 }