1. 12 Jul, 2023 9 commits
  2. 11 Jul, 2023 5 commits
  3. 10 Jul, 2023 4 commits
  4. 09 Jul, 2023 1 commit
  5. 07 Jul, 2023 1 commit
  6. 06 Jul, 2023 10 commits
  7. 05 Jul, 2023 3 commits
  8. 30 Jun, 2023 7 commits
    • Andrii Nakryiko's avatar
      Merge branch 'libbpf: add netfilter link attach helper' · c20f9cef
      Andrii Nakryiko authored
      Florian Westphal says:
      
      ====================
      v4: address comment from Daniel Xu:
        - use human-readable test names in 2/2
      
      v3: address comments from Andrii:
        - prune verbose error message in 1/2
        - use bpf_link_create internally in 1/2
        - use subtests in patch 2/2
      
      When initial netfilter bpf program type support got added one
      suggestion was to extend libbpf with a helper to ease attachment
      of nf programs to the hook locations.
      
      Add such a helper and a demo test case that attaches a dummy
      program to various combinations.
      
      I tested that the selftest fails when changing the expected
      outcome (i.e., set 'success' when it should fail and v.v.).
      ====================
      Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
      c20f9cef
    • Florian Westphal's avatar
      selftests/bpf: Add bpf_program__attach_netfilter helper test · a94098d4
      Florian Westphal authored
      Call bpf_program__attach_netfilter() with different
      protocol/hook/priority combinations.
      
      Test fails if supposedly-illegal attachments work
      (e.g., bogus protocol family, illegal priority and so on) or if a
      should-work attachment fails.  Expected output:
      
       ./test_progs -t netfilter_link_attach
       #145/1   netfilter_link_attach/allzero:OK
       #145/2   netfilter_link_attach/invalid-pf:OK
       #145/3   netfilter_link_attach/invalid-hooknum:OK
       #145/4   netfilter_link_attach/invalid-priority-min:OK
       #145/5   netfilter_link_attach/invalid-priority-max:OK
       #145/6   netfilter_link_attach/invalid-flags:OK
       #145/7   netfilter_link_attach/invalid-inet-not-supported:OK
       #145/8   netfilter_link_attach/attach ipv4:OK
       #145/9   netfilter_link_attach/attach ipv6:OK
      Signed-off-by: default avatarFlorian Westphal <fw@strlen.de>
      Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
      Reviewed-by: default avatarToke Høiland-Jørgensen <toke@redhat.com>
      Acked-by: default avatarDaniel Xu <dxu@dxuuu.xyz>
      Link: https://lore.kernel.org/bpf/20230628152738.22765-3-fw@strlen.de
      a94098d4
    • Florian Westphal's avatar
      libbpf: Add netfilter link attach helper · 52364abb
      Florian Westphal authored
      Add new api function: bpf_program__attach_netfilter.
      
      It takes a bpf program (netfilter type), and a pointer to a option struct
      that contains the desired attachment (protocol family, priority, hook
      location, ...).
      
      It returns a pointer to a 'bpf_link' structure or NULL on error.
      
      Next patch adds new netfilter_basic test that uses this function to
      attach a program to a few pf/hook/priority combinations.
      
      v2: change name and use bpf_link_create.
      Suggested-by: default avatarAndrii Nakryiko <andrii.nakryiko@gmail.com>
      Signed-off-by: default avatarFlorian Westphal <fw@strlen.de>
      Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
      Reviewed-by: default avatarToke Høiland-Jørgensen <toke@redhat.com>
      Acked-by: default avatarDaniel Xu <dxu@dxuuu.xyz>
      Link: https://lore.kernel.org/bpf/CAEf4BzZrmUv27AJp0dDxBDMY_B8e55-wLs8DUKK69vCWsCG_pQ@mail.gmail.com/
      Link: https://lore.kernel.org/bpf/CAEf4BzZ69YgrQW7DHCJUT_X+GqMq_ZQQPBwopaJJVGFD5=d5Vg@mail.gmail.com/
      Link: https://lore.kernel.org/bpf/20230628152738.22765-2-fw@strlen.de
      52364abb
    • Andrea Terzolo's avatar
      libbpf: Skip modules BTF loading when CAP_SYS_ADMIN is missing · 2d2c9516
      Andrea Terzolo authored
      If during CO-RE relocations libbpf is not able to find the target type
      in the running kernel BTF, it searches for it in modules' BTF.
      The downside of this approach is that loading modules' BTF requires
      CAP_SYS_ADMIN and this prevents BPF applications from running with more
      granular capabilities (e.g. CAP_BPF) when they don't need to search
      types into modules' BTF.
      
      This patch skips by default modules' BTF loading phase when
      CAP_SYS_ADMIN is missing.
      Suggested-by: default avatarAndrii Nakryiko <andrii@kernel.org>
      Co-developed-by: default avatarFederico Di Pierro <nierro92@gmail.com>
      Signed-off-by: default avatarFederico Di Pierro <nierro92@gmail.com>
      Signed-off-by: default avatarAndrea Terzolo <andreaterzolo3@gmail.com>
      Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
      Link: https://lore.kernel.org/CAGQdkDvYU_e=_NX+6DRkL_-TeH3p+QtsdZwHkmH0w3Fuzw0C4w@mail.gmail.com
      Link: https://lore.kernel.org/bpf/20230626093614.21270-1-andreaterzolo3@gmail.com
      2d2c9516
    • Kui-Feng Lee's avatar
      selftests/bpf: Verify that the cgroup_skb filters receive expected packets. · 539c7e67
      Kui-Feng Lee authored
      This test case includes four scenarios:
      
      1. Connect to the server from outside the cgroup and close the connection
         from outside the cgroup.
      2. Connect to the server from outside the cgroup and close the connection
         from inside the cgroup.
      3. Connect to the server from inside the cgroup and close the connection
         from outside the cgroup.
      4. Connect to the server from inside the cgroup and close the connection
         from inside the cgroup.
      
      The test case is to verify that cgroup_skb/{egress, ingress} filters
      receive expected packets including SYN, SYN/ACK, ACK, FIN, and FIN/ACK.
      Signed-off-by: default avatarKui-Feng Lee <kuifeng@meta.com>
      Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
      Link: https://lore.kernel.org/bpf/20230624014600.576756-3-kuifeng@meta.com
      539c7e67
    • Kui-Feng Lee's avatar
      bpf, net: Check skb ownership against full socket. · 223f5f79
      Kui-Feng Lee authored
      Check skb ownership of an skb against full sockets instead of request_sock.
      
      The filters were called only if an skb is owned by the sock that the skb is
      sent out through. In another words, skb->sk should point to the sock that
      it is sending through its egress. However, the filters would miss SYN/ACK
      skbs that they are owned by a request_sock but sent through the listener
      sock, that is the socket listening incoming connections.
      
      However, the listener socket is also the full socket of the request socket.
      We should use the full socket as the owner socket of an skb instead.
      
      What is the ownership check for?
      ================================
      
      BPF_CGROUP_RUN_PROG_INET_EGRESS() checked sk == skb->sk to ensure the
      ownership of an skb. Alexei referred to a mailing list conversation [0]
      that took place a few years ago. In that conversation, Daniel Borkmann
      stated that:
      
          Wouldn't that mean however, when you go through stacked devices that
          you'd run the same eBPF cgroup program for skb->sk multiple times?
      
      According to what Daniel said, the ownership check mentioned earlier
      presumably prevents multiple calls of egress filters caused by an skb.
      
      A test that reproduce this scenario shows that the BPF cgroup egress
      programs can be called multiple times for one skb if this ownership
      check is not there. So, we can not just remove this check.
      
      Test Stacked Devices
      ====================
      
      We use L2TP to build an environment of stacked devices. L2TP (Layer 2
      Tunneling Protocol) is a tunneling protocol used to support virtual private
      networks (VPNs). It relays encapsulated packets; for example in UDP, to its
      peer by using a socket.
      
      Using L2TP, packets are first sent through the IP stack and should then
      arrive at an L2TP device. The device will expand its skb header to
      encapsulate the packet. The skb will be sent back to the IP stack using
      the socket that was made for the L2TP session. After that, the routing
      process will occur once more, but this time for a new destination.
      
      We changed tools/testing/selftests/net/l2tp.sh to set up a test environment
      using L2TP. The run_ping() function in l2tp.sh is where the main change
      occurred.
      
          run_ping()
          {
              local desc="$1"
      
              sleep 10
              run_cmd host-1 ${ping6} -s 227 -c 4 -i 10 -I fc00:101::1
              fc00:101::2
              log_test $? 0 "IPv6 route through L2TP tunnel ${desc}"
              sleep 10
          }
      
      The test will use L2TP devices to send PING messages. These messages will
      have a message size of 227 bytes as a special label to distinguish them.
      This is not an ideal solution, but works.
      
      During the execution of the test script, bpftrace was attached to
      ip6_finish_output() and l2tp_xmit_skb():
      
          bpftrace -e '
            kfunc:ip6_finish_output {
              time("%H:%M:%S: ");
              printf("ip6_finish_output skb=%p skb->len=%d cgroup=%p sk=%p
                      skb->sk=%p\n", args->skb, args->skb->len,
                     args->sk->sk_cgrp_data.cgroup, args->sk, args->skb->sk); }
            kfunc:l2tp_xmit_skb {
              time("%H:%M:%S: ");
              printf("l2tp_xmit_skb skb=%p sk=%p\n", args->skb,
      	       args->session->tunnel->sock); }'
      
      The following is part of the output messages printed by bpftrace:
      
          16:35:20: ip6_finish_output skb=0xffff888103d8e600 skb->len=275
                    cgroup=0xffff88810741f800 sk=0xffff888105f3b900
                    skb->sk=0xffff888105f3b900
      
          16:35:20: l2tp_xmit_skb skb=0xffff888103d8e600 sk=0xffff888103dd6300
      
          16:35:20: ip6_finish_output skb=0xffff888103d8e600 skb->len=337
                    cgroup=0xffff88810741f800 sk=0xffff888103dd6300
                    skb->sk=0xffff888105f3b900
      
          16:35:20: ip6_finish_output skb=0xffff888103d8e600 skb->len=337
                    cgroup=(nil) sk=(nil) skb->sk=(nil)
      
          16:35:20: ip6_finish_output skb=0xffff888103d8e000 skb->len=275
                    cgroup=0xffffffff837741d0 sk=0xffff888101fe0000
                    skb->sk=0xffff888101fe0000
      
          16:35:20: l2tp_xmit_skb skb=0xffff888103d8e000 sk=0xffff888103483180
      
          16:35:20: ip6_finish_output skb=0xffff888103d8e000 skb->len=337
                    cgroup=0xffff88810741f800 sk=0xffff888103483180
                    skb->sk=0xffff888101fe0000
      
          16:35:20: ip6_finish_output skb=0xffff888103d8e000 skb->len=337
                    cgroup=(nil) sk=(nil) skb->sk=(nil)
      
      The first four entries describe a PING message that was sent using the ping
      command, whereas the following four entries describe the response received.
      Multiple sockets are used to send one skb, including the socket used by the
      L2TP session. This can be observed.
      
      Based on this information, it seems that the ownership check is designed to
      avoid multiple calls of egress filters caused by a single skb.
      
        [0] https://lore.kernel.org/all/58193E9D.7040201@iogearbox.net/Signed-off-by: default avatarKui-Feng Lee <kuifeng@meta.com>
      Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
      Link: https://lore.kernel.org/bpf/20230624014600.576756-2-kuifeng@meta.com
      223f5f79
    • Stanislav Fomichev's avatar
      selftests/bpf: Add test to exercise typedef walking · 2597a25c
      Stanislav Fomichev authored
      Add new bpf_fentry_test_sinfo with skb_shared_info argument and try to
      access frags.
      Signed-off-by: default avatarStanislav Fomichev <sdf@google.com>
      Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
      Acked-by: default avatarYonghong Song <yhs@fb.com>
      Link: https://lore.kernel.org/bpf/20230626212522.2414485-2-sdf@google.com
      2597a25c