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 294*10b94e40SAlexander V. Chernikov IFLA_ADDRESS = 1 295*10b94e40SAlexander V. Chernikov IFLA_BROADCAST = 2 296*10b94e40SAlexander V. Chernikov IFLA_IFNAME = 3 297*10b94e40SAlexander V. Chernikov IFLA_MTU = 4 298*10b94e40SAlexander V. Chernikov IFLA_LINK = 5 299*10b94e40SAlexander V. Chernikov IFLA_QDISC = 6 300*10b94e40SAlexander V. Chernikov IFLA_STATS = 7 301*10b94e40SAlexander V. Chernikov IFLA_COST = 8 302*10b94e40SAlexander V. Chernikov IFLA_PRIORITY = 9 303*10b94e40SAlexander V. Chernikov IFLA_MASTER = 10 304*10b94e40SAlexander V. Chernikov IFLA_WIRELESS = 11 305*10b94e40SAlexander V. Chernikov IFLA_PROTINFO = 12 306*10b94e40SAlexander V. Chernikov IFLA_TXQLEN = 13 307*10b94e40SAlexander V. Chernikov IFLA_MAP = 14 308*10b94e40SAlexander V. Chernikov IFLA_WEIGHT = 15 309*10b94e40SAlexander V. Chernikov IFLA_OPERSTATE = 16 310*10b94e40SAlexander V. Chernikov IFLA_LINKMODE = 17 311*10b94e40SAlexander V. Chernikov IFLA_LINKINFO = 18 312*10b94e40SAlexander V. Chernikov IFLA_NET_NS_PID = 19 313*10b94e40SAlexander V. Chernikov IFLA_IFALIAS = 20 314*10b94e40SAlexander V. Chernikov IFLA_NUM_VF = 21 315*10b94e40SAlexander V. Chernikov IFLA_VFINFO_LIST = 22 316*10b94e40SAlexander V. Chernikov IFLA_STATS64 = 23 317*10b94e40SAlexander V. Chernikov IFLA_VF_PORTS = 24 318*10b94e40SAlexander V. Chernikov IFLA_PORT_SELF = 25 319*10b94e40SAlexander V. Chernikov IFLA_AF_SPEC = 26 320*10b94e40SAlexander V. Chernikov IFLA_GROUP = 27 321*10b94e40SAlexander V. Chernikov IFLA_NET_NS_FD = 28 322*10b94e40SAlexander V. Chernikov IFLA_EXT_MASK = 29 323*10b94e40SAlexander V. Chernikov IFLA_PROMISCUITY = 30 324*10b94e40SAlexander V. Chernikov IFLA_NUM_TX_QUEUES = 31 325*10b94e40SAlexander V. Chernikov IFLA_NUM_RX_QUEUES = 32 326*10b94e40SAlexander V. Chernikov IFLA_CARRIER = 33 327*10b94e40SAlexander V. Chernikov IFLA_PHYS_PORT_ID = 34 328*10b94e40SAlexander V. Chernikov IFLA_CARRIER_CHANGES = 35 329*10b94e40SAlexander V. Chernikov IFLA_PHYS_SWITCH_ID = 36 330*10b94e40SAlexander V. Chernikov IFLA_LINK_NETNSID = 37 331*10b94e40SAlexander V. Chernikov IFLA_PHYS_PORT_NAME = 38 332*10b94e40SAlexander V. Chernikov IFLA_PROTO_DOWN = 39 333*10b94e40SAlexander V. Chernikov IFLA_GSO_MAX_SEGS = 40 334*10b94e40SAlexander V. Chernikov IFLA_GSO_MAX_SIZE = 41 335*10b94e40SAlexander V. Chernikov IFLA_PAD = 42 336*10b94e40SAlexander V. Chernikov IFLA_XDP = 43 337*10b94e40SAlexander V. Chernikov IFLA_EVENT = 44 338*10b94e40SAlexander V. Chernikov IFLA_NEW_NETNSID = 45 339*10b94e40SAlexander V. Chernikov IFLA_IF_NETNSID = 46 340*10b94e40SAlexander V. Chernikov IFLA_CARRIER_UP_COUNT = 47 341*10b94e40SAlexander V. Chernikov IFLA_CARRIER_DOWN_COUNT = 48 342*10b94e40SAlexander V. Chernikov IFLA_NEW_IFINDEX = 49 343*10b94e40SAlexander V. Chernikov IFLA_MIN_MTU = 50 344*10b94e40SAlexander V. Chernikov IFLA_MAX_MTU = 51 345*10b94e40SAlexander V. Chernikov IFLA_PROP_LIST = 52 346*10b94e40SAlexander V. Chernikov IFLA_ALT_IFNAME = 53 347*10b94e40SAlexander V. Chernikov IFLA_PERM_ADDRESS = 54 348*10b94e40SAlexander V. Chernikov IFLA_PROTO_DOWN_REASON = 55 349*10b94e40SAlexander V. Chernikov IFLA_PARENT_DEV_NAME = 56 350*10b94e40SAlexander V. Chernikov IFLA_PARENT_DEV_BUS_NAME = 57 351*10b94e40SAlexander V. Chernikov IFLA_GRO_MAX_SIZE = 58 352*10b94e40SAlexander V. Chernikov IFLA_TSO_MAX_SEGS = 59 353*10b94e40SAlexander V. Chernikov IFLA_ALLMULTI = 60 354*10b94e40SAlexander V. Chernikov IFLA_DEVLINK_PORT = 61 355*10b94e40SAlexander V. Chernikov IFLA_GSO_IPV4_MAX_SIZE = 62 356*10b94e40SAlexander V. Chernikov IFLA_GRO_IPV4_MAX_SIZE = 63 357*10b94e40SAlexander V. Chernikov IFLA_FREEBSD = 64 358*10b94e40SAlexander V. Chernikov 359*10b94e40SAlexander V. Chernikov 360*10b94e40SAlexander V. Chernikovclass IflafAttrType(Enum): 361*10b94e40SAlexander V. Chernikov IFLAF_UNSPEC = 0 362*10b94e40SAlexander V. Chernikov IFLAF_ORIG_IFNAME = 1 363*10b94e40SAlexander V. Chernikov IFLAF_ORIG_HWADDR = 2 364fee65b7eSAlexander V. Chernikov 365fee65b7eSAlexander V. Chernikov 366fee65b7eSAlexander V. Chernikovclass IflinkInfo(Enum): 367fee65b7eSAlexander V. Chernikov IFLA_INFO_UNSPEC = 0 368fee65b7eSAlexander V. Chernikov IFLA_INFO_KIND = auto() 369fee65b7eSAlexander V. Chernikov IFLA_INFO_DATA = auto() 370fee65b7eSAlexander V. Chernikov IFLA_INFO_XSTATS = auto() 371fee65b7eSAlexander V. Chernikov IFLA_INFO_SLAVE_KIND = auto() 372fee65b7eSAlexander V. Chernikov IFLA_INFO_SLAVE_DATA = auto() 373fee65b7eSAlexander V. Chernikov 374fee65b7eSAlexander V. Chernikov 375fee65b7eSAlexander V. Chernikovclass IfLinkInfoDataVlan(Enum): 376fee65b7eSAlexander V. Chernikov IFLA_VLAN_UNSPEC = 0 377fee65b7eSAlexander V. Chernikov IFLA_VLAN_ID = auto() 378fee65b7eSAlexander V. Chernikov IFLA_VLAN_FLAGS = auto() 379fee65b7eSAlexander V. Chernikov IFLA_VLAN_EGRESS_QOS = auto() 380fee65b7eSAlexander V. Chernikov IFLA_VLAN_INGRESS_QOS = auto() 381fee65b7eSAlexander V. Chernikov IFLA_VLAN_PROTOCOL = auto() 382fee65b7eSAlexander V. Chernikov 383fee65b7eSAlexander V. Chernikov 384fee65b7eSAlexander V. Chernikovclass IfaddrMsg(Structure): 385fee65b7eSAlexander V. Chernikov _fields_ = [ 386fee65b7eSAlexander V. Chernikov ("ifa_family", c_ubyte), 387fee65b7eSAlexander V. Chernikov ("ifa_prefixlen", c_ubyte), 388fee65b7eSAlexander V. Chernikov ("ifa_flags", c_ubyte), 389fee65b7eSAlexander V. Chernikov ("ifa_scope", c_ubyte), 390fee65b7eSAlexander V. Chernikov ("ifa_index", c_uint), 391fee65b7eSAlexander V. Chernikov ] 392fee65b7eSAlexander V. Chernikov 393fee65b7eSAlexander V. Chernikov 394d91f8db5SAlexander V. Chernikovclass IfaAttrType(Enum): 395fee65b7eSAlexander V. Chernikov IFA_UNSPEC = 0 396*10b94e40SAlexander V. Chernikov IFA_ADDRESS = 1 397*10b94e40SAlexander V. Chernikov IFA_LOCAL = 2 398*10b94e40SAlexander V. Chernikov IFA_LABEL = 3 399*10b94e40SAlexander V. Chernikov IFA_BROADCAST = 4 400*10b94e40SAlexander V. Chernikov IFA_ANYCAST = 5 401*10b94e40SAlexander V. Chernikov IFA_CACHEINFO = 6 402*10b94e40SAlexander V. Chernikov IFA_MULTICAST = 7 403*10b94e40SAlexander V. Chernikov IFA_FLAGS = 8 404*10b94e40SAlexander V. Chernikov IFA_RT_PRIORITY = 9 405*10b94e40SAlexander V. Chernikov IFA_TARGET_NETNSID = 10 406*10b94e40SAlexander V. Chernikov IFA_FREEBSD = 11 407*10b94e40SAlexander V. Chernikov 408*10b94e40SAlexander V. Chernikov 409*10b94e40SAlexander V. Chernikovclass IfafAttrType(Enum): 410*10b94e40SAlexander V. Chernikov IFAF_UNSPEC = 0 411*10b94e40SAlexander V. Chernikov IFAF_VHID = 1 412*10b94e40SAlexander V. Chernikov IFAF_FLAGS = 2 413*10b94e40SAlexander V. Chernikov 414*10b94e40SAlexander V. Chernikov 415*10b94e40SAlexander V. Chernikovclass IfaCacheInfo(Structure): 416*10b94e40SAlexander V. Chernikov _fields_ = [ 417*10b94e40SAlexander V. Chernikov ("ifa_prefered", c_uint), # seconds till the end of the prefix considered preferred 418*10b94e40SAlexander V. Chernikov ("ifa_valid", c_uint), # seconds till the end of the prefix considered valid 419*10b94e40SAlexander V. Chernikov ("cstamp", c_uint), # creation time in 1ms intervals from the boot time 420*10b94e40SAlexander V. Chernikov ("tstamp", c_uint), # update time in 1ms intervals from the boot time 421*10b94e40SAlexander V. Chernikov ] 422*10b94e40SAlexander V. Chernikov 423*10b94e40SAlexander V. Chernikov 424*10b94e40SAlexander V. Chernikovclass IfaFlags(Enum): 425*10b94e40SAlexander V. Chernikov IFA_F_TEMPORARY = 0x01 426*10b94e40SAlexander V. Chernikov IFA_F_NODAD = 0x02 427*10b94e40SAlexander V. Chernikov IFA_F_OPTIMISTIC = 0x04 428*10b94e40SAlexander V. Chernikov IFA_F_DADFAILED = 0x08 429*10b94e40SAlexander V. Chernikov IFA_F_HOMEADDRESS = 0x10 430*10b94e40SAlexander V. Chernikov IFA_F_DEPRECATED = 0x20 431*10b94e40SAlexander V. Chernikov IFA_F_TENTATIVE = 0x40 432*10b94e40SAlexander V. Chernikov IFA_F_PERMANENT = 0x80 433*10b94e40SAlexander V. Chernikov IFA_F_MANAGETEMPADDR = 0x100 434*10b94e40SAlexander V. Chernikov IFA_F_NOPREFIXROUTE = 0x200 435*10b94e40SAlexander V. Chernikov IFA_F_MCAUTOJOIN = 0x400 436*10b94e40SAlexander V. Chernikov IFA_F_STABLE_PRIVACY = 0x800 437*10b94e40SAlexander V. Chernikov 438*10b94e40SAlexander V. Chernikov 439*10b94e40SAlexander V. Chernikovclass IfafFlags6(Enum): 440*10b94e40SAlexander V. Chernikov IN6_IFF_ANYCAST = 0x01 441*10b94e40SAlexander V. Chernikov IN6_IFF_TENTATIVE = 0x02 442*10b94e40SAlexander V. Chernikov IN6_IFF_DUPLICATED = 0x04 443*10b94e40SAlexander V. Chernikov IN6_IFF_DETACHED = 0x08 444*10b94e40SAlexander V. Chernikov IN6_IFF_DEPRECATED = 0x10 445*10b94e40SAlexander V. Chernikov IN6_IFF_NODAD = 0x20 446*10b94e40SAlexander V. Chernikov IN6_IFF_AUTOCONF = 0x40 447*10b94e40SAlexander V. Chernikov IN6_IFF_TEMPORARY = 0x80 448*10b94e40SAlexander V. Chernikov IN6_IFF_PREFER_SOURCE = 0x100 449fee65b7eSAlexander V. Chernikov 450fee65b7eSAlexander V. Chernikov 451fee65b7eSAlexander V. Chernikovclass NdMsg(Structure): 452fee65b7eSAlexander V. Chernikov _fields_ = [ 453fee65b7eSAlexander V. Chernikov ("ndm_family", c_ubyte), 454fee65b7eSAlexander V. Chernikov ("ndm_pad1", c_ubyte), 455fee65b7eSAlexander V. Chernikov ("ndm_pad2", c_ubyte), 456fee65b7eSAlexander V. Chernikov ("ndm_ifindex", c_uint), 457fee65b7eSAlexander V. Chernikov ("ndm_state", c_ushort), 458fee65b7eSAlexander V. Chernikov ("ndm_flags", c_ubyte), 459fee65b7eSAlexander V. Chernikov ("ndm_type", c_ubyte), 460fee65b7eSAlexander V. Chernikov ] 461fee65b7eSAlexander V. Chernikov 462fee65b7eSAlexander V. Chernikov 463fee65b7eSAlexander V. Chernikovclass NdAttrType(Enum): 464fee65b7eSAlexander V. Chernikov NDA_UNSPEC = 0 465fee65b7eSAlexander V. Chernikov NDA_DST = 1 466fee65b7eSAlexander V. Chernikov NDA_LLADDR = 2 467fee65b7eSAlexander V. Chernikov NDA_CACHEINFO = 3 468fee65b7eSAlexander V. Chernikov NDA_PROBES = 4 469fee65b7eSAlexander V. Chernikov NDA_VLAN = 5 470fee65b7eSAlexander V. Chernikov NDA_PORT = 6 471fee65b7eSAlexander V. Chernikov NDA_VNI = 7 472fee65b7eSAlexander V. Chernikov NDA_IFINDEX = 8 473fee65b7eSAlexander V. Chernikov NDA_MASTER = 9 474fee65b7eSAlexander V. Chernikov NDA_LINK_NETNSID = 10 475fee65b7eSAlexander V. Chernikov NDA_SRC_VNI = 11 476fee65b7eSAlexander V. Chernikov NDA_PROTOCOL = 12 477fee65b7eSAlexander V. Chernikov NDA_NH_ID = 13 478fee65b7eSAlexander V. Chernikov NDA_FDB_EXT_ATTRS = 14 479fee65b7eSAlexander V. Chernikov NDA_FLAGS_EXT = 15 480fee65b7eSAlexander V. Chernikov NDA_NDM_STATE_MASK = 16 481fee65b7eSAlexander V. Chernikov NDA_NDM_FLAGS_MASK = 17 482fee65b7eSAlexander V. Chernikov 483fee65b7eSAlexander V. Chernikov 484fee65b7eSAlexander V. Chernikovclass NlAttrRtFlags(NlAttrU32): 485fee65b7eSAlexander V. Chernikov def _print_attr_value(self): 486fee65b7eSAlexander V. Chernikov s = get_bitmask_str(RtFlagsBSD, self.u32) 487fee65b7eSAlexander V. Chernikov return " rtflags={}".format(s) 488fee65b7eSAlexander V. Chernikov 489fee65b7eSAlexander V. Chernikov 490fee65b7eSAlexander V. Chernikovclass NlAttrIfindex(NlAttrU32): 491fee65b7eSAlexander V. Chernikov def _print_attr_value(self): 492fee65b7eSAlexander V. Chernikov try: 493fee65b7eSAlexander V. Chernikov ifname = socket.if_indextoname(self.u32) 494fee65b7eSAlexander V. Chernikov return " iface={}(#{})".format(ifname, self.u32) 495fee65b7eSAlexander V. Chernikov except OSError: 496fee65b7eSAlexander V. Chernikov pass 497fee65b7eSAlexander V. Chernikov return " iface=if#{}".format(self.u32) 498fee65b7eSAlexander V. Chernikov 499fee65b7eSAlexander V. Chernikov 500fee65b7eSAlexander V. Chernikovclass NlAttrTable(NlAttrU32): 501fee65b7eSAlexander V. Chernikov def _print_attr_value(self): 502fee65b7eSAlexander V. Chernikov return " rtable={}".format(self.u32) 503fee65b7eSAlexander V. Chernikov 504fee65b7eSAlexander V. Chernikov 505fee65b7eSAlexander V. Chernikovclass NlAttrNhId(NlAttrU32): 506fee65b7eSAlexander V. Chernikov def _print_attr_value(self): 507fee65b7eSAlexander V. Chernikov return " nh_id={}".format(self.u32) 508fee65b7eSAlexander V. Chernikov 509fee65b7eSAlexander V. Chernikov 510fee65b7eSAlexander V. Chernikovclass NlAttrKNhId(NlAttrU32): 511fee65b7eSAlexander V. Chernikov def _print_attr_value(self): 512fee65b7eSAlexander V. Chernikov return " knh_id={}".format(self.u32) 513fee65b7eSAlexander V. Chernikov 514fee65b7eSAlexander V. Chernikov 515fee65b7eSAlexander V. Chernikovclass NlAttrMac(NlAttr): 516fee65b7eSAlexander V. Chernikov def _print_attr_value(self): 517fee65b7eSAlexander V. Chernikov return ' mac="' + ":".join(["{:02X}".format(b) for b in self._data]) + '"' 518fee65b7eSAlexander V. Chernikov 519fee65b7eSAlexander V. Chernikov 520fee65b7eSAlexander V. Chernikovclass NlAttrIfStats(NlAttr): 521fee65b7eSAlexander V. Chernikov def _print_attr_value(self): 522fee65b7eSAlexander V. Chernikov return " stats={...}" 523fee65b7eSAlexander V. Chernikov 524fee65b7eSAlexander V. Chernikov 525*10b94e40SAlexander V. Chernikovclass NlAttrCacheInfo(NlAttr): 526*10b94e40SAlexander V. Chernikov def __init__(self, nla_type, data): 527*10b94e40SAlexander V. Chernikov super().__init__(nla_type, data) 528*10b94e40SAlexander V. Chernikov self.ci = IfaCacheInfo.from_buffer_copy(data) 529*10b94e40SAlexander V. Chernikov 530*10b94e40SAlexander V. Chernikov @staticmethod 531*10b94e40SAlexander V. Chernikov def _validate(data): 532*10b94e40SAlexander V. Chernikov nla_len, nla_type = struct.unpack("@HH", data[:4]) 533*10b94e40SAlexander V. Chernikov data_len = nla_len - 4 534*10b94e40SAlexander V. Chernikov if data_len != sizeof(IfaCacheInfo): 535*10b94e40SAlexander V. Chernikov raise ValueError( 536*10b94e40SAlexander V. Chernikov "Error validating attr {}: wrong size".format(nla_type) 537*10b94e40SAlexander V. Chernikov ) # noqa: E501 538*10b94e40SAlexander V. Chernikov 539*10b94e40SAlexander V. Chernikov def _print_attr_value(self): 540*10b94e40SAlexander V. Chernikov return " ifa_prefered={} ifa_valid={} cstamp={} tstamp={}".format( 541*10b94e40SAlexander V. Chernikov self.ci.ifa_prefered, self.ci.ifa_valid, self.ci.cstamp, self.ci.tstamp) 542*10b94e40SAlexander V. Chernikov 543*10b94e40SAlexander V. Chernikov 544fee65b7eSAlexander V. Chernikovclass NlAttrVia(NlAttr): 545fee65b7eSAlexander V. Chernikov def __init__(self, nla_type, family, addr: str): 546fee65b7eSAlexander V. Chernikov super().__init__(nla_type, b"") 547fee65b7eSAlexander V. Chernikov self.addr = addr 548fee65b7eSAlexander V. Chernikov self.family = family 549fee65b7eSAlexander V. Chernikov 550fee65b7eSAlexander V. Chernikov @staticmethod 551fee65b7eSAlexander V. Chernikov def _validate(data): 552fee65b7eSAlexander V. Chernikov nla_len, nla_type = struct.unpack("@HH", data[:4]) 553fee65b7eSAlexander V. Chernikov data_len = nla_len - 4 554fee65b7eSAlexander V. Chernikov if data_len == 0: 555fee65b7eSAlexander V. Chernikov raise ValueError( 556fee65b7eSAlexander V. Chernikov "Error validating attr {}: empty data".format(nla_type) 557fee65b7eSAlexander V. Chernikov ) # noqa: E501 558fee65b7eSAlexander V. Chernikov family = int(data_len[0]) 559fee65b7eSAlexander V. Chernikov if family not in (socket.AF_INET, socket.AF_INET6): 560fee65b7eSAlexander V. Chernikov raise ValueError( 561fee65b7eSAlexander V. Chernikov "Error validating attr {}: unsupported AF {}".format( # noqa: E501 562fee65b7eSAlexander V. Chernikov nla_type, family 563fee65b7eSAlexander V. Chernikov ) 564fee65b7eSAlexander V. Chernikov ) 565fee65b7eSAlexander V. Chernikov if family == socket.AF_INET: 566fee65b7eSAlexander V. Chernikov expected_len = 1 + 4 567fee65b7eSAlexander V. Chernikov else: 568fee65b7eSAlexander V. Chernikov expected_len = 1 + 16 569fee65b7eSAlexander V. Chernikov if data_len != expected_len: 570fee65b7eSAlexander V. Chernikov raise ValueError( 571fee65b7eSAlexander V. Chernikov "Error validating attr {}: expected len {} got {}".format( # noqa: E501 572fee65b7eSAlexander V. Chernikov nla_type, expected_len, data_len 573fee65b7eSAlexander V. Chernikov ) 574fee65b7eSAlexander V. Chernikov ) 575fee65b7eSAlexander V. Chernikov 576fee65b7eSAlexander V. Chernikov @property 577fee65b7eSAlexander V. Chernikov def nla_len(self): 578fee65b7eSAlexander V. Chernikov if self.family == socket.AF_INET6: 579fee65b7eSAlexander V. Chernikov return 21 580fee65b7eSAlexander V. Chernikov else: 581fee65b7eSAlexander V. Chernikov return 9 582fee65b7eSAlexander V. Chernikov 583fee65b7eSAlexander V. Chernikov @classmethod 584fee65b7eSAlexander V. Chernikov def _parse(cls, data): 585fee65b7eSAlexander V. Chernikov nla_len, nla_type, family = struct.unpack("@HHB", data[:5]) 586fee65b7eSAlexander V. Chernikov off = 5 587fee65b7eSAlexander V. Chernikov if family == socket.AF_INET: 588fee65b7eSAlexander V. Chernikov addr = socket.inet_ntop(family, data[off:off + 4]) 589fee65b7eSAlexander V. Chernikov else: 590fee65b7eSAlexander V. Chernikov addr = socket.inet_ntop(family, data[off:off + 16]) 591fee65b7eSAlexander V. Chernikov return cls(nla_type, family, addr) 592fee65b7eSAlexander V. Chernikov 593fee65b7eSAlexander V. Chernikov def __bytes__(self): 594fee65b7eSAlexander V. Chernikov addr = socket.inet_pton(self.family, self.addr) 595fee65b7eSAlexander V. Chernikov return self._to_bytes(struct.pack("@B", self.family) + addr) 596fee65b7eSAlexander V. Chernikov 597fee65b7eSAlexander V. Chernikov def _print_attr_value(self): 598fee65b7eSAlexander V. Chernikov return " via={}".format(self.addr) 599fee65b7eSAlexander V. Chernikov 600fee65b7eSAlexander V. Chernikov 601fee65b7eSAlexander V. Chernikovrtnl_route_attrs = prepare_attrs_map( 602fee65b7eSAlexander V. Chernikov [ 603fee65b7eSAlexander V. Chernikov AttrDescr(RtattrType.RTA_DST, NlAttrIp), 604fee65b7eSAlexander V. Chernikov AttrDescr(RtattrType.RTA_SRC, NlAttrIp), 605fee65b7eSAlexander V. Chernikov AttrDescr(RtattrType.RTA_IIF, NlAttrIfindex), 606fee65b7eSAlexander V. Chernikov AttrDescr(RtattrType.RTA_OIF, NlAttrIfindex), 607fee65b7eSAlexander V. Chernikov AttrDescr(RtattrType.RTA_GATEWAY, NlAttrIp), 608fee65b7eSAlexander V. Chernikov AttrDescr(RtattrType.RTA_TABLE, NlAttrTable), 609fee65b7eSAlexander V. Chernikov AttrDescr(RtattrType.RTA_PRIORITY, NlAttrU32), 610fee65b7eSAlexander V. Chernikov AttrDescr(RtattrType.RTA_VIA, NlAttrVia), 611fee65b7eSAlexander V. Chernikov AttrDescr(RtattrType.RTA_NH_ID, NlAttrNhId), 612fee65b7eSAlexander V. Chernikov AttrDescr(RtattrType.RTA_KNH_ID, NlAttrKNhId), 613fee65b7eSAlexander V. Chernikov AttrDescr(RtattrType.RTA_RTFLAGS, NlAttrRtFlags), 614fee65b7eSAlexander V. Chernikov AttrDescr( 615fee65b7eSAlexander V. Chernikov RtattrType.RTA_METRICS, 616fee65b7eSAlexander V. Chernikov NlAttrNested, 617fee65b7eSAlexander V. Chernikov [ 618fee65b7eSAlexander V. Chernikov AttrDescr(NlRtaxType.RTAX_MTU, NlAttrU32), 619fee65b7eSAlexander V. Chernikov ], 620fee65b7eSAlexander V. Chernikov ), 621fee65b7eSAlexander V. Chernikov ] 622fee65b7eSAlexander V. Chernikov) 623fee65b7eSAlexander V. Chernikov 624fee65b7eSAlexander V. Chernikovrtnl_ifla_attrs = prepare_attrs_map( 625fee65b7eSAlexander V. Chernikov [ 626fee65b7eSAlexander V. Chernikov AttrDescr(IflattrType.IFLA_ADDRESS, NlAttrMac), 627fee65b7eSAlexander V. Chernikov AttrDescr(IflattrType.IFLA_BROADCAST, NlAttrMac), 628fee65b7eSAlexander V. Chernikov AttrDescr(IflattrType.IFLA_IFNAME, NlAttrStr), 629fee65b7eSAlexander V. Chernikov AttrDescr(IflattrType.IFLA_MTU, NlAttrU32), 630fee65b7eSAlexander V. Chernikov AttrDescr(IflattrType.IFLA_LINK, NlAttrU32), 631fee65b7eSAlexander V. Chernikov AttrDescr(IflattrType.IFLA_PROMISCUITY, NlAttrU32), 632fee65b7eSAlexander V. Chernikov AttrDescr(IflattrType.IFLA_OPERSTATE, NlAttrU8), 633fee65b7eSAlexander V. Chernikov AttrDescr(IflattrType.IFLA_CARRIER, NlAttrU8), 634fee65b7eSAlexander V. Chernikov AttrDescr(IflattrType.IFLA_IFALIAS, NlAttrStr), 635fee65b7eSAlexander V. Chernikov AttrDescr(IflattrType.IFLA_STATS64, NlAttrIfStats), 636fee65b7eSAlexander V. Chernikov AttrDescr(IflattrType.IFLA_NEW_IFINDEX, NlAttrU32), 637fee65b7eSAlexander V. Chernikov AttrDescr( 638fee65b7eSAlexander V. Chernikov IflattrType.IFLA_LINKINFO, 639fee65b7eSAlexander V. Chernikov NlAttrNested, 640fee65b7eSAlexander V. Chernikov [ 641fee65b7eSAlexander V. Chernikov AttrDescr(IflinkInfo.IFLA_INFO_KIND, NlAttrStr), 642fee65b7eSAlexander V. Chernikov AttrDescr(IflinkInfo.IFLA_INFO_DATA, NlAttr), 643fee65b7eSAlexander V. Chernikov ], 644fee65b7eSAlexander V. Chernikov ), 645*10b94e40SAlexander V. Chernikov AttrDescr( 646*10b94e40SAlexander V. Chernikov IflattrType.IFLA_FREEBSD, 647*10b94e40SAlexander V. Chernikov NlAttrNested, 648*10b94e40SAlexander V. Chernikov [ 649*10b94e40SAlexander V. Chernikov AttrDescr(IflafAttrType.IFLAF_ORIG_HWADDR, NlAttrMac), 650*10b94e40SAlexander V. Chernikov ], 651*10b94e40SAlexander V. Chernikov ), 652fee65b7eSAlexander V. Chernikov ] 653fee65b7eSAlexander V. Chernikov) 654fee65b7eSAlexander V. Chernikov 655fee65b7eSAlexander V. Chernikovrtnl_ifa_attrs = prepare_attrs_map( 656fee65b7eSAlexander V. Chernikov [ 657d91f8db5SAlexander V. Chernikov AttrDescr(IfaAttrType.IFA_ADDRESS, NlAttrIp), 658d91f8db5SAlexander V. Chernikov AttrDescr(IfaAttrType.IFA_LOCAL, NlAttrIp), 659d91f8db5SAlexander V. Chernikov AttrDescr(IfaAttrType.IFA_LABEL, NlAttrStr), 660d91f8db5SAlexander V. Chernikov AttrDescr(IfaAttrType.IFA_BROADCAST, NlAttrIp), 661d91f8db5SAlexander V. Chernikov AttrDescr(IfaAttrType.IFA_ANYCAST, NlAttrIp), 662d91f8db5SAlexander V. Chernikov AttrDescr(IfaAttrType.IFA_FLAGS, NlAttrU32), 663*10b94e40SAlexander V. Chernikov AttrDescr(IfaAttrType.IFA_CACHEINFO, NlAttrCacheInfo), 664*10b94e40SAlexander V. Chernikov AttrDescr( 665*10b94e40SAlexander V. Chernikov IfaAttrType.IFA_FREEBSD, 666*10b94e40SAlexander V. Chernikov NlAttrNested, 667*10b94e40SAlexander V. Chernikov [ 668*10b94e40SAlexander V. Chernikov AttrDescr(IfafAttrType.IFAF_VHID, NlAttrU32), 669*10b94e40SAlexander V. Chernikov AttrDescr(IfafAttrType.IFAF_FLAGS, NlAttrU32), 670*10b94e40SAlexander V. Chernikov ], 671*10b94e40SAlexander V. Chernikov ), 672fee65b7eSAlexander V. Chernikov ] 673fee65b7eSAlexander V. Chernikov) 674fee65b7eSAlexander V. Chernikov 675fee65b7eSAlexander V. Chernikov 676fee65b7eSAlexander V. Chernikovrtnl_nd_attrs = prepare_attrs_map( 677fee65b7eSAlexander V. Chernikov [ 678fee65b7eSAlexander V. Chernikov AttrDescr(NdAttrType.NDA_DST, NlAttrIp), 679fee65b7eSAlexander V. Chernikov AttrDescr(NdAttrType.NDA_IFINDEX, NlAttrIfindex), 680fee65b7eSAlexander V. Chernikov AttrDescr(NdAttrType.NDA_FLAGS_EXT, NlAttrU32), 681fee65b7eSAlexander V. Chernikov AttrDescr(NdAttrType.NDA_LLADDR, NlAttrMac), 682fee65b7eSAlexander V. Chernikov ] 683fee65b7eSAlexander V. Chernikov) 684fee65b7eSAlexander V. Chernikov 685fee65b7eSAlexander V. Chernikov 686fee65b7eSAlexander V. Chernikovclass BaseNetlinkRtMessage(StdNetlinkMessage): 687fee65b7eSAlexander V. Chernikov pass 688fee65b7eSAlexander V. Chernikov 689fee65b7eSAlexander V. Chernikov 690fee65b7eSAlexander V. Chernikovclass NetlinkRtMessage(BaseNetlinkRtMessage): 691fee65b7eSAlexander V. Chernikov messages = [ 692fc2538cbSAlexander V. Chernikov NlMsgProps(NlRtMsgType.RTM_NEWROUTE, NlMsgCategory.NEW), 693fc2538cbSAlexander V. Chernikov NlMsgProps(NlRtMsgType.RTM_DELROUTE, NlMsgCategory.DELETE), 694fc2538cbSAlexander V. Chernikov NlMsgProps(NlRtMsgType.RTM_GETROUTE, NlMsgCategory.GET), 695fee65b7eSAlexander V. Chernikov ] 696fee65b7eSAlexander V. Chernikov nl_attrs_map = rtnl_route_attrs 697fee65b7eSAlexander V. Chernikov 698fee65b7eSAlexander V. Chernikov def __init__(self, helper, nlm_type): 699fee65b7eSAlexander V. Chernikov super().__init__(helper, nlm_type) 700fee65b7eSAlexander V. Chernikov self.base_hdr = RtMsgHdr() 701fee65b7eSAlexander V. Chernikov 702fee65b7eSAlexander V. Chernikov def parse_base_header(self, data): 703fee65b7eSAlexander V. Chernikov if len(data) < sizeof(RtMsgHdr): 704fee65b7eSAlexander V. Chernikov raise ValueError("length less than rtmsg header") 705fee65b7eSAlexander V. Chernikov rtm_hdr = RtMsgHdr.from_buffer_copy(data) 706fee65b7eSAlexander V. Chernikov return (rtm_hdr, sizeof(RtMsgHdr)) 707fee65b7eSAlexander V. Chernikov 708fee65b7eSAlexander V. Chernikov def print_base_header(self, hdr, prepend=""): 709fee65b7eSAlexander V. Chernikov family = self.helper.get_af_name(hdr.rtm_family) 710fee65b7eSAlexander V. Chernikov print( 711fee65b7eSAlexander V. Chernikov "{}family={}, dst_len={}, src_len={}, tos={}, table={}, protocol={}({}), scope={}({}), type={}({}), flags={}({})".format( # noqa: E501 712fee65b7eSAlexander V. Chernikov prepend, 713fee65b7eSAlexander V. Chernikov family, 714fee65b7eSAlexander V. Chernikov hdr.rtm_dst_len, 715fee65b7eSAlexander V. Chernikov hdr.rtm_src_len, 716fee65b7eSAlexander V. Chernikov hdr.rtm_tos, 717fee65b7eSAlexander V. Chernikov hdr.rtm_table, 718fee65b7eSAlexander V. Chernikov self.helper.get_attr_byval(RtProto, hdr.rtm_protocol), 719fee65b7eSAlexander V. Chernikov hdr.rtm_protocol, 720fee65b7eSAlexander V. Chernikov self.helper.get_attr_byval(RtScope, hdr.rtm_scope), 721fee65b7eSAlexander V. Chernikov hdr.rtm_scope, 722fee65b7eSAlexander V. Chernikov self.helper.get_attr_byval(RtType, hdr.rtm_type), 723fee65b7eSAlexander V. Chernikov hdr.rtm_type, 724fee65b7eSAlexander V. Chernikov self.helper.get_bitmask_str(RtMsgFlags, hdr.rtm_flags), 725fee65b7eSAlexander V. Chernikov hdr.rtm_flags, 726fee65b7eSAlexander V. Chernikov ) 727fee65b7eSAlexander V. Chernikov ) 728fee65b7eSAlexander V. Chernikov 729fee65b7eSAlexander V. Chernikov 730fee65b7eSAlexander V. Chernikovclass NetlinkIflaMessage(BaseNetlinkRtMessage): 731fee65b7eSAlexander V. Chernikov messages = [ 732fc2538cbSAlexander V. Chernikov NlMsgProps(NlRtMsgType.RTM_NEWLINK, NlMsgCategory.NEW), 733fc2538cbSAlexander V. Chernikov NlMsgProps(NlRtMsgType.RTM_DELLINK, NlMsgCategory.DELETE), 734fc2538cbSAlexander V. Chernikov NlMsgProps(NlRtMsgType.RTM_GETLINK, NlMsgCategory.GET), 735fee65b7eSAlexander V. Chernikov ] 736fee65b7eSAlexander V. Chernikov nl_attrs_map = rtnl_ifla_attrs 737fee65b7eSAlexander V. Chernikov 738fee65b7eSAlexander V. Chernikov def __init__(self, helper, nlm_type): 739fee65b7eSAlexander V. Chernikov super().__init__(helper, nlm_type) 740fee65b7eSAlexander V. Chernikov self.base_hdr = IfinfoMsg() 741fee65b7eSAlexander V. Chernikov 742fee65b7eSAlexander V. Chernikov def parse_base_header(self, data): 743fee65b7eSAlexander V. Chernikov if len(data) < sizeof(IfinfoMsg): 744fee65b7eSAlexander V. Chernikov raise ValueError("length less than IfinfoMsg header") 745fee65b7eSAlexander V. Chernikov rtm_hdr = IfinfoMsg.from_buffer_copy(data) 746fee65b7eSAlexander V. Chernikov return (rtm_hdr, sizeof(IfinfoMsg)) 747fee65b7eSAlexander V. Chernikov 748fee65b7eSAlexander V. Chernikov def print_base_header(self, hdr, prepend=""): 749fee65b7eSAlexander V. Chernikov family = self.helper.get_af_name(hdr.ifi_family) 750fee65b7eSAlexander V. Chernikov print( 751fee65b7eSAlexander V. Chernikov "{}family={}, ifi_type={}, ifi_index={}, ifi_flags={}, ifi_change={}".format( # noqa: E501 752fee65b7eSAlexander V. Chernikov prepend, 753fee65b7eSAlexander V. Chernikov family, 754fee65b7eSAlexander V. Chernikov hdr.ifi_type, 755fee65b7eSAlexander V. Chernikov hdr.ifi_index, 756fee65b7eSAlexander V. Chernikov hdr.ifi_flags, 757fee65b7eSAlexander V. Chernikov hdr.ifi_change, 758fee65b7eSAlexander V. Chernikov ) 759fee65b7eSAlexander V. Chernikov ) 760fee65b7eSAlexander V. Chernikov 761fee65b7eSAlexander V. Chernikov 762fee65b7eSAlexander V. Chernikovclass NetlinkIfaMessage(BaseNetlinkRtMessage): 763fee65b7eSAlexander V. Chernikov messages = [ 764fc2538cbSAlexander V. Chernikov NlMsgProps(NlRtMsgType.RTM_NEWADDR, NlMsgCategory.NEW), 765fc2538cbSAlexander V. Chernikov NlMsgProps(NlRtMsgType.RTM_DELADDR, NlMsgCategory.DELETE), 766fc2538cbSAlexander V. Chernikov NlMsgProps(NlRtMsgType.RTM_GETADDR, NlMsgCategory.GET), 767fee65b7eSAlexander V. Chernikov ] 768fee65b7eSAlexander V. Chernikov nl_attrs_map = rtnl_ifa_attrs 769fee65b7eSAlexander V. Chernikov 770fee65b7eSAlexander V. Chernikov def __init__(self, helper, nlm_type): 771fee65b7eSAlexander V. Chernikov super().__init__(helper, nlm_type) 772fee65b7eSAlexander V. Chernikov self.base_hdr = IfaddrMsg() 773fee65b7eSAlexander V. Chernikov 774fee65b7eSAlexander V. Chernikov def parse_base_header(self, data): 775fee65b7eSAlexander V. Chernikov if len(data) < sizeof(IfaddrMsg): 776fee65b7eSAlexander V. Chernikov raise ValueError("length less than IfaddrMsg header") 777fee65b7eSAlexander V. Chernikov rtm_hdr = IfaddrMsg.from_buffer_copy(data) 778fee65b7eSAlexander V. Chernikov return (rtm_hdr, sizeof(IfaddrMsg)) 779fee65b7eSAlexander V. Chernikov 780fee65b7eSAlexander V. Chernikov def print_base_header(self, hdr, prepend=""): 781fee65b7eSAlexander V. Chernikov family = self.helper.get_af_name(hdr.ifa_family) 782fee65b7eSAlexander V. Chernikov print( 783fee65b7eSAlexander V. Chernikov "{}family={}, ifa_prefixlen={}, ifa_flags={}, ifa_scope={}, ifa_index={}".format( # noqa: E501 784fee65b7eSAlexander V. Chernikov prepend, 785fee65b7eSAlexander V. Chernikov family, 786fee65b7eSAlexander V. Chernikov hdr.ifa_prefixlen, 787fee65b7eSAlexander V. Chernikov hdr.ifa_flags, 788fee65b7eSAlexander V. Chernikov hdr.ifa_scope, 789fee65b7eSAlexander V. Chernikov hdr.ifa_index, 790fee65b7eSAlexander V. Chernikov ) 791fee65b7eSAlexander V. Chernikov ) 792fee65b7eSAlexander V. Chernikov 793fee65b7eSAlexander V. Chernikov 794fee65b7eSAlexander V. Chernikovclass NetlinkNdMessage(BaseNetlinkRtMessage): 795fee65b7eSAlexander V. Chernikov messages = [ 796fc2538cbSAlexander V. Chernikov NlMsgProps(NlRtMsgType.RTM_NEWNEIGH, NlMsgCategory.NEW), 797fc2538cbSAlexander V. Chernikov NlMsgProps(NlRtMsgType.RTM_DELNEIGH, NlMsgCategory.DELETE), 798fc2538cbSAlexander V. Chernikov NlMsgProps(NlRtMsgType.RTM_GETNEIGH, NlMsgCategory.GET), 799fee65b7eSAlexander V. Chernikov ] 800fee65b7eSAlexander V. Chernikov nl_attrs_map = rtnl_nd_attrs 801fee65b7eSAlexander V. Chernikov 802fee65b7eSAlexander V. Chernikov def __init__(self, helper, nlm_type): 803fee65b7eSAlexander V. Chernikov super().__init__(helper, nlm_type) 804fee65b7eSAlexander V. Chernikov self.base_hdr = NdMsg() 805fee65b7eSAlexander V. Chernikov 806fee65b7eSAlexander V. Chernikov def parse_base_header(self, data): 807fee65b7eSAlexander V. Chernikov if len(data) < sizeof(NdMsg): 808fee65b7eSAlexander V. Chernikov raise ValueError("length less than NdMsg header") 809fee65b7eSAlexander V. Chernikov nd_hdr = NdMsg.from_buffer_copy(data) 810fee65b7eSAlexander V. Chernikov return (nd_hdr, sizeof(NdMsg)) 811fee65b7eSAlexander V. Chernikov 812fee65b7eSAlexander V. Chernikov def print_base_header(self, hdr, prepend=""): 813fee65b7eSAlexander V. Chernikov family = self.helper.get_af_name(hdr.ndm_family) 814fee65b7eSAlexander V. Chernikov print( 815fee65b7eSAlexander V. Chernikov "{}family={}, ndm_ifindex={}, ndm_state={}, ndm_flags={}".format( # noqa: E501 816fee65b7eSAlexander V. Chernikov prepend, 817fee65b7eSAlexander V. Chernikov family, 818fee65b7eSAlexander V. Chernikov hdr.ndm_ifindex, 819fee65b7eSAlexander V. Chernikov hdr.ndm_state, 820fee65b7eSAlexander V. Chernikov hdr.ndm_flags, 821fee65b7eSAlexander V. Chernikov ) 822fee65b7eSAlexander V. Chernikov ) 823fc2538cbSAlexander V. Chernikov 824fc2538cbSAlexander V. Chernikov 825fc2538cbSAlexander V. Chernikovhandler_classes = { 826fc2538cbSAlexander V. Chernikov "netlink_route": [ 827fc2538cbSAlexander V. Chernikov NetlinkRtMessage, 828fc2538cbSAlexander V. Chernikov NetlinkIflaMessage, 829fc2538cbSAlexander V. Chernikov NetlinkIfaMessage, 830fc2538cbSAlexander V. Chernikov NetlinkNdMessage, 831fc2538cbSAlexander V. Chernikov ], 832fc2538cbSAlexander V. Chernikov} 833