# SPDX-License-Identifier: GPL-2.0 """ BPF helper utilities for kernel selftests. Provides common operations for interacting with BPF maps and programs via bpftool, used by XDP and other BPF-based test files. """ from .utils import bpftool def _format_hex_bytes(value): """ Helper function that converts an integer into a formatted hexadecimal byte string. Args: value: An integer representing the number to be converted. Returns: A string representing hexadecimal equivalent of value, with bytes separated by spaces. """ hex_str = value.to_bytes(4, byteorder='little', signed=True) return ' '.join(f'{byte:02x}' for byte in hex_str) def bpf_map_set(map_name, key, value): """ Updates an XDP map with a given key-value pair using bpftool. Args: map_name: The name of the XDP map to update. key: The key to update in the map, formatted as a hexadecimal string. value: The value to associate with the key, formatted as a hexadecimal string. """ key_formatted = _format_hex_bytes(key) value_formatted = _format_hex_bytes(value) bpftool( f"map update name {map_name} key hex {key_formatted} value hex {value_formatted}" ) def bpf_map_dump(map_id): """Dump all entries of a BPF array map. Args: map_id: Numeric map ID (as returned by bpftool prog show). Returns: A dict mapping formatted key (int) to formatted value (int). """ raw = bpftool(f"map dump id {map_id}", json=True) return {e["formatted"]["key"]: e["formatted"]["value"] for e in raw} def bpf_prog_map_ids(prog_id): """Get the map name-to-ID mapping for a loaded BPF program. Args: prog_id: Numeric program ID. Returns: A dict mapping map name (str) to map ID (int). """ map_ids = bpftool(f"prog show id {prog_id}", json=True)["map_ids"] maps = {} for mid in map_ids: name = bpftool(f"map show id {mid}", json=True)["name"] maps[name] = mid return maps