• Daniel Borkmann's avatar
    ingress, clsact: don't add TCA_OPTIONS to nl msg · a2de651e
    Daniel Borkmann authored
    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: default avatarDaniel Borkmann <daniel@iogearbox.net>
    a2de651e
q_clsact.c 587 Bytes