]>
git.proxmox.com Git - mirror_ifupdown2.git/blob - ifupdown/rtnetlink.py
3 # Copyright 2014 Cumulus Networks, Inc. All rights reserved.
5 # Author: Scott Feldman, sfeldma@cumulusnetworks.com
6 # Author: Roopa Prabhu, roopa@cumulusnetworks.com
9 from socket
import NETLINK_ROUTE
, AF_INET
, AF_INET6
10 from string
import printable
16 logger
= logging
.getLogger(__name__
)
19 # from /usr/include/linux/rtnetlink.h
23 RTMGRP_IPV4_IFADDR
= 0x10
24 RTMGRP_IPV4_ROUTE
= 0x40
25 RTMGRP_IPV6_IFADDR
= 0x100
26 RTMGRP_IPV6_ROUTE
= 0x400
38 # Definitions used in routing table administration.
40 class Nlmsg(Structure
):
43 return string_at(addressof(self
), sizeof(self
))
45 def __eq__(self
, other
):
46 return self
._stringify
() == other
._stringify
() and \
47 self
.__dict
__ == other
.__dict
__
50 return Rtattr
.from_address(addressof(self
) + NLMSG_ALIGN(sizeof(self
)))
52 def pack_extra(self
, extra
, addr
):
53 memmove(addr
, addressof(extra
), sizeof(extra
))
54 return NLMSG_ALIGN(sizeof(extra
))
56 def pack_rtas(self
, rtas
, addr
):
58 for rta_type
, value
in rtas
.iteritems():
59 rta
= Rtattr
.from_address(addr
)
60 rta
.rta_type
= rta_type
61 pack_fn
= self
.rta_fn(rta_type
)
62 rta_len
= NLMSG_ALIGN(pack_fn(rta
, value
))
67 def pack_rtas_new(self
, rtas
, addr
, policy
):
70 for rta_type
, value
in rtas
.iteritems():
71 if type(value
) == dict:
72 rta
= Rtattr
.from_address(addr
)
73 rta
.rta_type
= rta_type
74 rta
.rta_len
= RTA_LENGTH(0)
75 rta_len
= NLMSG_ALIGN(rta
.rta_len
)
78 pack_fn
= policy
.get(rta_type
)
79 rta_len
= NLMSG_ALIGN(pack_fn(addr
, value
))
81 rta
.rta_len
+= rta_len
83 rta
= Rtattr
.from_address(addr
)
84 rta
.rta_type
= rta_type
85 pack_fn
= policy
.get(rta_type
)
86 rta_len
= NLMSG_ALIGN(pack_fn(rta
, value
))
91 def rta_linkinfo(self
, addr
, rtas
):
94 # Start nested linkinfo
95 #rta = Rtattr.from_address(addr)
96 #rta.rta_type = IFLA_LINKINFO
97 #rta.rta_len = RTA_LENGTH(0)
98 #rta_len = NLMSG_ALIGN(rta.rta_len)
101 #nest_start_linkinfo = rta
103 # Check interface kind
104 kind
= rtas
.get(IFLA_INFO_KIND
)
106 data_policy
= self
.rta_linkinfo_data_vlan_policy()
108 data_policy
= self
.rta_linkinfo_data_macvlan_policy()
111 rta
= Rtattr
.from_address(addr
)
112 rta
.rta_type
= IFLA_INFO_KIND
113 rta_len
= NLMSG_ALIGN(self
.rta_string(rta
, kind
))
117 # nest start link info data
118 rta
= Rtattr
.from_address(addr
)
119 rta
.rta_type
= IFLA_INFO_DATA
120 rta
.rta_len
= RTA_LENGTH(0)
121 rta_len
= NLMSG_ALIGN(rta
.rta_len
)
124 rta_len
= self
.pack_rtas_new(rtas
.get(IFLA_INFO_DATA
), addr
,
126 rta
.rta_len
+= rta_len
133 def rta_linkinfo_data_vlan(self
, addr
, rtas
):
134 return self
.pack_rtas_new(rtas
, addr
, self
.rta_linkinfo_data_vlan_policy())
136 def rta_linkinfo_data(self
, addr
, rtas
):
137 return self
.pack_rtas_new(rtas
, addr
, self
.rta_linkinfo_data_vlan_policy())
139 def unpack_rtas(self
, which_ones
=[]):
140 len = self
.nlh
.nlmsg_len
- NLMSG_LENGTH(sizeof(self
))
143 while RTA_OK(rta
, len):
144 rta_type
= rta
.rta_type
145 if not which_ones
or rta_type
in which_ones
:
146 unpack_fn
= self
.rta_fn(rta_type
)
147 rtas
[rta_type
] = unpack_fn(rta
)
148 len, rta
= RTA_NEXT(rta
, len)
152 rtas
= self
.unpack_rtas()
153 for type, value
in rtas
.iteritems():
154 print "rta", type, ":", value
156 class _IPv6Addr(BigEndianStructure
):
162 class _IPv4Addr(BigEndianStructure
):
167 def rta_uint8(self
, rta
, value
=None):
170 c_uint8
.from_address(data
).value
= value
171 rta
.rta_len
= RTA_LENGTH(sizeof(c_uint8
))
174 return c_uint8
.from_address(data
).value
176 def rta_uint16(self
, rta
, value
=None):
179 c_uint16
.from_address(data
).value
= value
180 rta
.rta_len
= RTA_LENGTH(sizeof(c_uint16
))
183 return c_uint16
.from_address(data
).value
185 def rta_uint32(self
, rta
, value
=None):
188 c_uint32
.from_address(data
).value
= value
189 rta
.rta_len
= RTA_LENGTH(sizeof(c_uint32
))
192 return c_uint32
.from_address(data
).value
194 def rta_string(self
, rta
, value
=None):
197 s
= create_string_buffer(value
)
198 memmove(data
, addressof(s
), len(value
))
199 rta
.rta_len
= RTA_LENGTH(len(value
))
202 return c_char_p(data
).value
204 def rta_addr(self
, rta
, value
=None):
207 if isinstance(value
, IPv4Address
):
208 self
._IPv
4Addr
.from_address(data
).addr
= value
._ip
209 rta
.rta_len
= RTA_LENGTH(sizeof(self
._IPv
4Addr
))
210 elif isinstance(value
, IPv6Address
):
211 addr
= self
._IPv
6Addr
.from_address(data
)
212 addr
.upper
= value
._ip
>> 64
213 addr
.lower
= value
._ip
& 0xffffffffffffffff
214 rta
.rta_len
= RTA_LENGTH(sizeof(self
._IPv
6Addr
))
219 if RTA_PAYLOAD(rta
) == 4:
220 addr
= c_uint32
.__ctype_be__
.from_address(data
).value
221 addr
= IPv4Address(addr
)
223 addr
= self
._IPv
6Addr
.from_address(data
)
224 addr
= IPv6Address((addr
.upper
<< 64) + addr
.lower
)
227 def rta_uint8_array(self
, rta
, value
=None):
232 array
= (c_uint8
* RTA_PAYLOAD(rta
))()
233 memmove(array
, data
, RTA_PAYLOAD(rta
))
236 def rta_uint32_array(self
, rta
, value
=None):
241 size
= RTA_PAYLOAD(rta
) / sizeof(c_uint32
)
242 array
= (c_uint32
* size
)()
243 memmove(array
, data
, RTA_PAYLOAD(rta
))
246 def rta_multipath(self
, rta
, value
=None):
250 def rta_wtf(self
, rta
, value
=None):
253 def rta_none(self
, rta
, value
=None):
256 def rta_fn(self
, rta_type
):
263 RTN_UNICAST
= 1 # Gateway or direct route
264 RTN_LOCAL
= 2 # Accept locally
265 RTN_BROADCAST
= 3 # Accept locally as broadcast,
267 RTN_ANYCAST
= 4 # Accept locally as broadcast,
268 # but send as unicast
269 RTN_MULTICAST
= 5 # Multicast route
270 RTN_BLACKHOLE
= 6 # Drop
271 RTN_UNREACHABLE
= 7 # Destination is unreachable
272 RTN_PROHIBIT
= 8 # Administratively prohibited
273 RTN_THROW
= 9 # Not in this table
274 RTN_NAT
= 10 # Translate this address
275 RTN_XRESOLVE
= 11 # Use external resolver
281 RTPROT_REDIRECT
= 1 # Route installed by ICMP redirects;
282 # not used by current IPv4
283 RTPROT_KERNEL
= 2 # Route installed by kernel
284 RTPROT_BOOT
= 3 # Route installed during boot
285 RTPROT_STATIC
= 4 # Route installed by administrator
287 # Values of protocol >= RTPROT_STATIC are not interpreted by kernel;
288 # they are just passed from user and back as is.
289 # It will be used by hypothetical multiple routing daemons.
290 # Note that protocol values should be standardized in order to
293 RTPROT_GATED
= 8 # Apparently, GateD
294 RTPROT_RA
= 9 # RDISC/ND router advertisements
295 RTPROT_MRT
= 10 # Merit MRT
296 RTPROT_ZEBRA
= 11 # Zebra
297 RTPROT_BIRD
= 12 # BIRD
298 RTPROT_DNROUTED
= 13 # DECnet routing daemon
299 RTPROT_XORP
= 14 # XORP
300 RTPROT_NTK
= 15 # Netsukuku
301 RTPROT_DHCP
= 16 # DHCP client
305 # Really it is not scope, but sort of distance to the destination.
306 # NOWHERE are reserved for not existing destinations, HOST is our
307 # local addresses, LINK are destinations, located on directly attached
308 # link and UNIVERSE is everywhere in the Universe.
310 # Intermediate values are also possible f.e. interior routes
311 # could be assigned a value between UNIVERSE and LINK.
313 RT_SCOPE_UNIVERSE
= 0
314 # User defined values
322 RTM_F_NOTIFY
= 0x100 # Notify user of route change
323 RTM_F_CLONED
= 0x200 # This route is cloned
324 RTM_F_EQUALIZE
= 0x400 # Multipath equalizer: NI
325 RTM_F_PREFIX
= 0x800 # Prefix addresses
327 # Reserved table identifiers
330 # User defined values
331 RT_TABLE_COMPAT
= 252
332 RT_TABLE_DEFAULT
= 253
335 RT_TABLE_MAX
= 0xFFFFFFFF
337 # Generic structure for encapsulation of optional route information.
338 # It is reminiscent of sockaddr, but with sa_family replaced
339 # with attribute type.
341 class Rtattr(Structure
):
344 ('rta_len', c_uint16
),
345 ('rta_type', c_uint16
),
348 # Routing message attributes
360 RTA_PROTOINFO
= 10 # no longer used
363 RTA_SESSION
= 13 # no longer used
364 RTA_MP_ALGO
= 14 # no longer used
368 # Macros to handle rtattributes
372 return (len + RTA_ALIGNTO
- 1) & ~
(RTA_ALIGNTO
- 1)
373 def RTA_OK(rta
, len):
374 return len >= sizeof(Rtattr
) and \
375 rta
.rta_len
>= sizeof(Rtattr
) and \
377 def RTA_NEXT(rta
, len):
378 cur
= RTA_ALIGN(rta
.rta_len
)
379 rta
= Rtattr
.from_address(addressof(rta
) + cur
)
380 return len - cur
, rta
382 return len + RTA_ALIGN(sizeof(Rtattr
))
384 return RTA_ALIGN(RTA_LENGTH(len))
386 return addressof(rta
) + RTA_LENGTH(0)
387 def RTA_PAYLOAD(rta
):
388 return rta
.rta_len
- RTA_LENGTH(0)
390 RTNH_F_DEAD
= 1 # Nexthop is dead (used by multipath)
391 RTNH_F_PERVASIVE
= 2 # Do recursive gateway lookup
392 RTNH_F_ONLINK
= 4 # Gateway is forced on link
394 # Reserved table identifiers
397 # User defined values
398 RT_TABLE_COMPAT
= 252
399 RT_TABLE_DEFAULT
= 253
402 RT_TABLE_MAX
= 0xFFFFFFFF
407 ('rtm_family', c_uint8
),
408 ('rtm_dst_len', c_uint8
),
409 ('rtm_src_len', c_uint8
),
410 ('rtm_tos', c_uint8
),
411 ('rtm_table', c_uint8
),
412 ('rtm_protocol', c_uint8
),
413 ('rtm_scope', c_uint8
),
414 ('rtm_type', c_uint8
),
415 ('rtm_flags', c_uint32
),
419 RT_TABLE_UNSPEC
: "unspecified",
420 RT_TABLE_COMPAT
: "compat",
421 RT_TABLE_DEFAULT
: "default",
422 RT_TABLE_MAIN
: "main",
423 RT_TABLE_LOCAL
: "local",
427 RTPROT_UNSPEC
: "none",
428 RTPROT_REDIRECT
: "redirect",
429 RTPROT_KERNEL
: "kernel",
431 RTPROT_STATIC
: "static",
432 RTPROT_GATED
: "gated",
434 RTPROT_MRT
: "mrtmrt",
435 RTPROT_ZEBRA
: "zebra",
437 RTPROT_DNROUTED
: "dnrouted",
444 RT_SCOPE_UNIVERSE
: "universe",
445 RT_SCOPE_SITE
: "site",
446 RT_SCOPE_LINK
: "link",
447 RT_SCOPE_HOST
: "host",
448 RT_SCOPE_NOWHERE
: "nowhere",
452 RTN_UNSPEC
: "unspecified",
453 RTN_UNICAST
: "unicast",
455 RTN_BROADCAST
: "broadcast",
456 RTN_ANYCAST
: "anycast",
457 RTN_MULTICAST
: "multicast",
458 RTN_BLACKHOLE
: "blackhole",
459 RTN_UNREACHABLE
: "unreachable",
460 RTN_PROHIBIT
: "prohibit",
463 RTN_XRESOLVE
: "xresolve",
467 print 'rtm_family', self
.rtm_family
468 print 'rtm_dst_len', self
.rtm_dst_len
469 print 'rtm_src_len', self
.rtm_src_len
470 print 'rtm_tos', self
.rtm_tos
471 print 'rtm_table', self
._table
_str
.get(self
.rtm_table
, self
.rtm_table
)
472 print 'rtm_protocol', self
._proto
_str
.get(self
.rtm_protocol
)
473 print 'rtm_scope', self
._scope
_str
.get(self
.rtm_scope
)
474 print 'rtm_type', self
._type
_str
.get(self
.rtm_type
)
475 print 'rtm_flags 0x%08x' % self
.rtm_flags
477 def rta_fn(self
, rta_type
):
479 RTA_DST
: self
.rta_addr
,
480 RTA_SRC
: self
.rta_addr
,
481 RTA_IIF
: self
.rta_uint32
,
482 RTA_OIF
: self
.rta_uint32
,
483 RTA_GATEWAY
: self
.rta_addr
,
484 RTA_PRIORITY
: self
.rta_uint32
,
485 RTA_PREFSRC
: self
.rta_addr
,
486 RTA_METRICS
: self
.rta_uint32_array
,
487 RTA_MULTIPATH
: self
.rta_multipath
,
488 RTA_PROTOINFO
: self
.rta_none
,
489 RTA_FLOW
: self
.rta_uint32
,
490 RTA_CACHEINFO
: self
.rta_none
,
491 RTA_SESSION
: self
.rta_none
,
492 RTA_MP_ALGO
: self
.rta_none
,
493 RTA_TABLE
: self
.rta_uint32
,
496 return fns
.get(rta_type
)
498 class Rtgenmsg(Nlmsg
):
501 ('rtgen_family', c_uint8
),
505 print 'rtgen_family', self
.rtgen_family
507 # New extended info filters for IFLA_EXT_MASK
508 RTEXT_FILTER_VF
= (1 << 0)
510 # passes link level specific information, not dependent
511 # on network protocol.
524 IFLA_WIRELESS
= 11 # Wireless Extension event - see wireless.h
525 IFLA_PROTINFO
= 12 # Protocol specific information for a link
534 IFLA_NUM_VF
= 21 # Number of VFs if device is SR-IOV PF
535 IFLA_VFINFO_LIST
= 22
540 IFLA_GROUP
= 27 # Group the device belongs to
542 IFLA_EXT_MASK
= 29 # Extended info mask, VFs, etc
546 # IFLA_LINKINFO attributes
553 # IFLA_LINKINFO_DATA attributes for vlan
557 # IFLA_LINKINFO_DATA attributes for macvlan
558 IFLA_MACVLAN_UNSPEC
= 0
559 IFLA_MACVLAN_MODE
= 1
562 MACVLAN_MODE_PRIVATE
= 1
563 MACVLAN_MODE_VEPA
= 2
564 MACVLAN_MODE_BRIDGE
= 3
565 MACVLAN_MODE_PASSTHRU
= 4
567 class Ifinfomsg(Nlmsg
):
570 ('ifi_family', c_uint8
),
571 ('__ifi_pad', c_uint8
),
572 ('ifi_type', c_uint16
), # ARPHRD_*
573 ('ifi_index', c_int32
), # Link index
574 ('ifi_flags', c_uint32
), # IFF_* flags
575 ('ifi_change', c_uint32
), # IFF_* change mask
579 print 'ifi_family', self
.ifi_family
580 print 'ifi_type', self
.ifi_type
581 print 'ifi_index', self
.ifi_index
582 print 'ifi_flags 0x%08x' % self
.ifi_flags
583 print 'ifi_change 0x%08x' % self
.ifi_change
585 def rta_linkinfo_data_vlan_policy(self
):
587 IFLA_VLAN_ID
: self
.rta_uint16
,
591 def rta_linkinfo_data_macvlan_policy(self
):
593 IFLA_MACVLAN_MODE
: self
.rta_uint32
,
597 def rta_linkinfo_policy(self
):
599 IFLA_INFO_KIND
: self
.rta_string
,
600 IFLA_INFO_DATA
: self
.rta_linkinfo_data
,
604 def rta_policy(self
):
606 IFLA_UNSPEC
: self
.rta_wtf
,
607 IFLA_ADDRESS
: self
.rta_uint8_array
,
608 IFLA_BROADCAST
: self
.rta_uint8_array
,
609 IFLA_IFNAME
: self
.rta_string
,
610 IFLA_MTU
: self
.rta_uint32
,
611 IFLA_LINK
: self
.rta_uint32
,
612 IFLA_QDISC
: self
.rta_string
,
613 IFLA_STATS
: self
.rta_none
,
614 IFLA_COST
: self
.rta_none
,
615 IFLA_PRIORITY
: self
.rta_none
,
616 IFLA_MASTER
: self
.rta_uint32
,
617 IFLA_WIRELESS
: self
.rta_none
,
618 IFLA_PROTINFO
: self
.rta_none
,
619 IFLA_TXQLEN
: self
.rta_uint32
,
620 IFLA_MAP
: self
.rta_none
,
621 IFLA_WEIGHT
: self
.rta_uint32
,
622 IFLA_OPERSTATE
: self
.rta_uint8
,
623 IFLA_LINKMODE
: self
.rta_uint8
,
624 IFLA_LINKINFO
: self
.rta_linkinfo
,
625 IFLA_NET_NS_PID
: self
.rta_uint32
,
626 IFLA_IFALIAS
: self
.rta_string
,
627 IFLA_NUM_VF
: self
.rta_uint32
,
628 IFLA_VFINFO_LIST
: self
.rta_none
,
629 IFLA_STATS64
: self
.rta_none
,
630 IFLA_VF_PORTS
: self
.rta_none
,
631 IFLA_PORT_SELF
: self
.rta_none
,
632 IFLA_AF_SPEC
: self
.rta_none
,
633 IFLA_GROUP
: self
.rta_none
,
634 IFLA_NET_NS_FD
: self
.rta_none
,
635 IFLA_EXT_MASK
: self
.rta_none
,
639 def rta_fn(self
, rta_type
):
641 IFLA_UNSPEC
: self
.rta_wtf
,
642 IFLA_ADDRESS
: self
.rta_uint8_array
,
643 IFLA_BROADCAST
: self
.rta_uint8_array
,
644 IFLA_IFNAME
: self
.rta_string
,
645 IFLA_MTU
: self
.rta_uint32
,
646 IFLA_LINK
: self
.rta_uint32
,
647 IFLA_QDISC
: self
.rta_string
,
648 IFLA_STATS
: self
.rta_none
,
649 IFLA_COST
: self
.rta_none
,
650 IFLA_PRIORITY
: self
.rta_none
,
651 IFLA_MASTER
: self
.rta_uint32
,
652 IFLA_WIRELESS
: self
.rta_none
,
653 IFLA_PROTINFO
: self
.rta_none
,
654 IFLA_TXQLEN
: self
.rta_uint32
,
655 IFLA_MAP
: self
.rta_none
,
656 IFLA_WEIGHT
: self
.rta_uint32
,
657 IFLA_OPERSTATE
: self
.rta_uint8
,
658 IFLA_LINKMODE
: self
.rta_uint8
,
659 IFLA_LINKINFO
: self
.rta_linkinfo
,
660 IFLA_NET_NS_PID
: self
.rta_uint32
,
661 IFLA_IFALIAS
: self
.rta_string
,
662 IFLA_NUM_VF
: self
.rta_uint32
,
663 IFLA_VFINFO_LIST
: self
.rta_none
,
664 IFLA_STATS64
: self
.rta_none
,
665 IFLA_VF_PORTS
: self
.rta_none
,
666 IFLA_PORT_SELF
: self
.rta_none
,
667 IFLA_AF_SPEC
: self
.rta_none
,
668 IFLA_GROUP
: self
.rta_none
,
669 IFLA_NET_NS_FD
: self
.rta_none
,
670 IFLA_EXT_MASK
: self
.rta_none
,
672 return fns
.get(rta_type
)
674 # passes address specific information
677 # IFA_ADDRESS is prefix address, rather than local interface address.
678 # It makes no difference for normally configured broadcast interfaces,
679 # but for point-to-point IFA_ADDRESS is DESTINATION address,
680 # local address is supplied in IFA_LOCAL attribute.
692 class Ifaddrmsg(Nlmsg
):
695 ('ifa_family', c_uint8
),
696 ('ifa_prefixlen', c_uint8
), # The prefix length
697 ('ifa_flags', c_uint8
), # Flags
698 ('ifa_scope', c_uint8
), # Address scope
699 ('ifa_index', c_uint32
), # Link index
708 print 'ifa_family', self
.ifa_family
709 print 'ifa_prefixlen', self
.ifa_prefixlen
710 print 'ifa_flags 0x%02x' % self
.ifa_flags
711 print 'ifa_scope', self
.ifa_scope
712 print 'ifa_index', self
.ifa_index
714 def rta_fn(self
, rta_type
):
716 IFA_ADDRESS
: self
.rta_addr
,
717 IFA_LOCAL
: self
.rta_addr
,
718 IFA_LABEL
: self
.rta_string
,
719 IFA_BROADCAST
: self
.rta_addr
,
720 IFA_ANYCAST
: self
.rta_addr
,
721 IFA_CACHEINFO
: self
.rta_none
,
722 IFA_MULTICAST
: self
.rta_addr
,
724 return fns
.get(rta_type
)
726 class RtNetlinkError(Exception):
728 def __init__(self
, message
):
729 Exception.__init
__(self
, message
)
730 logger
.error(message
)
732 class RtNetlink(Netlink
):
734 def __init__(self
, pid
):
735 Netlink
.__init
__(self
, pid
, NETLINK_ROUTE
)
737 _rt_nlmsg_type_str
= {
738 RTM_NEWROUTE
: "RTM_NEWROUTE",
739 RTM_DELROUTE
: "RTM_DELROUTE",
740 RTM_NEWLINK
: "RTM_NEWLINK",
741 RTM_DELLINK
: "RTM_DELLINK",
742 RTM_GETLINK
: "RTM_GETLINK",
743 RTM_NEWADDR
: "RTM_NEWADDR",
744 RTM_DELADDR
: "RTM_DELADDR",
747 def _hexdump(self
, buf
):
751 nums
= ["%02x" % c
for c
in chunk
]
752 txt
= [chr(c
) if chr(c
) in printable
[:-5] else '.' for c
in chunk
]
753 print " ".join(nums
).ljust(48), "".join(txt
)
756 nlmsg
= self
.nlmsg(nlh
)
758 self
._hexdump
(self
.sendbuf
[:nlh
.nlmsg_len
])
766 def nlmsg(self
, nlh
):
771 RTM_NEWLINK
: Ifinfomsg
,
772 RTM_DELLINK
: Ifinfomsg
,
773 RTM_GETLINK
: Rtgenmsg
,
774 RTM_NEWADDR
: Ifaddrmsg
,
775 RTM_DELADDR
: Ifaddrmsg
,
776 RTM_GETADDR
: Rtgenmsg
,
778 nldata
= NLMSG_DATA(nlh
)
779 nlmsg
= nlmsg_struct
[nlh
.nlmsg_type
].from_address(nldata
)
783 def _nl_cb(self
, nlh
):
784 # print "nl cb", self._rt_nlmsg_type_str[nlh.nlmsg_type]
786 if nlh
.nlmsg_type
in self
._cbs
:
788 nlmsg
= self
.nlmsg(nlh
)
791 if nlh
.nlmsg_len
- NLMSG_LENGTH(sizeof(nlmsg
)) < 0:
792 raise RtNetlinkError("invalid nl length")
794 self
._cbs
[nlh
.nlmsg_type
](nlh
, nlmsg
)
796 def bind(self
, groups
, cbs
):
798 Netlink
.bind(self
, groups
, self
._nl
_cb
)
800 def request(self
, nlmsg_type
, flags
, extra
, rtas
={}):
802 nlh
= Nlmsghdr
.from_buffer(self
.sendbuf
)
803 nlh_p
= addressof(nlh
)
808 nlh
.nlmsg_len
= NLMSG_HDRLEN()
809 nlh
.nlmsg_type
= nlmsg_type
810 nlh
.nlmsg_flags
= flags
814 nlmsg
= self
.nlmsg(nlh
)
816 nlh
.nlmsg_len
+= nlmsg
.pack_extra(extra
, nlh_p
+ nlh
.nlmsg_len
)
817 nlh
.nlmsg_len
+= nlmsg
.pack_rtas_new(rtas
, nlh_p
+ nlh
.nlmsg_len
, nlmsg
.rta_policy())
820 self
.sendall(string_at(nlh_p
, nlh
.nlmsg_len
))
826 def rta_linkinfo_policy(self
):
828 [IFLA_INFO_KIND
] : self
.rta_string
,
829 [IFLA_INFO_DATA
] : self
.rta_linkinfo_data
,
833 def rta_policy(self
):
835 IFLA_UNSPEC
: self
.rta_wtf
,
836 IFLA_ADDRESS
: self
.rta_uint8_array
,
837 IFLA_BROADCAST
: self
.rta_uint8_array
,
838 IFLA_IFNAME
: self
.rta_string
,
839 IFLA_MTU
: self
.rta_uint32
,
840 IFLA_LINK
: self
.rta_uint32
,
841 IFLA_QDISC
: self
.rta_string
,
842 IFLA_STATS
: self
.rta_none
,
843 IFLA_COST
: self
.rta_none
,
844 IFLA_PRIORITY
: self
.rta_none
,
845 IFLA_MASTER
: self
.rta_uint32
,
846 IFLA_WIRELESS
: self
.rta_none
,
847 IFLA_PROTINFO
: self
.rta_none
,
848 IFLA_TXQLEN
: self
.rta_uint32
,
849 IFLA_MAP
: self
.rta_none
,
850 IFLA_WEIGHT
: self
.rta_uint32
,
851 IFLA_OPERSTATE
: self
.rta_uint8
,
852 IFLA_LINKMODE
: self
.rta_uint8
,
853 IFLA_LINKINFO
: self
.rta_linkinfo
,
854 IFLA_NET_NS_PID
: self
.rta_uint32
,
855 IFLA_IFALIAS
: self
.rta_string
,
856 IFLA_NUM_VF
: self
.rta_uint32
,
857 IFLA_VFINFO_LIST
: self
.rta_none
,
858 IFLA_STATS64
: self
.rta_none
,
859 IFLA_VF_PORTS
: self
.rta_none
,
860 IFLA_PORT_SELF
: self
.rta_none
,
861 IFLA_AF_SPEC
: self
.rta_none
,
862 IFLA_GROUP
: self
.rta_none
,
863 IFLA_NET_NS_FD
: self
.rta_none
,
864 IFLA_EXT_MASK
: self
.rta_none
,