• Daniel Borkmann's avatar
    bpf: add bpf_skb_load_bytes helper · 05c74e5e
    Daniel Borkmann authored
    When hacking tc programs with eBPF, one of the issues that come up
    from time to time is to load addresses from headers. In eBPF as in
    classic BPF, we have BPF_LD | BPF_ABS | BPF_{B,H,W} instructions that
    extract a byte, half-word or word out of the skb data though helpers
    such as bpf_load_pointer() (interpreter case).
    
    F.e. extracting a whole IPv6 address could possibly look like ...
    
      union v6addr {
        struct {
          __u32 p1;
          __u32 p2;
          __u32 p3;
          __u32 p4;
        };
        __u8 addr[16];
      };
    
      [...]
    
      a.p1 = htonl(load_word(skb, off));
      a.p2 = htonl(load_word(skb, off +  4));
      a.p3 = htonl(load_word(skb, off +  8));
      a.p4 = htonl(load_word(skb, off + 12));
    
      [...]
    
      /* access to a.addr[...] */
    
    This work adds a complementary helper bpf_skb_load_bytes() (we also
    have bpf_skb_store_bytes()) as an alternative where the same call
    would look like from an eBPF program:
    
      ret = bpf_skb_load_bytes(skb, off, addr, sizeof(addr));
    
    Same verifier restrictions apply as in ffeedafb ("bpf: introduce
    current->pid, tgid, uid, gid, comm accessors") case, where stack memory
    access needs to be statically verified and thus guaranteed to be
    initialized in first use (otherwise verifier cannot tell whether a
    subsequent access to it is valid or not as it's runtime dependent).
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    Acked-by: default avatarAlexei Starovoitov <ast@kernel.org>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    05c74e5e
filter.c 51.4 KB