1fee65b7eSAlexander V. Chernikovimport socket 2fee65b7eSAlexander V. Chernikovimport struct 3fee65b7eSAlexander V. Chernikovfrom ctypes import c_int 4fee65b7eSAlexander V. Chernikovfrom ctypes import c_ubyte 5fee65b7eSAlexander V. Chernikovfrom ctypes import c_uint 6fee65b7eSAlexander V. Chernikovfrom ctypes import c_ushort 7fee65b7eSAlexander V. Chernikovfrom ctypes import sizeof 8fee65b7eSAlexander V. Chernikovfrom ctypes import Structure 9fee65b7eSAlexander V. Chernikovfrom enum import auto 10fee65b7eSAlexander V. Chernikovfrom enum import Enum 11fee65b7eSAlexander V. Chernikov 12fee65b7eSAlexander V. Chernikovfrom atf_python.sys.netlink.attrs import NlAttr 13fee65b7eSAlexander V. Chernikovfrom atf_python.sys.netlink.attrs import NlAttrIp 14fee65b7eSAlexander V. Chernikovfrom atf_python.sys.netlink.attrs import NlAttrNested 15fee65b7eSAlexander V. Chernikovfrom atf_python.sys.netlink.attrs import NlAttrStr 16fee65b7eSAlexander V. Chernikovfrom atf_python.sys.netlink.attrs import NlAttrU32 17fee65b7eSAlexander V. Chernikovfrom atf_python.sys.netlink.attrs import NlAttrU8 18fee65b7eSAlexander V. Chernikovfrom atf_python.sys.netlink.message import StdNetlinkMessage 19fc2538cbSAlexander V. Chernikovfrom atf_python.sys.netlink.message import NlMsgProps 20fc2538cbSAlexander V. Chernikovfrom atf_python.sys.netlink.message import NlMsgCategory 21fee65b7eSAlexander V. Chernikovfrom atf_python.sys.netlink.utils import AttrDescr 22fee65b7eSAlexander V. Chernikovfrom atf_python.sys.netlink.utils import get_bitmask_str 23fee65b7eSAlexander V. Chernikovfrom atf_python.sys.netlink.utils import prepare_attrs_map 24fee65b7eSAlexander V. Chernikov 25fee65b7eSAlexander V. Chernikov 26fee65b7eSAlexander V. Chernikovclass RtattrType(Enum): 27fee65b7eSAlexander V. Chernikov RTA_UNSPEC = 0 28fee65b7eSAlexander V. Chernikov RTA_DST = 1 29fee65b7eSAlexander V. Chernikov RTA_SRC = 2 30fee65b7eSAlexander V. Chernikov RTA_IIF = 3 31fee65b7eSAlexander V. Chernikov RTA_OIF = 4 32fee65b7eSAlexander V. Chernikov RTA_GATEWAY = 5 33fee65b7eSAlexander V. Chernikov RTA_PRIORITY = 6 34fee65b7eSAlexander V. Chernikov RTA_PREFSRC = 7 35fee65b7eSAlexander V. Chernikov RTA_METRICS = 8 36fee65b7eSAlexander V. Chernikov RTA_MULTIPATH = 9 37fee65b7eSAlexander V. Chernikov # RTA_PROTOINFO = 10 38fee65b7eSAlexander V. Chernikov RTA_KNH_ID = 10 39fee65b7eSAlexander V. Chernikov RTA_FLOW = 11 40fee65b7eSAlexander V. Chernikov RTA_CACHEINFO = 12 41fee65b7eSAlexander V. Chernikov RTA_SESSION = 13 42fee65b7eSAlexander V. Chernikov # RTA_MP_ALGO = 14 43fee65b7eSAlexander V. Chernikov RTA_RTFLAGS = 14 44fee65b7eSAlexander V. Chernikov RTA_TABLE = 15 45fee65b7eSAlexander V. Chernikov RTA_MARK = 16 46fee65b7eSAlexander V. Chernikov RTA_MFC_STATS = 17 47fee65b7eSAlexander V. Chernikov RTA_VIA = 18 48fee65b7eSAlexander V. Chernikov RTA_NEWDST = 19 49fee65b7eSAlexander V. Chernikov RTA_PREF = 20 50fee65b7eSAlexander V. Chernikov RTA_ENCAP_TYPE = 21 51fee65b7eSAlexander V. Chernikov RTA_ENCAP = 22 52fee65b7eSAlexander V. Chernikov RTA_EXPIRES = 23 53fee65b7eSAlexander V. Chernikov RTA_PAD = 24 54fee65b7eSAlexander V. Chernikov RTA_UID = 25 55fee65b7eSAlexander V. Chernikov RTA_TTL_PROPAGATE = 26 56fee65b7eSAlexander V. Chernikov RTA_IP_PROTO = 27 57fee65b7eSAlexander V. Chernikov RTA_SPORT = 28 58fee65b7eSAlexander V. Chernikov RTA_DPORT = 29 59fee65b7eSAlexander V. Chernikov RTA_NH_ID = 30 60fee65b7eSAlexander V. Chernikov 61fee65b7eSAlexander V. Chernikov 62fee65b7eSAlexander V. Chernikovclass NlRtMsgType(Enum): 63fee65b7eSAlexander V. Chernikov RTM_NEWLINK = 16 64fee65b7eSAlexander V. Chernikov RTM_DELLINK = 17 65fee65b7eSAlexander V. Chernikov RTM_GETLINK = 18 66fee65b7eSAlexander V. Chernikov RTM_SETLINK = 19 67fee65b7eSAlexander V. Chernikov RTM_NEWADDR = 20 68fee65b7eSAlexander V. Chernikov RTM_DELADDR = 21 69fee65b7eSAlexander V. Chernikov RTM_GETADDR = 22 70fee65b7eSAlexander V. Chernikov RTM_NEWROUTE = 24 71fee65b7eSAlexander V. Chernikov RTM_DELROUTE = 25 72fee65b7eSAlexander V. Chernikov RTM_GETROUTE = 26 73fee65b7eSAlexander V. Chernikov RTM_NEWNEIGH = 28 74fee65b7eSAlexander V. Chernikov RTM_DELNEIGH = 29 75fee65b7eSAlexander V. Chernikov RTM_GETNEIGH = 30 76fee65b7eSAlexander V. Chernikov RTM_NEWRULE = 32 77fee65b7eSAlexander V. Chernikov RTM_DELRULE = 33 78fee65b7eSAlexander V. Chernikov RTM_GETRULE = 34 79fee65b7eSAlexander V. Chernikov RTM_NEWQDISC = 36 80fee65b7eSAlexander V. Chernikov RTM_DELQDISC = 37 81fee65b7eSAlexander V. Chernikov RTM_GETQDISC = 38 82fee65b7eSAlexander V. Chernikov RTM_NEWTCLASS = 40 83fee65b7eSAlexander V. Chernikov RTM_DELTCLASS = 41 84fee65b7eSAlexander V. Chernikov RTM_GETTCLASS = 42 85fee65b7eSAlexander V. Chernikov RTM_NEWTFILTER = 44 86fee65b7eSAlexander V. Chernikov RTM_DELTFILTER = 45 87fee65b7eSAlexander V. Chernikov RTM_GETTFILTER = 46 88fee65b7eSAlexander V. Chernikov RTM_NEWACTION = 48 89fee65b7eSAlexander V. Chernikov RTM_DELACTION = 49 90fee65b7eSAlexander V. Chernikov RTM_GETACTION = 50 91fee65b7eSAlexander V. Chernikov RTM_NEWPREFIX = 52 92fee65b7eSAlexander V. Chernikov RTM_GETMULTICAST = 58 93fee65b7eSAlexander V. Chernikov RTM_GETANYCAST = 62 94fee65b7eSAlexander V. Chernikov RTM_NEWNEIGHTBL = 64 95fee65b7eSAlexander V. Chernikov RTM_GETNEIGHTBL = 66 96fee65b7eSAlexander V. Chernikov RTM_SETNEIGHTBL = 67 97fee65b7eSAlexander V. Chernikov RTM_NEWNDUSEROPT = 68 98fee65b7eSAlexander V. Chernikov RTM_NEWADDRLABEL = 72 99fee65b7eSAlexander V. Chernikov RTM_DELADDRLABEL = 73 100fee65b7eSAlexander V. Chernikov RTM_GETADDRLABEL = 74 101fee65b7eSAlexander V. Chernikov RTM_GETDCB = 78 102fee65b7eSAlexander V. Chernikov RTM_SETDCB = 79 103fee65b7eSAlexander V. Chernikov RTM_NEWNETCONF = 80 104fee65b7eSAlexander V. Chernikov RTM_GETNETCONF = 82 105fee65b7eSAlexander V. Chernikov RTM_NEWMDB = 84 106fee65b7eSAlexander V. Chernikov RTM_DELMDB = 85 107fee65b7eSAlexander V. Chernikov RTM_GETMDB = 86 108fee65b7eSAlexander V. Chernikov RTM_NEWNSID = 88 109fee65b7eSAlexander V. Chernikov RTM_DELNSID = 89 110fee65b7eSAlexander V. Chernikov RTM_GETNSID = 90 111fee65b7eSAlexander V. Chernikov RTM_NEWSTATS = 92 112fee65b7eSAlexander V. Chernikov RTM_GETSTATS = 94 113fee65b7eSAlexander V. Chernikov 114fee65b7eSAlexander V. Chernikov 115fee65b7eSAlexander V. Chernikovclass RtAttr(Structure): 116fee65b7eSAlexander V. Chernikov _fields_ = [ 117fee65b7eSAlexander V. Chernikov ("rta_len", c_ushort), 118fee65b7eSAlexander V. Chernikov ("rta_type", c_ushort), 119fee65b7eSAlexander V. Chernikov ] 120fee65b7eSAlexander V. Chernikov 121fee65b7eSAlexander V. Chernikov 122fee65b7eSAlexander V. Chernikovclass RtMsgHdr(Structure): 123fee65b7eSAlexander V. Chernikov _fields_ = [ 124fee65b7eSAlexander V. Chernikov ("rtm_family", c_ubyte), 125fee65b7eSAlexander V. Chernikov ("rtm_dst_len", c_ubyte), 126fee65b7eSAlexander V. Chernikov ("rtm_src_len", c_ubyte), 127fee65b7eSAlexander V. Chernikov ("rtm_tos", c_ubyte), 128fee65b7eSAlexander V. Chernikov ("rtm_table", c_ubyte), 129fee65b7eSAlexander V. Chernikov ("rtm_protocol", c_ubyte), 130fee65b7eSAlexander V. Chernikov ("rtm_scope", c_ubyte), 131fee65b7eSAlexander V. Chernikov ("rtm_type", c_ubyte), 132fee65b7eSAlexander V. Chernikov ("rtm_flags", c_uint), 133fee65b7eSAlexander V. Chernikov ] 134fee65b7eSAlexander V. Chernikov 135fee65b7eSAlexander V. Chernikov 136fee65b7eSAlexander V. Chernikovclass RtMsgFlags(Enum): 137fee65b7eSAlexander V. Chernikov RTM_F_NOTIFY = 0x100 138fee65b7eSAlexander V. Chernikov RTM_F_CLONED = 0x200 139fee65b7eSAlexander V. Chernikov RTM_F_EQUALIZE = 0x400 140fee65b7eSAlexander V. Chernikov RTM_F_PREFIX = 0x800 141fee65b7eSAlexander V. Chernikov RTM_F_LOOKUP_TABLE = 0x1000 142fee65b7eSAlexander V. Chernikov RTM_F_FIB_MATCH = 0x2000 143fee65b7eSAlexander V. Chernikov RTM_F_OFFLOAD = 0x4000 144fee65b7eSAlexander V. Chernikov RTM_F_TRAP = 0x8000 145fee65b7eSAlexander V. Chernikov RTM_F_OFFLOAD_FAILED = 0x20000000 146fee65b7eSAlexander V. Chernikov 147fee65b7eSAlexander V. Chernikov 148fee65b7eSAlexander V. Chernikovclass RtScope(Enum): 149fee65b7eSAlexander V. Chernikov RT_SCOPE_UNIVERSE = 0 150fee65b7eSAlexander V. Chernikov RT_SCOPE_SITE = 200 151fee65b7eSAlexander V. Chernikov RT_SCOPE_LINK = 253 152fee65b7eSAlexander V. Chernikov RT_SCOPE_HOST = 254 153fee65b7eSAlexander V. Chernikov RT_SCOPE_NOWHERE = 255 154fee65b7eSAlexander V. Chernikov 155fee65b7eSAlexander V. Chernikov 156fee65b7eSAlexander V. Chernikovclass RtType(Enum): 157fee65b7eSAlexander V. Chernikov RTN_UNSPEC = 0 158fee65b7eSAlexander V. Chernikov RTN_UNICAST = auto() 159fee65b7eSAlexander V. Chernikov RTN_LOCAL = auto() 160fee65b7eSAlexander V. Chernikov RTN_BROADCAST = auto() 161fee65b7eSAlexander V. Chernikov RTN_ANYCAST = auto() 162fee65b7eSAlexander V. Chernikov RTN_MULTICAST = auto() 163fee65b7eSAlexander V. Chernikov RTN_BLACKHOLE = auto() 164fee65b7eSAlexander V. Chernikov RTN_UNREACHABLE = auto() 165fee65b7eSAlexander V. Chernikov RTN_PROHIBIT = auto() 166fee65b7eSAlexander V. Chernikov RTN_THROW = auto() 167fee65b7eSAlexander V. Chernikov RTN_NAT = auto() 168fee65b7eSAlexander V. Chernikov RTN_XRESOLVE = auto() 169fee65b7eSAlexander V. Chernikov 170fee65b7eSAlexander V. Chernikov 171fee65b7eSAlexander V. Chernikovclass RtProto(Enum): 172fee65b7eSAlexander V. Chernikov RTPROT_UNSPEC = 0 173fee65b7eSAlexander V. Chernikov RTPROT_REDIRECT = 1 174fee65b7eSAlexander V. Chernikov RTPROT_KERNEL = 2 175fee65b7eSAlexander V. Chernikov RTPROT_BOOT = 3 176fee65b7eSAlexander V. Chernikov RTPROT_STATIC = 4 177fee65b7eSAlexander V. Chernikov RTPROT_GATED = 8 178fee65b7eSAlexander V. Chernikov RTPROT_RA = 9 179fee65b7eSAlexander V. Chernikov RTPROT_MRT = 10 180fee65b7eSAlexander V. Chernikov RTPROT_ZEBRA = 11 181fee65b7eSAlexander V. Chernikov RTPROT_BIRD = 12 182fee65b7eSAlexander V. Chernikov RTPROT_DNROUTED = 13 183fee65b7eSAlexander V. Chernikov RTPROT_XORP = 14 184fee65b7eSAlexander V. Chernikov RTPROT_NTK = 15 185fee65b7eSAlexander V. Chernikov RTPROT_DHCP = 16 186fee65b7eSAlexander V. Chernikov RTPROT_MROUTED = 17 187fee65b7eSAlexander V. Chernikov RTPROT_KEEPALIVED = 18 188fee65b7eSAlexander V. Chernikov RTPROT_BABEL = 42 189fee65b7eSAlexander V. Chernikov RTPROT_OPENR = 99 190fee65b7eSAlexander V. Chernikov RTPROT_BGP = 186 191fee65b7eSAlexander V. Chernikov RTPROT_ISIS = 187 192fee65b7eSAlexander V. Chernikov RTPROT_OSPF = 188 193fee65b7eSAlexander V. Chernikov RTPROT_RIP = 189 194fee65b7eSAlexander V. Chernikov RTPROT_EIGRP = 192 195fee65b7eSAlexander V. Chernikov 196fee65b7eSAlexander V. Chernikov 197fee65b7eSAlexander V. Chernikovclass NlRtaxType(Enum): 198fee65b7eSAlexander V. Chernikov RTAX_UNSPEC = 0 199fee65b7eSAlexander V. Chernikov RTAX_LOCK = auto() 200fee65b7eSAlexander V. Chernikov RTAX_MTU = auto() 201fee65b7eSAlexander V. Chernikov RTAX_WINDOW = auto() 202fee65b7eSAlexander V. Chernikov RTAX_RTT = auto() 203fee65b7eSAlexander V. Chernikov RTAX_RTTVAR = auto() 204fee65b7eSAlexander V. Chernikov RTAX_SSTHRESH = auto() 205fee65b7eSAlexander V. Chernikov RTAX_CWND = auto() 206fee65b7eSAlexander V. Chernikov RTAX_ADVMSS = auto() 207fee65b7eSAlexander V. Chernikov RTAX_REORDERING = auto() 208fee65b7eSAlexander V. Chernikov RTAX_HOPLIMIT = auto() 209fee65b7eSAlexander V. Chernikov RTAX_INITCWND = auto() 210fee65b7eSAlexander V. Chernikov RTAX_FEATURES = auto() 211fee65b7eSAlexander V. Chernikov RTAX_RTO_MIN = auto() 212fee65b7eSAlexander V. Chernikov RTAX_INITRWND = auto() 213fee65b7eSAlexander V. Chernikov RTAX_QUICKACK = auto() 214fee65b7eSAlexander V. Chernikov RTAX_CC_ALGO = auto() 215fee65b7eSAlexander V. Chernikov RTAX_FASTOPEN_NO_COOKIE = auto() 216fee65b7eSAlexander V. Chernikov 217fee65b7eSAlexander V. Chernikov 218fee65b7eSAlexander V. Chernikovclass RtFlagsBSD(Enum): 219fee65b7eSAlexander V. Chernikov RTF_UP = 0x1 220fee65b7eSAlexander V. Chernikov RTF_GATEWAY = 0x2 221fee65b7eSAlexander V. Chernikov RTF_HOST = 0x4 222fee65b7eSAlexander V. Chernikov RTF_REJECT = 0x8 223fee65b7eSAlexander V. Chernikov RTF_DYNAMIC = 0x10 224fee65b7eSAlexander V. Chernikov RTF_MODIFIED = 0x20 225fee65b7eSAlexander V. Chernikov RTF_DONE = 0x40 226fee65b7eSAlexander V. Chernikov RTF_XRESOLVE = 0x200 227fee65b7eSAlexander V. Chernikov RTF_LLINFO = 0x400 228fee65b7eSAlexander V. Chernikov RTF_LLDATA = 0x400 229fee65b7eSAlexander V. Chernikov RTF_STATIC = 0x800 230fee65b7eSAlexander V. Chernikov RTF_BLACKHOLE = 0x1000 231fee65b7eSAlexander V. Chernikov RTF_PROTO2 = 0x4000 232fee65b7eSAlexander V. Chernikov RTF_PROTO1 = 0x8000 233fee65b7eSAlexander V. Chernikov RTF_PROTO3 = 0x40000 234fee65b7eSAlexander V. Chernikov RTF_FIXEDMTU = 0x80000 235fee65b7eSAlexander V. Chernikov RTF_PINNED = 0x100000 236fee65b7eSAlexander V. Chernikov RTF_LOCAL = 0x200000 237fee65b7eSAlexander V. Chernikov RTF_BROADCAST = 0x400000 238fee65b7eSAlexander V. Chernikov RTF_MULTICAST = 0x800000 239fee65b7eSAlexander V. Chernikov RTF_STICKY = 0x10000000 240fee65b7eSAlexander V. Chernikov RTF_RNH_LOCKED = 0x40000000 241fee65b7eSAlexander V. Chernikov RTF_GWFLAG_COMPAT = 0x80000000 242fee65b7eSAlexander V. Chernikov 243fee65b7eSAlexander V. Chernikov 244fee65b7eSAlexander V. Chernikovclass NlRtGroup(Enum): 245fee65b7eSAlexander V. Chernikov RTNLGRP_NONE = 0 246fee65b7eSAlexander V. Chernikov RTNLGRP_LINK = auto() 247fee65b7eSAlexander V. Chernikov RTNLGRP_NOTIFY = auto() 248fee65b7eSAlexander V. Chernikov RTNLGRP_NEIGH = auto() 249fee65b7eSAlexander V. Chernikov RTNLGRP_TC = auto() 250fee65b7eSAlexander V. Chernikov RTNLGRP_IPV4_IFADDR = auto() 251fee65b7eSAlexander V. Chernikov RTNLGRP_IPV4_MROUTE = auto() 252fee65b7eSAlexander V. Chernikov RTNLGRP_IPV4_ROUTE = auto() 253fee65b7eSAlexander V. Chernikov RTNLGRP_IPV4_RULE = auto() 254fee65b7eSAlexander V. Chernikov RTNLGRP_IPV6_IFADDR = auto() 255fee65b7eSAlexander V. Chernikov RTNLGRP_IPV6_MROUTE = auto() 256fee65b7eSAlexander V. Chernikov RTNLGRP_IPV6_ROUTE = auto() 257fee65b7eSAlexander V. Chernikov RTNLGRP_IPV6_IFINFO = auto() 258fee65b7eSAlexander V. Chernikov RTNLGRP_DECnet_IFADDR = auto() 259fee65b7eSAlexander V. Chernikov RTNLGRP_NOP2 = auto() 260fee65b7eSAlexander V. Chernikov RTNLGRP_DECnet_ROUTE = auto() 261fee65b7eSAlexander V. Chernikov RTNLGRP_DECnet_RULE = auto() 262fee65b7eSAlexander V. Chernikov RTNLGRP_NOP4 = auto() 263fee65b7eSAlexander V. Chernikov RTNLGRP_IPV6_PREFIX = auto() 264fee65b7eSAlexander V. Chernikov RTNLGRP_IPV6_RULE = auto() 265fee65b7eSAlexander V. Chernikov RTNLGRP_ND_USEROPT = auto() 266fee65b7eSAlexander V. Chernikov RTNLGRP_PHONET_IFADDR = auto() 267fee65b7eSAlexander V. Chernikov RTNLGRP_PHONET_ROUTE = auto() 268fee65b7eSAlexander V. Chernikov RTNLGRP_DCB = auto() 269fee65b7eSAlexander V. Chernikov RTNLGRP_IPV4_NETCONF = auto() 270fee65b7eSAlexander V. Chernikov RTNLGRP_IPV6_NETCONF = auto() 271fee65b7eSAlexander V. Chernikov RTNLGRP_MDB = auto() 272fee65b7eSAlexander V. Chernikov RTNLGRP_MPLS_ROUTE = auto() 273fee65b7eSAlexander V. Chernikov RTNLGRP_NSID = auto() 274fee65b7eSAlexander V. Chernikov RTNLGRP_MPLS_NETCONF = auto() 275fee65b7eSAlexander V. Chernikov RTNLGRP_IPV4_MROUTE_R = auto() 276fee65b7eSAlexander V. Chernikov RTNLGRP_IPV6_MROUTE_R = auto() 277fee65b7eSAlexander V. Chernikov RTNLGRP_NEXTHOP = auto() 278fee65b7eSAlexander V. Chernikov RTNLGRP_BRVLAN = auto() 279fee65b7eSAlexander V. Chernikov 280fee65b7eSAlexander V. Chernikov 281fee65b7eSAlexander V. Chernikovclass IfinfoMsg(Structure): 282fee65b7eSAlexander V. Chernikov _fields_ = [ 283fee65b7eSAlexander V. Chernikov ("ifi_family", c_ubyte), 284fee65b7eSAlexander V. Chernikov ("__ifi_pad", c_ubyte), 285fee65b7eSAlexander V. Chernikov ("ifi_type", c_ushort), 286fee65b7eSAlexander V. Chernikov ("ifi_index", c_int), 287fee65b7eSAlexander V. Chernikov ("ifi_flags", c_uint), 288fee65b7eSAlexander V. Chernikov ("ifi_change", c_uint), 289fee65b7eSAlexander V. Chernikov ] 290fee65b7eSAlexander V. Chernikov 291fee65b7eSAlexander V. Chernikov 292fee65b7eSAlexander V. Chernikovclass IflattrType(Enum): 293fee65b7eSAlexander V. Chernikov IFLA_UNSPEC = 0 294fee65b7eSAlexander V. Chernikov IFLA_ADDRESS = auto() 295fee65b7eSAlexander V. Chernikov IFLA_BROADCAST = auto() 296fee65b7eSAlexander V. Chernikov IFLA_IFNAME = auto() 297fee65b7eSAlexander V. Chernikov IFLA_MTU = auto() 298fee65b7eSAlexander V. Chernikov IFLA_LINK = auto() 299fee65b7eSAlexander V. Chernikov IFLA_QDISC = auto() 300fee65b7eSAlexander V. Chernikov IFLA_STATS = auto() 301fee65b7eSAlexander V. Chernikov IFLA_COST = auto() 302fee65b7eSAlexander V. Chernikov IFLA_PRIORITY = auto() 303fee65b7eSAlexander V. Chernikov IFLA_MASTER = auto() 304fee65b7eSAlexander V. Chernikov IFLA_WIRELESS = auto() 305fee65b7eSAlexander V. Chernikov IFLA_PROTINFO = auto() 306fee65b7eSAlexander V. Chernikov IFLA_TXQLEN = auto() 307fee65b7eSAlexander V. Chernikov IFLA_MAP = auto() 308fee65b7eSAlexander V. Chernikov IFLA_WEIGHT = auto() 309fee65b7eSAlexander V. Chernikov IFLA_OPERSTATE = auto() 310fee65b7eSAlexander V. Chernikov IFLA_LINKMODE = auto() 311fee65b7eSAlexander V. Chernikov IFLA_LINKINFO = auto() 312fee65b7eSAlexander V. Chernikov IFLA_NET_NS_PID = auto() 313fee65b7eSAlexander V. Chernikov IFLA_IFALIAS = auto() 314fee65b7eSAlexander V. Chernikov IFLA_NUM_VF = auto() 315fee65b7eSAlexander V. Chernikov IFLA_VFINFO_LIST = auto() 316fee65b7eSAlexander V. Chernikov IFLA_STATS64 = auto() 317fee65b7eSAlexander V. Chernikov IFLA_VF_PORTS = auto() 318fee65b7eSAlexander V. Chernikov IFLA_PORT_SELF = auto() 319fee65b7eSAlexander V. Chernikov IFLA_AF_SPEC = auto() 320fee65b7eSAlexander V. Chernikov IFLA_GROUP = auto() 321fee65b7eSAlexander V. Chernikov IFLA_NET_NS_FD = auto() 322fee65b7eSAlexander V. Chernikov IFLA_EXT_MASK = auto() 323fee65b7eSAlexander V. Chernikov IFLA_PROMISCUITY = auto() 324fee65b7eSAlexander V. Chernikov IFLA_NUM_TX_QUEUES = auto() 325fee65b7eSAlexander V. Chernikov IFLA_NUM_RX_QUEUES = auto() 326fee65b7eSAlexander V. Chernikov IFLA_CARRIER = auto() 327fee65b7eSAlexander V. Chernikov IFLA_PHYS_PORT_ID = auto() 328fee65b7eSAlexander V. Chernikov IFLA_CARRIER_CHANGES = auto() 329fee65b7eSAlexander V. Chernikov IFLA_PHYS_SWITCH_ID = auto() 330fee65b7eSAlexander V. Chernikov IFLA_LINK_NETNSID = auto() 331fee65b7eSAlexander V. Chernikov IFLA_PHYS_PORT_NAME = auto() 332fee65b7eSAlexander V. Chernikov IFLA_PROTO_DOWN = auto() 333fee65b7eSAlexander V. Chernikov IFLA_GSO_MAX_SEGS = auto() 334fee65b7eSAlexander V. Chernikov IFLA_GSO_MAX_SIZE = auto() 335fee65b7eSAlexander V. Chernikov IFLA_PAD = auto() 336fee65b7eSAlexander V. Chernikov IFLA_XDP = auto() 337fee65b7eSAlexander V. Chernikov IFLA_EVENT = auto() 338fee65b7eSAlexander V. Chernikov IFLA_NEW_NETNSID = auto() 339fee65b7eSAlexander V. Chernikov IFLA_IF_NETNSID = auto() 340fee65b7eSAlexander V. Chernikov IFLA_CARRIER_UP_COUNT = auto() 341fee65b7eSAlexander V. Chernikov IFLA_CARRIER_DOWN_COUNT = auto() 342fee65b7eSAlexander V. Chernikov IFLA_NEW_IFINDEX = auto() 343fee65b7eSAlexander V. Chernikov IFLA_MIN_MTU = auto() 344fee65b7eSAlexander V. Chernikov IFLA_MAX_MTU = auto() 345fee65b7eSAlexander V. Chernikov IFLA_PROP_LIST = auto() 346fee65b7eSAlexander V. Chernikov IFLA_ALT_IFNAME = auto() 347fee65b7eSAlexander V. Chernikov IFLA_PERM_ADDRESS = auto() 348fee65b7eSAlexander V. Chernikov IFLA_PROTO_DOWN_REASON = auto() 349fee65b7eSAlexander V. Chernikov 350fee65b7eSAlexander V. Chernikov 351fee65b7eSAlexander V. Chernikovclass IflinkInfo(Enum): 352fee65b7eSAlexander V. Chernikov IFLA_INFO_UNSPEC = 0 353fee65b7eSAlexander V. Chernikov IFLA_INFO_KIND = auto() 354fee65b7eSAlexander V. Chernikov IFLA_INFO_DATA = auto() 355fee65b7eSAlexander V. Chernikov IFLA_INFO_XSTATS = auto() 356fee65b7eSAlexander V. Chernikov IFLA_INFO_SLAVE_KIND = auto() 357fee65b7eSAlexander V. Chernikov IFLA_INFO_SLAVE_DATA = auto() 358fee65b7eSAlexander V. Chernikov 359fee65b7eSAlexander V. Chernikov 360fee65b7eSAlexander V. Chernikovclass IfLinkInfoDataVlan(Enum): 361fee65b7eSAlexander V. Chernikov IFLA_VLAN_UNSPEC = 0 362fee65b7eSAlexander V. Chernikov IFLA_VLAN_ID = auto() 363fee65b7eSAlexander V. Chernikov IFLA_VLAN_FLAGS = auto() 364fee65b7eSAlexander V. Chernikov IFLA_VLAN_EGRESS_QOS = auto() 365fee65b7eSAlexander V. Chernikov IFLA_VLAN_INGRESS_QOS = auto() 366fee65b7eSAlexander V. Chernikov IFLA_VLAN_PROTOCOL = auto() 367fee65b7eSAlexander V. Chernikov 368fee65b7eSAlexander V. Chernikov 369fee65b7eSAlexander V. Chernikovclass IfaddrMsg(Structure): 370fee65b7eSAlexander V. Chernikov _fields_ = [ 371fee65b7eSAlexander V. Chernikov ("ifa_family", c_ubyte), 372fee65b7eSAlexander V. Chernikov ("ifa_prefixlen", c_ubyte), 373fee65b7eSAlexander V. Chernikov ("ifa_flags", c_ubyte), 374fee65b7eSAlexander V. Chernikov ("ifa_scope", c_ubyte), 375fee65b7eSAlexander V. Chernikov ("ifa_index", c_uint), 376fee65b7eSAlexander V. Chernikov ] 377fee65b7eSAlexander V. Chernikov 378fee65b7eSAlexander V. Chernikov 379*d91f8db5SAlexander V. Chernikovclass IfaAttrType(Enum): 380fee65b7eSAlexander V. Chernikov IFA_UNSPEC = 0 381fee65b7eSAlexander V. Chernikov IFA_ADDRESS = auto() 382fee65b7eSAlexander V. Chernikov IFA_LOCAL = auto() 383fee65b7eSAlexander V. Chernikov IFA_LABEL = auto() 384fee65b7eSAlexander V. Chernikov IFA_BROADCAST = auto() 385fee65b7eSAlexander V. Chernikov IFA_ANYCAST = auto() 386fee65b7eSAlexander V. Chernikov IFA_CACHEINFO = auto() 387fee65b7eSAlexander V. Chernikov IFA_MULTICAST = auto() 388fee65b7eSAlexander V. Chernikov IFA_FLAGS = auto() 389fee65b7eSAlexander V. Chernikov IFA_RT_PRIORITY = auto() 390fee65b7eSAlexander V. Chernikov IFA_TARGET_NETNSID = auto() 391fee65b7eSAlexander V. Chernikov 392fee65b7eSAlexander V. Chernikov 393fee65b7eSAlexander V. Chernikovclass NdMsg(Structure): 394fee65b7eSAlexander V. Chernikov _fields_ = [ 395fee65b7eSAlexander V. Chernikov ("ndm_family", c_ubyte), 396fee65b7eSAlexander V. Chernikov ("ndm_pad1", c_ubyte), 397fee65b7eSAlexander V. Chernikov ("ndm_pad2", c_ubyte), 398fee65b7eSAlexander V. Chernikov ("ndm_ifindex", c_uint), 399fee65b7eSAlexander V. Chernikov ("ndm_state", c_ushort), 400fee65b7eSAlexander V. Chernikov ("ndm_flags", c_ubyte), 401fee65b7eSAlexander V. Chernikov ("ndm_type", c_ubyte), 402fee65b7eSAlexander V. Chernikov ] 403fee65b7eSAlexander V. Chernikov 404fee65b7eSAlexander V. Chernikov 405fee65b7eSAlexander V. Chernikovclass NdAttrType(Enum): 406fee65b7eSAlexander V. Chernikov NDA_UNSPEC = 0 407fee65b7eSAlexander V. Chernikov NDA_DST = 1 408fee65b7eSAlexander V. Chernikov NDA_LLADDR = 2 409fee65b7eSAlexander V. Chernikov NDA_CACHEINFO = 3 410fee65b7eSAlexander V. Chernikov NDA_PROBES = 4 411fee65b7eSAlexander V. Chernikov NDA_VLAN = 5 412fee65b7eSAlexander V. Chernikov NDA_PORT = 6 413fee65b7eSAlexander V. Chernikov NDA_VNI = 7 414fee65b7eSAlexander V. Chernikov NDA_IFINDEX = 8 415fee65b7eSAlexander V. Chernikov NDA_MASTER = 9 416fee65b7eSAlexander V. Chernikov NDA_LINK_NETNSID = 10 417fee65b7eSAlexander V. Chernikov NDA_SRC_VNI = 11 418fee65b7eSAlexander V. Chernikov NDA_PROTOCOL = 12 419fee65b7eSAlexander V. Chernikov NDA_NH_ID = 13 420fee65b7eSAlexander V. Chernikov NDA_FDB_EXT_ATTRS = 14 421fee65b7eSAlexander V. Chernikov NDA_FLAGS_EXT = 15 422fee65b7eSAlexander V. Chernikov NDA_NDM_STATE_MASK = 16 423fee65b7eSAlexander V. Chernikov NDA_NDM_FLAGS_MASK = 17 424fee65b7eSAlexander V. Chernikov 425fee65b7eSAlexander V. Chernikov 426fee65b7eSAlexander V. Chernikovclass NlAttrRtFlags(NlAttrU32): 427fee65b7eSAlexander V. Chernikov def _print_attr_value(self): 428fee65b7eSAlexander V. Chernikov s = get_bitmask_str(RtFlagsBSD, self.u32) 429fee65b7eSAlexander V. Chernikov return " rtflags={}".format(s) 430fee65b7eSAlexander V. Chernikov 431fee65b7eSAlexander V. Chernikov 432fee65b7eSAlexander V. Chernikovclass NlAttrIfindex(NlAttrU32): 433fee65b7eSAlexander V. Chernikov def _print_attr_value(self): 434fee65b7eSAlexander V. Chernikov try: 435fee65b7eSAlexander V. Chernikov ifname = socket.if_indextoname(self.u32) 436fee65b7eSAlexander V. Chernikov return " iface={}(#{})".format(ifname, self.u32) 437fee65b7eSAlexander V. Chernikov except OSError: 438fee65b7eSAlexander V. Chernikov pass 439fee65b7eSAlexander V. Chernikov return " iface=if#{}".format(self.u32) 440fee65b7eSAlexander V. Chernikov 441fee65b7eSAlexander V. Chernikov 442fee65b7eSAlexander V. Chernikovclass NlAttrTable(NlAttrU32): 443fee65b7eSAlexander V. Chernikov def _print_attr_value(self): 444fee65b7eSAlexander V. Chernikov return " rtable={}".format(self.u32) 445fee65b7eSAlexander V. Chernikov 446fee65b7eSAlexander V. Chernikov 447fee65b7eSAlexander V. Chernikovclass NlAttrNhId(NlAttrU32): 448fee65b7eSAlexander V. Chernikov def _print_attr_value(self): 449fee65b7eSAlexander V. Chernikov return " nh_id={}".format(self.u32) 450fee65b7eSAlexander V. Chernikov 451fee65b7eSAlexander V. Chernikov 452fee65b7eSAlexander V. Chernikovclass NlAttrKNhId(NlAttrU32): 453fee65b7eSAlexander V. Chernikov def _print_attr_value(self): 454fee65b7eSAlexander V. Chernikov return " knh_id={}".format(self.u32) 455fee65b7eSAlexander V. Chernikov 456fee65b7eSAlexander V. Chernikov 457fee65b7eSAlexander V. Chernikovclass NlAttrMac(NlAttr): 458fee65b7eSAlexander V. Chernikov def _print_attr_value(self): 459fee65b7eSAlexander V. Chernikov return ' mac="' + ":".join(["{:02X}".format(b) for b in self._data]) + '"' 460fee65b7eSAlexander V. Chernikov 461fee65b7eSAlexander V. Chernikov 462fee65b7eSAlexander V. Chernikovclass NlAttrIfStats(NlAttr): 463fee65b7eSAlexander V. Chernikov def _print_attr_value(self): 464fee65b7eSAlexander V. Chernikov return " stats={...}" 465fee65b7eSAlexander V. Chernikov 466fee65b7eSAlexander V. Chernikov 467fee65b7eSAlexander V. Chernikovclass NlAttrVia(NlAttr): 468fee65b7eSAlexander V. Chernikov def __init__(self, nla_type, family, addr: str): 469fee65b7eSAlexander V. Chernikov super().__init__(nla_type, b"") 470fee65b7eSAlexander V. Chernikov self.addr = addr 471fee65b7eSAlexander V. Chernikov self.family = family 472fee65b7eSAlexander V. Chernikov 473fee65b7eSAlexander V. Chernikov @staticmethod 474fee65b7eSAlexander V. Chernikov def _validate(data): 475fee65b7eSAlexander V. Chernikov nla_len, nla_type = struct.unpack("@HH", data[:4]) 476fee65b7eSAlexander V. Chernikov data_len = nla_len - 4 477fee65b7eSAlexander V. Chernikov if data_len == 0: 478fee65b7eSAlexander V. Chernikov raise ValueError( 479fee65b7eSAlexander V. Chernikov "Error validating attr {}: empty data".format(nla_type) 480fee65b7eSAlexander V. Chernikov ) # noqa: E501 481fee65b7eSAlexander V. Chernikov family = int(data_len[0]) 482fee65b7eSAlexander V. Chernikov if family not in (socket.AF_INET, socket.AF_INET6): 483fee65b7eSAlexander V. Chernikov raise ValueError( 484fee65b7eSAlexander V. Chernikov "Error validating attr {}: unsupported AF {}".format( # noqa: E501 485fee65b7eSAlexander V. Chernikov nla_type, family 486fee65b7eSAlexander V. Chernikov ) 487fee65b7eSAlexander V. Chernikov ) 488fee65b7eSAlexander V. Chernikov if family == socket.AF_INET: 489fee65b7eSAlexander V. Chernikov expected_len = 1 + 4 490fee65b7eSAlexander V. Chernikov else: 491fee65b7eSAlexander V. Chernikov expected_len = 1 + 16 492fee65b7eSAlexander V. Chernikov if data_len != expected_len: 493fee65b7eSAlexander V. Chernikov raise ValueError( 494fee65b7eSAlexander V. Chernikov "Error validating attr {}: expected len {} got {}".format( # noqa: E501 495fee65b7eSAlexander V. Chernikov nla_type, expected_len, data_len 496fee65b7eSAlexander V. Chernikov ) 497fee65b7eSAlexander V. Chernikov ) 498fee65b7eSAlexander V. Chernikov 499fee65b7eSAlexander V. Chernikov @property 500fee65b7eSAlexander V. Chernikov def nla_len(self): 501fee65b7eSAlexander V. Chernikov if self.family == socket.AF_INET6: 502fee65b7eSAlexander V. Chernikov return 21 503fee65b7eSAlexander V. Chernikov else: 504fee65b7eSAlexander V. Chernikov return 9 505fee65b7eSAlexander V. Chernikov 506fee65b7eSAlexander V. Chernikov @classmethod 507fee65b7eSAlexander V. Chernikov def _parse(cls, data): 508fee65b7eSAlexander V. Chernikov nla_len, nla_type, family = struct.unpack("@HHB", data[:5]) 509fee65b7eSAlexander V. Chernikov off = 5 510fee65b7eSAlexander V. Chernikov if family == socket.AF_INET: 511fee65b7eSAlexander V. Chernikov addr = socket.inet_ntop(family, data[off:off + 4]) 512fee65b7eSAlexander V. Chernikov else: 513fee65b7eSAlexander V. Chernikov addr = socket.inet_ntop(family, data[off:off + 16]) 514fee65b7eSAlexander V. Chernikov return cls(nla_type, family, addr) 515fee65b7eSAlexander V. Chernikov 516fee65b7eSAlexander V. Chernikov def __bytes__(self): 517fee65b7eSAlexander V. Chernikov addr = socket.inet_pton(self.family, self.addr) 518fee65b7eSAlexander V. Chernikov return self._to_bytes(struct.pack("@B", self.family) + addr) 519fee65b7eSAlexander V. Chernikov 520fee65b7eSAlexander V. Chernikov def _print_attr_value(self): 521fee65b7eSAlexander V. Chernikov return " via={}".format(self.addr) 522fee65b7eSAlexander V. Chernikov 523fee65b7eSAlexander V. Chernikov 524fee65b7eSAlexander V. Chernikovrtnl_route_attrs = prepare_attrs_map( 525fee65b7eSAlexander V. Chernikov [ 526fee65b7eSAlexander V. Chernikov AttrDescr(RtattrType.RTA_DST, NlAttrIp), 527fee65b7eSAlexander V. Chernikov AttrDescr(RtattrType.RTA_SRC, NlAttrIp), 528fee65b7eSAlexander V. Chernikov AttrDescr(RtattrType.RTA_IIF, NlAttrIfindex), 529fee65b7eSAlexander V. Chernikov AttrDescr(RtattrType.RTA_OIF, NlAttrIfindex), 530fee65b7eSAlexander V. Chernikov AttrDescr(RtattrType.RTA_GATEWAY, NlAttrIp), 531fee65b7eSAlexander V. Chernikov AttrDescr(RtattrType.RTA_TABLE, NlAttrTable), 532fee65b7eSAlexander V. Chernikov AttrDescr(RtattrType.RTA_PRIORITY, NlAttrU32), 533fee65b7eSAlexander V. Chernikov AttrDescr(RtattrType.RTA_VIA, NlAttrVia), 534fee65b7eSAlexander V. Chernikov AttrDescr(RtattrType.RTA_NH_ID, NlAttrNhId), 535fee65b7eSAlexander V. Chernikov AttrDescr(RtattrType.RTA_KNH_ID, NlAttrKNhId), 536fee65b7eSAlexander V. Chernikov AttrDescr(RtattrType.RTA_RTFLAGS, NlAttrRtFlags), 537fee65b7eSAlexander V. Chernikov AttrDescr( 538fee65b7eSAlexander V. Chernikov RtattrType.RTA_METRICS, 539fee65b7eSAlexander V. Chernikov NlAttrNested, 540fee65b7eSAlexander V. Chernikov [ 541fee65b7eSAlexander V. Chernikov AttrDescr(NlRtaxType.RTAX_MTU, NlAttrU32), 542fee65b7eSAlexander V. Chernikov ], 543fee65b7eSAlexander V. Chernikov ), 544fee65b7eSAlexander V. Chernikov ] 545fee65b7eSAlexander V. Chernikov) 546fee65b7eSAlexander V. Chernikov 547fee65b7eSAlexander V. Chernikovrtnl_ifla_attrs = prepare_attrs_map( 548fee65b7eSAlexander V. Chernikov [ 549fee65b7eSAlexander V. Chernikov AttrDescr(IflattrType.IFLA_ADDRESS, NlAttrMac), 550fee65b7eSAlexander V. Chernikov AttrDescr(IflattrType.IFLA_BROADCAST, NlAttrMac), 551fee65b7eSAlexander V. Chernikov AttrDescr(IflattrType.IFLA_IFNAME, NlAttrStr), 552fee65b7eSAlexander V. Chernikov AttrDescr(IflattrType.IFLA_MTU, NlAttrU32), 553fee65b7eSAlexander V. Chernikov AttrDescr(IflattrType.IFLA_LINK, NlAttrU32), 554fee65b7eSAlexander V. Chernikov AttrDescr(IflattrType.IFLA_PROMISCUITY, NlAttrU32), 555fee65b7eSAlexander V. Chernikov AttrDescr(IflattrType.IFLA_OPERSTATE, NlAttrU8), 556fee65b7eSAlexander V. Chernikov AttrDescr(IflattrType.IFLA_CARRIER, NlAttrU8), 557fee65b7eSAlexander V. Chernikov AttrDescr(IflattrType.IFLA_IFALIAS, NlAttrStr), 558fee65b7eSAlexander V. Chernikov AttrDescr(IflattrType.IFLA_STATS64, NlAttrIfStats), 559fee65b7eSAlexander V. Chernikov AttrDescr(IflattrType.IFLA_NEW_IFINDEX, NlAttrU32), 560fee65b7eSAlexander V. Chernikov AttrDescr( 561fee65b7eSAlexander V. Chernikov IflattrType.IFLA_LINKINFO, 562fee65b7eSAlexander V. Chernikov NlAttrNested, 563fee65b7eSAlexander V. Chernikov [ 564fee65b7eSAlexander V. Chernikov AttrDescr(IflinkInfo.IFLA_INFO_KIND, NlAttrStr), 565fee65b7eSAlexander V. Chernikov AttrDescr(IflinkInfo.IFLA_INFO_DATA, NlAttr), 566fee65b7eSAlexander V. Chernikov ], 567fee65b7eSAlexander V. Chernikov ), 568fee65b7eSAlexander V. Chernikov ] 569fee65b7eSAlexander V. Chernikov) 570fee65b7eSAlexander V. Chernikov 571fee65b7eSAlexander V. Chernikovrtnl_ifa_attrs = prepare_attrs_map( 572fee65b7eSAlexander V. Chernikov [ 573*d91f8db5SAlexander V. Chernikov AttrDescr(IfaAttrType.IFA_ADDRESS, NlAttrIp), 574*d91f8db5SAlexander V. Chernikov AttrDescr(IfaAttrType.IFA_LOCAL, NlAttrIp), 575*d91f8db5SAlexander V. Chernikov AttrDescr(IfaAttrType.IFA_LABEL, NlAttrStr), 576*d91f8db5SAlexander V. Chernikov AttrDescr(IfaAttrType.IFA_BROADCAST, NlAttrIp), 577*d91f8db5SAlexander V. Chernikov AttrDescr(IfaAttrType.IFA_ANYCAST, NlAttrIp), 578*d91f8db5SAlexander V. Chernikov AttrDescr(IfaAttrType.IFA_FLAGS, NlAttrU32), 579fee65b7eSAlexander V. Chernikov ] 580fee65b7eSAlexander V. Chernikov) 581fee65b7eSAlexander V. Chernikov 582fee65b7eSAlexander V. Chernikov 583fee65b7eSAlexander V. Chernikovrtnl_nd_attrs = prepare_attrs_map( 584fee65b7eSAlexander V. Chernikov [ 585fee65b7eSAlexander V. Chernikov AttrDescr(NdAttrType.NDA_DST, NlAttrIp), 586fee65b7eSAlexander V. Chernikov AttrDescr(NdAttrType.NDA_IFINDEX, NlAttrIfindex), 587fee65b7eSAlexander V. Chernikov AttrDescr(NdAttrType.NDA_FLAGS_EXT, NlAttrU32), 588fee65b7eSAlexander V. Chernikov AttrDescr(NdAttrType.NDA_LLADDR, NlAttrMac), 589fee65b7eSAlexander V. Chernikov ] 590fee65b7eSAlexander V. Chernikov) 591fee65b7eSAlexander V. Chernikov 592fee65b7eSAlexander V. Chernikov 593fee65b7eSAlexander V. Chernikovclass BaseNetlinkRtMessage(StdNetlinkMessage): 594fee65b7eSAlexander V. Chernikov pass 595fee65b7eSAlexander V. Chernikov 596fee65b7eSAlexander V. Chernikov 597fee65b7eSAlexander V. Chernikovclass NetlinkRtMessage(BaseNetlinkRtMessage): 598fee65b7eSAlexander V. Chernikov messages = [ 599fc2538cbSAlexander V. Chernikov NlMsgProps(NlRtMsgType.RTM_NEWROUTE, NlMsgCategory.NEW), 600fc2538cbSAlexander V. Chernikov NlMsgProps(NlRtMsgType.RTM_DELROUTE, NlMsgCategory.DELETE), 601fc2538cbSAlexander V. Chernikov NlMsgProps(NlRtMsgType.RTM_GETROUTE, NlMsgCategory.GET), 602fee65b7eSAlexander V. Chernikov ] 603fee65b7eSAlexander V. Chernikov nl_attrs_map = rtnl_route_attrs 604fee65b7eSAlexander V. Chernikov 605fee65b7eSAlexander V. Chernikov def __init__(self, helper, nlm_type): 606fee65b7eSAlexander V. Chernikov super().__init__(helper, nlm_type) 607fee65b7eSAlexander V. Chernikov self.base_hdr = RtMsgHdr() 608fee65b7eSAlexander V. Chernikov 609fee65b7eSAlexander V. Chernikov def parse_base_header(self, data): 610fee65b7eSAlexander V. Chernikov if len(data) < sizeof(RtMsgHdr): 611fee65b7eSAlexander V. Chernikov raise ValueError("length less than rtmsg header") 612fee65b7eSAlexander V. Chernikov rtm_hdr = RtMsgHdr.from_buffer_copy(data) 613fee65b7eSAlexander V. Chernikov return (rtm_hdr, sizeof(RtMsgHdr)) 614fee65b7eSAlexander V. Chernikov 615fee65b7eSAlexander V. Chernikov def print_base_header(self, hdr, prepend=""): 616fee65b7eSAlexander V. Chernikov family = self.helper.get_af_name(hdr.rtm_family) 617fee65b7eSAlexander V. Chernikov print( 618fee65b7eSAlexander V. Chernikov "{}family={}, dst_len={}, src_len={}, tos={}, table={}, protocol={}({}), scope={}({}), type={}({}), flags={}({})".format( # noqa: E501 619fee65b7eSAlexander V. Chernikov prepend, 620fee65b7eSAlexander V. Chernikov family, 621fee65b7eSAlexander V. Chernikov hdr.rtm_dst_len, 622fee65b7eSAlexander V. Chernikov hdr.rtm_src_len, 623fee65b7eSAlexander V. Chernikov hdr.rtm_tos, 624fee65b7eSAlexander V. Chernikov hdr.rtm_table, 625fee65b7eSAlexander V. Chernikov self.helper.get_attr_byval(RtProto, hdr.rtm_protocol), 626fee65b7eSAlexander V. Chernikov hdr.rtm_protocol, 627fee65b7eSAlexander V. Chernikov self.helper.get_attr_byval(RtScope, hdr.rtm_scope), 628fee65b7eSAlexander V. Chernikov hdr.rtm_scope, 629fee65b7eSAlexander V. Chernikov self.helper.get_attr_byval(RtType, hdr.rtm_type), 630fee65b7eSAlexander V. Chernikov hdr.rtm_type, 631fee65b7eSAlexander V. Chernikov self.helper.get_bitmask_str(RtMsgFlags, hdr.rtm_flags), 632fee65b7eSAlexander V. Chernikov hdr.rtm_flags, 633fee65b7eSAlexander V. Chernikov ) 634fee65b7eSAlexander V. Chernikov ) 635fee65b7eSAlexander V. Chernikov 636fee65b7eSAlexander V. Chernikov 637fee65b7eSAlexander V. Chernikovclass NetlinkIflaMessage(BaseNetlinkRtMessage): 638fee65b7eSAlexander V. Chernikov messages = [ 639fc2538cbSAlexander V. Chernikov NlMsgProps(NlRtMsgType.RTM_NEWLINK, NlMsgCategory.NEW), 640fc2538cbSAlexander V. Chernikov NlMsgProps(NlRtMsgType.RTM_DELLINK, NlMsgCategory.DELETE), 641fc2538cbSAlexander V. Chernikov NlMsgProps(NlRtMsgType.RTM_GETLINK, NlMsgCategory.GET), 642fee65b7eSAlexander V. Chernikov ] 643fee65b7eSAlexander V. Chernikov nl_attrs_map = rtnl_ifla_attrs 644fee65b7eSAlexander V. Chernikov 645fee65b7eSAlexander V. Chernikov def __init__(self, helper, nlm_type): 646fee65b7eSAlexander V. Chernikov super().__init__(helper, nlm_type) 647fee65b7eSAlexander V. Chernikov self.base_hdr = IfinfoMsg() 648fee65b7eSAlexander V. Chernikov 649fee65b7eSAlexander V. Chernikov def parse_base_header(self, data): 650fee65b7eSAlexander V. Chernikov if len(data) < sizeof(IfinfoMsg): 651fee65b7eSAlexander V. Chernikov raise ValueError("length less than IfinfoMsg header") 652fee65b7eSAlexander V. Chernikov rtm_hdr = IfinfoMsg.from_buffer_copy(data) 653fee65b7eSAlexander V. Chernikov return (rtm_hdr, sizeof(IfinfoMsg)) 654fee65b7eSAlexander V. Chernikov 655fee65b7eSAlexander V. Chernikov def print_base_header(self, hdr, prepend=""): 656fee65b7eSAlexander V. Chernikov family = self.helper.get_af_name(hdr.ifi_family) 657fee65b7eSAlexander V. Chernikov print( 658fee65b7eSAlexander V. Chernikov "{}family={}, ifi_type={}, ifi_index={}, ifi_flags={}, ifi_change={}".format( # noqa: E501 659fee65b7eSAlexander V. Chernikov prepend, 660fee65b7eSAlexander V. Chernikov family, 661fee65b7eSAlexander V. Chernikov hdr.ifi_type, 662fee65b7eSAlexander V. Chernikov hdr.ifi_index, 663fee65b7eSAlexander V. Chernikov hdr.ifi_flags, 664fee65b7eSAlexander V. Chernikov hdr.ifi_change, 665fee65b7eSAlexander V. Chernikov ) 666fee65b7eSAlexander V. Chernikov ) 667fee65b7eSAlexander V. Chernikov 668fee65b7eSAlexander V. Chernikov 669fee65b7eSAlexander V. Chernikovclass NetlinkIfaMessage(BaseNetlinkRtMessage): 670fee65b7eSAlexander V. Chernikov messages = [ 671fc2538cbSAlexander V. Chernikov NlMsgProps(NlRtMsgType.RTM_NEWADDR, NlMsgCategory.NEW), 672fc2538cbSAlexander V. Chernikov NlMsgProps(NlRtMsgType.RTM_DELADDR, NlMsgCategory.DELETE), 673fc2538cbSAlexander V. Chernikov NlMsgProps(NlRtMsgType.RTM_GETADDR, NlMsgCategory.GET), 674fee65b7eSAlexander V. Chernikov ] 675fee65b7eSAlexander V. Chernikov nl_attrs_map = rtnl_ifa_attrs 676fee65b7eSAlexander V. Chernikov 677fee65b7eSAlexander V. Chernikov def __init__(self, helper, nlm_type): 678fee65b7eSAlexander V. Chernikov super().__init__(helper, nlm_type) 679fee65b7eSAlexander V. Chernikov self.base_hdr = IfaddrMsg() 680fee65b7eSAlexander V. Chernikov 681fee65b7eSAlexander V. Chernikov def parse_base_header(self, data): 682fee65b7eSAlexander V. Chernikov if len(data) < sizeof(IfaddrMsg): 683fee65b7eSAlexander V. Chernikov raise ValueError("length less than IfaddrMsg header") 684fee65b7eSAlexander V. Chernikov rtm_hdr = IfaddrMsg.from_buffer_copy(data) 685fee65b7eSAlexander V. Chernikov return (rtm_hdr, sizeof(IfaddrMsg)) 686fee65b7eSAlexander V. Chernikov 687fee65b7eSAlexander V. Chernikov def print_base_header(self, hdr, prepend=""): 688fee65b7eSAlexander V. Chernikov family = self.helper.get_af_name(hdr.ifa_family) 689fee65b7eSAlexander V. Chernikov print( 690fee65b7eSAlexander V. Chernikov "{}family={}, ifa_prefixlen={}, ifa_flags={}, ifa_scope={}, ifa_index={}".format( # noqa: E501 691fee65b7eSAlexander V. Chernikov prepend, 692fee65b7eSAlexander V. Chernikov family, 693fee65b7eSAlexander V. Chernikov hdr.ifa_prefixlen, 694fee65b7eSAlexander V. Chernikov hdr.ifa_flags, 695fee65b7eSAlexander V. Chernikov hdr.ifa_scope, 696fee65b7eSAlexander V. Chernikov hdr.ifa_index, 697fee65b7eSAlexander V. Chernikov ) 698fee65b7eSAlexander V. Chernikov ) 699fee65b7eSAlexander V. Chernikov 700fee65b7eSAlexander V. Chernikov 701fee65b7eSAlexander V. Chernikovclass NetlinkNdMessage(BaseNetlinkRtMessage): 702fee65b7eSAlexander V. Chernikov messages = [ 703fc2538cbSAlexander V. Chernikov NlMsgProps(NlRtMsgType.RTM_NEWNEIGH, NlMsgCategory.NEW), 704fc2538cbSAlexander V. Chernikov NlMsgProps(NlRtMsgType.RTM_DELNEIGH, NlMsgCategory.DELETE), 705fc2538cbSAlexander V. Chernikov NlMsgProps(NlRtMsgType.RTM_GETNEIGH, NlMsgCategory.GET), 706fee65b7eSAlexander V. Chernikov ] 707fee65b7eSAlexander V. Chernikov nl_attrs_map = rtnl_nd_attrs 708fee65b7eSAlexander V. Chernikov 709fee65b7eSAlexander V. Chernikov def __init__(self, helper, nlm_type): 710fee65b7eSAlexander V. Chernikov super().__init__(helper, nlm_type) 711fee65b7eSAlexander V. Chernikov self.base_hdr = NdMsg() 712fee65b7eSAlexander V. Chernikov 713fee65b7eSAlexander V. Chernikov def parse_base_header(self, data): 714fee65b7eSAlexander V. Chernikov if len(data) < sizeof(NdMsg): 715fee65b7eSAlexander V. Chernikov raise ValueError("length less than NdMsg header") 716fee65b7eSAlexander V. Chernikov nd_hdr = NdMsg.from_buffer_copy(data) 717fee65b7eSAlexander V. Chernikov return (nd_hdr, sizeof(NdMsg)) 718fee65b7eSAlexander V. Chernikov 719fee65b7eSAlexander V. Chernikov def print_base_header(self, hdr, prepend=""): 720fee65b7eSAlexander V. Chernikov family = self.helper.get_af_name(hdr.ndm_family) 721fee65b7eSAlexander V. Chernikov print( 722fee65b7eSAlexander V. Chernikov "{}family={}, ndm_ifindex={}, ndm_state={}, ndm_flags={}".format( # noqa: E501 723fee65b7eSAlexander V. Chernikov prepend, 724fee65b7eSAlexander V. Chernikov family, 725fee65b7eSAlexander V. Chernikov hdr.ndm_ifindex, 726fee65b7eSAlexander V. Chernikov hdr.ndm_state, 727fee65b7eSAlexander V. Chernikov hdr.ndm_flags, 728fee65b7eSAlexander V. Chernikov ) 729fee65b7eSAlexander V. Chernikov ) 730fc2538cbSAlexander V. Chernikov 731fc2538cbSAlexander V. Chernikov 732fc2538cbSAlexander V. Chernikovhandler_classes = { 733fc2538cbSAlexander V. Chernikov "netlink_route": [ 734fc2538cbSAlexander V. Chernikov NetlinkRtMessage, 735fc2538cbSAlexander V. Chernikov NetlinkIflaMessage, 736fc2538cbSAlexander V. Chernikov NetlinkIfaMessage, 737fc2538cbSAlexander V. Chernikov NetlinkNdMessage, 738fc2538cbSAlexander V. Chernikov ], 739fc2538cbSAlexander V. Chernikov} 740