class TaskStatsNetlink(object): # Keep in sync with format_stats() and pinfo.did_some_io() def __init__(self, options): self.options = options self.connection = Connection(NETLINK_GENERIC) controller = Controller(self.connection) self.family_id = controller.get_family_id('TASKSTATS') def build_request(self, tid): return GeNlMessage(self.family_id, cmd=TASKSTATS_CMD_GET, attrs=[U32Attr(TASKSTATS_CMD_ATTR_PID, tid)], flags=NLM_F_REQUEST) def get_single_task_stats(self, thread): thread.task_stats_request.send(self.connection) try: reply = self.connection.recv() except OSError, e: if e.errno == errno.ESRCH: # OSError: Netlink error: No such process (3) return raise if len(reply.payload) < 292: # Short reply return reply_data = reply.payload[20:] reply_length, reply_type = struct.unpack('HH', reply.payload[4:8]) reply_version = struct.unpack('H', reply.payload[20:22])[0] assert reply_length >= 288 assert reply_type == TASKSTATS_CMD_ATTR_PID + 3 assert reply_version >= 4 return Stats(reply_data)
def __init__(self, intf): self.conn = Connection(NETLINK_ROUTE) self.intf = intf
def __init__(self, options): self.options = options self.connection = Connection(NETLINK_GENERIC) controller = Controller(self.connection) self.family_id = controller.get_family_id('TASKSTATS')
self.attrs = attrs self.family = family Message.__init__(self, family, flags=flags, payload=[GenlHdr(self.cmd)]+attrs) @staticmethod def recv(conn): msg = conn.recv() packet = msg.payload hdr = _genl_hdr_parse(packet[:4]) genlmsg = GeNlMessage(msg.type, hdr.cmd, [], msg.flags) genlmsg.attrs = parse_attributes(packet[4:]) genlmsg.version = hdr.version return genlmsg class Controller: def __init__(self, conn): self.conn = conn def get_family_id(self, family): a = NulStrAttr(CTRL_ATTR_FAMILY_NAME, family) m = GeNlMessage(GENL_ID_CTRL, CTRL_CMD_GETFAMILY, flags=NLM_F_REQUEST, attrs=[a]) m.send(self.conn) m = GeNlMessage.recv(self.conn) return m.attrs[CTRL_ATTR_FAMILY_ID].u16() connection = Connection(NETLINK_GENERIC) controller = Controller(connection)