2 Netlink message generation/parsing
4 Copyright 2007 Johannes Berg <johannes@sipsolutions.net>
6 GPLv2+; See copying for details.
10 from netlink
import NLM_F_REQUEST
, NLMSG_MIN_TYPE
, Message
, parse_attributes
11 from netlink
import NulStrAttr
, Connection
, NETLINK_GENERIC
14 CTRL_CMD_NEWFAMILY
= 1
15 CTRL_CMD_DELFAMILY
= 2
16 CTRL_CMD_GETFAMILY
= 3
22 CTRL_ATTR_FAMILY_ID
= 1
23 CTRL_ATTR_FAMILY_NAME
= 2
30 def __init__(self
, cmd
, version
= 0):
32 self
.version
= version
34 return struct
.pack("BBxx", self
.cmd
, self
.version
)
36 def _genl_hdr_parse(data
):
37 return GenlHdr(*struct
.unpack("BBxx", data
))
39 GENL_ID_CTRL
= NLMSG_MIN_TYPE
41 class GeNlMessage(Message
):
42 def __init__(self
, family
, cmd
, attrs
=[], flags
=0):
46 Message
.__init
__(self
, family
, flags
=flags
,
47 payload
=[GenlHdr(self
.cmd
)]+attrs
)
53 hdr
= _genl_hdr_parse(packet
[:4])
55 genlmsg
= GeNlMessage(msg
.type, hdr
.cmd
, [], msg
.flags
)
56 genlmsg
.attrs
= parse_attributes(packet
[4:])
57 genlmsg
.version
= hdr
.version
62 def __init__(self
, conn
):
64 def get_family_id(self
, family
):
65 a
= NulStrAttr(CTRL_ATTR_FAMILY_NAME
, family
)
66 m
= GeNlMessage(GENL_ID_CTRL
, CTRL_CMD_GETFAMILY
,
67 flags
=NLM_F_REQUEST
, attrs
=[a
])
69 m
= GeNlMessage
.recv(self
.conn
)
70 return m
.attrs
[CTRL_ATTR_FAMILY_ID
].u16()
72 connection
= Connection(NETLINK_GENERIC
)
73 controller
= Controller(connection
)