1import socket 2import struct 3from ctypes import c_int 4from ctypes import c_ubyte 5from ctypes import c_uint 6from ctypes import c_ushort 7from ctypes import sizeof 8from ctypes import Structure 9from enum import auto 10from enum import Enum 11 12from atf_python.sys.netlink.attrs import NlAttr 13from atf_python.sys.netlink.attrs import NlAttrIp 14from atf_python.sys.netlink.attrs import NlAttrNested 15from atf_python.sys.netlink.attrs import NlAttrStr 16from atf_python.sys.netlink.attrs import NlAttrU16 17from atf_python.sys.netlink.attrs import NlAttrU32 18from atf_python.sys.netlink.attrs import NlAttrU64 19from atf_python.sys.netlink.attrs import NlAttrU8 20from atf_python.sys.netlink.message import StdNetlinkMessage 21from atf_python.sys.netlink.message import NlMsgProps 22from atf_python.sys.netlink.message import NlMsgCategory 23from atf_python.sys.netlink.utils import AttrDescr 24from atf_python.sys.netlink.utils import get_bitmask_str 25from atf_python.sys.netlink.utils import prepare_attrs_map 26 27 28class RtattrType(Enum): 29 RTA_UNSPEC = 0 30 RTA_DST = 1 31 RTA_SRC = 2 32 RTA_IIF = 3 33 RTA_OIF = 4 34 RTA_GATEWAY = 5 35 RTA_PRIORITY = 6 36 RTA_PREFSRC = 7 37 RTA_METRICS = 8 38 RTA_MULTIPATH = 9 39 # RTA_PROTOINFO = 10 40 RTA_KNH_ID = 10 41 RTA_FLOW = 11 42 RTA_CACHEINFO = 12 43 RTA_SESSION = 13 44 # RTA_MP_ALGO = 14 45 RTA_RTFLAGS = 14 46 RTA_TABLE = 15 47 RTA_MARK = 16 48 RTA_MFC_STATS = 17 49 RTA_VIA = 18 50 RTA_NEWDST = 19 51 RTA_PREF = 20 52 RTA_ENCAP_TYPE = 21 53 RTA_ENCAP = 22 54 RTA_EXPIRES = 23 55 RTA_PAD = 24 56 RTA_UID = 25 57 RTA_TTL_PROPAGATE = 26 58 RTA_IP_PROTO = 27 59 RTA_SPORT = 28 60 RTA_DPORT = 29 61 RTA_NH_ID = 30 62 63 64class NlRtMsgType(Enum): 65 RTM_NEWLINK = 16 66 RTM_DELLINK = 17 67 RTM_GETLINK = 18 68 RTM_SETLINK = 19 69 RTM_NEWADDR = 20 70 RTM_DELADDR = 21 71 RTM_GETADDR = 22 72 RTM_NEWROUTE = 24 73 RTM_DELROUTE = 25 74 RTM_GETROUTE = 26 75 RTM_NEWNEIGH = 28 76 RTM_DELNEIGH = 29 77 RTM_GETNEIGH = 30 78 RTM_NEWRULE = 32 79 RTM_DELRULE = 33 80 RTM_GETRULE = 34 81 RTM_NEWQDISC = 36 82 RTM_DELQDISC = 37 83 RTM_GETQDISC = 38 84 RTM_NEWTCLASS = 40 85 RTM_DELTCLASS = 41 86 RTM_GETTCLASS = 42 87 RTM_NEWTFILTER = 44 88 RTM_DELTFILTER = 45 89 RTM_GETTFILTER = 46 90 RTM_NEWACTION = 48 91 RTM_DELACTION = 49 92 RTM_GETACTION = 50 93 RTM_NEWPREFIX = 52 94 RTM_GETMULTICAST = 58 95 RTM_GETANYCAST = 62 96 RTM_NEWNEIGHTBL = 64 97 RTM_GETNEIGHTBL = 66 98 RTM_SETNEIGHTBL = 67 99 RTM_NEWNDUSEROPT = 68 100 RTM_NEWADDRLABEL = 72 101 RTM_DELADDRLABEL = 73 102 RTM_GETADDRLABEL = 74 103 RTM_GETDCB = 78 104 RTM_SETDCB = 79 105 RTM_NEWNETCONF = 80 106 RTM_GETNETCONF = 82 107 RTM_NEWMDB = 84 108 RTM_DELMDB = 85 109 RTM_GETMDB = 86 110 RTM_NEWNSID = 88 111 RTM_DELNSID = 89 112 RTM_GETNSID = 90 113 RTM_NEWSTATS = 92 114 RTM_GETSTATS = 94 115 116 117class RtAttr(Structure): 118 _fields_ = [ 119 ("rta_len", c_ushort), 120 ("rta_type", c_ushort), 121 ] 122 123 124class RtMsgHdr(Structure): 125 _fields_ = [ 126 ("rtm_family", c_ubyte), 127 ("rtm_dst_len", c_ubyte), 128 ("rtm_src_len", c_ubyte), 129 ("rtm_tos", c_ubyte), 130 ("rtm_table", c_ubyte), 131 ("rtm_protocol", c_ubyte), 132 ("rtm_scope", c_ubyte), 133 ("rtm_type", c_ubyte), 134 ("rtm_flags", c_uint), 135 ] 136 137 138class RtMsgFlags(Enum): 139 RTM_F_NOTIFY = 0x100 140 RTM_F_CLONED = 0x200 141 RTM_F_EQUALIZE = 0x400 142 RTM_F_PREFIX = 0x800 143 RTM_F_LOOKUP_TABLE = 0x1000 144 RTM_F_FIB_MATCH = 0x2000 145 RTM_F_OFFLOAD = 0x4000 146 RTM_F_TRAP = 0x8000 147 RTM_F_OFFLOAD_FAILED = 0x20000000 148 149 150class RtScope(Enum): 151 RT_SCOPE_UNIVERSE = 0 152 RT_SCOPE_SITE = 200 153 RT_SCOPE_LINK = 253 154 RT_SCOPE_HOST = 254 155 RT_SCOPE_NOWHERE = 255 156 157 158class RtType(Enum): 159 RTN_UNSPEC = 0 160 RTN_UNICAST = auto() 161 RTN_LOCAL = auto() 162 RTN_BROADCAST = auto() 163 RTN_ANYCAST = auto() 164 RTN_MULTICAST = auto() 165 RTN_BLACKHOLE = auto() 166 RTN_UNREACHABLE = auto() 167 RTN_PROHIBIT = auto() 168 RTN_THROW = auto() 169 RTN_NAT = auto() 170 RTN_XRESOLVE = auto() 171 172 173class RtProto(Enum): 174 RTPROT_UNSPEC = 0 175 RTPROT_REDIRECT = 1 176 RTPROT_KERNEL = 2 177 RTPROT_BOOT = 3 178 RTPROT_STATIC = 4 179 RTPROT_GATED = 8 180 RTPROT_RA = 9 181 RTPROT_MRT = 10 182 RTPROT_ZEBRA = 11 183 RTPROT_BIRD = 12 184 RTPROT_DNROUTED = 13 185 RTPROT_XORP = 14 186 RTPROT_NTK = 15 187 RTPROT_DHCP = 16 188 RTPROT_MROUTED = 17 189 RTPROT_KEEPALIVED = 18 190 RTPROT_BABEL = 42 191 RTPROT_OPENR = 99 192 RTPROT_BGP = 186 193 RTPROT_ISIS = 187 194 RTPROT_OSPF = 188 195 RTPROT_RIP = 189 196 RTPROT_EIGRP = 192 197 198 199class NlRtaxType(Enum): 200 RTAX_UNSPEC = 0 201 RTAX_LOCK = auto() 202 RTAX_MTU = auto() 203 RTAX_WINDOW = auto() 204 RTAX_RTT = auto() 205 RTAX_RTTVAR = auto() 206 RTAX_SSTHRESH = auto() 207 RTAX_CWND = auto() 208 RTAX_ADVMSS = auto() 209 RTAX_REORDERING = auto() 210 RTAX_HOPLIMIT = auto() 211 RTAX_INITCWND = auto() 212 RTAX_FEATURES = auto() 213 RTAX_RTO_MIN = auto() 214 RTAX_INITRWND = auto() 215 RTAX_QUICKACK = auto() 216 RTAX_CC_ALGO = auto() 217 RTAX_FASTOPEN_NO_COOKIE = auto() 218 219 220class RtFlagsBSD(Enum): 221 RTF_UP = 0x1 222 RTF_GATEWAY = 0x2 223 RTF_HOST = 0x4 224 RTF_REJECT = 0x8 225 RTF_DYNAMIC = 0x10 226 RTF_MODIFIED = 0x20 227 RTF_DONE = 0x40 228 RTF_XRESOLVE = 0x200 229 RTF_LLINFO = 0x400 230 RTF_LLDATA = 0x400 231 RTF_STATIC = 0x800 232 RTF_BLACKHOLE = 0x1000 233 RTF_PROTO2 = 0x4000 234 RTF_PROTO1 = 0x8000 235 RTF_PROTO3 = 0x40000 236 RTF_FIXEDMTU = 0x80000 237 RTF_PINNED = 0x100000 238 RTF_LOCAL = 0x200000 239 RTF_BROADCAST = 0x400000 240 RTF_MULTICAST = 0x800000 241 RTF_STICKY = 0x10000000 242 RTF_RNH_LOCKED = 0x40000000 243 RTF_GWFLAG_COMPAT = 0x80000000 244 245 246class NlRtGroup(Enum): 247 RTNLGRP_NONE = 0 248 RTNLGRP_LINK = auto() 249 RTNLGRP_NOTIFY = auto() 250 RTNLGRP_NEIGH = auto() 251 RTNLGRP_TC = auto() 252 RTNLGRP_IPV4_IFADDR = auto() 253 RTNLGRP_IPV4_MROUTE = auto() 254 RTNLGRP_IPV4_ROUTE = auto() 255 RTNLGRP_IPV4_RULE = auto() 256 RTNLGRP_IPV6_IFADDR = auto() 257 RTNLGRP_IPV6_MROUTE = auto() 258 RTNLGRP_IPV6_ROUTE = auto() 259 RTNLGRP_IPV6_IFINFO = auto() 260 RTNLGRP_DECnet_IFADDR = auto() 261 RTNLGRP_NOP2 = auto() 262 RTNLGRP_DECnet_ROUTE = auto() 263 RTNLGRP_DECnet_RULE = auto() 264 RTNLGRP_NOP4 = auto() 265 RTNLGRP_IPV6_PREFIX = auto() 266 RTNLGRP_IPV6_RULE = auto() 267 RTNLGRP_ND_USEROPT = auto() 268 RTNLGRP_PHONET_IFADDR = auto() 269 RTNLGRP_PHONET_ROUTE = auto() 270 RTNLGRP_DCB = auto() 271 RTNLGRP_IPV4_NETCONF = auto() 272 RTNLGRP_IPV6_NETCONF = auto() 273 RTNLGRP_MDB = auto() 274 RTNLGRP_MPLS_ROUTE = auto() 275 RTNLGRP_NSID = auto() 276 RTNLGRP_MPLS_NETCONF = auto() 277 RTNLGRP_IPV4_MROUTE_R = auto() 278 RTNLGRP_IPV6_MROUTE_R = auto() 279 RTNLGRP_NEXTHOP = auto() 280 RTNLGRP_BRVLAN = auto() 281 282 283class IfinfoMsg(Structure): 284 _fields_ = [ 285 ("ifi_family", c_ubyte), 286 ("__ifi_pad", c_ubyte), 287 ("ifi_type", c_ushort), 288 ("ifi_index", c_int), 289 ("ifi_flags", c_uint), 290 ("ifi_change", c_uint), 291 ] 292 293 294class IflattrType(Enum): 295 IFLA_UNSPEC = 0 296 IFLA_ADDRESS = 1 297 IFLA_BROADCAST = 2 298 IFLA_IFNAME = 3 299 IFLA_MTU = 4 300 IFLA_LINK = 5 301 IFLA_QDISC = 6 302 IFLA_STATS = 7 303 IFLA_COST = 8 304 IFLA_PRIORITY = 9 305 IFLA_MASTER = 10 306 IFLA_WIRELESS = 11 307 IFLA_PROTINFO = 12 308 IFLA_TXQLEN = 13 309 IFLA_MAP = 14 310 IFLA_WEIGHT = 15 311 IFLA_OPERSTATE = 16 312 IFLA_LINKMODE = 17 313 IFLA_LINKINFO = 18 314 IFLA_NET_NS_PID = 19 315 IFLA_IFALIAS = 20 316 IFLA_NUM_VF = 21 317 IFLA_VFINFO_LIST = 22 318 IFLA_STATS64 = 23 319 IFLA_VF_PORTS = 24 320 IFLA_PORT_SELF = 25 321 IFLA_AF_SPEC = 26 322 IFLA_GROUP = 27 323 IFLA_NET_NS_FD = 28 324 IFLA_EXT_MASK = 29 325 IFLA_PROMISCUITY = 30 326 IFLA_NUM_TX_QUEUES = 31 327 IFLA_NUM_RX_QUEUES = 32 328 IFLA_CARRIER = 33 329 IFLA_PHYS_PORT_ID = 34 330 IFLA_CARRIER_CHANGES = 35 331 IFLA_PHYS_SWITCH_ID = 36 332 IFLA_LINK_NETNSID = 37 333 IFLA_PHYS_PORT_NAME = 38 334 IFLA_PROTO_DOWN = 39 335 IFLA_GSO_MAX_SEGS = 40 336 IFLA_GSO_MAX_SIZE = 41 337 IFLA_PAD = 42 338 IFLA_XDP = 43 339 IFLA_EVENT = 44 340 IFLA_NEW_NETNSID = 45 341 IFLA_IF_NETNSID = 46 342 IFLA_CARRIER_UP_COUNT = 47 343 IFLA_CARRIER_DOWN_COUNT = 48 344 IFLA_NEW_IFINDEX = 49 345 IFLA_MIN_MTU = 50 346 IFLA_MAX_MTU = 51 347 IFLA_PROP_LIST = 52 348 IFLA_ALT_IFNAME = 53 349 IFLA_PERM_ADDRESS = 54 350 IFLA_PROTO_DOWN_REASON = 55 351 IFLA_PARENT_DEV_NAME = 56 352 IFLA_PARENT_DEV_BUS_NAME = 57 353 IFLA_GRO_MAX_SIZE = 58 354 IFLA_TSO_MAX_SEGS = 59 355 IFLA_ALLMULTI = 60 356 IFLA_DEVLINK_PORT = 61 357 IFLA_GSO_IPV4_MAX_SIZE = 62 358 IFLA_GRO_IPV4_MAX_SIZE = 63 359 IFLA_FREEBSD = 64 360 361 362class IflafAttrType(Enum): 363 IFLAF_UNSPEC = 0 364 IFLAF_ORIG_IFNAME = 1 365 IFLAF_ORIG_HWADDR = 2 366 IFLAF_CAPS = 3 367 IFLAF_VF_STATUS = 4 368 369 370class IflafVfStatusType(Enum): 371 IFLAF_VFS_UNSPEC = 0 372 IFLAF_VFS_VERSION = 1 373 IFLAF_VFS_ERROR = 2 374 IFLAF_VFS_PF_LINK_STATE = 3 375 IFLAF_VFS_PF_LINK_SPEED = 4 376 IFLAF_VFS_LIST = 5 377 378 379class IflafVfListType(Enum): 380 IFLAF_VF_LIST_UNSPEC = 0 381 IFLAF_VF_LIST_ENTRY = 1 382 383 384class IflafVfType(Enum): 385 IFLAF_VF_UNSPEC = 0 386 IFLAF_VF_INDEX = 1 387 IFLAF_VF_CONFIGURED = 2 388 IFLAF_VF_INITIALIZED = 3 389 IFLAF_VF_MAC = 4 390 IFLAF_VF_VLAN_MODE = 5 391 IFLAF_VF_VLAN = 6 392 IFLAF_VF_VLAN_COUNT = 7 393 IFLAF_VF_VLAN_LIMIT = 8 394 IFLAF_VF_NUM_QUEUES = 9 395 IFLAF_VF_ALLOW_SET_MAC = 10 396 IFLAF_VF_ALLOW_SET_VLAN = 11 397 IFLAF_VF_MAC_ANTI_SPOOF = 12 398 IFLAF_VF_ALLOW_PROMISC = 13 399 IFLAF_VF_TRAFFIC_ENABLED = 14 400 IFLAF_VF_MDD_BLOCKED = 15 401 IFLAF_VF_QUARANTINED = 16 402 IFLAF_VF_API_VERSION = 17 403 IFLAF_VF_LINK_STATE_POLICY = 18 404 IFLAF_VF_EXTENSIONS = 19 405 406 407class IflafVfExtListType(Enum): 408 IFLAF_VF_EXT_LIST_UNSPEC = 0 409 IFLAF_VF_EXT_LIST_ENTRY = 1 410 411 412class IflafVfExtType(Enum): 413 IFLAF_VF_EXT_UNSPEC = 0 414 IFLAF_VF_EXT_NAME = 1 415 IFLAF_VF_EXT_DATA = 2 416 417 418class IflinkInfo(Enum): 419 IFLA_INFO_UNSPEC = 0 420 IFLA_INFO_KIND = auto() 421 IFLA_INFO_DATA = auto() 422 IFLA_INFO_XSTATS = auto() 423 IFLA_INFO_SLAVE_KIND = auto() 424 IFLA_INFO_SLAVE_DATA = auto() 425 426 427class IfLinkInfoDataVlan(Enum): 428 IFLA_VLAN_UNSPEC = 0 429 IFLA_VLAN_ID = auto() 430 IFLA_VLAN_FLAGS = auto() 431 IFLA_VLAN_EGRESS_QOS = auto() 432 IFLA_VLAN_INGRESS_QOS = auto() 433 IFLA_VLAN_PROTOCOL = auto() 434 435 436class IfaddrMsg(Structure): 437 _fields_ = [ 438 ("ifa_family", c_ubyte), 439 ("ifa_prefixlen", c_ubyte), 440 ("ifa_flags", c_ubyte), 441 ("ifa_scope", c_ubyte), 442 ("ifa_index", c_uint), 443 ] 444 445 446class IfaAttrType(Enum): 447 IFA_UNSPEC = 0 448 IFA_ADDRESS = 1 449 IFA_LOCAL = 2 450 IFA_LABEL = 3 451 IFA_BROADCAST = 4 452 IFA_ANYCAST = 5 453 IFA_CACHEINFO = 6 454 IFA_MULTICAST = 7 455 IFA_FLAGS = 8 456 IFA_RT_PRIORITY = 9 457 IFA_TARGET_NETNSID = 10 458 IFA_FREEBSD = 11 459 460 461class IfafAttrType(Enum): 462 IFAF_UNSPEC = 0 463 IFAF_VHID = 1 464 IFAF_FLAGS = 2 465 466 467class IfaCacheInfo(Structure): 468 _fields_ = [ 469 ("ifa_prefered", c_uint), # seconds till the end of the prefix considered preferred 470 ("ifa_valid", c_uint), # seconds till the end of the prefix considered valid 471 ("cstamp", c_uint), # creation time in 1ms intervals from the boot time 472 ("tstamp", c_uint), # update time in 1ms intervals from the boot time 473 ] 474 475 476class IfaFlags(Enum): 477 IFA_F_TEMPORARY = 0x01 478 IFA_F_NODAD = 0x02 479 IFA_F_OPTIMISTIC = 0x04 480 IFA_F_DADFAILED = 0x08 481 IFA_F_HOMEADDRESS = 0x10 482 IFA_F_DEPRECATED = 0x20 483 IFA_F_TENTATIVE = 0x40 484 IFA_F_PERMANENT = 0x80 485 IFA_F_MANAGETEMPADDR = 0x100 486 IFA_F_NOPREFIXROUTE = 0x200 487 IFA_F_MCAUTOJOIN = 0x400 488 IFA_F_STABLE_PRIVACY = 0x800 489 490 491class IfafFlags6(Enum): 492 IN6_IFF_ANYCAST = 0x01 493 IN6_IFF_TENTATIVE = 0x02 494 IN6_IFF_DUPLICATED = 0x04 495 IN6_IFF_DETACHED = 0x08 496 IN6_IFF_DEPRECATED = 0x10 497 IN6_IFF_NODAD = 0x20 498 IN6_IFF_AUTOCONF = 0x40 499 IN6_IFF_TEMPORARY = 0x80 500 IN6_IFF_PREFER_SOURCE = 0x100 501 502 503class NdMsg(Structure): 504 _fields_ = [ 505 ("ndm_family", c_ubyte), 506 ("ndm_pad1", c_ubyte), 507 ("ndm_pad2", c_ubyte), 508 ("ndm_ifindex", c_uint), 509 ("ndm_state", c_ushort), 510 ("ndm_flags", c_ubyte), 511 ("ndm_type", c_ubyte), 512 ] 513 514 515class NdAttrType(Enum): 516 NDA_UNSPEC = 0 517 NDA_DST = 1 518 NDA_LLADDR = 2 519 NDA_CACHEINFO = 3 520 NDA_PROBES = 4 521 NDA_VLAN = 5 522 NDA_PORT = 6 523 NDA_VNI = 7 524 NDA_IFINDEX = 8 525 NDA_MASTER = 9 526 NDA_LINK_NETNSID = 10 527 NDA_SRC_VNI = 11 528 NDA_PROTOCOL = 12 529 NDA_NH_ID = 13 530 NDA_FDB_EXT_ATTRS = 14 531 NDA_FLAGS_EXT = 15 532 NDA_NDM_STATE_MASK = 16 533 NDA_NDM_FLAGS_MASK = 17 534 535 536class NlAttrRtFlags(NlAttrU32): 537 def _print_attr_value(self): 538 s = get_bitmask_str(RtFlagsBSD, self.u32) 539 return " rtflags={}".format(s) 540 541 542class NlAttrIfindex(NlAttrU32): 543 def _print_attr_value(self): 544 try: 545 ifname = socket.if_indextoname(self.u32) 546 return " iface={}(#{})".format(ifname, self.u32) 547 except OSError: 548 pass 549 return " iface=if#{}".format(self.u32) 550 551 552class NlAttrTable(NlAttrU32): 553 def _print_attr_value(self): 554 return " rtable={}".format(self.u32) 555 556 557class NlAttrNhId(NlAttrU32): 558 def _print_attr_value(self): 559 return " nh_id={}".format(self.u32) 560 561 562class NlAttrKNhId(NlAttrU32): 563 def _print_attr_value(self): 564 return " knh_id={}".format(self.u32) 565 566 567class NlAttrMac(NlAttr): 568 def _print_attr_value(self): 569 return ' mac="' + ":".join(["{:02X}".format(b) for b in self._data]) + '"' 570 571 572class NlAttrIfStats(NlAttr): 573 def _print_attr_value(self): 574 return " stats={...}" 575 576 577class NlAttrCacheInfo(NlAttr): 578 def __init__(self, nla_type, data): 579 super().__init__(nla_type, data) 580 self.ci = IfaCacheInfo.from_buffer_copy(data) 581 582 @staticmethod 583 def _validate(data): 584 nla_len, nla_type = struct.unpack("@HH", data[:4]) 585 data_len = nla_len - 4 586 if data_len != sizeof(IfaCacheInfo): 587 raise ValueError( 588 "Error validating attr {}: wrong size".format(nla_type) 589 ) # noqa: E501 590 591 def _print_attr_value(self): 592 return " ifa_prefered={} ifa_valid={} cstamp={} tstamp={}".format( 593 self.ci.ifa_prefered, self.ci.ifa_valid, self.ci.cstamp, self.ci.tstamp) 594 595 596class NlAttrVia(NlAttr): 597 def __init__(self, nla_type, family, addr: str): 598 super().__init__(nla_type, b"") 599 self.addr = addr 600 self.family = family 601 602 @staticmethod 603 def _validate(data): 604 nla_len, nla_type = struct.unpack("@HH", data[:4]) 605 data_len = nla_len - 4 606 if data_len == 0: 607 raise ValueError( 608 "Error validating attr {}: empty data".format(nla_type) 609 ) # noqa: E501 610 family = int(data_len[0]) 611 if family not in (socket.AF_INET, socket.AF_INET6): 612 raise ValueError( 613 "Error validating attr {}: unsupported AF {}".format( # noqa: E501 614 nla_type, family 615 ) 616 ) 617 if family == socket.AF_INET: 618 expected_len = 1 + 4 619 else: 620 expected_len = 1 + 16 621 if data_len != expected_len: 622 raise ValueError( 623 "Error validating attr {}: expected len {} got {}".format( # noqa: E501 624 nla_type, expected_len, data_len 625 ) 626 ) 627 628 @property 629 def nla_len(self): 630 if self.family == socket.AF_INET6: 631 return 21 632 else: 633 return 9 634 635 @classmethod 636 def _parse(cls, data): 637 nla_len, nla_type, family = struct.unpack("@HHB", data[:5]) 638 off = 5 639 if family == socket.AF_INET: 640 addr = socket.inet_ntop(family, data[off:off + 4]) 641 else: 642 addr = socket.inet_ntop(family, data[off:off + 16]) 643 return cls(nla_type, family, addr) 644 645 def __bytes__(self): 646 addr = socket.inet_pton(self.family, self.addr) 647 return self._to_bytes(struct.pack("@B", self.family) + addr) 648 649 def _print_attr_value(self): 650 return " via={}".format(self.addr) 651 652 653rtnl_route_attrs = prepare_attrs_map( 654 [ 655 AttrDescr(RtattrType.RTA_DST, NlAttrIp), 656 AttrDescr(RtattrType.RTA_SRC, NlAttrIp), 657 AttrDescr(RtattrType.RTA_IIF, NlAttrIfindex), 658 AttrDescr(RtattrType.RTA_OIF, NlAttrIfindex), 659 AttrDescr(RtattrType.RTA_GATEWAY, NlAttrIp), 660 AttrDescr(RtattrType.RTA_TABLE, NlAttrTable), 661 AttrDescr(RtattrType.RTA_PRIORITY, NlAttrU32), 662 AttrDescr(RtattrType.RTA_VIA, NlAttrVia), 663 AttrDescr(RtattrType.RTA_NH_ID, NlAttrNhId), 664 AttrDescr(RtattrType.RTA_KNH_ID, NlAttrKNhId), 665 AttrDescr(RtattrType.RTA_RTFLAGS, NlAttrRtFlags), 666 AttrDescr( 667 RtattrType.RTA_METRICS, 668 NlAttrNested, 669 [ 670 AttrDescr(NlRtaxType.RTAX_MTU, NlAttrU32), 671 ], 672 ), 673 ] 674) 675 676rtnl_iflaf_vf_ext_attrs = [ 677 AttrDescr(IflafVfExtType.IFLAF_VF_EXT_NAME, NlAttrStr), 678 AttrDescr(IflafVfExtType.IFLAF_VF_EXT_DATA, NlAttr), 679] 680 681rtnl_iflaf_vf_ext_list_attrs = [ 682 AttrDescr( 683 IflafVfExtListType.IFLAF_VF_EXT_LIST_ENTRY, 684 NlAttrNested, 685 rtnl_iflaf_vf_ext_attrs, 686 ), 687] 688 689rtnl_iflaf_vf_attrs = [ 690 AttrDescr(IflafVfType.IFLAF_VF_INDEX, NlAttrU32), 691 AttrDescr(IflafVfType.IFLAF_VF_CONFIGURED, NlAttrU8), 692 AttrDescr(IflafVfType.IFLAF_VF_INITIALIZED, NlAttrU8), 693 AttrDescr(IflafVfType.IFLAF_VF_MAC, NlAttrMac), 694 AttrDescr(IflafVfType.IFLAF_VF_VLAN_MODE, NlAttrU8), 695 AttrDescr(IflafVfType.IFLAF_VF_VLAN, NlAttrU16), 696 AttrDescr(IflafVfType.IFLAF_VF_VLAN_COUNT, NlAttrU32), 697 AttrDescr(IflafVfType.IFLAF_VF_VLAN_LIMIT, NlAttrU32), 698 AttrDescr(IflafVfType.IFLAF_VF_NUM_QUEUES, NlAttrU32), 699 AttrDescr(IflafVfType.IFLAF_VF_ALLOW_SET_MAC, NlAttrU8), 700 AttrDescr(IflafVfType.IFLAF_VF_ALLOW_SET_VLAN, NlAttrU8), 701 AttrDescr(IflafVfType.IFLAF_VF_MAC_ANTI_SPOOF, NlAttrU8), 702 AttrDescr(IflafVfType.IFLAF_VF_ALLOW_PROMISC, NlAttrU8), 703 AttrDescr(IflafVfType.IFLAF_VF_TRAFFIC_ENABLED, NlAttrU8), 704 AttrDescr(IflafVfType.IFLAF_VF_MDD_BLOCKED, NlAttrU8), 705 AttrDescr(IflafVfType.IFLAF_VF_QUARANTINED, NlAttrU8), 706 AttrDescr(IflafVfType.IFLAF_VF_API_VERSION, NlAttrStr), 707 AttrDescr(IflafVfType.IFLAF_VF_LINK_STATE_POLICY, NlAttrU8), 708 AttrDescr( 709 IflafVfType.IFLAF_VF_EXTENSIONS, 710 NlAttrNested, 711 rtnl_iflaf_vf_ext_list_attrs, 712 ), 713] 714 715rtnl_iflaf_vf_list_attrs = [ 716 AttrDescr( 717 IflafVfListType.IFLAF_VF_LIST_ENTRY, 718 NlAttrNested, 719 rtnl_iflaf_vf_attrs, 720 ), 721] 722 723rtnl_iflaf_vf_status_attrs = [ 724 AttrDescr(IflafVfStatusType.IFLAF_VFS_VERSION, NlAttrU32), 725 AttrDescr(IflafVfStatusType.IFLAF_VFS_ERROR, NlAttrU32), 726 AttrDescr(IflafVfStatusType.IFLAF_VFS_PF_LINK_STATE, NlAttrU8), 727 AttrDescr(IflafVfStatusType.IFLAF_VFS_PF_LINK_SPEED, NlAttrU64), 728 AttrDescr( 729 IflafVfStatusType.IFLAF_VFS_LIST, 730 NlAttrNested, 731 rtnl_iflaf_vf_list_attrs, 732 ), 733] 734 735rtnl_ifla_attrs = prepare_attrs_map( 736 [ 737 AttrDescr(IflattrType.IFLA_ADDRESS, NlAttrMac), 738 AttrDescr(IflattrType.IFLA_BROADCAST, NlAttrMac), 739 AttrDescr(IflattrType.IFLA_IFNAME, NlAttrStr), 740 AttrDescr(IflattrType.IFLA_MTU, NlAttrU32), 741 AttrDescr(IflattrType.IFLA_LINK, NlAttrU32), 742 AttrDescr(IflattrType.IFLA_PROMISCUITY, NlAttrU32), 743 AttrDescr(IflattrType.IFLA_OPERSTATE, NlAttrU8), 744 AttrDescr(IflattrType.IFLA_CARRIER, NlAttrU8), 745 AttrDescr(IflattrType.IFLA_IFALIAS, NlAttrStr), 746 AttrDescr(IflattrType.IFLA_NUM_VF, NlAttrU32), 747 AttrDescr(IflattrType.IFLA_STATS64, NlAttrIfStats), 748 AttrDescr(IflattrType.IFLA_NEW_IFINDEX, NlAttrU32), 749 AttrDescr( 750 IflattrType.IFLA_LINKINFO, 751 NlAttrNested, 752 [ 753 AttrDescr(IflinkInfo.IFLA_INFO_KIND, NlAttrStr), 754 AttrDescr(IflinkInfo.IFLA_INFO_DATA, NlAttr), 755 ], 756 ), 757 AttrDescr( 758 IflattrType.IFLA_FREEBSD, 759 NlAttrNested, 760 [ 761 AttrDescr(IflafAttrType.IFLAF_ORIG_HWADDR, NlAttrMac), 762 AttrDescr( 763 IflafAttrType.IFLAF_VF_STATUS, 764 NlAttrNested, 765 rtnl_iflaf_vf_status_attrs, 766 ), 767 ], 768 ), 769 ] 770) 771 772rtnl_ifa_attrs = prepare_attrs_map( 773 [ 774 AttrDescr(IfaAttrType.IFA_ADDRESS, NlAttrIp), 775 AttrDescr(IfaAttrType.IFA_LOCAL, NlAttrIp), 776 AttrDescr(IfaAttrType.IFA_LABEL, NlAttrStr), 777 AttrDescr(IfaAttrType.IFA_BROADCAST, NlAttrIp), 778 AttrDescr(IfaAttrType.IFA_ANYCAST, NlAttrIp), 779 AttrDescr(IfaAttrType.IFA_FLAGS, NlAttrU32), 780 AttrDescr(IfaAttrType.IFA_CACHEINFO, NlAttrCacheInfo), 781 AttrDescr( 782 IfaAttrType.IFA_FREEBSD, 783 NlAttrNested, 784 [ 785 AttrDescr(IfafAttrType.IFAF_VHID, NlAttrU32), 786 AttrDescr(IfafAttrType.IFAF_FLAGS, NlAttrU32), 787 ], 788 ), 789 ] 790) 791 792 793rtnl_nd_attrs = prepare_attrs_map( 794 [ 795 AttrDescr(NdAttrType.NDA_DST, NlAttrIp), 796 AttrDescr(NdAttrType.NDA_IFINDEX, NlAttrIfindex), 797 AttrDescr(NdAttrType.NDA_FLAGS_EXT, NlAttrU32), 798 AttrDescr(NdAttrType.NDA_LLADDR, NlAttrMac), 799 ] 800) 801 802 803class BaseNetlinkRtMessage(StdNetlinkMessage): 804 pass 805 806 807class NetlinkRtMessage(BaseNetlinkRtMessage): 808 messages = [ 809 NlMsgProps(NlRtMsgType.RTM_NEWROUTE, NlMsgCategory.NEW), 810 NlMsgProps(NlRtMsgType.RTM_DELROUTE, NlMsgCategory.DELETE), 811 NlMsgProps(NlRtMsgType.RTM_GETROUTE, NlMsgCategory.GET), 812 ] 813 nl_attrs_map = rtnl_route_attrs 814 815 def __init__(self, helper, nlm_type): 816 super().__init__(helper, nlm_type) 817 self.base_hdr = RtMsgHdr() 818 819 def parse_base_header(self, data): 820 if len(data) < sizeof(RtMsgHdr): 821 raise ValueError("length less than rtmsg header") 822 rtm_hdr = RtMsgHdr.from_buffer_copy(data) 823 return (rtm_hdr, sizeof(RtMsgHdr)) 824 825 def print_base_header(self, hdr, prepend=""): 826 family = self.helper.get_af_name(hdr.rtm_family) 827 print( 828 "{}family={}, dst_len={}, src_len={}, tos={}, table={}, protocol={}({}), scope={}({}), type={}({}), flags={}({})".format( # noqa: E501 829 prepend, 830 family, 831 hdr.rtm_dst_len, 832 hdr.rtm_src_len, 833 hdr.rtm_tos, 834 hdr.rtm_table, 835 self.helper.get_attr_byval(RtProto, hdr.rtm_protocol), 836 hdr.rtm_protocol, 837 self.helper.get_attr_byval(RtScope, hdr.rtm_scope), 838 hdr.rtm_scope, 839 self.helper.get_attr_byval(RtType, hdr.rtm_type), 840 hdr.rtm_type, 841 self.helper.get_bitmask_str(RtMsgFlags, hdr.rtm_flags), 842 hdr.rtm_flags, 843 ) 844 ) 845 846 847class NetlinkIflaMessage(BaseNetlinkRtMessage): 848 messages = [ 849 NlMsgProps(NlRtMsgType.RTM_NEWLINK, NlMsgCategory.NEW), 850 NlMsgProps(NlRtMsgType.RTM_DELLINK, NlMsgCategory.DELETE), 851 NlMsgProps(NlRtMsgType.RTM_GETLINK, NlMsgCategory.GET), 852 ] 853 nl_attrs_map = rtnl_ifla_attrs 854 855 def __init__(self, helper, nlm_type): 856 super().__init__(helper, nlm_type) 857 self.base_hdr = IfinfoMsg() 858 859 def parse_base_header(self, data): 860 if len(data) < sizeof(IfinfoMsg): 861 raise ValueError("length less than IfinfoMsg header") 862 rtm_hdr = IfinfoMsg.from_buffer_copy(data) 863 return (rtm_hdr, sizeof(IfinfoMsg)) 864 865 def print_base_header(self, hdr, prepend=""): 866 family = self.helper.get_af_name(hdr.ifi_family) 867 print( 868 "{}family={}, ifi_type={}, ifi_index={}, ifi_flags={}, ifi_change={}".format( # noqa: E501 869 prepend, 870 family, 871 hdr.ifi_type, 872 hdr.ifi_index, 873 hdr.ifi_flags, 874 hdr.ifi_change, 875 ) 876 ) 877 878 879class NetlinkIfaMessage(BaseNetlinkRtMessage): 880 messages = [ 881 NlMsgProps(NlRtMsgType.RTM_NEWADDR, NlMsgCategory.NEW), 882 NlMsgProps(NlRtMsgType.RTM_DELADDR, NlMsgCategory.DELETE), 883 NlMsgProps(NlRtMsgType.RTM_GETADDR, NlMsgCategory.GET), 884 ] 885 nl_attrs_map = rtnl_ifa_attrs 886 887 def __init__(self, helper, nlm_type): 888 super().__init__(helper, nlm_type) 889 self.base_hdr = IfaddrMsg() 890 891 def parse_base_header(self, data): 892 if len(data) < sizeof(IfaddrMsg): 893 raise ValueError("length less than IfaddrMsg header") 894 rtm_hdr = IfaddrMsg.from_buffer_copy(data) 895 return (rtm_hdr, sizeof(IfaddrMsg)) 896 897 def print_base_header(self, hdr, prepend=""): 898 family = self.helper.get_af_name(hdr.ifa_family) 899 print( 900 "{}family={}, ifa_prefixlen={}, ifa_flags={}, ifa_scope={}, ifa_index={}".format( # noqa: E501 901 prepend, 902 family, 903 hdr.ifa_prefixlen, 904 hdr.ifa_flags, 905 hdr.ifa_scope, 906 hdr.ifa_index, 907 ) 908 ) 909 910 911class NetlinkNdMessage(BaseNetlinkRtMessage): 912 messages = [ 913 NlMsgProps(NlRtMsgType.RTM_NEWNEIGH, NlMsgCategory.NEW), 914 NlMsgProps(NlRtMsgType.RTM_DELNEIGH, NlMsgCategory.DELETE), 915 NlMsgProps(NlRtMsgType.RTM_GETNEIGH, NlMsgCategory.GET), 916 ] 917 nl_attrs_map = rtnl_nd_attrs 918 919 def __init__(self, helper, nlm_type): 920 super().__init__(helper, nlm_type) 921 self.base_hdr = NdMsg() 922 923 def parse_base_header(self, data): 924 if len(data) < sizeof(NdMsg): 925 raise ValueError("length less than NdMsg header") 926 nd_hdr = NdMsg.from_buffer_copy(data) 927 return (nd_hdr, sizeof(NdMsg)) 928 929 def print_base_header(self, hdr, prepend=""): 930 family = self.helper.get_af_name(hdr.ndm_family) 931 print( 932 "{}family={}, ndm_ifindex={}, ndm_state={}, ndm_flags={}".format( # noqa: E501 933 prepend, 934 family, 935 hdr.ndm_ifindex, 936 hdr.ndm_state, 937 hdr.ndm_flags, 938 ) 939 ) 940 941 942handler_classes = { 943 "netlink_route": [ 944 NetlinkRtMessage, 945 NetlinkIflaMessage, 946 NetlinkIfaMessage, 947 NetlinkNdMessage, 948 ], 949} 950