xref: /freebsd-src/tests/atf_python/sys/netlink/netlink_generic.py (revision 54b955f4df5e76b5679ba7f3eb6bb2d5fc62923d)
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