• Daniel Borkmann's avatar
    act_bpf: properly support late binding of bpf action to a classifier · a5c90b29
    Daniel Borkmann authored
    Since the introduction of the BPF action in d23b8ad8 ("tc: add BPF
    based action"), late binding was not working as expected. I.e. setting
    the action part for a classifier only via 'bpf index <num>', where <num>
    is the index of an existing action, is being rejected by the kernel due
    to other missing parameters.
    
    It doesn't make sense to require these parameters such as BPF opcodes
    etc, as they are not going to be used anyway: in this case, they're just
    allocated/parsed and then freed again w/o doing anything meaningful.
    
    Instead, parse and verify the remaining parameters *after* the test on
    tcf_hash_check(), when we really know that we're dealing with creation
    of a new action or replacement of an existing one and where late binding
    is thus irrelevant.
    
    After patch, test case is now working:
    
      FOO="1,6 0 0 4294967295,"
      tc actions add action bpf bytecode "$FOO"
      tc filter add dev foo parent 1: bpf bytecode "$FOO" flowid 1:1 action bpf index 1
      tc actions show action bpf
        action order 0: bpf bytecode '1,6 0 0 4294967295' default-action pipe
        index 1 ref 2 bind 1
      tc filter show dev foo
        filter protocol all pref 49152 bpf
        filter protocol all pref 49152 bpf handle 0x1 flowid 1:1 bytecode '1,6 0 0 4294967295'
        action order 1: bpf bytecode '1,6 0 0 4294967295' default-action pipe
        index 1 ref 2 bind 1
    
    Late binding of a BPF action can be useful for preloading maps (e.g. before
    they hit traffic) in case of eBPF programs, or to share a single eBPF action
    with multiple classifiers.
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    Acked-by: default avatarAlexei Starovoitov <ast@plumgrid.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    a5c90b29
act_bpf.c 8.5 KB