1fc2538cbSAlexander V. Chernikov#!/usr/local/bin/python3 2f0ffe1ceSAlexander V. Chernikovimport struct 33e5d0784SAlexander V. Chernikovfrom ctypes import c_int64 43e5d0784SAlexander V. Chernikovfrom ctypes import c_long 5fc2538cbSAlexander V. Chernikovfrom ctypes import sizeof 63e5d0784SAlexander V. Chernikovfrom ctypes import Structure 7fc2538cbSAlexander V. Chernikovfrom enum import Enum 8fc2538cbSAlexander V. Chernikov 93e5d0784SAlexander V. Chernikovfrom atf_python.sys.netlink.attrs import NlAttr 10f0ffe1ceSAlexander V. Chernikovfrom atf_python.sys.netlink.attrs import NlAttrIp4 11f0ffe1ceSAlexander V. Chernikovfrom atf_python.sys.netlink.attrs import NlAttrIp6 12*54b955f4SAlexander V. Chernikovfrom atf_python.sys.netlink.attrs import NlAttrNested 13f0ffe1ceSAlexander V. Chernikovfrom atf_python.sys.netlink.attrs import NlAttrS32 14fc2538cbSAlexander V. Chernikovfrom atf_python.sys.netlink.attrs import NlAttrStr 15fc2538cbSAlexander V. Chernikovfrom atf_python.sys.netlink.attrs import NlAttrU16 16fc2538cbSAlexander V. Chernikovfrom atf_python.sys.netlink.attrs import NlAttrU32 173e5d0784SAlexander V. Chernikovfrom atf_python.sys.netlink.attrs import NlAttrU8 18fc2538cbSAlexander V. Chernikovfrom atf_python.sys.netlink.base_headers import GenlMsgHdr 19fc2538cbSAlexander V. Chernikovfrom atf_python.sys.netlink.message import NlMsgCategory 20fc2538cbSAlexander V. Chernikovfrom atf_python.sys.netlink.message import NlMsgProps 21fc2538cbSAlexander V. Chernikovfrom atf_python.sys.netlink.message import StdNetlinkMessage 22fc2538cbSAlexander V. Chernikovfrom atf_python.sys.netlink.utils import AttrDescr 23fc2538cbSAlexander V. Chernikovfrom atf_python.sys.netlink.utils import enum_or_int 24f0ffe1ceSAlexander V. Chernikovfrom atf_python.sys.netlink.utils import prepare_attrs_map 25fc2538cbSAlexander V. Chernikov 26fc2538cbSAlexander V. Chernikov 27fc2538cbSAlexander V. Chernikovclass NetlinkGenlMessage(StdNetlinkMessage): 28fc2538cbSAlexander V. Chernikov messages = [] 29fc2538cbSAlexander V. Chernikov nl_attrs_map = {} 30fc2538cbSAlexander V. Chernikov family_name = None 31fc2538cbSAlexander V. Chernikov 32fc2538cbSAlexander V. Chernikov def __init__(self, helper, family_id, cmd=0): 33fc2538cbSAlexander V. Chernikov super().__init__(helper, family_id) 34fc2538cbSAlexander V. Chernikov self.base_hdr = GenlMsgHdr(cmd=enum_or_int(cmd)) 35fc2538cbSAlexander V. Chernikov 36fc2538cbSAlexander V. Chernikov def parse_base_header(self, data): 37fc2538cbSAlexander V. Chernikov if len(data) < sizeof(GenlMsgHdr): 38fc2538cbSAlexander V. Chernikov raise ValueError("length less than GenlMsgHdr header") 39fc2538cbSAlexander V. Chernikov ghdr = GenlMsgHdr.from_buffer_copy(data) 40fc2538cbSAlexander V. Chernikov return (ghdr, sizeof(GenlMsgHdr)) 41fc2538cbSAlexander V. Chernikov 42fc2538cbSAlexander V. Chernikov def _get_msg_type(self): 43fc2538cbSAlexander V. Chernikov return self.base_hdr.cmd 44fc2538cbSAlexander V. Chernikov 45fc2538cbSAlexander V. Chernikov def print_nl_header(self, prepend=""): 46fc2538cbSAlexander V. Chernikov # len=44, type=RTM_DELROUTE, flags=NLM_F_REQUEST|NLM_F_ACK, seq=1641163704, pid=0 # noqa: E501 47fc2538cbSAlexander V. Chernikov hdr = self.nl_hdr 48fc2538cbSAlexander V. Chernikov print( 49fc2538cbSAlexander V. Chernikov "{}len={}, family={}, flags={}(0x{:X}), seq={}, pid={}".format( 50fc2538cbSAlexander V. Chernikov prepend, 51fc2538cbSAlexander V. Chernikov hdr.nlmsg_len, 52fc2538cbSAlexander V. Chernikov self.family_name, 53fc2538cbSAlexander V. Chernikov self.get_nlm_flags_str(), 54fc2538cbSAlexander V. Chernikov hdr.nlmsg_flags, 55fc2538cbSAlexander V. Chernikov hdr.nlmsg_seq, 56fc2538cbSAlexander V. Chernikov hdr.nlmsg_pid, 57fc2538cbSAlexander V. Chernikov ) 58fc2538cbSAlexander V. Chernikov ) 59fc2538cbSAlexander V. Chernikov 60fc2538cbSAlexander V. Chernikov def print_base_header(self, hdr, prepend=""): 61fc2538cbSAlexander V. Chernikov print( 62fc2538cbSAlexander V. Chernikov "{}cmd={} version={} reserved={}".format( 63fc2538cbSAlexander V. Chernikov prepend, self.msg_name, hdr.version, hdr.reserved 64fc2538cbSAlexander V. Chernikov ) 65fc2538cbSAlexander V. Chernikov ) 66fc2538cbSAlexander V. Chernikov 67fc2538cbSAlexander V. Chernikov 68fc2538cbSAlexander V. ChernikovGenlCtrlFamilyName = "nlctrl" 69fc2538cbSAlexander V. Chernikov 70f0ffe1ceSAlexander V. Chernikov 71fc2538cbSAlexander V. Chernikovclass GenlCtrlMsgType(Enum): 72fc2538cbSAlexander V. Chernikov CTRL_CMD_UNSPEC = 0 73fc2538cbSAlexander V. Chernikov CTRL_CMD_NEWFAMILY = 1 74fc2538cbSAlexander V. Chernikov CTRL_CMD_DELFAMILY = 2 75fc2538cbSAlexander V. Chernikov CTRL_CMD_GETFAMILY = 3 76fc2538cbSAlexander V. Chernikov CTRL_CMD_NEWOPS = 4 77fc2538cbSAlexander V. Chernikov CTRL_CMD_DELOPS = 5 78fc2538cbSAlexander V. Chernikov CTRL_CMD_GETOPS = 6 79fc2538cbSAlexander V. Chernikov CTRL_CMD_NEWMCAST_GRP = 7 80fc2538cbSAlexander V. Chernikov CTRL_CMD_DELMCAST_GRP = 8 81fc2538cbSAlexander V. Chernikov CTRL_CMD_GETMCAST_GRP = 9 82fc2538cbSAlexander V. Chernikov CTRL_CMD_GETPOLICY = 10 83fc2538cbSAlexander V. Chernikov 84fc2538cbSAlexander V. Chernikov 85fc2538cbSAlexander V. Chernikovclass GenlCtrlAttrType(Enum): 86fc2538cbSAlexander V. Chernikov CTRL_ATTR_FAMILY_ID = 1 87fc2538cbSAlexander V. Chernikov CTRL_ATTR_FAMILY_NAME = 2 88fc2538cbSAlexander V. Chernikov CTRL_ATTR_VERSION = 3 89fc2538cbSAlexander V. Chernikov CTRL_ATTR_HDRSIZE = 4 90fc2538cbSAlexander V. Chernikov CTRL_ATTR_MAXATTR = 5 91fc2538cbSAlexander V. Chernikov CTRL_ATTR_OPS = 6 92fc2538cbSAlexander V. Chernikov CTRL_ATTR_MCAST_GROUPS = 7 93fc2538cbSAlexander V. Chernikov CTRL_ATTR_POLICY = 8 94fc2538cbSAlexander V. Chernikov CTRL_ATTR_OP_POLICY = 9 95fc2538cbSAlexander V. Chernikov CTRL_ATTR_OP = 10 96fc2538cbSAlexander V. Chernikov 97fc2538cbSAlexander V. Chernikov 98*54b955f4SAlexander V. Chernikovclass GenlCtrlAttrOpType(Enum): 99*54b955f4SAlexander V. Chernikov CTRL_ATTR_OP_ID = 1 100*54b955f4SAlexander V. Chernikov CTRL_ATTR_OP_FLAGS = 2 101*54b955f4SAlexander V. Chernikov 102*54b955f4SAlexander V. Chernikov 103*54b955f4SAlexander V. Chernikovclass GenlCtrlAttrMcastGroupsType(Enum): 104*54b955f4SAlexander V. Chernikov CTRL_ATTR_MCAST_GRP_NAME = 1 105*54b955f4SAlexander V. Chernikov CTRL_ATTR_MCAST_GRP_ID = 2 106*54b955f4SAlexander V. Chernikov 107*54b955f4SAlexander V. Chernikov 108fc2538cbSAlexander V. Chernikovgenl_ctrl_attrs = prepare_attrs_map( 109fc2538cbSAlexander V. Chernikov [ 110fc2538cbSAlexander V. Chernikov AttrDescr(GenlCtrlAttrType.CTRL_ATTR_FAMILY_ID, NlAttrU16), 111fc2538cbSAlexander V. Chernikov AttrDescr(GenlCtrlAttrType.CTRL_ATTR_FAMILY_NAME, NlAttrStr), 112fc2538cbSAlexander V. Chernikov AttrDescr(GenlCtrlAttrType.CTRL_ATTR_VERSION, NlAttrU32), 113fc2538cbSAlexander V. Chernikov AttrDescr(GenlCtrlAttrType.CTRL_ATTR_HDRSIZE, NlAttrU32), 114fc2538cbSAlexander V. Chernikov AttrDescr(GenlCtrlAttrType.CTRL_ATTR_MAXATTR, NlAttrU32), 115*54b955f4SAlexander V. Chernikov AttrDescr( 116*54b955f4SAlexander V. Chernikov GenlCtrlAttrType.CTRL_ATTR_OPS, 117*54b955f4SAlexander V. Chernikov NlAttrNested, 118*54b955f4SAlexander V. Chernikov [ 119*54b955f4SAlexander V. Chernikov AttrDescr(GenlCtrlAttrOpType.CTRL_ATTR_OP_ID, NlAttrU32), 120*54b955f4SAlexander V. Chernikov AttrDescr(GenlCtrlAttrOpType.CTRL_ATTR_OP_FLAGS, NlAttrU32), 121*54b955f4SAlexander V. Chernikov ], 122*54b955f4SAlexander V. Chernikov True, 123*54b955f4SAlexander V. Chernikov ), 124*54b955f4SAlexander V. Chernikov AttrDescr( 125*54b955f4SAlexander V. Chernikov GenlCtrlAttrType.CTRL_ATTR_MCAST_GROUPS, 126*54b955f4SAlexander V. Chernikov NlAttrNested, 127*54b955f4SAlexander V. Chernikov [ 128*54b955f4SAlexander V. Chernikov AttrDescr( 129*54b955f4SAlexander V. Chernikov GenlCtrlAttrMcastGroupsType.CTRL_ATTR_MCAST_GRP_NAME, NlAttrStr 130*54b955f4SAlexander V. Chernikov ), 131*54b955f4SAlexander V. Chernikov AttrDescr( 132*54b955f4SAlexander V. Chernikov GenlCtrlAttrMcastGroupsType.CTRL_ATTR_MCAST_GRP_ID, NlAttrU32 133*54b955f4SAlexander V. Chernikov ), 134*54b955f4SAlexander V. Chernikov ], 135*54b955f4SAlexander V. Chernikov True, 136*54b955f4SAlexander V. Chernikov ), 137fc2538cbSAlexander V. Chernikov ] 138fc2538cbSAlexander V. Chernikov) 139fc2538cbSAlexander V. Chernikov 140fc2538cbSAlexander V. Chernikov 141fc2538cbSAlexander V. Chernikovclass NetlinkGenlCtrlMessage(NetlinkGenlMessage): 142fc2538cbSAlexander V. Chernikov messages = [ 143fc2538cbSAlexander V. Chernikov NlMsgProps(GenlCtrlMsgType.CTRL_CMD_NEWFAMILY, NlMsgCategory.NEW), 144fc2538cbSAlexander V. Chernikov NlMsgProps(GenlCtrlMsgType.CTRL_CMD_GETFAMILY, NlMsgCategory.GET), 145fc2538cbSAlexander V. Chernikov NlMsgProps(GenlCtrlMsgType.CTRL_CMD_DELFAMILY, NlMsgCategory.DELETE), 146fc2538cbSAlexander V. Chernikov ] 147fc2538cbSAlexander V. Chernikov nl_attrs_map = genl_ctrl_attrs 148fc2538cbSAlexander V. Chernikov family_name = GenlCtrlFamilyName 149fc2538cbSAlexander V. Chernikov 150fc2538cbSAlexander V. Chernikov 151f0ffe1ceSAlexander V. ChernikovCarpFamilyName = "carp" 152f0ffe1ceSAlexander V. Chernikov 153f0ffe1ceSAlexander V. Chernikov 154f0ffe1ceSAlexander V. Chernikovclass CarpMsgType(Enum): 155f0ffe1ceSAlexander V. Chernikov CARP_NL_CMD_UNSPEC = 0 156f0ffe1ceSAlexander V. Chernikov CARP_NL_CMD_GET = 1 157f0ffe1ceSAlexander V. Chernikov CARP_NL_CMD_SET = 2 158f0ffe1ceSAlexander V. Chernikov 159f0ffe1ceSAlexander V. Chernikov 160f0ffe1ceSAlexander V. Chernikovclass CarpAttrType(Enum): 161f0ffe1ceSAlexander V. Chernikov CARP_NL_UNSPEC = 0 162f0ffe1ceSAlexander V. Chernikov CARP_NL_VHID = 1 163f0ffe1ceSAlexander V. Chernikov CARP_NL_STATE = 2 164f0ffe1ceSAlexander V. Chernikov CARP_NL_ADVBASE = 3 165f0ffe1ceSAlexander V. Chernikov CARP_NL_ADVSKEW = 4 166f0ffe1ceSAlexander V. Chernikov CARP_NL_KEY = 5 167f0ffe1ceSAlexander V. Chernikov CARP_NL_IFINDEX = 6 168f0ffe1ceSAlexander V. Chernikov CARP_NL_ADDR = 7 169f0ffe1ceSAlexander V. Chernikov CARP_NL_ADDR6 = 8 170f0ffe1ceSAlexander V. Chernikov CARP_NL_IFNAME = 9 171f0ffe1ceSAlexander V. Chernikov 172f0ffe1ceSAlexander V. Chernikov 173f0ffe1ceSAlexander V. Chernikovcarp_gen_attrs = prepare_attrs_map( 174f0ffe1ceSAlexander V. Chernikov [ 175f0ffe1ceSAlexander V. Chernikov AttrDescr(CarpAttrType.CARP_NL_VHID, NlAttrU32), 176f0ffe1ceSAlexander V. Chernikov AttrDescr(CarpAttrType.CARP_NL_STATE, NlAttrU32), 177f0ffe1ceSAlexander V. Chernikov AttrDescr(CarpAttrType.CARP_NL_ADVBASE, NlAttrS32), 178f0ffe1ceSAlexander V. Chernikov AttrDescr(CarpAttrType.CARP_NL_ADVSKEW, NlAttrS32), 179f0ffe1ceSAlexander V. Chernikov AttrDescr(CarpAttrType.CARP_NL_KEY, NlAttr), 180f0ffe1ceSAlexander V. Chernikov AttrDescr(CarpAttrType.CARP_NL_IFINDEX, NlAttrU32), 181f0ffe1ceSAlexander V. Chernikov AttrDescr(CarpAttrType.CARP_NL_ADDR, NlAttrIp4), 182f0ffe1ceSAlexander V. Chernikov AttrDescr(CarpAttrType.CARP_NL_ADDR6, NlAttrIp6), 183f0ffe1ceSAlexander V. Chernikov AttrDescr(CarpAttrType.CARP_NL_IFNAME, NlAttrStr), 184f0ffe1ceSAlexander V. Chernikov ] 185f0ffe1ceSAlexander V. Chernikov) 186f0ffe1ceSAlexander V. Chernikov 187f0ffe1ceSAlexander V. Chernikov 188f0ffe1ceSAlexander V. Chernikovclass CarpGenMessage(NetlinkGenlMessage): 189f0ffe1ceSAlexander V. Chernikov messages = [ 190f0ffe1ceSAlexander V. Chernikov NlMsgProps(CarpMsgType.CARP_NL_CMD_GET, NlMsgCategory.GET), 191f0ffe1ceSAlexander V. Chernikov NlMsgProps(CarpMsgType.CARP_NL_CMD_SET, NlMsgCategory.NEW), 192f0ffe1ceSAlexander V. Chernikov ] 193f0ffe1ceSAlexander V. Chernikov nl_attrs_map = carp_gen_attrs 194f0ffe1ceSAlexander V. Chernikov family_name = CarpFamilyName 195f0ffe1ceSAlexander V. Chernikov 196f0ffe1ceSAlexander V. Chernikov 1973e5d0784SAlexander V. ChernikovKtestFamilyName = "ktest" 1983e5d0784SAlexander V. Chernikov 1993e5d0784SAlexander V. Chernikov 2003e5d0784SAlexander V. Chernikovclass KtestMsgType(Enum): 2013e5d0784SAlexander V. Chernikov KTEST_CMD_UNSPEC = 0 2023e5d0784SAlexander V. Chernikov KTEST_CMD_LIST = 1 2033e5d0784SAlexander V. Chernikov KTEST_CMD_RUN = 2 2043e5d0784SAlexander V. Chernikov KTEST_CMD_NEWTEST = 3 2053e5d0784SAlexander V. Chernikov KTEST_CMD_NEWMESSAGE = 4 2063e5d0784SAlexander V. Chernikov 2073e5d0784SAlexander V. Chernikov 2083e5d0784SAlexander V. Chernikovclass KtestAttrType(Enum): 2093e5d0784SAlexander V. Chernikov KTEST_ATTR_MOD_NAME = 1 2103e5d0784SAlexander V. Chernikov KTEST_ATTR_TEST_NAME = 2 2113e5d0784SAlexander V. Chernikov KTEST_ATTR_TEST_DESCR = 3 2123e5d0784SAlexander V. Chernikov KTEST_ATTR_TEST_META = 4 2133e5d0784SAlexander V. Chernikov 2143e5d0784SAlexander V. Chernikov 2153e5d0784SAlexander V. Chernikovclass KtestLogMsgType(Enum): 2163e5d0784SAlexander V. Chernikov KTEST_MSG_START = 1 2173e5d0784SAlexander V. Chernikov KTEST_MSG_END = 2 2183e5d0784SAlexander V. Chernikov KTEST_MSG_LOG = 3 2193e5d0784SAlexander V. Chernikov KTEST_MSG_FAIL = 4 2203e5d0784SAlexander V. Chernikov 2213e5d0784SAlexander V. Chernikov 2223e5d0784SAlexander V. Chernikovclass KtestMsgAttrType(Enum): 2233e5d0784SAlexander V. Chernikov KTEST_MSG_ATTR_TS = 1 2243e5d0784SAlexander V. Chernikov KTEST_MSG_ATTR_FUNC = 2 2253e5d0784SAlexander V. Chernikov KTEST_MSG_ATTR_FILE = 3 2263e5d0784SAlexander V. Chernikov KTEST_MSG_ATTR_LINE = 4 2273e5d0784SAlexander V. Chernikov KTEST_MSG_ATTR_TEXT = 5 2283e5d0784SAlexander V. Chernikov KTEST_MSG_ATTR_LEVEL = 6 2293e5d0784SAlexander V. Chernikov KTEST_MSG_ATTR_META = 7 2303e5d0784SAlexander V. Chernikov 2313e5d0784SAlexander V. Chernikov 2323e5d0784SAlexander V. Chernikovclass timespec(Structure): 2333e5d0784SAlexander V. Chernikov _fields_ = [ 2343e5d0784SAlexander V. Chernikov ("tv_sec", c_int64), 2353e5d0784SAlexander V. Chernikov ("tv_nsec", c_long), 2363e5d0784SAlexander V. Chernikov ] 2373e5d0784SAlexander V. Chernikov 2383e5d0784SAlexander V. Chernikov 2393e5d0784SAlexander V. Chernikovclass NlAttrTS(NlAttr): 2403e5d0784SAlexander V. Chernikov DATA_LEN = sizeof(timespec) 2413e5d0784SAlexander V. Chernikov 2423e5d0784SAlexander V. Chernikov def __init__(self, nla_type, val): 2433e5d0784SAlexander V. Chernikov self.ts = val 2443e5d0784SAlexander V. Chernikov super().__init__(nla_type, b"") 2453e5d0784SAlexander V. Chernikov 2463e5d0784SAlexander V. Chernikov @property 2473e5d0784SAlexander V. Chernikov def nla_len(self): 2483e5d0784SAlexander V. Chernikov return NlAttr.HDR_LEN + self.DATA_LEN 2493e5d0784SAlexander V. Chernikov 2503e5d0784SAlexander V. Chernikov def _print_attr_value(self): 2513e5d0784SAlexander V. Chernikov return " tv_sec={} tv_nsec={}".format(self.ts.tv_sec, self.ts.tv_nsec) 2523e5d0784SAlexander V. Chernikov 2533e5d0784SAlexander V. Chernikov @staticmethod 2543e5d0784SAlexander V. Chernikov def _validate(data): 2553e5d0784SAlexander V. Chernikov assert len(data) == NlAttr.HDR_LEN + NlAttrTS.DATA_LEN 2563e5d0784SAlexander V. Chernikov nla_len, nla_type = struct.unpack("@HH", data[: NlAttr.HDR_LEN]) 2573e5d0784SAlexander V. Chernikov assert nla_len == NlAttr.HDR_LEN + NlAttrTS.DATA_LEN 2583e5d0784SAlexander V. Chernikov 2593e5d0784SAlexander V. Chernikov @classmethod 2603e5d0784SAlexander V. Chernikov def _parse(cls, data): 2613e5d0784SAlexander V. Chernikov nla_len, nla_type = struct.unpack("@HH", data[: NlAttr.HDR_LEN]) 2623e5d0784SAlexander V. Chernikov val = timespec.from_buffer_copy(data[NlAttr.HDR_LEN :]) 2633e5d0784SAlexander V. Chernikov return cls(nla_type, val) 2643e5d0784SAlexander V. Chernikov 2653e5d0784SAlexander V. Chernikov def __bytes__(self): 2663e5d0784SAlexander V. Chernikov return self._to_bytes(bytes(self.ts)) 2673e5d0784SAlexander V. Chernikov 2683e5d0784SAlexander V. Chernikov 2693e5d0784SAlexander V. Chernikovktest_info_attrs = prepare_attrs_map( 2703e5d0784SAlexander V. Chernikov [ 2713e5d0784SAlexander V. Chernikov AttrDescr(KtestAttrType.KTEST_ATTR_MOD_NAME, NlAttrStr), 2723e5d0784SAlexander V. Chernikov AttrDescr(KtestAttrType.KTEST_ATTR_TEST_NAME, NlAttrStr), 2733e5d0784SAlexander V. Chernikov AttrDescr(KtestAttrType.KTEST_ATTR_TEST_DESCR, NlAttrStr), 2743e5d0784SAlexander V. Chernikov ] 2753e5d0784SAlexander V. Chernikov) 2763e5d0784SAlexander V. Chernikov 2773e5d0784SAlexander V. Chernikov 2783e5d0784SAlexander V. Chernikovktest_msg_attrs = prepare_attrs_map( 2793e5d0784SAlexander V. Chernikov [ 2803e5d0784SAlexander V. Chernikov AttrDescr(KtestMsgAttrType.KTEST_MSG_ATTR_FUNC, NlAttrStr), 2813e5d0784SAlexander V. Chernikov AttrDescr(KtestMsgAttrType.KTEST_MSG_ATTR_FILE, NlAttrStr), 2823e5d0784SAlexander V. Chernikov AttrDescr(KtestMsgAttrType.KTEST_MSG_ATTR_LINE, NlAttrU32), 2833e5d0784SAlexander V. Chernikov AttrDescr(KtestMsgAttrType.KTEST_MSG_ATTR_TEXT, NlAttrStr), 2843e5d0784SAlexander V. Chernikov AttrDescr(KtestMsgAttrType.KTEST_MSG_ATTR_LEVEL, NlAttrU8), 2853e5d0784SAlexander V. Chernikov AttrDescr(KtestMsgAttrType.KTEST_MSG_ATTR_TS, NlAttrTS), 2863e5d0784SAlexander V. Chernikov ] 2873e5d0784SAlexander V. Chernikov) 2883e5d0784SAlexander V. Chernikov 2893e5d0784SAlexander V. Chernikov 2903e5d0784SAlexander V. Chernikovclass KtestInfoMessage(NetlinkGenlMessage): 2913e5d0784SAlexander V. Chernikov messages = [ 2923e5d0784SAlexander V. Chernikov NlMsgProps(KtestMsgType.KTEST_CMD_LIST, NlMsgCategory.GET), 2933e5d0784SAlexander V. Chernikov NlMsgProps(KtestMsgType.KTEST_CMD_RUN, NlMsgCategory.NEW), 2943e5d0784SAlexander V. Chernikov NlMsgProps(KtestMsgType.KTEST_CMD_NEWTEST, NlMsgCategory.NEW), 2953e5d0784SAlexander V. Chernikov ] 2963e5d0784SAlexander V. Chernikov nl_attrs_map = ktest_info_attrs 2973e5d0784SAlexander V. Chernikov family_name = KtestFamilyName 2983e5d0784SAlexander V. Chernikov 2993e5d0784SAlexander V. Chernikov 3003e5d0784SAlexander V. Chernikovclass KtestMsgMessage(NetlinkGenlMessage): 3013e5d0784SAlexander V. Chernikov messages = [ 3023e5d0784SAlexander V. Chernikov NlMsgProps(KtestMsgType.KTEST_CMD_NEWMESSAGE, NlMsgCategory.NEW), 3033e5d0784SAlexander V. Chernikov ] 3043e5d0784SAlexander V. Chernikov nl_attrs_map = ktest_msg_attrs 3053e5d0784SAlexander V. Chernikov family_name = KtestFamilyName 3063e5d0784SAlexander V. Chernikov 3073e5d0784SAlexander V. Chernikov 308fc2538cbSAlexander V. Chernikovhandler_classes = { 309f0ffe1ceSAlexander V. Chernikov CarpFamilyName: [CarpGenMessage], 310fc2538cbSAlexander V. Chernikov GenlCtrlFamilyName: [NetlinkGenlCtrlMessage], 3113e5d0784SAlexander V. Chernikov KtestFamilyName: [KtestInfoMessage, KtestMsgMessage], 312fc2538cbSAlexander V. Chernikov} 313