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