Path: blob/main/tests/atf_python/sys/netlink/netlink_generic.py
39553 views
#!/usr/local/bin/python31import struct2from ctypes import c_int643from ctypes import c_long4from ctypes import sizeof5from ctypes import Structure6from enum import Enum78from atf_python.sys.netlink.attrs import NlAttr9from atf_python.sys.netlink.attrs import NlAttrIp410from atf_python.sys.netlink.attrs import NlAttrIp611from atf_python.sys.netlink.attrs import NlAttrNested12from atf_python.sys.netlink.attrs import NlAttrS3213from atf_python.sys.netlink.attrs import NlAttrStr14from atf_python.sys.netlink.attrs import NlAttrU1615from atf_python.sys.netlink.attrs import NlAttrU3216from atf_python.sys.netlink.attrs import NlAttrU817from atf_python.sys.netlink.base_headers import GenlMsgHdr18from atf_python.sys.netlink.message import NlMsgCategory19from atf_python.sys.netlink.message import NlMsgProps20from atf_python.sys.netlink.message import StdNetlinkMessage21from atf_python.sys.netlink.utils import AttrDescr22from atf_python.sys.netlink.utils import enum_or_int23from atf_python.sys.netlink.utils import prepare_attrs_map242526class NetlinkGenlMessage(StdNetlinkMessage):27messages = []28nl_attrs_map = {}29family_name = None3031def __init__(self, helper, family_id, cmd=0):32super().__init__(helper, family_id)33self.base_hdr = GenlMsgHdr(cmd=enum_or_int(cmd))3435def parse_base_header(self, data):36if len(data) < sizeof(GenlMsgHdr):37raise ValueError("length less than GenlMsgHdr header")38ghdr = GenlMsgHdr.from_buffer_copy(data)39return (ghdr, sizeof(GenlMsgHdr))4041def _get_msg_type(self):42return self.base_hdr.cmd4344def print_nl_header(self, prepend=""):45# len=44, type=RTM_DELROUTE, flags=NLM_F_REQUEST|NLM_F_ACK, seq=1641163704, pid=0 # noqa: E50146hdr = self.nl_hdr47print(48"{}len={}, family={}, flags={}(0x{:X}), seq={}, pid={}".format(49prepend,50hdr.nlmsg_len,51self.family_name,52self.get_nlm_flags_str(),53hdr.nlmsg_flags,54hdr.nlmsg_seq,55hdr.nlmsg_pid,56)57)5859def print_base_header(self, hdr, prepend=""):60print(61"{}cmd={} version={} reserved={}".format(62prepend, self.msg_name, hdr.version, hdr.reserved63)64)656667GenlCtrlFamilyName = "nlctrl"686970class GenlCtrlMsgType(Enum):71CTRL_CMD_UNSPEC = 072CTRL_CMD_NEWFAMILY = 173CTRL_CMD_DELFAMILY = 274CTRL_CMD_GETFAMILY = 375CTRL_CMD_NEWOPS = 476CTRL_CMD_DELOPS = 577CTRL_CMD_GETOPS = 678CTRL_CMD_NEWMCAST_GRP = 779CTRL_CMD_DELMCAST_GRP = 880CTRL_CMD_GETMCAST_GRP = 981CTRL_CMD_GETPOLICY = 10828384class GenlCtrlAttrType(Enum):85CTRL_ATTR_FAMILY_ID = 186CTRL_ATTR_FAMILY_NAME = 287CTRL_ATTR_VERSION = 388CTRL_ATTR_HDRSIZE = 489CTRL_ATTR_MAXATTR = 590CTRL_ATTR_OPS = 691CTRL_ATTR_MCAST_GROUPS = 792CTRL_ATTR_POLICY = 893CTRL_ATTR_OP_POLICY = 994CTRL_ATTR_OP = 10959697class GenlCtrlAttrOpType(Enum):98CTRL_ATTR_OP_ID = 199CTRL_ATTR_OP_FLAGS = 2100101102class GenlCtrlAttrMcastGroupsType(Enum):103CTRL_ATTR_MCAST_GRP_NAME = 1104CTRL_ATTR_MCAST_GRP_ID = 2105106107genl_ctrl_attrs = prepare_attrs_map(108[109AttrDescr(GenlCtrlAttrType.CTRL_ATTR_FAMILY_ID, NlAttrU16),110AttrDescr(GenlCtrlAttrType.CTRL_ATTR_FAMILY_NAME, NlAttrStr),111AttrDescr(GenlCtrlAttrType.CTRL_ATTR_VERSION, NlAttrU32),112AttrDescr(GenlCtrlAttrType.CTRL_ATTR_HDRSIZE, NlAttrU32),113AttrDescr(GenlCtrlAttrType.CTRL_ATTR_MAXATTR, NlAttrU32),114AttrDescr(115GenlCtrlAttrType.CTRL_ATTR_OPS,116NlAttrNested,117[118AttrDescr(GenlCtrlAttrOpType.CTRL_ATTR_OP_ID, NlAttrU32),119AttrDescr(GenlCtrlAttrOpType.CTRL_ATTR_OP_FLAGS, NlAttrU32),120],121True,122),123AttrDescr(124GenlCtrlAttrType.CTRL_ATTR_MCAST_GROUPS,125NlAttrNested,126[127AttrDescr(128GenlCtrlAttrMcastGroupsType.CTRL_ATTR_MCAST_GRP_NAME, NlAttrStr129),130AttrDescr(131GenlCtrlAttrMcastGroupsType.CTRL_ATTR_MCAST_GRP_ID, NlAttrU32132),133],134True,135),136]137)138139140class NetlinkGenlCtrlMessage(NetlinkGenlMessage):141messages = [142NlMsgProps(GenlCtrlMsgType.CTRL_CMD_NEWFAMILY, NlMsgCategory.NEW),143NlMsgProps(GenlCtrlMsgType.CTRL_CMD_GETFAMILY, NlMsgCategory.GET),144NlMsgProps(GenlCtrlMsgType.CTRL_CMD_DELFAMILY, NlMsgCategory.DELETE),145]146nl_attrs_map = genl_ctrl_attrs147family_name = GenlCtrlFamilyName148149150CarpFamilyName = "carp"151152153class CarpMsgType(Enum):154CARP_NL_CMD_UNSPEC = 0155CARP_NL_CMD_GET = 1156CARP_NL_CMD_SET = 2157158159class CarpAttrType(Enum):160CARP_NL_UNSPEC = 0161CARP_NL_VHID = 1162CARP_NL_STATE = 2163CARP_NL_ADVBASE = 3164CARP_NL_ADVSKEW = 4165CARP_NL_KEY = 5166CARP_NL_IFINDEX = 6167CARP_NL_ADDR = 7168CARP_NL_ADDR6 = 8169CARP_NL_IFNAME = 9170171172carp_gen_attrs = prepare_attrs_map(173[174AttrDescr(CarpAttrType.CARP_NL_VHID, NlAttrU32),175AttrDescr(CarpAttrType.CARP_NL_STATE, NlAttrU32),176AttrDescr(CarpAttrType.CARP_NL_ADVBASE, NlAttrS32),177AttrDescr(CarpAttrType.CARP_NL_ADVSKEW, NlAttrS32),178AttrDescr(CarpAttrType.CARP_NL_KEY, NlAttr),179AttrDescr(CarpAttrType.CARP_NL_IFINDEX, NlAttrU32),180AttrDescr(CarpAttrType.CARP_NL_ADDR, NlAttrIp4),181AttrDescr(CarpAttrType.CARP_NL_ADDR6, NlAttrIp6),182AttrDescr(CarpAttrType.CARP_NL_IFNAME, NlAttrStr),183]184)185186187class CarpGenMessage(NetlinkGenlMessage):188messages = [189NlMsgProps(CarpMsgType.CARP_NL_CMD_GET, NlMsgCategory.GET),190NlMsgProps(CarpMsgType.CARP_NL_CMD_SET, NlMsgCategory.NEW),191]192nl_attrs_map = carp_gen_attrs193family_name = CarpFamilyName194195196KtestFamilyName = "ktest"197198199class KtestMsgType(Enum):200KTEST_CMD_UNSPEC = 0201KTEST_CMD_LIST = 1202KTEST_CMD_RUN = 2203KTEST_CMD_NEWTEST = 3204KTEST_CMD_NEWMESSAGE = 4205206207class KtestAttrType(Enum):208KTEST_ATTR_MOD_NAME = 1209KTEST_ATTR_TEST_NAME = 2210KTEST_ATTR_TEST_DESCR = 3211KTEST_ATTR_TEST_META = 4212213214class KtestLogMsgType(Enum):215KTEST_MSG_START = 1216KTEST_MSG_END = 2217KTEST_MSG_LOG = 3218KTEST_MSG_FAIL = 4219220221class KtestMsgAttrType(Enum):222KTEST_MSG_ATTR_TS = 1223KTEST_MSG_ATTR_FUNC = 2224KTEST_MSG_ATTR_FILE = 3225KTEST_MSG_ATTR_LINE = 4226KTEST_MSG_ATTR_TEXT = 5227KTEST_MSG_ATTR_LEVEL = 6228KTEST_MSG_ATTR_META = 7229230231class timespec(Structure):232_fields_ = [233("tv_sec", c_int64),234("tv_nsec", c_long),235]236237238class NlAttrTS(NlAttr):239DATA_LEN = sizeof(timespec)240241def __init__(self, nla_type, val):242self.ts = val243super().__init__(nla_type, b"")244245@property246def nla_len(self):247return NlAttr.HDR_LEN + self.DATA_LEN248249def _print_attr_value(self):250return " tv_sec={} tv_nsec={}".format(self.ts.tv_sec, self.ts.tv_nsec)251252@staticmethod253def _validate(data):254assert len(data) == NlAttr.HDR_LEN + NlAttrTS.DATA_LEN255nla_len, nla_type = struct.unpack("@HH", data[: NlAttr.HDR_LEN])256assert nla_len == NlAttr.HDR_LEN + NlAttrTS.DATA_LEN257258@classmethod259def _parse(cls, data):260nla_len, nla_type = struct.unpack("@HH", data[: NlAttr.HDR_LEN])261val = timespec.from_buffer_copy(data[NlAttr.HDR_LEN :])262return cls(nla_type, val)263264def __bytes__(self):265return self._to_bytes(bytes(self.ts))266267268ktest_info_attrs = prepare_attrs_map(269[270AttrDescr(KtestAttrType.KTEST_ATTR_MOD_NAME, NlAttrStr),271AttrDescr(KtestAttrType.KTEST_ATTR_TEST_NAME, NlAttrStr),272AttrDescr(KtestAttrType.KTEST_ATTR_TEST_DESCR, NlAttrStr),273]274)275276277ktest_msg_attrs = prepare_attrs_map(278[279AttrDescr(KtestMsgAttrType.KTEST_MSG_ATTR_FUNC, NlAttrStr),280AttrDescr(KtestMsgAttrType.KTEST_MSG_ATTR_FILE, NlAttrStr),281AttrDescr(KtestMsgAttrType.KTEST_MSG_ATTR_LINE, NlAttrU32),282AttrDescr(KtestMsgAttrType.KTEST_MSG_ATTR_TEXT, NlAttrStr),283AttrDescr(KtestMsgAttrType.KTEST_MSG_ATTR_LEVEL, NlAttrU8),284AttrDescr(KtestMsgAttrType.KTEST_MSG_ATTR_TS, NlAttrTS),285]286)287288289class KtestInfoMessage(NetlinkGenlMessage):290messages = [291NlMsgProps(KtestMsgType.KTEST_CMD_LIST, NlMsgCategory.GET),292NlMsgProps(KtestMsgType.KTEST_CMD_RUN, NlMsgCategory.NEW),293NlMsgProps(KtestMsgType.KTEST_CMD_NEWTEST, NlMsgCategory.NEW),294]295nl_attrs_map = ktest_info_attrs296family_name = KtestFamilyName297298299class KtestMsgMessage(NetlinkGenlMessage):300messages = [301NlMsgProps(KtestMsgType.KTEST_CMD_NEWMESSAGE, NlMsgCategory.NEW),302]303nl_attrs_map = ktest_msg_attrs304family_name = KtestFamilyName305306307handler_classes = {308CarpFamilyName: [CarpGenMessage],309GenlCtrlFamilyName: [NetlinkGenlCtrlMessage],310KtestFamilyName: [KtestInfoMessage, KtestMsgMessage],311}312313314