xref: /dpdk/drivers/net/tap/bpf/meson.build (revision fa6cbff5b6c249280589c5286f62d6a107d0af34)
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