Blame iotop/genetlink.py

Packit 88fe6f
'''
Packit 88fe6f
Netlink message generation/parsing
Packit 88fe6f
Packit 88fe6f
Copyright 2007        Johannes Berg <johannes@sipsolutions.net>
Packit 88fe6f
Packit 88fe6f
GPLv2+; See copying for details.
Packit 88fe6f
'''
Packit 88fe6f
Packit 88fe6f
import struct
Packit 88fe6f
from iotop.netlink import NLM_F_REQUEST, NLMSG_MIN_TYPE, Message, parse_attributes
Packit 88fe6f
from iotop.netlink import NulStrAttr, Connection, NETLINK_GENERIC
Packit 88fe6f
Packit 88fe6f
CTRL_CMD_UNSPEC       = 0
Packit 88fe6f
CTRL_CMD_NEWFAMILY    = 1
Packit 88fe6f
CTRL_CMD_DELFAMILY    = 2
Packit 88fe6f
CTRL_CMD_GETFAMILY    = 3
Packit 88fe6f
CTRL_CMD_NEWOPS       = 4
Packit 88fe6f
CTRL_CMD_DELOPS       = 5
Packit 88fe6f
CTRL_CMD_GETOPS       = 6
Packit 88fe6f
Packit 88fe6f
CTRL_ATTR_UNSPEC      = 0
Packit 88fe6f
CTRL_ATTR_FAMILY_ID   = 1
Packit 88fe6f
CTRL_ATTR_FAMILY_NAME = 2
Packit 88fe6f
CTRL_ATTR_VERSION     = 3
Packit 88fe6f
CTRL_ATTR_HDRSIZE     = 4
Packit 88fe6f
CTRL_ATTR_MAXATTR     = 5
Packit 88fe6f
CTRL_ATTR_OPS         = 6
Packit 88fe6f
Packit 88fe6f
class GenlHdr:
Packit 88fe6f
    def __init__(self, cmd, version = 0):
Packit 88fe6f
        self.cmd = cmd
Packit 88fe6f
        self.version = version
Packit 88fe6f
    def _dump(self):
Packit 88fe6f
        return struct.pack("BBxx", self.cmd, self.version)
Packit 88fe6f
Packit 88fe6f
def _genl_hdr_parse(data):
Packit 88fe6f
    return GenlHdr(*struct.unpack("BBxx", data))
Packit 88fe6f
Packit 88fe6f
GENL_ID_CTRL        = NLMSG_MIN_TYPE
Packit 88fe6f
Packit 88fe6f
class GeNlMessage(Message):
Packit 88fe6f
    def __init__(self, family, cmd, attrs=[], flags=0):
Packit 88fe6f
        self.cmd = cmd
Packit 88fe6f
        self.attrs = attrs
Packit 88fe6f
        self.family = family
Packit 88fe6f
        Message.__init__(self, family, flags=flags,
Packit 88fe6f
                         payload=[GenlHdr(self.cmd)]+attrs)
Packit 88fe6f
Packit 88fe6f
    @staticmethod
Packit 88fe6f
    def recv(conn):
Packit 88fe6f
        msg = conn.recv()
Packit 88fe6f
        packet = msg.payload
Packit 88fe6f
        hdr = _genl_hdr_parse(packet[:4])
Packit 88fe6f
Packit 88fe6f
        genlmsg = GeNlMessage(msg.type, hdr.cmd, [], msg.flags)
Packit 88fe6f
        genlmsg.attrs = parse_attributes(packet[4:])
Packit 88fe6f
        genlmsg.version = hdr.version
Packit 88fe6f
Packit 88fe6f
        return genlmsg
Packit 88fe6f
Packit 88fe6f
class Controller:
Packit 88fe6f
    def __init__(self, conn):
Packit 88fe6f
        self.conn = conn
Packit 88fe6f
    def get_family_id(self, family):
Packit 88fe6f
        a = NulStrAttr(CTRL_ATTR_FAMILY_NAME, family)
Packit 88fe6f
        m = GeNlMessage(GENL_ID_CTRL, CTRL_CMD_GETFAMILY,
Packit 88fe6f
                        flags=NLM_F_REQUEST, attrs=[a])
Packit 88fe6f
        m.send(self.conn)
Packit 88fe6f
        m = GeNlMessage.recv(self.conn)
Packit 88fe6f
        return m.attrs[CTRL_ATTR_FAMILY_ID].u16()
Packit 88fe6f
Packit 88fe6f
connection = Connection(NETLINK_GENERIC)
Packit 88fe6f
controller = Controller(connection)