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