Path: blob/main/tests/atf_python/sys/netlink/utils.py
39553 views
#!/usr/local/bin/python31from enum import Enum2from typing import Any3from typing import Dict4from typing import List5from typing import NamedTuple678class NlConst:9AF_NETLINK = 3810NETLINK_ROUTE = 011NETLINK_GENERIC = 1612GENL_ID_CTRL = 16131415def roundup2(val: int, num: int) -> int:16if val % num:17return (val | (num - 1)) + 118else:19return val202122def align4(val: int) -> int:23return roundup2(val, 4)242526def enum_or_int(val) -> int:27if isinstance(val, Enum):28return val.value29return val303132class AttrDescr(NamedTuple):33val: Enum34cls: "NlAttr"35child_map: Any = None36is_array: bool = False373839def prepare_attrs_map(attrs: List[AttrDescr]) -> Dict[str, Dict]:40ret = {}41for ad in attrs:42ret[ad.val.value] = {"ad": ad}43if ad.child_map:44ret[ad.val.value]["child"] = prepare_attrs_map(ad.child_map)45ret[ad.val.value]["is_array"] = ad.is_array46return ret474849def build_propmap(cls):50ret = {}51for prop in dir(cls):52if not prop.startswith("_"):53ret[getattr(cls, prop).value] = prop54return ret555657def get_bitmask_map(propmap, val):58v = 159ret = {}60while val:61if v & val:62if v in propmap:63ret[v] = propmap[v]64else:65ret[v] = hex(v)66val -= v67v *= 268return ret697071def get_bitmask_str(cls, val):72if isinstance(cls, type):73pmap = build_propmap(cls)74else:75pmap = {}76for _cls in cls:77pmap.update(build_propmap(_cls))78bmap = get_bitmask_map(pmap, val)79return ",".join([v for k, v in bmap.items()])808182