xref: /linux/tools/testing/selftests/net/lib/py/bpf.py (revision 91a4855d6c03e770e42f17c798a36a3c46e63de2)
1*4ce06406SChris J Arges# SPDX-License-Identifier: GPL-2.0
2*4ce06406SChris J Arges
3*4ce06406SChris J Arges"""
4*4ce06406SChris J ArgesBPF helper utilities for kernel selftests.
5*4ce06406SChris J Arges
6*4ce06406SChris J ArgesProvides common operations for interacting with BPF maps and programs
7*4ce06406SChris J Argesvia bpftool, used by XDP and other BPF-based test files.
8*4ce06406SChris J Arges"""
9*4ce06406SChris J Arges
10*4ce06406SChris J Argesfrom .utils import bpftool
11*4ce06406SChris J Arges
12*4ce06406SChris J Argesdef _format_hex_bytes(value):
13*4ce06406SChris J Arges    """
14*4ce06406SChris J Arges    Helper function that converts an integer into a formatted hexadecimal byte string.
15*4ce06406SChris J Arges
16*4ce06406SChris J Arges    Args:
17*4ce06406SChris J Arges        value: An integer representing the number to be converted.
18*4ce06406SChris J Arges
19*4ce06406SChris J Arges    Returns:
20*4ce06406SChris J Arges        A string representing hexadecimal equivalent of value, with bytes separated by spaces.
21*4ce06406SChris J Arges    """
22*4ce06406SChris J Arges    hex_str = value.to_bytes(4, byteorder='little', signed=True)
23*4ce06406SChris J Arges    return ' '.join(f'{byte:02x}' for byte in hex_str)
24*4ce06406SChris J Arges
25*4ce06406SChris J Arges
26*4ce06406SChris J Argesdef bpf_map_set(map_name, key, value):
27*4ce06406SChris J Arges    """
28*4ce06406SChris J Arges    Updates an XDP map with a given key-value pair using bpftool.
29*4ce06406SChris J Arges
30*4ce06406SChris J Arges    Args:
31*4ce06406SChris J Arges        map_name: The name of the XDP map to update.
32*4ce06406SChris J Arges        key: The key to update in the map, formatted as a hexadecimal string.
33*4ce06406SChris J Arges        value: The value to associate with the key, formatted as a hexadecimal string.
34*4ce06406SChris J Arges    """
35*4ce06406SChris J Arges    key_formatted = _format_hex_bytes(key)
36*4ce06406SChris J Arges    value_formatted = _format_hex_bytes(value)
37*4ce06406SChris J Arges    bpftool(
38*4ce06406SChris J Arges        f"map update name {map_name} key hex {key_formatted} value hex {value_formatted}"
39*4ce06406SChris J Arges    )
40*4ce06406SChris J Arges
41*4ce06406SChris J Argesdef bpf_map_dump(map_id):
42*4ce06406SChris J Arges    """Dump all entries of a BPF array map.
43*4ce06406SChris J Arges
44*4ce06406SChris J Arges    Args:
45*4ce06406SChris J Arges        map_id: Numeric map ID (as returned by bpftool prog show).
46*4ce06406SChris J Arges
47*4ce06406SChris J Arges    Returns:
48*4ce06406SChris J Arges        A dict mapping formatted key (int) to formatted value (int).
49*4ce06406SChris J Arges    """
50*4ce06406SChris J Arges    raw = bpftool(f"map dump id {map_id}", json=True)
51*4ce06406SChris J Arges    return {e["formatted"]["key"]: e["formatted"]["value"] for e in raw}
52*4ce06406SChris J Arges
53*4ce06406SChris J Arges
54*4ce06406SChris J Argesdef bpf_prog_map_ids(prog_id):
55*4ce06406SChris J Arges    """Get the map name-to-ID mapping for a loaded BPF program.
56*4ce06406SChris J Arges
57*4ce06406SChris J Arges    Args:
58*4ce06406SChris J Arges        prog_id: Numeric program ID.
59*4ce06406SChris J Arges
60*4ce06406SChris J Arges    Returns:
61*4ce06406SChris J Arges        A dict mapping map name (str) to map ID (int).
62*4ce06406SChris J Arges    """
63*4ce06406SChris J Arges    map_ids = bpftool(f"prog show id {prog_id}", json=True)["map_ids"]
64*4ce06406SChris J Arges    maps = {}
65*4ce06406SChris J Arges    for mid in map_ids:
66*4ce06406SChris J Arges        name = bpftool(f"map show id {mid}", json=True)["name"]
67*4ce06406SChris J Arges        maps[name] = mid
68*4ce06406SChris J Arges    return maps
69