1d8d06504SStephen Hemminger# SPDX-License-Identifier: BSD-3-Clause 2d8d06504SStephen Hemminger# Copyright 2024 Stephen Hemminger <stephen@networkplumber.org> 3d8d06504SStephen Hemminger 42bb2f755SStephen Hemminger# Loading BPF requires libbpf 52bb2f755SStephen Hemminger# and the bpf_map__XXX API's were introduced in 0.8.0 62bb2f755SStephen Hemmingerlibbpf = dependency('libbpf', version: '>= 1.0', 72bb2f755SStephen Hemminger required: false, method: 'pkg-config') 8d8d06504SStephen Hemmingerif not libbpf.found() 9d8d06504SStephen Hemminger message('net/tap: no RSS support missing libbpf') 10d8d06504SStephen Hemminger subdir_done() 11d8d06504SStephen Hemmingerendif 12d8d06504SStephen Hemminger 132bb2f755SStephen Hemminger# Making skeleton needs bpftool 14d8d06504SStephen Hemminger# Debian install this in /usr/sbin which is not in $PATH 152bb2f755SStephen Hemmingerbpftool_supports_skel = false 162bb2f755SStephen Hemmingerbpftool = find_program('bpftool', '/usr/sbin/bpftool', required: false) 172bb2f755SStephen Hemmingerif bpftool.found() 182bb2f755SStephen Hemminger # Some Ubuntu versions have non-functional bpftool 192bb2f755SStephen Hemminger bpftool_supports_skel = run_command(bpftool, 'gen', 'help', 202bb2f755SStephen Hemminger check:false).returncode() == 0 212bb2f755SStephen Hemmingerendif 222bb2f755SStephen Hemminger 232bb2f755SStephen Hemmingerif not bpftool_supports_skel 24d8d06504SStephen Hemminger message('net/tap: no RSS support missing bpftool') 25d8d06504SStephen Hemminger subdir_done() 26d8d06504SStephen Hemmingerendif 27d8d06504SStephen Hemminger 28d8d06504SStephen Hemmingerclang_supports_bpf = false 29d8d06504SStephen Hemmingerclang = find_program('clang', required: false) 30d8d06504SStephen Hemmingerif clang.found() 31d8d06504SStephen Hemminger clang_supports_bpf = run_command(clang, '-target', 'bpf', '--print-supported-cpus', 32d8d06504SStephen Hemminger check: false).returncode() == 0 33d8d06504SStephen Hemmingerendif 34d8d06504SStephen Hemminger 35d8d06504SStephen Hemmingerif not clang_supports_bpf 36d8d06504SStephen Hemminger message('net/tap: no RSS support missing clang BPF') 37d8d06504SStephen Hemminger subdir_done() 38d8d06504SStephen Hemmingerendif 39d8d06504SStephen Hemminger 40d8d06504SStephen Hemmingerenable_tap_rss = true 41d8d06504SStephen Hemminger 42d8d06504SStephen Hemmingerlibbpf_include_dir = libbpf.get_variable(pkgconfig : 'includedir') 43d8d06504SStephen Hemminger 44d8d06504SStephen Hemminger# The include files <linux/bpf.h> and others include <asm/types.h> 45d8d06504SStephen Hemminger# but <asm/types.h> is not defined for multi-lib environment target. 46d8d06504SStephen Hemminger# Workaround by using include directoriy from the host build environment. 47*fa6cbff5SStephen Hemmingermachine_name = run_command('uname', '-m', check: true).stdout().strip() 48d8d06504SStephen Hemmingermarch_include_dir = '/usr/include/' + machine_name + '-linux-gnu' 49d8d06504SStephen Hemminger 50d8d06504SStephen Hemmingerclang_flags = [ 512bb2f755SStephen Hemminger # these are flags used to build the BPF code 52d8d06504SStephen Hemminger '-O2', 53d8d06504SStephen Hemminger '-Wall', 54d8d06504SStephen Hemminger '-Wextra', 552bb2f755SStephen Hemminger max_queues, 56d8d06504SStephen Hemminger '-target', 57d8d06504SStephen Hemminger 'bpf', 58d8d06504SStephen Hemminger '-g', 59d8d06504SStephen Hemminger '-c', 60d8d06504SStephen Hemminger] 61d8d06504SStephen Hemminger 622bb2f755SStephen Hemminger# Command used to compile BPF pgrograme 63d8d06504SStephen Hemmingerbpf_o_cmd = [ 64d8d06504SStephen Hemminger clang, 65d8d06504SStephen Hemminger clang_flags, 66d8d06504SStephen Hemminger '-idirafter', 67d8d06504SStephen Hemminger libbpf_include_dir, 68d8d06504SStephen Hemminger '-idirafter', 69d8d06504SStephen Hemminger march_include_dir, 70d8d06504SStephen Hemminger '@INPUT@', 71d8d06504SStephen Hemminger '-o', 72d8d06504SStephen Hemminger '@OUTPUT@', 73d8d06504SStephen Hemminger] 74d8d06504SStephen Hemminger 752bb2f755SStephen Hemminger# Command used to generate header file from BPF object 76d8d06504SStephen Hemmingerskel_h_cmd = [ 77d8d06504SStephen Hemminger bpftool, 78d8d06504SStephen Hemminger 'gen', 79d8d06504SStephen Hemminger 'skeleton', 80d8d06504SStephen Hemminger '@INPUT@', 81d8d06504SStephen Hemminger] 82d8d06504SStephen Hemminger 83d8d06504SStephen Hemmingertap_rss_o = custom_target( 84d8d06504SStephen Hemminger 'tap_rss.bpf.o', 85d8d06504SStephen Hemminger input: 'tap_rss.c', 86d8d06504SStephen Hemminger output: 'tap_rss.o', 87d8d06504SStephen Hemminger command: bpf_o_cmd) 88d8d06504SStephen Hemminger 89d8d06504SStephen Hemmingertap_rss_skel_h = custom_target( 90d8d06504SStephen Hemminger 'tap_rss.skel.h', 91d8d06504SStephen Hemminger input: tap_rss_o, 92d8d06504SStephen Hemminger output: 'tap_rss.skel.h', 93d8d06504SStephen Hemminger command: skel_h_cmd, 94d8d06504SStephen Hemminger capture: true) 95