| # 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 |