xref: /freebsd/tests/atf_python/sys/netlink/netlink_generic.py (revision d8e36cd2b10f78470c1de56337f685c10ce26ed2)
1#!/usr/local/bin/python3
2from ctypes import sizeof
3from enum import Enum
4
5from atf_python.sys.netlink.attrs import NlAttrStr
6from atf_python.sys.netlink.attrs import NlAttrU16
7from atf_python.sys.netlink.attrs import NlAttrU32
8from atf_python.sys.netlink.base_headers import GenlMsgHdr
9from atf_python.sys.netlink.message import NlMsgCategory
10from atf_python.sys.netlink.message import NlMsgProps
11from atf_python.sys.netlink.message import StdNetlinkMessage
12from atf_python.sys.netlink.utils import AttrDescr
13from atf_python.sys.netlink.utils import prepare_attrs_map
14from atf_python.sys.netlink.utils import enum_or_int
15
16
17class NetlinkGenlMessage(StdNetlinkMessage):
18    messages = []
19    nl_attrs_map = {}
20    family_name = None
21
22    def __init__(self, helper, family_id, cmd=0):
23        super().__init__(helper, family_id)
24        self.base_hdr = GenlMsgHdr(cmd=enum_or_int(cmd))
25
26    def parse_base_header(self, data):
27        if len(data) < sizeof(GenlMsgHdr):
28            raise ValueError("length less than GenlMsgHdr header")
29        ghdr = GenlMsgHdr.from_buffer_copy(data)
30        return (ghdr, sizeof(GenlMsgHdr))
31
32    def _get_msg_type(self):
33        return self.base_hdr.cmd
34
35    def print_nl_header(self, prepend=""):
36        # len=44, type=RTM_DELROUTE, flags=NLM_F_REQUEST|NLM_F_ACK, seq=1641163704, pid=0  # noqa: E501
37        hdr = self.nl_hdr
38        print(
39            "{}len={}, family={}, flags={}(0x{:X}), seq={}, pid={}".format(
40                prepend,
41                hdr.nlmsg_len,
42                self.family_name,
43                self.get_nlm_flags_str(),
44                hdr.nlmsg_flags,
45                hdr.nlmsg_seq,
46                hdr.nlmsg_pid,
47            )
48        )
49
50    def print_base_header(self, hdr, prepend=""):
51        print(
52            "{}cmd={} version={} reserved={}".format(
53                prepend, self.msg_name, hdr.version, hdr.reserved
54            )
55        )
56
57
58GenlCtrlFamilyName = "nlctrl"
59
60class GenlCtrlMsgType(Enum):
61    CTRL_CMD_UNSPEC = 0
62    CTRL_CMD_NEWFAMILY = 1
63    CTRL_CMD_DELFAMILY = 2
64    CTRL_CMD_GETFAMILY = 3
65    CTRL_CMD_NEWOPS = 4
66    CTRL_CMD_DELOPS = 5
67    CTRL_CMD_GETOPS = 6
68    CTRL_CMD_NEWMCAST_GRP = 7
69    CTRL_CMD_DELMCAST_GRP = 8
70    CTRL_CMD_GETMCAST_GRP = 9
71    CTRL_CMD_GETPOLICY = 10
72
73
74class GenlCtrlAttrType(Enum):
75    CTRL_ATTR_FAMILY_ID = 1
76    CTRL_ATTR_FAMILY_NAME = 2
77    CTRL_ATTR_VERSION = 3
78    CTRL_ATTR_HDRSIZE = 4
79    CTRL_ATTR_MAXATTR = 5
80    CTRL_ATTR_OPS = 6
81    CTRL_ATTR_MCAST_GROUPS = 7
82    CTRL_ATTR_POLICY = 8
83    CTRL_ATTR_OP_POLICY = 9
84    CTRL_ATTR_OP = 10
85
86
87genl_ctrl_attrs = prepare_attrs_map(
88    [
89        AttrDescr(GenlCtrlAttrType.CTRL_ATTR_FAMILY_ID, NlAttrU16),
90        AttrDescr(GenlCtrlAttrType.CTRL_ATTR_FAMILY_NAME, NlAttrStr),
91        AttrDescr(GenlCtrlAttrType.CTRL_ATTR_VERSION, NlAttrU32),
92        AttrDescr(GenlCtrlAttrType.CTRL_ATTR_HDRSIZE, NlAttrU32),
93        AttrDescr(GenlCtrlAttrType.CTRL_ATTR_MAXATTR, NlAttrU32),
94    ]
95)
96
97
98class NetlinkGenlCtrlMessage(NetlinkGenlMessage):
99    messages = [
100        NlMsgProps(GenlCtrlMsgType.CTRL_CMD_NEWFAMILY, NlMsgCategory.NEW),
101        NlMsgProps(GenlCtrlMsgType.CTRL_CMD_GETFAMILY, NlMsgCategory.GET),
102        NlMsgProps(GenlCtrlMsgType.CTRL_CMD_DELFAMILY, NlMsgCategory.DELETE),
103    ]
104    nl_attrs_map = genl_ctrl_attrs
105    family_name = GenlCtrlFamilyName
106
107
108handler_classes = {
109    GenlCtrlFamilyName: [NetlinkGenlCtrlMessage],
110}
111