mirror of
https://github.com/xdp-project/BNG-router.git
synced 2024-05-06 15:54:53 +00:00
ac9373c82e
adjustment. Adding map client_vlans which allows matching server responses with client requests. Reformatting Option 82 to include interface name (work in progress, we need to figure out how to convert VLAN tags to ASCII).
Usage ----- dhcp_user_xdp takes network interface, DHCP server IP and DHCP relay agent IP as inputs and stores them in a map. Filters the incoming DHCP requests and inserts option 82 in the DHCP request packets and overwrites the destination IP to that of DHCP relay server IP. Build instructions: cd bpf-examples/dhcp-relay make Loading bpf program: sudo ./dhcp_user_xdp -i <netif> -d <dhcp server IP> -s <dhcp relay agent IP> where, netif: Ingress network interface name unloading program: sudo ./dhcp_user_xdp -i <netif> -u To run in SKB mode: add option "-m skb" for both load and uload commands Please beware that testing requires a physical NIC because we tail extend packets due to complications with variable length DHCP options. Enable forwarding and allow local address spoofing: sudo echo 1 > /proc/sys/net/ipv4/ip_forward sudo echo 1 > /proc/sys/net/ipv4/conf/all/accept_local Verify using tcpdump: sudo tcpdump -s 0 -i <netif> port 67 and port 68 -vvv ====== TEST SETUP ====== 2 physical Linux servers connected back-to-back with a patch cable. ===== Client ===== Kernel: 5.4.0-72-generic NIC model: Mellanox Technologies MT27800 Family [ConnectX-5] NIC name: ens6f0 Preparation: sudo ip link set ens6f0 up sudo ip link add link ens6f0 name ens6f0.83 type vlan id 83 sudo ip link set ens6f0.83 up sudo ip link add link ens6f0.83 name ens6f0.83.20 type vlan id 20 sudo ip link set ens6f0.83.20 up Test: sudo dhclient ens6f0.83.20 ===== BNG ===== Kernel: 5.9.0-050900-lowlatency NIC model: Mellanox Technologies MT27800 Family [ConnectX-5] NIC name: ens6f0np0 Preparation: sudo ip link set ens6f0np0 up sudo ip link add link ens6f0np0 name ens6f0np0.83 type vlan id 83 sudo ip link set ens6f0np0.83 up sudo ip link add link ens6f0np0.83 name ens6f0np0.83.20 type vlan id 20 sudo ip link set ens6f0np0.83.20 up sudo ethtool -K ens6f0np0 rxvlan off sudo echo 1 > /proc/sys/net/ipv4/conf/ens6f0np0.83.20/accept_local sudo echo 1 > /proc/sys/net/ipv4/ip_forward Test: # Launch XDP program sudo ./dhcp_user_xdp -i ens6f0np0 -d 192.168.4.20 -s 10.100.100.3 # tcpdump upstream interface to verify that packet is forwarded sudo tcpdump -n -i eno1 port 67 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eno1, link-type EN10MB (Ethernet), capture size 262144 bytes 10:10:00.191071 IP 10.100.100.3.68 > 192.168.4.20.67: BOOTP/DHCP, Request from b8:59:9f:06:5a:98, length 300 10:10:03.114784 IP 10.100.100.3.68 > 192.168.4.20.67: BOOTP/DHCP, Request from b8:59:9f:06:5a:98, length 300 ^C 2 packets captured 2 packets received by filter 0 packets dropped by kernel # Open trace pipe to see debug messages from XDP program sudo cat /sys/kernel/debug/tracing/trace_pipe <idle>-0 [003] d.s2 11051597.318498: bpf_trace_printk: Ethertype 800 <idle>-0 [003] d.s2 11051597.318499: bpf_trace_printk: Found VLAN tag 83 at depth 0 <idle>-0 [003] d.s2 11051597.318500: bpf_trace_printk: Found VLAN tag 20 at depth 1 <idle>-0 [003] d.s2 11051597.318501: bpf_trace_printk: Parsing DHCP packet, opcode 1, hops 0 <idle>-0 [003] d.s2 11051597.318502: bpf_trace_printk: Broadcast packet received, opcode 1, hops 0 <idle>-0 [003] d.s2 11051597.318503: bpf_trace_printk: Got option code 53 at offset 290, hex 122 <idle>-0 [003] d.s2 11051597.318504: bpf_trace_printk: Got option code 12 at offset 293, hex 125 <idle>-0 [003] d.s2 11051597.318506: bpf_trace_printk: Got option code 55 at offset 304, hex 130 <idle>-0 [003] d.s2 11051597.318508: bpf_trace_printk: Got option code 255 at offset 319, hex 13f <idle>-0 [003] d.s2 11051597.318509: bpf_trace_printk: Going to write DHCP option at offset 319 <idle>-0 [003] d.s2 11051597.318510: bpf_trace_printk: Wrote DHCP option at offset 290, returning XDP_PASS ^C