2 Netlink message generation/parsing
4 Copyright 2007 Johannes Berg <johannes@sipsolutions.net>
6 GPLv2+; See copying for details.
10 from iotop
.netlink
import NLM_F_REQUEST
, NLMSG_MIN_TYPE
, Message
11 from iotop
.netlink
import parse_attributes
12 from iotop
.netlink
import NulStrAttr
, Connection
, NETLINK_GENERIC
15 CTRL_CMD_NEWFAMILY
= 1
16 CTRL_CMD_DELFAMILY
= 2
17 CTRL_CMD_GETFAMILY
= 3
23 CTRL_ATTR_FAMILY_ID
= 1
24 CTRL_ATTR_FAMILY_NAME
= 2
32 def __init__(self
, cmd
, version
=0):
34 self
.version
= version
37 return struct
.pack("BBxx", self
.cmd
, self
.version
)
40 def _genl_hdr_parse(data
):
41 return GenlHdr(*struct
.unpack("BBxx", data
))
43 GENL_ID_CTRL
= NLMSG_MIN_TYPE
46 class GeNlMessage(Message
):
47 def __init__(self
, family
, cmd
, attrs
=[], flags
=0):
51 Message
.__init
__(self
, family
, flags
=flags
,
52 payload
=[GenlHdr(self
.cmd
)] + attrs
)
58 hdr
= _genl_hdr_parse(packet
[:4])
60 genlmsg
= GeNlMessage(msg
.type, hdr
.cmd
, [], msg
.flags
)
61 genlmsg
.attrs
= parse_attributes(packet
[4:])
62 genlmsg
.version
= hdr
.version
68 def __init__(self
, conn
):
71 def get_family_id(self
, family
):
72 a
= NulStrAttr(CTRL_ATTR_FAMILY_NAME
, family
)
73 m
= GeNlMessage(GENL_ID_CTRL
, CTRL_CMD_GETFAMILY
,
74 flags
=NLM_F_REQUEST
, attrs
=[a
])
76 m
= GeNlMessage
.recv(self
.conn
)
77 return m
.attrs
[CTRL_ATTR_FAMILY_ID
].u16()
79 connection
= Connection(NETLINK_GENERIC
)
80 controller
= Controller(connection
)