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