xdp-project / xdp-tools

Utilities and example programs for use with XDP

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

xdp-loader - multiprong dispatcher not working, requirements not clear

davehouser1 opened this issue · comments

I would like to be able to load multiple xdp programs on a single interface.

Environment
Ubuntu 20.04 - 5.4.0-91-generic

Command being run:

  • seperate commands
    ./xdp-loader load -v enp94s0f3 ./xdp-drop-ebpf-01.o; ./xdp-loader load -v enp94s0f3 ./xdp-drop-ebpf-01.o
  • single one-liner
    ./xdp-loader load -m skb enp94s0f3 ./xdp-drop-ebpf-01.o ./xdp-drop-ebpf-02.o

Expected outcome
xdp-loader will load both programs to a single interface from one command, or separate commands.

Actual outcome (Separate Commands using only -v)

  • Command 01: Command runs and program is loaded
# ./xdp-loader load -v enp94s0f3 ./xdp-drop-ebpf-01.o
Current rlimit 67108864 already >= minimum 1048576
Loading 1 files on interface 'enp94s0f3'.
XDP program 0: Run prio: 50. Chain call actions: XDP_PASS
libxdp: Compatibility check for dispatcher program failed: Argument list too long
libxdp: Falling back to loading single prog without dispatcher
  • Command 02: Command runs with an error that the interface is busy:
# ./xdp-loader load -v enp94s0f3 ./xdp-drop-ebpf-02.o
Current rlimit 67108864 already >= minimum 1048576
Loading 1 files on interface 'enp94s0f3'.
XDP program 0: Run prio: 50. Chain call actions: XDP_PASS
libxdp: Compatibility check for dispatcher program failed: Argument list too long
libxdp: Falling back to loading single prog without dispatcher
libxdp: Error attaching XDP program to ifindex 7: Device or resource busy
libxdp: XDP already loaded on device
Couldn't attach XDP program on iface 'enp94s0f3': Device or resource busy(-16)

Actual outcome (Single Command using -vv)

# ./xdp-loader load -vv enp94s0f3 ./xdp-drop-ebpf-01.o ./xdp-drop-ebpf-02.o
Current rlimit 67108864 already >= minimum 1048576
Loading 2 files on interface 'enp94s0f3'.
libbpf: loading ./xdp-drop-ebpf-01.o
libbpf: elf: section(3) prog, size 560, link 0, flags 6, type=1
libbpf: sec 'prog': found program 'xdp_drop_benchmark_traffic' at insn offset 0 (0 bytes), code size 70 insns (560 bytes)
libbpf: elf: section(4) license, size 4, link 0, flags 3, type=1
libbpf: license of ./xdp-drop-ebpf-01.o is GPL
libbpf: elf: section(5) .eh_frame, size 48, link 0, flags 2, type=1
libbpf: elf: skipping unrecognized data section(5) .eh_frame
libbpf: elf: section(6) .rel.eh_frame, size 16, link 7, flags 0, type=9
libbpf: elf: skipping relo section(6) .rel.eh_frame for section(5) .eh_frame
libbpf: elf: section(7) .symtab, size 336, link 1, flags 0, type=2
libbpf: looking for externs among 14 symbols...
libbpf: collected 0 externs total
libbpf: prog 'xdp_drop_benchmark_traffic': unrecognized ELF section name 'prog'
libxdp: No BTF found for program
libxdp: No BTF found for program
XDP program 0: Run prio: 50. Chain call actions: XDP_PASS
libbpf: loading ./xdp-drop-ebpf-02.o
libbpf: elf: section(3) prog, size 560, link 0, flags 6, type=1
libbpf: sec 'prog': found program 'xdp_drop_benchmark_traffic' at insn offset 0 (0 bytes), code size 70 insns (560 bytes)
libbpf: elf: section(4) license, size 4, link 0, flags 3, type=1
libbpf: license of ./xdp-drop-ebpf-02.o is GPL
libbpf: elf: section(5) .eh_frame, size 48, link 0, flags 2, type=1
libbpf: elf: skipping unrecognized data section(5) .eh_frame
libbpf: elf: section(6) .rel.eh_frame, size 16, link 7, flags 0, type=9
libbpf: elf: skipping relo section(6) .rel.eh_frame for section(5) .eh_frame
libbpf: elf: section(7) .symtab, size 336, link 1, flags 0, type=2
libbpf: looking for externs among 14 symbols...
libbpf: collected 0 externs total
libbpf: prog 'xdp_drop_benchmark_traffic': unrecognized ELF section name 'prog'
libxdp: No BTF found for program
libxdp: No BTF found for program
XDP program 1: Run prio: 50. Chain call actions: XDP_PASS
libxdp: Generating multi-prog dispatcher for 2 programs
libxdp: Looking for './xdp-dispatcher.o'
libxdp: Loading XDP program from './xdp-dispatcher.o' section 'xdp/dispatcher'
libbpf: loading ./xdp-dispatcher.o
libbpf: elf: section(2) .text, size 528, link 0, flags 6, type=1
libbpf: sec '.text': found program 'compat_test' at insn offset 60 (480 bytes), code size 6 insns (48 bytes)
libbpf: sec '.text': found program 'prog0' at insn offset 0 (0 bytes), code size 6 insns (48 bytes)
libbpf: sec '.text': found program 'prog1' at insn offset 6 (48 bytes), code size 6 insns (48 bytes)
libbpf: sec '.text': found program 'prog2' at insn offset 12 (96 bytes), code size 6 insns (48 bytes)
libbpf: sec '.text': found program 'prog3' at insn offset 18 (144 bytes), code size 6 insns (48 bytes)
libbpf: sec '.text': found program 'prog4' at insn offset 24 (192 bytes), code size 6 insns (48 bytes)
libbpf: sec '.text': found program 'prog5' at insn offset 30 (240 bytes), code size 6 insns (48 bytes)
libbpf: sec '.text': found program 'prog6' at insn offset 36 (288 bytes), code size 6 insns (48 bytes)
libbpf: sec '.text': found program 'prog7' at insn offset 42 (336 bytes), code size 6 insns (48 bytes)
libbpf: sec '.text': found program 'prog8' at insn offset 48 (384 bytes), code size 6 insns (48 bytes)
libbpf: sec '.text': found program 'prog9' at insn offset 54 (432 bytes), code size 6 insns (48 bytes)
libbpf: elf: section(3) xdp/dispatcher, size 1184, link 0, flags 6, type=1
libbpf: sec 'xdp/dispatcher': found program 'xdp_dispatcher' at insn offset 0 (0 bytes), code size 148 insns (1184 bytes)
libbpf: elf: section(4) .relxdp/dispatcher, size 336, link 25, flags 0, type=9
libbpf: elf: section(5) xdp/pass, size 16, link 0, flags 6, type=1
libbpf: sec 'xdp/pass': found program 'xdp_pass' at insn offset 0 (0 bytes), code size 2 insns (16 bytes)
libbpf: elf: section(6) .rodata, size 84, link 0, flags 2, type=1
libbpf: elf: section(7) license, size 4, link 0, flags 3, type=1
libbpf: license of ./xdp-dispatcher.o is GPL
libbpf: elf: section(8) xdp_metadata, size 8, link 0, flags 3, type=1
libbpf: elf: skipping unrecognized data section(8) xdp_metadata
libbpf: elf: section(17) .BTF, size 3198, link 0, flags 0, type=1
libbpf: elf: section(19) .BTF.ext, size 2304, link 0, flags 0, type=1
libbpf: elf: section(25) .symtab, size 2040, link 1, flags 0, type=2
libbpf: looking for externs among 85 symbols...
libbpf: collected 0 externs total
libbpf: map 'xdp_disp.rodata' (global data): at sec_idx 6, offset 0, flags 480.
libbpf: map 0 is "xdp_disp.rodata"
libbpf: sec '.relxdp/dispatcher': collecting relocation for section(3) 'xdp/dispatcher'
libbpf: sec '.relxdp/dispatcher': relo #0: insn #2 against '.rodata'
libbpf: prog 'xdp_dispatcher': found data map 0 (xdp_disp.rodata, sec 6, off 0) for insn 2
libbpf: sec '.relxdp/dispatcher': relo #1: insn #7 against 'prog0'
libbpf: sec '.relxdp/dispatcher': relo #2: insn #19 against 'prog1'
libbpf: sec '.relxdp/dispatcher': relo #3: insn #20 against '.rodata'
libbpf: prog 'xdp_dispatcher': found data map 0 (xdp_disp.rodata, sec 6, off 0) for insn 20
libbpf: sec '.relxdp/dispatcher': relo #4: insn #33 against 'prog2'
libbpf: sec '.relxdp/dispatcher': relo #5: insn #34 against '.rodata'
libbpf: prog 'xdp_dispatcher': found data map 0 (xdp_disp.rodata, sec 6, off 0) for insn 34
libbpf: sec '.relxdp/dispatcher': relo #6: insn #47 against 'prog3'
libbpf: sec '.relxdp/dispatcher': relo #7: insn #48 against '.rodata'
libbpf: prog 'xdp_dispatcher': found data map 0 (xdp_disp.rodata, sec 6, off 0) for insn 48
libbpf: sec '.relxdp/dispatcher': relo #8: insn #61 against 'prog4'
libbpf: sec '.relxdp/dispatcher': relo #9: insn #62 against '.rodata'
libbpf: prog 'xdp_dispatcher': found data map 0 (xdp_disp.rodata, sec 6, off 0) for insn 62
libbpf: sec '.relxdp/dispatcher': relo #10: insn #75 against 'prog5'
libbpf: sec '.relxdp/dispatcher': relo #11: insn #76 against '.rodata'
libbpf: prog 'xdp_dispatcher': found data map 0 (xdp_disp.rodata, sec 6, off 0) for insn 76
libbpf: sec '.relxdp/dispatcher': relo #12: insn #89 against 'prog6'
libbpf: sec '.relxdp/dispatcher': relo #13: insn #90 against '.rodata'
libbpf: prog 'xdp_dispatcher': found data map 0 (xdp_disp.rodata, sec 6, off 0) for insn 90
libbpf: sec '.relxdp/dispatcher': relo #14: insn #103 against 'prog7'
libbpf: sec '.relxdp/dispatcher': relo #15: insn #104 against '.rodata'
libbpf: prog 'xdp_dispatcher': found data map 0 (xdp_disp.rodata, sec 6, off 0) for insn 104
libbpf: sec '.relxdp/dispatcher': relo #16: insn #117 against 'prog8'
libbpf: sec '.relxdp/dispatcher': relo #17: insn #118 against '.rodata'
libbpf: prog 'xdp_dispatcher': found data map 0 (xdp_disp.rodata, sec 6, off 0) for insn 118
libbpf: sec '.relxdp/dispatcher': relo #18: insn #131 against 'prog9'
libbpf: sec '.relxdp/dispatcher': relo #19: insn #132 against '.rodata'
libbpf: prog 'xdp_dispatcher': found data map 0 (xdp_disp.rodata, sec 6, off 0) for insn 132
libbpf: sec '.relxdp/dispatcher': relo #20: insn #145 against 'compat_test'
libxdp: DATASEC '.xdp_run_config' not found.
libxdp: Verified XDP dispatcher version 1 <= 1
libxdp: Loading multiprog dispatcher for 2 programs
libbpf: map 'xdp_disp.rodata': created successfully, fd=5
libbpf: prog 'xdp_dispatcher': added 6 insns from sub-prog 'prog0'
libbpf: prog 'xdp_dispatcher': insn #7 relocated, imm 140 points to subprog 'prog0' (now at 148 offset)
libbpf: prog 'xdp_dispatcher': added 6 insns from sub-prog 'prog1'
libbpf: prog 'xdp_dispatcher': insn #19 relocated, imm 134 points to subprog 'prog1' (now at 154 offset)
libbpf: prog 'xdp_dispatcher': added 6 insns from sub-prog 'prog2'
libbpf: prog 'xdp_dispatcher': insn #33 relocated, imm 126 points to subprog 'prog2' (now at 160 offset)
libbpf: prog 'xdp_dispatcher': added 6 insns from sub-prog 'prog3'
libbpf: prog 'xdp_dispatcher': insn #47 relocated, imm 118 points to subprog 'prog3' (now at 166 offset)
libbpf: prog 'xdp_dispatcher': added 6 insns from sub-prog 'prog4'
libbpf: prog 'xdp_dispatcher': insn #61 relocated, imm 110 points to subprog 'prog4' (now at 172 offset)
libbpf: prog 'xdp_dispatcher': added 6 insns from sub-prog 'prog5'
libbpf: prog 'xdp_dispatcher': insn #75 relocated, imm 102 points to subprog 'prog5' (now at 178 offset)
libbpf: prog 'xdp_dispatcher': added 6 insns from sub-prog 'prog6'
libbpf: prog 'xdp_dispatcher': insn #89 relocated, imm 94 points to subprog 'prog6' (now at 184 offset)
libbpf: prog 'xdp_dispatcher': added 6 insns from sub-prog 'prog7'
libbpf: prog 'xdp_dispatcher': insn #103 relocated, imm 86 points to subprog 'prog7' (now at 190 offset)
libbpf: prog 'xdp_dispatcher': added 6 insns from sub-prog 'prog8'
libbpf: prog 'xdp_dispatcher': insn #117 relocated, imm 78 points to subprog 'prog8' (now at 196 offset)
libbpf: prog 'xdp_dispatcher': added 6 insns from sub-prog 'prog9'
libbpf: prog 'xdp_dispatcher': insn #131 relocated, imm 70 points to subprog 'prog9' (now at 202 offset)
libbpf: prog 'xdp_dispatcher': added 6 insns from sub-prog 'compat_test'
libbpf: prog 'xdp_dispatcher': insn #145 relocated, imm 62 points to subprog 'compat_test' (now at 208 offset)
libxdp: Loaded XDP program xdp_dispatcher, got fd 6
libxdp: Checking dispatcher compatibility
libxdp: Looking for './xdp-dispatcher.o'
libxdp: Loading XDP program from './xdp-dispatcher.o' section 'xdp/pass'
libbpf: loading ./xdp-dispatcher.o
libbpf: elf: section(2) .text, size 528, link 0, flags 6, type=1
libbpf: sec '.text': found program 'compat_test' at insn offset 60 (480 bytes), code size 6 insns (48 bytes)
libbpf: sec '.text': found program 'prog0' at insn offset 0 (0 bytes), code size 6 insns (48 bytes)
libbpf: sec '.text': found program 'prog1' at insn offset 6 (48 bytes), code size 6 insns (48 bytes)
libbpf: sec '.text': found program 'prog2' at insn offset 12 (96 bytes), code size 6 insns (48 bytes)
libbpf: sec '.text': found program 'prog3' at insn offset 18 (144 bytes), code size 6 insns (48 bytes)
libbpf: sec '.text': found program 'prog4' at insn offset 24 (192 bytes), code size 6 insns (48 bytes)
libbpf: sec '.text': found program 'prog5' at insn offset 30 (240 bytes), code size 6 insns (48 bytes)
libbpf: sec '.text': found program 'prog6' at insn offset 36 (288 bytes), code size 6 insns (48 bytes)
libbpf: sec '.text': found program 'prog7' at insn offset 42 (336 bytes), code size 6 insns (48 bytes)
libbpf: sec '.text': found program 'prog8' at insn offset 48 (384 bytes), code size 6 insns (48 bytes)
libbpf: sec '.text': found program 'prog9' at insn offset 54 (432 bytes), code size 6 insns (48 bytes)
libbpf: elf: section(3) xdp/dispatcher, size 1184, link 0, flags 6, type=1
libbpf: sec 'xdp/dispatcher': found program 'xdp_dispatcher' at insn offset 0 (0 bytes), code size 148 insns (1184 bytes)
libbpf: elf: section(4) .relxdp/dispatcher, size 336, link 25, flags 0, type=9
libbpf: elf: section(5) xdp/pass, size 16, link 0, flags 6, type=1
libbpf: sec 'xdp/pass': found program 'xdp_pass' at insn offset 0 (0 bytes), code size 2 insns (16 bytes)
libbpf: elf: section(6) .rodata, size 84, link 0, flags 2, type=1
libbpf: elf: section(7) license, size 4, link 0, flags 3, type=1
libbpf: license of ./xdp-dispatcher.o is GPL
libbpf: elf: section(8) xdp_metadata, size 8, link 0, flags 3, type=1
libbpf: elf: skipping unrecognized data section(8) xdp_metadata
libbpf: elf: section(17) .BTF, size 3198, link 0, flags 0, type=1
libbpf: elf: section(19) .BTF.ext, size 2304, link 0, flags 0, type=1
libbpf: elf: section(25) .symtab, size 2040, link 1, flags 0, type=2
libbpf: looking for externs among 85 symbols...
libbpf: collected 0 externs total
libbpf: map 'xdp_disp.rodata' (global data): at sec_idx 6, offset 0, flags 480.
libbpf: map 0 is "xdp_disp.rodata"
libbpf: sec '.relxdp/dispatcher': collecting relocation for section(3) 'xdp/dispatcher'
libbpf: sec '.relxdp/dispatcher': relo #0: insn #2 against '.rodata'
libbpf: prog 'xdp_dispatcher': found data map 0 (xdp_disp.rodata, sec 6, off 0) for insn 2
libbpf: sec '.relxdp/dispatcher': relo #1: insn #7 against 'prog0'
libbpf: sec '.relxdp/dispatcher': relo #2: insn #19 against 'prog1'
libbpf: sec '.relxdp/dispatcher': relo #3: insn #20 against '.rodata'
libbpf: prog 'xdp_dispatcher': found data map 0 (xdp_disp.rodata, sec 6, off 0) for insn 20
libbpf: sec '.relxdp/dispatcher': relo #4: insn #33 against 'prog2'
libbpf: sec '.relxdp/dispatcher': relo #5: insn #34 against '.rodata'
libbpf: prog 'xdp_dispatcher': found data map 0 (xdp_disp.rodata, sec 6, off 0) for insn 34
libbpf: sec '.relxdp/dispatcher': relo #6: insn #47 against 'prog3'
libbpf: sec '.relxdp/dispatcher': relo #7: insn #48 against '.rodata'
libbpf: prog 'xdp_dispatcher': found data map 0 (xdp_disp.rodata, sec 6, off 0) for insn 48
libbpf: sec '.relxdp/dispatcher': relo #8: insn #61 against 'prog4'
libbpf: sec '.relxdp/dispatcher': relo #9: insn #62 against '.rodata'
libbpf: prog 'xdp_dispatcher': found data map 0 (xdp_disp.rodata, sec 6, off 0) for insn 62
libbpf: sec '.relxdp/dispatcher': relo #10: insn #75 against 'prog5'
libbpf: sec '.relxdp/dispatcher': relo #11: insn #76 against '.rodata'
libbpf: prog 'xdp_dispatcher': found data map 0 (xdp_disp.rodata, sec 6, off 0) for insn 76
libbpf: sec '.relxdp/dispatcher': relo #12: insn #89 against 'prog6'
libbpf: sec '.relxdp/dispatcher': relo #13: insn #90 against '.rodata'
libbpf: prog 'xdp_dispatcher': found data map 0 (xdp_disp.rodata, sec 6, off 0) for insn 90
libbpf: sec '.relxdp/dispatcher': relo #14: insn #103 against 'prog7'
libbpf: sec '.relxdp/dispatcher': relo #15: insn #104 against '.rodata'
libbpf: prog 'xdp_dispatcher': found data map 0 (xdp_disp.rodata, sec 6, off 0) for insn 104
libbpf: sec '.relxdp/dispatcher': relo #16: insn #117 against 'prog8'
libbpf: sec '.relxdp/dispatcher': relo #17: insn #118 against '.rodata'
libbpf: prog 'xdp_dispatcher': found data map 0 (xdp_disp.rodata, sec 6, off 0) for insn 118
libbpf: sec '.relxdp/dispatcher': relo #18: insn #131 against 'prog9'
libbpf: sec '.relxdp/dispatcher': relo #19: insn #132 against '.rodata'
libbpf: prog 'xdp_dispatcher': found data map 0 (xdp_disp.rodata, sec 6, off 0) for insn 132
libbpf: sec '.relxdp/dispatcher': relo #20: insn #145 against 'compat_test'
libxdp: DATASEC '.xdp_run_config' not found.
libbpf: map 'xdp_disp.rodata': created successfully, fd=10
libbpf: prog 'xdp_dispatcher': added 6 insns from sub-prog 'prog0'
libbpf: prog 'xdp_dispatcher': insn #7 relocated, imm 140 points to subprog 'prog0' (now at 148 offset)
libbpf: prog 'xdp_dispatcher': added 6 insns from sub-prog 'prog1'
libbpf: prog 'xdp_dispatcher': insn #19 relocated, imm 134 points to subprog 'prog1' (now at 154 offset)
libbpf: prog 'xdp_dispatcher': added 6 insns from sub-prog 'prog2'
libbpf: prog 'xdp_dispatcher': insn #33 relocated, imm 126 points to subprog 'prog2' (now at 160 offset)
libbpf: prog 'xdp_dispatcher': added 6 insns from sub-prog 'prog3'
libbpf: prog 'xdp_dispatcher': insn #47 relocated, imm 118 points to subprog 'prog3' (now at 166 offset)
libbpf: prog 'xdp_dispatcher': added 6 insns from sub-prog 'prog4'
libbpf: prog 'xdp_dispatcher': insn #61 relocated, imm 110 points to subprog 'prog4' (now at 172 offset)
libbpf: prog 'xdp_dispatcher': added 6 insns from sub-prog 'prog5'
libbpf: prog 'xdp_dispatcher': insn #75 relocated, imm 102 points to subprog 'prog5' (now at 178 offset)
libbpf: prog 'xdp_dispatcher': added 6 insns from sub-prog 'prog6'
libbpf: prog 'xdp_dispatcher': insn #89 relocated, imm 94 points to subprog 'prog6' (now at 184 offset)
libbpf: prog 'xdp_dispatcher': added 6 insns from sub-prog 'prog7'
libbpf: prog 'xdp_dispatcher': insn #103 relocated, imm 86 points to subprog 'prog7' (now at 190 offset)
libbpf: prog 'xdp_dispatcher': added 6 insns from sub-prog 'prog8'
libbpf: prog 'xdp_dispatcher': insn #117 relocated, imm 78 points to subprog 'prog8' (now at 196 offset)
libbpf: prog 'xdp_dispatcher': added 6 insns from sub-prog 'prog9'
libbpf: prog 'xdp_dispatcher': insn #131 relocated, imm 70 points to subprog 'prog9' (now at 202 offset)
libbpf: prog 'xdp_dispatcher': added 6 insns from sub-prog 'compat_test'
libbpf: prog 'xdp_dispatcher': insn #145 relocated, imm 62 points to subprog 'compat_test' (now at 208 offset)
libbpf: load bpf program failed: Argument list too long
libbpf: failed to load program 'xdp_pass'
libbpf: failed to load object './xdp-dispatcher.o'
libxdp: Failed to load program xdp_pass: Argument list too long
libxdp: Compatibility check for dispatcher program failed: Argument list too long
libxdp: Can't fall back to legacy load with 2 programs
This means that the kernel does not support the features needed
by the multiprog dispatcher, either because it is too old entirely,
or because it is not yet supported on the current architecture.

Attaching XDP program in native mode not supported - try SKB mode.

I see the following error from above:

This means that the kernel does not support the features needed
by the multiprog dispatcher, either because it is too old entirely,
or because it is not yet supported on the current architecture.

However this does not provide any details on what is actually needed to get the multiprong dispatcher to work on my system (or any system for that matter). What Kernels / operating systems are supported? Is there a kernel option I need to enable for my OS possibly? I read though the documentation on the github, but did not see any requirements needed to load multiple xdp programs to an interface.

Its obvious that It does not work on my system, but WHAT systems does this work on? What is supported? And if possible, how can I get it to work on mine?

UPDATE:
After looking at the xdp-project website, I see your DONE task for "implement freplace re-attachment" is only supported on kernel versions >= 5.10. Are there any other requirements needed?

@tohojo thanks for the info.
I upgrade my distro / kernel to the following:

  • Ubuntu 21.04
  • Kernel: 5.11.0-41-generic

I then performed a make clean, and reconfigured / compiled again.
I get different errors now related to BTF.

# ./xdp-loader load -v enp94s0f3 ./xdp-drop-ebpf-01.o ./xdp-drop-ebpf-02.o
Current rlimit 50538029056 already >= minimum 1048576
Loading 2 files on interface 'enp94s0f3'.
XDP program 0: Run prio: 50. Chain call actions: XDP_PASS
XDP program 1: Run prio: 50. Chain call actions: XDP_PASS
libxdp: Program xdp_drop_benchmark_traffic has no BTF information, so we can't load it as multiprog
libxdp: Can't fall back to legacy load with 2 programs
This means that the kernel does not support the features needed
by the multiprog dispatcher, either because it is too old entirely,
or because it is not yet supported on the current architecture.

I assume that this means that the multiprog dispatch is functional with my kernel's capabilities at this newer version. I also assume my source code needs to be adjusted to include metadata for BPF Type Formatting, is that true? If so I can close up this ticket.
Before I do, is there any simple guides / examples on how to configure separate programs to support BPF recognition for xdp-loader multiprong dispatcher, so I can adjust my source code accordingly for testing?
I found this which interesting, and I will dig more on it, however I am no C guru so just looking for any quick shares someone may have on working examples I can test with.

EDIT:
I should share the source code for the programs incase that provide context.
Be aware, the only difference between xdp-drop-ebpf-01.c and xdp-drop-ebpf-02.c is different subnets I am matching on from the IP header. Otherwise they are the same. Below is just xdp-drop-ebpf-01.c:

#include <linux/bpf.h>
#include <linux/if_ether.h>
#include <linux/in.h>
#include <linux/ip.h>
#include <linux/ipv6.h>
#include <linux/udp.h>

#include <stdint.h>

#define SEC(NAME) __attribute__((section(NAME), used))

#define htons(x) ((__be16)___constant_swab16((x)))
#define htonl(x) ((__be32)___constant_swab32((x)))

struct vlan_hdr {
    __be16 h_vlan_TCI;
    __be16 h_vlan_encapsulated_proto;
};

SEC("prog")
int xdp_drop_benchmark_traffic(struct xdp_md *ctx)
{
    void *data_end = (void *)(long)ctx->data_end;
    void *data = (void *)(long)ctx->data;
    struct ethhdr *eth = data;

    uint64_t nh_off = sizeof(*eth);
    if (data + nh_off > data_end) {
        return XDP_PASS;
    }   

    uint16_t h_proto = eth->h_proto;
    int i;

    /* Handle double VLAN tagged packet. See https://en.wikipedia.org/wiki/IEEE_802.1ad */
    for (i = 0; i < 2; i++) {
        if (h_proto == htons(ETH_P_8021Q) || h_proto == htons(ETH_P_8021AD)) {
            struct vlan_hdr *vhdr;

            vhdr = data + nh_off;
            nh_off += sizeof(struct vlan_hdr);
            if (data + nh_off > data_end) {
                return XDP_PASS;
            }   
            h_proto = vhdr->h_vlan_encapsulated_proto;
        }   
    }   
    if (h_proto == htons(ETH_P_IP)) {
        struct iphdr *iph = data + nh_off;
        struct udphdr *udph = data + nh_off + sizeof(struct iphdr);
        if (udph + 1 > (struct udphdr *)data_end) {
            return XDP_PASS;
        }
        if (iph->protocol == IPPROTO_UDP &&
            (htonl(iph->daddr) & 0xFFFFFF00) ==
                 0xAC105B00 // 172.16.91.0/24
            && udph->dest == htons(1234)) {
            return XDP_DROP;
        }
    } else if (h_proto == htons(ETH_P_IPV6)) {
        struct ipv6hdr *ip6h = data + nh_off;
        struct udphdr *udph = data + nh_off + sizeof(struct ipv6hdr);
        if (udph + 1 > (struct udphdr *)data_end) {
            return XDP_PASS;
        }
        if (ip6h->nexthdr == IPPROTO_UDP &&
            ip6h->daddr.s6_addr[0] == 0xfd    // fd00::/8
            && ip6h->daddr.s6_addr[1] == 0x00 // fd00::/8
            && udph->dest == htons(1234)) {
            return XDP_DROP;
        }
    }

    return XDP_PASS;
}

char _license[] SEC("license") = "GPL";

Ah yes, I'll add something about BTF as well. You don't need to make any source changes, just build changes. Specifically, make sure you're using a recent clang version (IIRC clang 9 is enough, but generally, as new as possible), and make sure you're compiling your BPF objects with -g

@tohojo
clang version is currently at 12. The problem was adding -g to my clang syntax for compiling.
Tested multiple programs as a one liner, and sequentially, both work now.
Closing this issue. Thanks for the support!

Awesome! You're welcome, and thanks for pointing out the lack of documentation of these issues :)