Path: blob/main/tests/atf_python/sys/netlink/netlink_route.py
39553 views
import socket1import struct2from ctypes import c_int3from ctypes import c_ubyte4from ctypes import c_uint5from ctypes import c_ushort6from ctypes import sizeof7from ctypes import Structure8from enum import auto9from enum import Enum1011from atf_python.sys.netlink.attrs import NlAttr12from atf_python.sys.netlink.attrs import NlAttrIp13from atf_python.sys.netlink.attrs import NlAttrNested14from atf_python.sys.netlink.attrs import NlAttrStr15from atf_python.sys.netlink.attrs import NlAttrU3216from atf_python.sys.netlink.attrs import NlAttrU817from atf_python.sys.netlink.message import StdNetlinkMessage18from atf_python.sys.netlink.message import NlMsgProps19from atf_python.sys.netlink.message import NlMsgCategory20from atf_python.sys.netlink.utils import AttrDescr21from atf_python.sys.netlink.utils import get_bitmask_str22from atf_python.sys.netlink.utils import prepare_attrs_map232425class RtattrType(Enum):26RTA_UNSPEC = 027RTA_DST = 128RTA_SRC = 229RTA_IIF = 330RTA_OIF = 431RTA_GATEWAY = 532RTA_PRIORITY = 633RTA_PREFSRC = 734RTA_METRICS = 835RTA_MULTIPATH = 936# RTA_PROTOINFO = 1037RTA_KNH_ID = 1038RTA_FLOW = 1139RTA_CACHEINFO = 1240RTA_SESSION = 1341# RTA_MP_ALGO = 1442RTA_RTFLAGS = 1443RTA_TABLE = 1544RTA_MARK = 1645RTA_MFC_STATS = 1746RTA_VIA = 1847RTA_NEWDST = 1948RTA_PREF = 2049RTA_ENCAP_TYPE = 2150RTA_ENCAP = 2251RTA_EXPIRES = 2352RTA_PAD = 2453RTA_UID = 2554RTA_TTL_PROPAGATE = 2655RTA_IP_PROTO = 2756RTA_SPORT = 2857RTA_DPORT = 2958RTA_NH_ID = 30596061class NlRtMsgType(Enum):62RTM_NEWLINK = 1663RTM_DELLINK = 1764RTM_GETLINK = 1865RTM_SETLINK = 1966RTM_NEWADDR = 2067RTM_DELADDR = 2168RTM_GETADDR = 2269RTM_NEWROUTE = 2470RTM_DELROUTE = 2571RTM_GETROUTE = 2672RTM_NEWNEIGH = 2873RTM_DELNEIGH = 2974RTM_GETNEIGH = 3075RTM_NEWRULE = 3276RTM_DELRULE = 3377RTM_GETRULE = 3478RTM_NEWQDISC = 3679RTM_DELQDISC = 3780RTM_GETQDISC = 3881RTM_NEWTCLASS = 4082RTM_DELTCLASS = 4183RTM_GETTCLASS = 4284RTM_NEWTFILTER = 4485RTM_DELTFILTER = 4586RTM_GETTFILTER = 4687RTM_NEWACTION = 4888RTM_DELACTION = 4989RTM_GETACTION = 5090RTM_NEWPREFIX = 5291RTM_GETMULTICAST = 5892RTM_GETANYCAST = 6293RTM_NEWNEIGHTBL = 6494RTM_GETNEIGHTBL = 6695RTM_SETNEIGHTBL = 6796RTM_NEWNDUSEROPT = 6897RTM_NEWADDRLABEL = 7298RTM_DELADDRLABEL = 7399RTM_GETADDRLABEL = 74100RTM_GETDCB = 78101RTM_SETDCB = 79102RTM_NEWNETCONF = 80103RTM_GETNETCONF = 82104RTM_NEWMDB = 84105RTM_DELMDB = 85106RTM_GETMDB = 86107RTM_NEWNSID = 88108RTM_DELNSID = 89109RTM_GETNSID = 90110RTM_NEWSTATS = 92111RTM_GETSTATS = 94112113114class RtAttr(Structure):115_fields_ = [116("rta_len", c_ushort),117("rta_type", c_ushort),118]119120121class RtMsgHdr(Structure):122_fields_ = [123("rtm_family", c_ubyte),124("rtm_dst_len", c_ubyte),125("rtm_src_len", c_ubyte),126("rtm_tos", c_ubyte),127("rtm_table", c_ubyte),128("rtm_protocol", c_ubyte),129("rtm_scope", c_ubyte),130("rtm_type", c_ubyte),131("rtm_flags", c_uint),132]133134135class RtMsgFlags(Enum):136RTM_F_NOTIFY = 0x100137RTM_F_CLONED = 0x200138RTM_F_EQUALIZE = 0x400139RTM_F_PREFIX = 0x800140RTM_F_LOOKUP_TABLE = 0x1000141RTM_F_FIB_MATCH = 0x2000142RTM_F_OFFLOAD = 0x4000143RTM_F_TRAP = 0x8000144RTM_F_OFFLOAD_FAILED = 0x20000000145146147class RtScope(Enum):148RT_SCOPE_UNIVERSE = 0149RT_SCOPE_SITE = 200150RT_SCOPE_LINK = 253151RT_SCOPE_HOST = 254152RT_SCOPE_NOWHERE = 255153154155class RtType(Enum):156RTN_UNSPEC = 0157RTN_UNICAST = auto()158RTN_LOCAL = auto()159RTN_BROADCAST = auto()160RTN_ANYCAST = auto()161RTN_MULTICAST = auto()162RTN_BLACKHOLE = auto()163RTN_UNREACHABLE = auto()164RTN_PROHIBIT = auto()165RTN_THROW = auto()166RTN_NAT = auto()167RTN_XRESOLVE = auto()168169170class RtProto(Enum):171RTPROT_UNSPEC = 0172RTPROT_REDIRECT = 1173RTPROT_KERNEL = 2174RTPROT_BOOT = 3175RTPROT_STATIC = 4176RTPROT_GATED = 8177RTPROT_RA = 9178RTPROT_MRT = 10179RTPROT_ZEBRA = 11180RTPROT_BIRD = 12181RTPROT_DNROUTED = 13182RTPROT_XORP = 14183RTPROT_NTK = 15184RTPROT_DHCP = 16185RTPROT_MROUTED = 17186RTPROT_KEEPALIVED = 18187RTPROT_BABEL = 42188RTPROT_OPENR = 99189RTPROT_BGP = 186190RTPROT_ISIS = 187191RTPROT_OSPF = 188192RTPROT_RIP = 189193RTPROT_EIGRP = 192194195196class NlRtaxType(Enum):197RTAX_UNSPEC = 0198RTAX_LOCK = auto()199RTAX_MTU = auto()200RTAX_WINDOW = auto()201RTAX_RTT = auto()202RTAX_RTTVAR = auto()203RTAX_SSTHRESH = auto()204RTAX_CWND = auto()205RTAX_ADVMSS = auto()206RTAX_REORDERING = auto()207RTAX_HOPLIMIT = auto()208RTAX_INITCWND = auto()209RTAX_FEATURES = auto()210RTAX_RTO_MIN = auto()211RTAX_INITRWND = auto()212RTAX_QUICKACK = auto()213RTAX_CC_ALGO = auto()214RTAX_FASTOPEN_NO_COOKIE = auto()215216217class RtFlagsBSD(Enum):218RTF_UP = 0x1219RTF_GATEWAY = 0x2220RTF_HOST = 0x4221RTF_REJECT = 0x8222RTF_DYNAMIC = 0x10223RTF_MODIFIED = 0x20224RTF_DONE = 0x40225RTF_XRESOLVE = 0x200226RTF_LLINFO = 0x400227RTF_LLDATA = 0x400228RTF_STATIC = 0x800229RTF_BLACKHOLE = 0x1000230RTF_PROTO2 = 0x4000231RTF_PROTO1 = 0x8000232RTF_PROTO3 = 0x40000233RTF_FIXEDMTU = 0x80000234RTF_PINNED = 0x100000235RTF_LOCAL = 0x200000236RTF_BROADCAST = 0x400000237RTF_MULTICAST = 0x800000238RTF_STICKY = 0x10000000239RTF_RNH_LOCKED = 0x40000000240RTF_GWFLAG_COMPAT = 0x80000000241242243class NlRtGroup(Enum):244RTNLGRP_NONE = 0245RTNLGRP_LINK = auto()246RTNLGRP_NOTIFY = auto()247RTNLGRP_NEIGH = auto()248RTNLGRP_TC = auto()249RTNLGRP_IPV4_IFADDR = auto()250RTNLGRP_IPV4_MROUTE = auto()251RTNLGRP_IPV4_ROUTE = auto()252RTNLGRP_IPV4_RULE = auto()253RTNLGRP_IPV6_IFADDR = auto()254RTNLGRP_IPV6_MROUTE = auto()255RTNLGRP_IPV6_ROUTE = auto()256RTNLGRP_IPV6_IFINFO = auto()257RTNLGRP_DECnet_IFADDR = auto()258RTNLGRP_NOP2 = auto()259RTNLGRP_DECnet_ROUTE = auto()260RTNLGRP_DECnet_RULE = auto()261RTNLGRP_NOP4 = auto()262RTNLGRP_IPV6_PREFIX = auto()263RTNLGRP_IPV6_RULE = auto()264RTNLGRP_ND_USEROPT = auto()265RTNLGRP_PHONET_IFADDR = auto()266RTNLGRP_PHONET_ROUTE = auto()267RTNLGRP_DCB = auto()268RTNLGRP_IPV4_NETCONF = auto()269RTNLGRP_IPV6_NETCONF = auto()270RTNLGRP_MDB = auto()271RTNLGRP_MPLS_ROUTE = auto()272RTNLGRP_NSID = auto()273RTNLGRP_MPLS_NETCONF = auto()274RTNLGRP_IPV4_MROUTE_R = auto()275RTNLGRP_IPV6_MROUTE_R = auto()276RTNLGRP_NEXTHOP = auto()277RTNLGRP_BRVLAN = auto()278279280class IfinfoMsg(Structure):281_fields_ = [282("ifi_family", c_ubyte),283("__ifi_pad", c_ubyte),284("ifi_type", c_ushort),285("ifi_index", c_int),286("ifi_flags", c_uint),287("ifi_change", c_uint),288]289290291class IflattrType(Enum):292IFLA_UNSPEC = 0293IFLA_ADDRESS = 1294IFLA_BROADCAST = 2295IFLA_IFNAME = 3296IFLA_MTU = 4297IFLA_LINK = 5298IFLA_QDISC = 6299IFLA_STATS = 7300IFLA_COST = 8301IFLA_PRIORITY = 9302IFLA_MASTER = 10303IFLA_WIRELESS = 11304IFLA_PROTINFO = 12305IFLA_TXQLEN = 13306IFLA_MAP = 14307IFLA_WEIGHT = 15308IFLA_OPERSTATE = 16309IFLA_LINKMODE = 17310IFLA_LINKINFO = 18311IFLA_NET_NS_PID = 19312IFLA_IFALIAS = 20313IFLA_NUM_VF = 21314IFLA_VFINFO_LIST = 22315IFLA_STATS64 = 23316IFLA_VF_PORTS = 24317IFLA_PORT_SELF = 25318IFLA_AF_SPEC = 26319IFLA_GROUP = 27320IFLA_NET_NS_FD = 28321IFLA_EXT_MASK = 29322IFLA_PROMISCUITY = 30323IFLA_NUM_TX_QUEUES = 31324IFLA_NUM_RX_QUEUES = 32325IFLA_CARRIER = 33326IFLA_PHYS_PORT_ID = 34327IFLA_CARRIER_CHANGES = 35328IFLA_PHYS_SWITCH_ID = 36329IFLA_LINK_NETNSID = 37330IFLA_PHYS_PORT_NAME = 38331IFLA_PROTO_DOWN = 39332IFLA_GSO_MAX_SEGS = 40333IFLA_GSO_MAX_SIZE = 41334IFLA_PAD = 42335IFLA_XDP = 43336IFLA_EVENT = 44337IFLA_NEW_NETNSID = 45338IFLA_IF_NETNSID = 46339IFLA_CARRIER_UP_COUNT = 47340IFLA_CARRIER_DOWN_COUNT = 48341IFLA_NEW_IFINDEX = 49342IFLA_MIN_MTU = 50343IFLA_MAX_MTU = 51344IFLA_PROP_LIST = 52345IFLA_ALT_IFNAME = 53346IFLA_PERM_ADDRESS = 54347IFLA_PROTO_DOWN_REASON = 55348IFLA_PARENT_DEV_NAME = 56349IFLA_PARENT_DEV_BUS_NAME = 57350IFLA_GRO_MAX_SIZE = 58351IFLA_TSO_MAX_SEGS = 59352IFLA_ALLMULTI = 60353IFLA_DEVLINK_PORT = 61354IFLA_GSO_IPV4_MAX_SIZE = 62355IFLA_GRO_IPV4_MAX_SIZE = 63356IFLA_FREEBSD = 64357358359class IflafAttrType(Enum):360IFLAF_UNSPEC = 0361IFLAF_ORIG_IFNAME = 1362IFLAF_ORIG_HWADDR = 2363364365class IflinkInfo(Enum):366IFLA_INFO_UNSPEC = 0367IFLA_INFO_KIND = auto()368IFLA_INFO_DATA = auto()369IFLA_INFO_XSTATS = auto()370IFLA_INFO_SLAVE_KIND = auto()371IFLA_INFO_SLAVE_DATA = auto()372373374class IfLinkInfoDataVlan(Enum):375IFLA_VLAN_UNSPEC = 0376IFLA_VLAN_ID = auto()377IFLA_VLAN_FLAGS = auto()378IFLA_VLAN_EGRESS_QOS = auto()379IFLA_VLAN_INGRESS_QOS = auto()380IFLA_VLAN_PROTOCOL = auto()381382383class IfaddrMsg(Structure):384_fields_ = [385("ifa_family", c_ubyte),386("ifa_prefixlen", c_ubyte),387("ifa_flags", c_ubyte),388("ifa_scope", c_ubyte),389("ifa_index", c_uint),390]391392393class IfaAttrType(Enum):394IFA_UNSPEC = 0395IFA_ADDRESS = 1396IFA_LOCAL = 2397IFA_LABEL = 3398IFA_BROADCAST = 4399IFA_ANYCAST = 5400IFA_CACHEINFO = 6401IFA_MULTICAST = 7402IFA_FLAGS = 8403IFA_RT_PRIORITY = 9404IFA_TARGET_NETNSID = 10405IFA_FREEBSD = 11406407408class IfafAttrType(Enum):409IFAF_UNSPEC = 0410IFAF_VHID = 1411IFAF_FLAGS = 2412413414class IfaCacheInfo(Structure):415_fields_ = [416("ifa_prefered", c_uint), # seconds till the end of the prefix considered preferred417("ifa_valid", c_uint), # seconds till the end of the prefix considered valid418("cstamp", c_uint), # creation time in 1ms intervals from the boot time419("tstamp", c_uint), # update time in 1ms intervals from the boot time420]421422423class IfaFlags(Enum):424IFA_F_TEMPORARY = 0x01425IFA_F_NODAD = 0x02426IFA_F_OPTIMISTIC = 0x04427IFA_F_DADFAILED = 0x08428IFA_F_HOMEADDRESS = 0x10429IFA_F_DEPRECATED = 0x20430IFA_F_TENTATIVE = 0x40431IFA_F_PERMANENT = 0x80432IFA_F_MANAGETEMPADDR = 0x100433IFA_F_NOPREFIXROUTE = 0x200434IFA_F_MCAUTOJOIN = 0x400435IFA_F_STABLE_PRIVACY = 0x800436437438class IfafFlags6(Enum):439IN6_IFF_ANYCAST = 0x01440IN6_IFF_TENTATIVE = 0x02441IN6_IFF_DUPLICATED = 0x04442IN6_IFF_DETACHED = 0x08443IN6_IFF_DEPRECATED = 0x10444IN6_IFF_NODAD = 0x20445IN6_IFF_AUTOCONF = 0x40446IN6_IFF_TEMPORARY = 0x80447IN6_IFF_PREFER_SOURCE = 0x100448449450class NdMsg(Structure):451_fields_ = [452("ndm_family", c_ubyte),453("ndm_pad1", c_ubyte),454("ndm_pad2", c_ubyte),455("ndm_ifindex", c_uint),456("ndm_state", c_ushort),457("ndm_flags", c_ubyte),458("ndm_type", c_ubyte),459]460461462class NdAttrType(Enum):463NDA_UNSPEC = 0464NDA_DST = 1465NDA_LLADDR = 2466NDA_CACHEINFO = 3467NDA_PROBES = 4468NDA_VLAN = 5469NDA_PORT = 6470NDA_VNI = 7471NDA_IFINDEX = 8472NDA_MASTER = 9473NDA_LINK_NETNSID = 10474NDA_SRC_VNI = 11475NDA_PROTOCOL = 12476NDA_NH_ID = 13477NDA_FDB_EXT_ATTRS = 14478NDA_FLAGS_EXT = 15479NDA_NDM_STATE_MASK = 16480NDA_NDM_FLAGS_MASK = 17481482483class NlAttrRtFlags(NlAttrU32):484def _print_attr_value(self):485s = get_bitmask_str(RtFlagsBSD, self.u32)486return " rtflags={}".format(s)487488489class NlAttrIfindex(NlAttrU32):490def _print_attr_value(self):491try:492ifname = socket.if_indextoname(self.u32)493return " iface={}(#{})".format(ifname, self.u32)494except OSError:495pass496return " iface=if#{}".format(self.u32)497498499class NlAttrTable(NlAttrU32):500def _print_attr_value(self):501return " rtable={}".format(self.u32)502503504class NlAttrNhId(NlAttrU32):505def _print_attr_value(self):506return " nh_id={}".format(self.u32)507508509class NlAttrKNhId(NlAttrU32):510def _print_attr_value(self):511return " knh_id={}".format(self.u32)512513514class NlAttrMac(NlAttr):515def _print_attr_value(self):516return ' mac="' + ":".join(["{:02X}".format(b) for b in self._data]) + '"'517518519class NlAttrIfStats(NlAttr):520def _print_attr_value(self):521return " stats={...}"522523524class NlAttrCacheInfo(NlAttr):525def __init__(self, nla_type, data):526super().__init__(nla_type, data)527self.ci = IfaCacheInfo.from_buffer_copy(data)528529@staticmethod530def _validate(data):531nla_len, nla_type = struct.unpack("@HH", data[:4])532data_len = nla_len - 4533if data_len != sizeof(IfaCacheInfo):534raise ValueError(535"Error validating attr {}: wrong size".format(nla_type)536) # noqa: E501537538def _print_attr_value(self):539return " ifa_prefered={} ifa_valid={} cstamp={} tstamp={}".format(540self.ci.ifa_prefered, self.ci.ifa_valid, self.ci.cstamp, self.ci.tstamp)541542543class NlAttrVia(NlAttr):544def __init__(self, nla_type, family, addr: str):545super().__init__(nla_type, b"")546self.addr = addr547self.family = family548549@staticmethod550def _validate(data):551nla_len, nla_type = struct.unpack("@HH", data[:4])552data_len = nla_len - 4553if data_len == 0:554raise ValueError(555"Error validating attr {}: empty data".format(nla_type)556) # noqa: E501557family = int(data_len[0])558if family not in (socket.AF_INET, socket.AF_INET6):559raise ValueError(560"Error validating attr {}: unsupported AF {}".format( # noqa: E501561nla_type, family562)563)564if family == socket.AF_INET:565expected_len = 1 + 4566else:567expected_len = 1 + 16568if data_len != expected_len:569raise ValueError(570"Error validating attr {}: expected len {} got {}".format( # noqa: E501571nla_type, expected_len, data_len572)573)574575@property576def nla_len(self):577if self.family == socket.AF_INET6:578return 21579else:580return 9581582@classmethod583def _parse(cls, data):584nla_len, nla_type, family = struct.unpack("@HHB", data[:5])585off = 5586if family == socket.AF_INET:587addr = socket.inet_ntop(family, data[off:off + 4])588else:589addr = socket.inet_ntop(family, data[off:off + 16])590return cls(nla_type, family, addr)591592def __bytes__(self):593addr = socket.inet_pton(self.family, self.addr)594return self._to_bytes(struct.pack("@B", self.family) + addr)595596def _print_attr_value(self):597return " via={}".format(self.addr)598599600rtnl_route_attrs = prepare_attrs_map(601[602AttrDescr(RtattrType.RTA_DST, NlAttrIp),603AttrDescr(RtattrType.RTA_SRC, NlAttrIp),604AttrDescr(RtattrType.RTA_IIF, NlAttrIfindex),605AttrDescr(RtattrType.RTA_OIF, NlAttrIfindex),606AttrDescr(RtattrType.RTA_GATEWAY, NlAttrIp),607AttrDescr(RtattrType.RTA_TABLE, NlAttrTable),608AttrDescr(RtattrType.RTA_PRIORITY, NlAttrU32),609AttrDescr(RtattrType.RTA_VIA, NlAttrVia),610AttrDescr(RtattrType.RTA_NH_ID, NlAttrNhId),611AttrDescr(RtattrType.RTA_KNH_ID, NlAttrKNhId),612AttrDescr(RtattrType.RTA_RTFLAGS, NlAttrRtFlags),613AttrDescr(614RtattrType.RTA_METRICS,615NlAttrNested,616[617AttrDescr(NlRtaxType.RTAX_MTU, NlAttrU32),618],619),620]621)622623rtnl_ifla_attrs = prepare_attrs_map(624[625AttrDescr(IflattrType.IFLA_ADDRESS, NlAttrMac),626AttrDescr(IflattrType.IFLA_BROADCAST, NlAttrMac),627AttrDescr(IflattrType.IFLA_IFNAME, NlAttrStr),628AttrDescr(IflattrType.IFLA_MTU, NlAttrU32),629AttrDescr(IflattrType.IFLA_LINK, NlAttrU32),630AttrDescr(IflattrType.IFLA_PROMISCUITY, NlAttrU32),631AttrDescr(IflattrType.IFLA_OPERSTATE, NlAttrU8),632AttrDescr(IflattrType.IFLA_CARRIER, NlAttrU8),633AttrDescr(IflattrType.IFLA_IFALIAS, NlAttrStr),634AttrDescr(IflattrType.IFLA_STATS64, NlAttrIfStats),635AttrDescr(IflattrType.IFLA_NEW_IFINDEX, NlAttrU32),636AttrDescr(637IflattrType.IFLA_LINKINFO,638NlAttrNested,639[640AttrDescr(IflinkInfo.IFLA_INFO_KIND, NlAttrStr),641AttrDescr(IflinkInfo.IFLA_INFO_DATA, NlAttr),642],643),644AttrDescr(645IflattrType.IFLA_FREEBSD,646NlAttrNested,647[648AttrDescr(IflafAttrType.IFLAF_ORIG_HWADDR, NlAttrMac),649],650),651]652)653654rtnl_ifa_attrs = prepare_attrs_map(655[656AttrDescr(IfaAttrType.IFA_ADDRESS, NlAttrIp),657AttrDescr(IfaAttrType.IFA_LOCAL, NlAttrIp),658AttrDescr(IfaAttrType.IFA_LABEL, NlAttrStr),659AttrDescr(IfaAttrType.IFA_BROADCAST, NlAttrIp),660AttrDescr(IfaAttrType.IFA_ANYCAST, NlAttrIp),661AttrDescr(IfaAttrType.IFA_FLAGS, NlAttrU32),662AttrDescr(IfaAttrType.IFA_CACHEINFO, NlAttrCacheInfo),663AttrDescr(664IfaAttrType.IFA_FREEBSD,665NlAttrNested,666[667AttrDescr(IfafAttrType.IFAF_VHID, NlAttrU32),668AttrDescr(IfafAttrType.IFAF_FLAGS, NlAttrU32),669],670),671]672)673674675rtnl_nd_attrs = prepare_attrs_map(676[677AttrDescr(NdAttrType.NDA_DST, NlAttrIp),678AttrDescr(NdAttrType.NDA_IFINDEX, NlAttrIfindex),679AttrDescr(NdAttrType.NDA_FLAGS_EXT, NlAttrU32),680AttrDescr(NdAttrType.NDA_LLADDR, NlAttrMac),681]682)683684685class BaseNetlinkRtMessage(StdNetlinkMessage):686pass687688689class NetlinkRtMessage(BaseNetlinkRtMessage):690messages = [691NlMsgProps(NlRtMsgType.RTM_NEWROUTE, NlMsgCategory.NEW),692NlMsgProps(NlRtMsgType.RTM_DELROUTE, NlMsgCategory.DELETE),693NlMsgProps(NlRtMsgType.RTM_GETROUTE, NlMsgCategory.GET),694]695nl_attrs_map = rtnl_route_attrs696697def __init__(self, helper, nlm_type):698super().__init__(helper, nlm_type)699self.base_hdr = RtMsgHdr()700701def parse_base_header(self, data):702if len(data) < sizeof(RtMsgHdr):703raise ValueError("length less than rtmsg header")704rtm_hdr = RtMsgHdr.from_buffer_copy(data)705return (rtm_hdr, sizeof(RtMsgHdr))706707def print_base_header(self, hdr, prepend=""):708family = self.helper.get_af_name(hdr.rtm_family)709print(710"{}family={}, dst_len={}, src_len={}, tos={}, table={}, protocol={}({}), scope={}({}), type={}({}), flags={}({})".format( # noqa: E501711prepend,712family,713hdr.rtm_dst_len,714hdr.rtm_src_len,715hdr.rtm_tos,716hdr.rtm_table,717self.helper.get_attr_byval(RtProto, hdr.rtm_protocol),718hdr.rtm_protocol,719self.helper.get_attr_byval(RtScope, hdr.rtm_scope),720hdr.rtm_scope,721self.helper.get_attr_byval(RtType, hdr.rtm_type),722hdr.rtm_type,723self.helper.get_bitmask_str(RtMsgFlags, hdr.rtm_flags),724hdr.rtm_flags,725)726)727728729class NetlinkIflaMessage(BaseNetlinkRtMessage):730messages = [731NlMsgProps(NlRtMsgType.RTM_NEWLINK, NlMsgCategory.NEW),732NlMsgProps(NlRtMsgType.RTM_DELLINK, NlMsgCategory.DELETE),733NlMsgProps(NlRtMsgType.RTM_GETLINK, NlMsgCategory.GET),734]735nl_attrs_map = rtnl_ifla_attrs736737def __init__(self, helper, nlm_type):738super().__init__(helper, nlm_type)739self.base_hdr = IfinfoMsg()740741def parse_base_header(self, data):742if len(data) < sizeof(IfinfoMsg):743raise ValueError("length less than IfinfoMsg header")744rtm_hdr = IfinfoMsg.from_buffer_copy(data)745return (rtm_hdr, sizeof(IfinfoMsg))746747def print_base_header(self, hdr, prepend=""):748family = self.helper.get_af_name(hdr.ifi_family)749print(750"{}family={}, ifi_type={}, ifi_index={}, ifi_flags={}, ifi_change={}".format( # noqa: E501751prepend,752family,753hdr.ifi_type,754hdr.ifi_index,755hdr.ifi_flags,756hdr.ifi_change,757)758)759760761class NetlinkIfaMessage(BaseNetlinkRtMessage):762messages = [763NlMsgProps(NlRtMsgType.RTM_NEWADDR, NlMsgCategory.NEW),764NlMsgProps(NlRtMsgType.RTM_DELADDR, NlMsgCategory.DELETE),765NlMsgProps(NlRtMsgType.RTM_GETADDR, NlMsgCategory.GET),766]767nl_attrs_map = rtnl_ifa_attrs768769def __init__(self, helper, nlm_type):770super().__init__(helper, nlm_type)771self.base_hdr = IfaddrMsg()772773def parse_base_header(self, data):774if len(data) < sizeof(IfaddrMsg):775raise ValueError("length less than IfaddrMsg header")776rtm_hdr = IfaddrMsg.from_buffer_copy(data)777return (rtm_hdr, sizeof(IfaddrMsg))778779def print_base_header(self, hdr, prepend=""):780family = self.helper.get_af_name(hdr.ifa_family)781print(782"{}family={}, ifa_prefixlen={}, ifa_flags={}, ifa_scope={}, ifa_index={}".format( # noqa: E501783prepend,784family,785hdr.ifa_prefixlen,786hdr.ifa_flags,787hdr.ifa_scope,788hdr.ifa_index,789)790)791792793class NetlinkNdMessage(BaseNetlinkRtMessage):794messages = [795NlMsgProps(NlRtMsgType.RTM_NEWNEIGH, NlMsgCategory.NEW),796NlMsgProps(NlRtMsgType.RTM_DELNEIGH, NlMsgCategory.DELETE),797NlMsgProps(NlRtMsgType.RTM_GETNEIGH, NlMsgCategory.GET),798]799nl_attrs_map = rtnl_nd_attrs800801def __init__(self, helper, nlm_type):802super().__init__(helper, nlm_type)803self.base_hdr = NdMsg()804805def parse_base_header(self, data):806if len(data) < sizeof(NdMsg):807raise ValueError("length less than NdMsg header")808nd_hdr = NdMsg.from_buffer_copy(data)809return (nd_hdr, sizeof(NdMsg))810811def print_base_header(self, hdr, prepend=""):812family = self.helper.get_af_name(hdr.ndm_family)813print(814"{}family={}, ndm_ifindex={}, ndm_state={}, ndm_flags={}".format( # noqa: E501815prepend,816family,817hdr.ndm_ifindex,818hdr.ndm_state,819hdr.ndm_flags,820)821)822823824handler_classes = {825"netlink_route": [826NetlinkRtMessage,827NetlinkIflaMessage,828NetlinkIfaMessage,829NetlinkNdMessage,830],831}832833834