
    /I_A                         S SK Jr  SSK7  S SKJr  S SKJrJr  S SKrS SKrS SK	r	\R                  " \5      r " S S\5      r " S	 S
\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      rg)    )OrderedDict   )*)select)packunpackNc                       \ rS rSrSrg)NetlinkError'    N__name__
__module____qualname____firstlineno____static_attributes__r       +/usr/share/ifupdown2/nlmanager/nlmanager.pyr
   r
   '       r   r
   c                       \ rS rSrSrg)NetlinkNoAddressError+   r   Nr   r   r   r   r   r   +   r   r   r   c                       \ rS rSrSrg)NetlinkInterruptedSystemCall/   r   Nr   r   r   r   r   r   /   r   r   r   c                       \ rS rSrSrg)InvalidInterfaceNameVlanCombo3   r   Nr   r   r   r   r   r   3   r   r   r   c                        \ rS rSrS rS rSrg)Sequence7   c                     SU l         g )Nr   _nextselfs    r   __init__Sequence.__init__9   s	    
r   c                 D    U =R                   S-  sl         U R                   $ )Nr   r#   r%   s    r   __next__Sequence.__next__<   s    

a
zzr   r#   N)r   r   r   r   r'   r*   r   r   r   r   r    r    7   s    r   r    c                   z   \ rS rSrS9S jrS rS rS rS	 rS
 r	S r
S rS rS rS rS rS rS rS rS rS rS rS rS r\R2                  \R4                  \R6                  \R8                  4S jr\R2                  \R4                  \R6                  \R8                  4S jrS:S jr\ RB                  S4S jr"S r#S r$S r%S  r&S! r'S;S" jr(SSS0 0 0 4S# jr)SSS0 0 0 4S$ jr*S<S% jr+S;S& jr,0 S4S' jr-S;S( jr.S) r/S=S* jr0S=S+ jr1S>S, jr2S?S- jr3S?S. jr4S/ r5S0 r6S@S1 jr7S2 r8S3 r9  SAS4 jr:S5 r;S6 r<S7 r=S8r>g)BNetlinkManagerA   r   TNc                 ~   [         R                  " 5       US-  -  U l        [        5       U l        SU l        0 U l        S U l        X l        0 U l	        U R                  S5        U R                  S5        U R                  S5        U R                  S5        U(       a!  [        R                  U5        [!        U5        g g )N   F)osgetpidpidr    sequenceshutdown_flag
ifindexmap	tx_socket	use_colordebug
debug_linkdebug_addressdebug_neighbordebug_routelogsetLevelset_log_level)r&   
pid_offsetr8   	log_levels       r   r'   NetlinkManager.__init__C   s    
 99;*"23 
"" 
5!E"LL#)$ r   c                     g)Nr-   r   r%   s    r   __str__NetlinkManager.__str__Z   s    r   c                 <    [         R                  S5        SU l        g )NzNetlinkManager: Caught SIGTERMTr>   infor5   r&   signalframes      r   signal_term_handler"NetlinkManager.signal_term_handler]   s    12!r   c                 <    [         R                  S5        SU l        g )NzNetlinkManager: Caught SIGINTTrH   rJ   s      r   signal_int_handler!NetlinkManager.signal_int_handlera   s    01!r   c                     U R                   (       a!  U R                   R                  5         S U l         [        R                  S5        g )Nz!NetlinkManager: shutdown complete)r7   closer>   rI   r%   s    r   shutdownNetlinkManager.shutdowne   s-    >>NN  "!DN45r   c                     U H9  nU(       a  SU R                   U'   M  X0R                   ;   d  M,  U R                   U	 M;     g)z6
Enable or disable debugs for all msgs_types messages
TNr9   )r&   	msg_typesenabledxs       r   _debug_set_clearNetlinkManager._debug_set_cleark   s2    
 A $

1

?

1 r   c                 P    U R                  [        [        [        [        4U5        g N)r[   RTM_NEWLINKRTM_DELLINKRTM_GETLINKRTM_SETLINKr&   rY   s     r   r:   NetlinkManager.debug_linkw   s    {KkRT[\r   c                 F    U R                  [        [        [        4U5        g r^   )r[   RTM_NEWADDRRTM_DELADDRRTM_GETADDRrc   s     r   r;   NetlinkManager.debug_addressz   s    {KEwOr   c                 F    U R                  [        [        [        4U5        g r^   )r[   RTM_NEWNEIGHRTM_DELNEIGHRTM_GETNEIGHrc   s     r   r<   NetlinkManager.debug_neighbor}       |\<H'Rr   c                 F    U R                  [        [        [        4U5        g r^   )r[   RTM_NEWROUTERTM_DELROUTERTM_GETROUTErc   s     r   r=   NetlinkManager.debug_route   ro   r   c                 F    U R                  [        [        [        4U5        g r^   )r[   RTM_GETNETCONFRTM_NEWNETCONFRTM_DELNETCONFrc   s     r   debug_netconfNetlinkManager.debug_netconf   s    ~~~NPWXr   c                 F    U R                  [        [        [        4U5        g r^   )r[   
RTM_GETMDB
RTM_NEWMDB
RTM_DELMDBrc   s     r   	debug_mdbNetlinkManager.debug_mdb   s    z:zBGLr   c                 $    XR                   ;   a  gg)NTFrW   )r&   mtypes     r   debug_this_packet NetlinkManager.debug_this_packet   s    JJr   c           	          [         R                   " [         R                  [         R                  S5      U l        [	        S[        [        R                  " SS5      5      5       H|  n U R                  R                  U R                  U-   S45        US:w  a4  [        R                  SU R                  < SU R                  U-   < 35        U R                  U-   U l	          g   U R                  R                  U R                  S45        g! [         a     M  f = f! [         a4    U R                  (       a!  U R                  R                  5         SU l        e f = f)zO
The TX socket is used for install requests, sending RTM_GETXXXX
requests, etc
r   NLMANAGER_BIND_RETRYi  znlmanager: pid z0 already in use - binding netlink socket to pid N)socket
AF_NETLINKSOCK_RAWr7   rangeintr1   getenvbindr3   r>   r9   	ExceptionrS   )r&   is     r   tx_socket_allocate!NetlinkManager.tx_socket_allocate   s   
 	#]]6+<+<fooqQDN 1c")),BD"IJKNN''Aq(9:
 Av		#xxA7  $xx!|DH L& NN1. !   	~~$$&!%		s7   A&D )A8D!D #)D 
DD DD >Ec                 |    U R                   (       d  U R                  5         U R                   R                  U5        g)zH
TX a bunch of concatenated nlpacket.messages....do NOT wait for an ACK
N)r7   r   sendall)r&   messages     r   tx_nlpacket_rawNetlinkManager.tx_nlpacket_raw   s)     ~~##%w'r   c                     UR                   (       d  [        R                  S5        gU R                  (       d  U R	                  5         U R                  R                  UR                   5        g)z0
TX a netlink packet but do NOT wait for an ACK
8You must first call build_message() to create the packetN)r   r>   errorr7   r   r   )r&   nlpackets     r   tx_nlpacketNetlinkManager.tx_nlpacket   sH     IIPQ~~##%x//0r   c                    UR                   (       d  [        R                  S5        g U R                  (       d  U R	                  5         U R                  R                  UR                   5        UR                  (       dH  [        R                  SUR                  5       UR                  UR                  UR                  4-  5        [        R                  n[        R                  nSnSnSnSn/ n U R                  (       a  [        R                  S5        U$  [!        U R                  // U R                  /S5      u  pnU	(       a  SnO&US-  nXF:  a  [        R                  S	U-  5        U$ M  U	 GH|  n/ n UR-                  S
5      nU(       d  [        R                  S5        Us  $ U(       d  MA  [/        X/S U 5      u  nnnnnS[        R0                  U   UUU4-  nUUR                  :w  a1  [        R                  USU< SUR                  < 3-   5        UUS  nMx  UUR                  :w  a1  [        R                  USU< SUR                  < 3-   5        UUS  nM  U[2        :X  a  [        R                  US-   5        Us  $ U[4        :X  a  [7        UUR                  5      nUR9                  UUUUU5        [;        UR<                  5      nU(       a\  U R                  (       a  UR?                  5          [@        RB                  " U5      nU(       a  SU< SU< S3nOSU-  n [G        U5      e[        R                  SU-  5        Us  $ SnU[H        :X  d
  U[J        :X  a!  [M        UUR                  U RN                  S9nGOU[P        :X  d
  U[R        :X  a   [U        UUR                  U RN                  S9nOU[V        :X  d
  U[X        :X  a   [[        UUR                  U RN                  S9nOU[\        :X  d
  U[^        :X  a   [a        UUR                  U RN                  S9nOsU[b        [d        4;   a   [g        UUR                  U RN                  S9nOCU[h        [j        [l        4;   a   [o        UUR                  U RN                  S9nO[#        SU-  5      eUR9                  UUUUU5        URq                  U5        UR                  (       a  UR?                  5         UUS  nU(       a  GM;  GM     GM  ! ["         ac  n[%        UR&                  [(        5      (       a>  US   S:X  a5  US-  n[        R                  SXW4-  5        XW:  a  [+        W5      e S nAGMn  e S nAff = f! ["         ad  n[%        UR&                  [(        5      (       a?  US   S:X  a6  US-  n[        R                  SXU4-  5        XW:  a  [+        W5      e S nAGM\  e S nAff = f! [D         a	    SU-  n GNf = f)Nr   z#TXed %12s, pid %d, seq %d, %d bytesr      zshutdown flag is True, exitingr      z&select() Interrupted system call %d/%dz'Socket was not readable for %d attempts   z(%s: recv() Interrupted system call %d/%dz+RXed zero length data, the socket is closedz#RXed %12s, pid %d, seq %d, %d bytesz%...we are not interested in this pid z since ours is z%...we are not interested in this seq z...this is an ACKzoperation failed with 'z' ()zoperation failed with code %sz$%s code NLE_SUCCESS...this is an ACKr8   z$RXed unknown netlink message type %s)9r   r>   r   r7   r   r   r9   get_type_stringr3   seqlengthNetlinkPacketheader_PACK
header_LENr5   rI   r   r   
isinstanceargstupler   recvr   type_to_string
NLMSG_DONENLMSG_ERRORErrordecode_packetabsnegative_errnodumpr1   strerror
ValueErrorr
   r_   r`   Linkr8   rf   rg   Addressrk   rl   Neighborrq   rr   Routerv   rw   Netconfr|   r}   r~   MDBappend)r&   r   r   r   	null_readnle_intr_countMAX_NULL_READSMAX_ERROR_NLE_INTRmsgsreadable	writeableexceptionale	error_strsdatar   msgtypeflagsr   r3   	debug_strmsg
error_coder   s                            r   tx_nlpacket_get_response'NetlinkManager.tx_nlpacket_get_response   s+   IIPQ~~##%x//0 ~~II;..0(,,hoo^_ ` $//"--
	 !!9:5;T^^<NPRUYUcUcTfhi5j2k 	Q	 .HHFRSK66$<D HHJKKd :@R]S]M^9_6VWeS# EIeIefmInpsux  {A  IB  !BI hll*		)%((,,/8 #8 9#FG} hll*		)%((,,/8 #8 9#FG}  *,		).A"AB# K/#GX^^<))&%c4H &)););%<
 &#zz #

Y+-;;z+B#+U]_i0jI0OR\0\I
 #/y"99II&Ly&XY#'K *+"k1W5K"&w$.."YC$3w+7M")'8>>T^^"\C$4<8O"*7HNNdnn"]C$4<8O"'4>>"ZC$(HH")'8>>T^^"\C$Z(LL"%gx~~"XC #,,RU\,\"]]))&%c4HC(#>>HHJ=Do d- G   affe,,1"a'NHHEHllm%;:9EE > ! !!&&%00QqTQY&!+!KqbtNu!uv)?">y"II$B $. Y,Kj,X	YsV   'S8 ;U(>(W'W8
U%AU U  U%(
W2AWWWW,+W,c                     UR                   S:X  a  [        R                  $ UR                   S:X  a  [        R                  $ [	        S[        U5      -  5      e)Nr      z%s is an invalid IP type)versionr   AF_INETAF_INET6r   type)r&   ips     r   	ip_to_afiNetlinkManager.ip_to_afit  sA    ::?>>!ZZ1_??"6bABBr   c                    U[         :X  a'  [        XU R                  S9n[        SUS5      Ul        OU[
        :X  a)  [        XU R                  S9n[        SUSSS5      Ul        OU[        :X  a(  [        XU R                  S9n[        SUSS5      Ul        O}U[        :X  a(  [        XU R                  S9n[        SUSS5      Ul        OKU[        :X  a(  [        XU R                  S9n[        SUSS5      Ul        O[        R                  SU-  5        g[        [         -  Ul        0 Ul        UR'                  [)        U R*                  5      U R,                  5        U R/                  U5      $ )zO
Issue a RTM_GETROUTE, etc with the NLM_F_DUMP flag
set and return the results
r   Bxxxir   BxxxiiiBxxxiiz(request_dump RTM_GET %s is not supportedN)rh   r   r8   r   bodyra   r   rm   r   rs   r   r|   r   r>   r   NLM_F_REQUEST
NLM_F_DUMPr   
attributesbuild_messagenextr4   r3   r   )r&   rtm_typefamilyr9   r   s        r   request_dumpNetlinkManager.request_dump|  s.    {"(T^^DCGVQ/CH$x$..ACIvq!Q7CH%8dnnECHfa3CH%4>>BCHfa3CH#h@CHfa3CH II@8KL!J.	$t}}-txx8,,S11r   c                 x  ^ ^ UU 4S jnU(       a  [         n	O[        n	S n
SmU	T R                  ;   nU(       Ga  U H  u  ppn[        XT R                  S9n[
        [        -  Ul        [        SXSSXEXgS5
      Ul	        UUl
        UR                  [        R                  U5        U(       a   UR                  [        R                  U5        UR                  [        R                  U5        UR                  [!        T R"                  5      T R$                  5        U" U
U5      n
M     U
(       a  T R'                  U
5        U(       a  UR)                  5        H  u  nnUu  pn[        XT R                  S9n[
        [        -  Ul        [        SXSSXEXgS5
      Ul	        UUl
        UR                  [        R                  U5        UR                  [        R*                  U5        UR                  [!        T R"                  5      T R$                  5        U" U
U5      n
M     U
(       a  T R'                  U
5        g g g )Nc                    > U (       d  UR                   n OXR                   -  n [        U 5      T:  a  TR                  U 5        Sn U $ )z
Adding an ipv4 route only takes 60 bytes, if we are adding thousands
of them this can add up to a lot of send calls.  Concat several of
them together before TXing.
N)r   lenr   )total_messageroutePACKET_CONCAT_SIZEr&   s     r   tx_or_concat_messageBNetlinkManager._routes_add_or_delete.<locals>.tx_or_concat_message  sD     ! %.=!%77$$]3 $  r   i @  r   	BBBBBBBBir   )rq   rr   r9   r   r8   r   NLM_F_CREATEr   r   r   r   add_attributeRTA_DSTRTA_GATEWAYRTA_OIFr   r   r4   r3   r   itemsRTA_MULTIPATH)r&   	add_routeroutesecmp_routestableprotocolroute_scope
route_typer   rtm_commandr   r9   afir   masknexthopinterface_indexr   	route_keyvaluer   s   `                   @r   _routes_add_or_delete$NetlinkManager._routes_add_or_delete  s   	!$ &K&K"tzz)=C9$kDNNK+l:!+s!Q"-1>
"##EMM26''(9(97C##EMM?C##D$7B 4]E J >D $$]3&1&7&7&9"E"+$kDNNK+l:!+s!Q"-1>
"##EMM26##E$7$7?##D$7B 4]E J ': $$]3  r   c           	      ,    U R                  SXX4XV5        g )NTr  r&   r   r   r   r   r   r   s          r   
routes_addNetlinkManager.routes_add  s    
 	""4e{gr   c           	      ,    U R                  SXX4XV5        g )NFr	  r
  s          r   
routes_delNetlinkManager.routes_del  s    
 	""5&uP[hr   c                 h   [        [        X R                  S9n[        [        -  Ul        U R                  U5      n[        SUS5      Ul        XCl	        UR                  [         R                  U5        UR                  [        U R                  5      U R                  5        U R!                  U5      $ )z 
ip must be ipnetwork.IPNetwork
r   	Bxxxxxxxir   )r   rs   r8   r   	NLM_F_ACKr   r   r   r   r   r   r   r   r   r4   r3   r   )r&   r   r9   r   r   s        r   	route_getNetlinkManager.route_get  s    
 lE^^D#i/ nnR +sA.
EMM2.D/:,,U33r   c                 .    U R                  [        X5      $ r^   )r   rs   )r&   r   r9   s      r   routes_dumpNetlinkManager.routes_dump   s      v==r   c           	         [        S5        U H  n[        R                  UR                  ;  a  [        R                  S5        M8  SUR                  [        R                     R                  UR                  4-  n[        U<S S[        R                  UR                  ;   a0  [        UR                  [        R                     R                  5      OS<S SUR                  [        R                     R                  < 35        M     g)z
Print a table of 'routes'
z+Prefix            Nexthop           ifindexzRoute is missing RTA_DSTz%s/%d15z   N)printr   r   r   r>   warningr  src_lenr   strr   )r&   r   rZ   r   s       r   routes_printNetlinkManager.routes_print  s     	;<A}}ALL067ALL7==qyyIIB?D?P?PTUT`T`?`Q\\%"3"34::;fjjemm,224 5 r   c                    [         U R                  ;   n[        [         X R                  S9n[        [
        -  Ul        [        S[        R                  SSS5      Ul
        UR                  [        R                  U5        UR                  [        U R                  5      U R                   5         U R#                  U5      S   $ ! [$         a    [&        R)                  SU-  5         gf = f)z!
Return a Link object for ifname
r   =Bxxxiiir   !Netlink did not find interface %sN)ra   r9   r   r8   r   r  r   r   r   	AF_UNSPECr   r   IFLA_IFNAMEr   r   r4   r3   r   r   r>   rI   )r&   ifnamer9   links       r   _get_iface_by_name!NetlinkManager._get_iface_by_name  s     tzz)K..A"Y.
V%5%5q!Q?	4++V44.9	006q99$ 	HH86AB	s   0C "C)(C)c                    [         U R                  ;   n[        [         X R                  S9n[        [
        -  Ul        [        S[        R                  USS5      Ul
        UR                  [        U R                  5      U R                  5         U R                  U5      S   $ ! [          a    ["        R%                  SU-  5         gf = f)z"
Return a Link object for ifindex
r   r!  r   r"  N)ra   r9   r   r8   r   r  r   r   r   r#  r   r   r   r4   r3   r   r   r>   rI   )r&   ifindexr9   r&  s       r   _get_iface_by_index"NetlinkManager._get_iface_by_index*  s     tzz)K..A"Y.
V%5%5w1E	4.9	006q99$ 	HH87BC	s   B$ $"C	C	c                 L    U R                  U5      nU(       a  UR                  $ g)z'
Return the interface index for ifname
N)r'  r*  )r&   r%  ifaces      r   get_iface_indexNetlinkManager.get_iface_index:  s$     ''/== r   c                     U R                  U5      nU(       a0  UR                  [        R                     R	                  [
        5      $ g r^   )r+  r   r   r$  get_pretty_valuer  )r&   r*  r.  s      r   get_iface_nameNetlinkManager.get_iface_nameD  s:    ((1##D$4$45FFsKKr   c                    [         U R                  ;   n[        [         X R                  S9n[	        S[
        R                  SSS5      Ul        [        [        -  Ul
        U(       a!  UR                  [        R                  U5        OU=R                  [        -  sl
        UR                  [        U R                   5      U R"                  5        U R%                  U5      $ Nr   r   r   )ra   r9   r   r8   r   r   r#  r   r   r  r   r   r$  r   r   r   r4   r3   r   )r&   r%  r9   r   s       r   	link_dumpNetlinkManager.link_dumpK  s    tzz);@	6#3#3Q1=!I-	d..7II#I$t}}-txx8,,S11r   c                    [         U R                  ;   n[        [         XR                  S9n	[        [
        -  U	l        [        S[        R                  USS5      U	l
        [        UR                  5       5       H  u  pU	R                  X5        M     U(       a   U	R                  [        R                  U5        [        5       nU(       a%  X,[        R                   '   Xl[        R"                  '   O-U(       a&  U4U[        R$                  '   X|[        R&                  '   U	R                  [        R(                  U5        U	R+                  [-        U R.                  5      U R0                  5        U R3                  U	5      $ r6  )r_   r9   r   r8   r   r  r   r   r   r#  r   listr   r   r$  dictIFLA_INFO_KINDIFLA_INFO_DATAIFLA_INFO_SLAVE_KINDIFLA_INFO_SLAVE_DATAIFLA_LINKINFOr   r   r4   r3   r   )r&   r%  kind
slave_kindr*  iflaifla_info_dataifla_info_slave_datar9   r&  nl_attrr  linkinfos                r   link_set_attrsNetlinkManager.link_set_attrsY  s   tzz)K..A"Y.
F$4$4gq!D	"4::<0NGw. 1 t//86,0T((),:T(()2<+HT../2FT../4--x84.9,,T22r   c                    [         U R                  ;   n[        [         XR                  S9n	[        [
        -  [        -  U	l        [        S[        R                  USS5      U	l        [        UR                  5       5       H  u  pU	R                  X5        M     U(       a   U	R                  [        R                  U5        [!        5       nU(       a$  X[        R"                  '   Xl[        R$                  '   U(       a$  XL[        R&                  '   X|[        R(                  '   U	R                  [        R*                  U5        U	R-                  [/        U R0                  5      U R2                  5        U R5                  U	5      $ zA
Build and TX a RTM_NEWLINK message to add the desired interface
r   r   r   )r_   r9   r   r8   r   r   r  r   r   r   r#  r   r:  r   r   r$  r;  r<  r=  r>  r?  r@  r   r   r4   r3   r   )r&   rA  r%  r*  rB  rC  rD  rE  r9   r&  rF  r  rG  s                r   link_add_setNetlinkManager.link_add_sets  s    tzz)K..A!M1I=
F$4$4gq!D	"4::<0NGw. 1 t//86,0T((),:T(()2<T../2FT../4--x84.9,,T22r   c                    U(       d  U(       d  [        S5      eU(       d  U R                  U5      n[        U R                  ;   n[	        [        X0R
                  S9n[        [        -  Ul        [        S[        R                  USS5      Ul        UR                  [        U R                  5      U R                   5        U R#                  U5      $ )Nzinvalid ifindex and/or ifnamer   r   r   )r   r/  r`   r9   r   r8   r   r  r   r   r   r#  r   r   r   r4   r3   r   )r&   r*  r%  r9   r&  s        r   link_delNetlinkManager.link_del  s    v<==**62Gtzz)K..A"Y.
F$4$4gq!D	4.9,,T22r   c                    [         U R                  ;   n[        [         X`R                  S9n[        [
        -  [        -  Ul        [        S[        R                  SSS5      Ul        UR                  [        R                  U5        U(       a   UR                  [        R                  U5        U(       a   UR                  [        R                  U5        UR                  [        R                   [        R"                  U[        R$                  U05        UR'                  [)        U R*                  5      U R,                  5        U R/                  U5      $ rK  )r_   r9   r   r8   r   r   r  r   r   r   r#  r   r   r$  	IFLA_LINKIFLA_MTUr@  r<  r=  r   r   r4   r3   r   )r&   r*  r%  rA  rD  mtur9   r&  s           r   	_link_addNetlinkManager._link_add  s     tzz)K..A!M1I=
F$4$4aA>	4++V4t~~w7t}}c24--0
 	 	4.9,,T22r   c                 &    U R                  S USX#S9$ )Nbridge)r*  r%  rA  rD  rT  )rU  )r&   r%  rD  rT  s       r   link_add_bridgeNetlinkManager.link_add_bridge  s    ~~d6Yg~qqr   c                      SU;   a2  [        UR                  S5      S   5      nXS:w  a  [        SX%U4-  5      e[        R                  U0nU(       a  XF[        R
                  '   U R                  XSU5      $ )X
ifindex is the index of the parent interface that this sub-interface
is being added to
.z;Interface %s must belong to VLAN %d (VLAN %d was requested)vlan)r   splitr   r   IFLA_VLAN_IDIFLA_VLAN_PROTOCOLrU  )r&   r*  r%  vlanidvlan_protocolifname_vlanidrD  s          r   link_add_vlanNetlinkManager.link_add_vlan  s    	 &=S 1" 56M&3 5Y5;F4S5T U U ++V46C4223~~gv~FFr   c                     U R                  UUS[        R                  [        R                  [        R                  [        R
                  [        R                  S.R                  U[        R                  5      05      $ )r\  macvlan)privateveparX  passthru)rU  r   IFLA_MACVLAN_MODEMACVLAN_MODE_PRIVATEMACVLAN_MODE_VEPAMACVLAN_MODE_BRIDGEMACVLAN_MODE_PASSTHRUget)r&   r*  r%  macvlan_modes       r   link_add_macvlanNetlinkManager.link_add_macvlan  si    
 ~~&&#88 22"66 $ : :	)
 #lD$=$=>	
 	
r   c                    [         U R                  ;   n[        [         X@R                  S9n[        Ul        [        [        -  Ul        [        S[        R                  SSS5      Ul        U(       a/  UR                  [        R                  [        R                  5        O.UR                  [        R                  [        R                  5        UR!                  [#        U R$                  5      U R&                  5        U R)                  U5      n0 nU H  nUR
                  [        R                  :w  a  M#  U(       a  UR*                  U;  a  M<  UR-                  [        R.                  5      n	U	(       d  Md  UR-                  [        R0                  5      n
 U	R3                  5        HM  u  pU[        R4                  :X  d  M  U H,  u  pUb  X;   d  M  X;  a  / Xz'   Xz   R7                  X45        M.     MO     M     U$ )z
filter_ifindex should be a tuple if interface indexes, this is a whitelist filter
filter_vlandid should be a tuple if VLAN IDs, this is a whitelist filter
r   r   r   )ra   r9   r   r8   	AF_BRIDGEr   r   r   r   r   r   r   r   IFLA_EXT_MASKRTEXT_FILTER_BRVLAN_COMPRESSEDRTEXT_FILTER_BRVLANr   r   r4   r3   r   r*  get_attribute_valueIFLA_AF_SPECr$  r   IFLA_BRIDGE_VLAN_INFOr   )r&   filter_ifindexfilter_vlanidcompress_vlansr9   r&  replyiface_vlansr   ifla_af_specr%  x_typex_value	vlan_flagvlan_ids                  r   vlan_getNetlinkManager.vlan_get  s   
 tzz)K..A-/
F$4$4aA>	t1143V3VWt1143K3KL4.9--d3CzzV---#++^"C2243D3DEL,,T-=-=>F
 &2%7%7%9!T77707,(0G4L%868 3 (/667KL 18 &:3 J r   c                 \   S nU R                  XU5      n[        R                  S[        U5      -  5        S nS n[	        S5        [	        S5        [        UR                  5       5       H  u  p[        U	5       H  u  pU[        R                  -  (       a  U
nUnM#  U[        R                  -  (       aX  X{-  nU(       d  [        R                  SU
-  5        U
n[        XjS-   5       H  n[	        SXU" U5      4-  5        SnM     S nS nM  [	        SXU" U5      4-  5        SnM     M     g )	Nc                     / nU [         R                  -  (       a  UR                  S5        U [         R                  -  (       a  UR                  S5        SR	                  U5      $ )NPVIDzEgress Untaggedz, )r   BRIDGE_VLAN_INFO_PVIDr   BRIDGE_VLAN_INFO_UNTAGGEDjoin)r  flag_strs     r   vlan_flag_to_string5NetlinkManager.vlan_show.<locals>.vlan_flag_to_string-  sK    H4555'4999 1299X&&r   ziface_vlans:
%s
z   Interface  VLAN  Flagsz  ==========  ====  =====zPBRIDGE_VLAN_INFO_RANGE_END is %d but we never saw a BRIDGE_VLAN_INFO_RANGE_BEGINr   z  %10s  %4d  %s )r  r>   r9   pformatr  sortedr   r   BRIDGE_VLAN_INFO_RANGE_BEGINBRIDGE_VLAN_INFO_RANGE_ENDr  r   )r&   r~  r  r  r  r  range_begin_vlan_id
range_flagr%  vlan_tuplesr  r  rZ   s                r   	vlan_showNetlinkManager.vlan_show+  s2   	' mmN>R		&)==>"
)*)*%+K,=,=,?%@!V(.{(;$t@@@*1'!*J!@!@@+J.$v  zA  %A  B.5+"#6!D/6>QR[>\2]]^!# E +/'!%J +v@ST]@^.__`F- )< &Ar   c	                    U[         [        4;   d
   SU-  5       eUS:  a  US::  d
   SU-  5       eUc  UnUS:  a  US::  d
   SU-  5       eX4::  d   SU< SU< S35       eXR                  ;   n	S	n
S	n[        XU R                  S
9n[
        [        -  Ul        [        S[        R                  US	S	5      Ul        U(       a  U
[        R                  -  n
U(       a  U
[        R                  -  n
U(       a  U[        R                  -  nU(       a  U[        R                  -  n[!        5       nU
(       a  X[        R"                  '   X4:X  a  X4/U[        R$                  '   O;U[        R&                  -  U4U[        R(                  -  U4/U[        R$                  '   UR+                  [        R,                  U5        UR/                  [1        U R2                  5      U R4                  5        U R7                  U5      $ )z&
iproute2 bridge/vlan.c vlan_modify()
z6Invalid msgtype %s, must be RTM_SETLINK or RTM_DELLINKr   r   zInvalid VLAN start %szInvalid VLAN end %szInvalid VLAN range -z, start must be <= endr   r   r   )rb   r`   r9   r   r8   r   r  r   r   r   rw  r   BRIDGE_FLAGS_SELFBRIDGE_FLAGS_MASTERr  r  r   IFLA_BRIDGE_FLAGSr}  r  r  r   r|  r   r   r4   r3   r   )r&   r   r*  vlanid_start
vlanid_endbridge_selfbridge_masterpviduntaggedr9   bridge_flagsvlan_info_flagsr&  r  s                 r   vlan_modifyNetlinkManager.vlan_modifyY  s    ;44x6nqx6xx4q \T%9a;RUa;aa9%JQ:#5Y7Lz7YY5)x_kmw+xx)::%Gdnn="Y.
F$4$4gq!D	D222LD444Lt999Ot===O"}3?//0 %9H8W7ZL334
 !4#D#DDlS 4#B#BBJO8L334
 	4,,l;4.9,,T22r   c           
      L    U(       a  SOSnU R                  [        XX7XdU5        g)z#
Add VLAN(s) to a bridge interface
FTN)r  rb   r&   r*  r  r  r  r  masterr  s           r   link_add_bridge_vlan#NetlinkManager.link_add_bridge_vlan  %      &e4gZV\dlmr   c           
      L    U(       a  SOSnU R                  [        XX7XdU5        g)z(
Delete VLAN(s) from a bridge interface
FTN)r  r`   r  s           r   link_del_bridge_vlan#NetlinkManager.link_del_bridge_vlan  r  r   c                    US:X  a  [         R                  nOUS:X  a  SnO[        SU-  5      e[        U R                  ;   n[         R                  n[        [        X@R
                  S9n[        [        -  Ul        [        S[        R                  SX55      Ul        UR                  [         R                  U5        UR                  [!        U R"                  5      U R$                  5        U R'                  U5      $ )z(
Either bring ifname up or take it down
updownr   z7Unsupported state %s, valid options are "up" and "down"r   =BxxxiLL)r   IFF_UPr   r_   r9   r8   r   r  r   r   r   r#  r   r   r$  r   r   r4   r3   r   )r&   r%  stateif_flagsr9   	if_changer&  s          r   link_set_updownNetlinkManager.link_set_updown  s    
 D={{Hf_HUX]]^^tzz)KK	K..A"Y.
V%5%5q(N	4++V44.9,,T22r   c                    SnUS:X  a  SOSn[         U R                  ;   n[        [         XPR                  S9n[        [
        -  Ul        [        S[        R                  SSS5      Ul
        UR                  [        R                  U5        UR                  [        R                  U5        UR                  [        U R                   5      U R"                  5        U R%                  U5      $ )zM
Either bring ifname up or take it down by setting IFLA_PROTO_DOWN on or off
r   onr   r   r  )r_   r9   r   r8   r   r  r   r   r   r#  r   r   r$  IFLA_PROTO_DOWNr   r   r4   r3   r   )r&   r%  r  r   	protodownr9   r&  s          r   link_set_protodown!NetlinkManager.link_set_protodown  s     $AA	tzz)K..A"Y.
V%5%5q!Q?	4++V44//;4.9,,T22r   c                 F   US:X  a!  [         R                  n[         R                  nOUS:X  a  [         R                  nSnOSnSn[        U R                  ;   n[        [        X`R                  S9n[
        [        -  Ul        [        S[        R                  SXT5      Ul        UR                  [         R                  U5        UR                  [         R                  U5        UR                  [!        U R"                  5      U R$                  5        U R'                  U5      $ )zU
ip link set %ifname master %master_ifindex %state
use master_ifindex=0 for nomaster
r  r  r   r   r  )r   r  r_   r9   r8   r   r  r   r   r   r#  r   r   r$  IFLA_MASTERr   r   r4   r3   r   )r&   r%  master_ifindexr  r  r  r9   r&  s           r   link_set_masterNetlinkManager.link_set_master  s    
 D=I{{Hf_IHIHtzz)K..A"Y.
V%5%5q(N	4++V44++^<4.9,,T22r   c                    [         U R                  ;   nSn[        [         XPR                  S9n[        [
        -  [        -  Ul        Xl        [        SX[        R                  U[        R                  5      Ul        UR                  [        R                  U5        UR                  [        R                   U5        UR#                  [%        U R&                  5      U R(                  5        U R+                  U5      $ Nr   r   z	=BxxxiHBB)rk   r9   r   r8   r   r   r  r   r   r   NUD_REACHABLEr   RTN_UNICASTr   r   NDA_DST
NDA_LLADDRr   r   r4   r3   r   r&   r   r*  r   macr9   service_hdr_flagsnbrs           r   neighbor_addNetlinkManager.neighbor_add  s    

*|UnnE =09<	
S83I3IK\^c^o^op(**B/(--s3$t}}-txx8,,S11r   c                    [         U R                  ;   nSn[        [         XPR                  S9n[        [
        -  Ul        Xl        [        SX[        R                  U[        R                  5      Ul        UR                  [        R                  U5        UR                  [        R                  U5        UR!                  [#        U R$                  5      U R&                  5        U R)                  U5      $ r  )rl   r9   r   r8   r   r  r   r   r   r  r   r  r   r   r  r  r   r   r4   r3   r   r  s           r   neighbor_delNetlinkManager.neighbor_del  s    

*|UnnE!I-	
S83I3IK\^c^o^op(**B/(--s3$t}}-txx8,,S11r   c
                    [         U R                  ;   n
[        R                  [	        U5      0nU(       a  [	        U5      U[        R
                  '   U(       a  XK[        R                  '   U(       a  X[[        R                  '   [	        U5      U[        R                  '   X[        R                  '   U(       a  [	        U5      U[        R                  '   U(       a  [	        U5      U[        R                  '   [        [         XR                  S9n[        [        -  [        -  Ul        [#        S[$        R&                  SSS5      Ul        UR+                  [        R,                  U5        UR+                  [        R.                  [        R0                  S[        R2                  U05        UR5                  [7        U R8                  5      U R:                  5        U R=                  U5      $ )Nr   r   r   vxlan)r_   r9   r   IFLA_VXLAN_IDr   IFLA_VXLAN_PORTIFLA_VXLAN_LOCALIFLA_VXLAN_GROUPIFLA_VXLAN_LEARNINGIFLA_VXLAN_TTLIFLA_VXLAN_AGEINGIFLA_VXLAN_LINKr8   r   r   r  r   r   r   r#  r   r   r$  r@  r<  r=  r   r   r4   r3   r   )r&   r%  vxlaniddstportlocalgrouplearningageingphysdevttlr9   	info_datar&  s                r   link_add_vxlanNetlinkManager.link_add_vxlan  sa    tzz)''W6	.1'lId**+/4d++,/4d++,.1(m	$**+),$%%&03FId,,-.1'lId**+K..A!M1I=
F$4$4aA>	4++V44--0
 	
 	4.9,,T22r   c                 J   [         U R                  ;   n[        [         XR                  S9n[	        S[
        R                  S5      Ul        [        [        -  [        -  Ul        UR                  [        U R                  5      U R                  5        U R!                  U5      $ )z
TODO: add ifname/ifindex filtering:
            - via the RTM_GETADDR request packet
            - or in python if kernel doesn't support per intf dump
r   z=Bxxxir   )rh   r9   r   r8   r   r   r#  r   r   r  r   r   r   r   r4   r3   r   r&   r9   r   s      r   	addr_dumpNetlinkManager.addr_dump  sw     tzz)k5NNC&"2"2A6!I-
:	$t}}-txx8,,S11r   c                 N   [         U R                  ;   n[        [         XR                  S9n[	        S[
        R                  SSS5      Ul        [        [        -  [        -  Ul        UR                  [        U R                  5      U R                  5        U R!                  U5      $ )a"  
The attribute Netconf.NETCONFA_IFINDEX is available but don't let it fool you
it seems like the kernel doesn't really care about this attribute and will dump
everything according of the requested family (AF_UNSPEC for everything).
Device filtering needs to be done afterwards by the user.
r   r   r   )rv   r9   r   r8   r   r   r#  r   r   r   r  r   r   r   r4   r3   r   r  s      r   netconf_dumpNetlinkManager.netconf_dump0  s{     $**,ne~~F	6#3#3Q1=!J.:	$t}}-txx8,,S11r   c                 N   [         U R                  ;   n[        [         XR                  S9n[	        S[
        R                  SSS5      Ul        [        [        -  [        -  Ul        UR                  [        U R                  5      U R                  5        U R!                  U5      $ r6  )r|   r9   r   r8   r   r   rw  r   r   r   r  r   r   r   r4   r3   r   r  s      r   mdb_dumpNetlinkManager.mdb_dumpA  sy    djj(*e~~>	6#3#3Q1=!J.:	$t}}-txx8,,S11r   )r9   r6   r3   r4   r5   r7   r8   )r   TN)Fr^   )NN)NNT)NFFFF)NFFF)r   N)NNNTNNN)?r   r   r   r   r'   rE   rM   rP   rT   r[   r:   r;   r<   r=   ry   r   r   r   r   r   r   r   r   r  r   RT_TABLE_MAINRT_PROT_XORPRT_SCOPE_UNIVERSEr  r  r  r  r   r#  r  r  r'  r+  r/  r3  r7  rH  rL  rO  rU  rY  rf  rt  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r   r   r-   r-   A   s   %. ""6
&]PSSYM
%N(
1i)VC!2L>4B ,,!..$66#//	h ,,!..$66#//	i4  "(!1!1 >5(& 2 +/4QSdf} 36 ! $$&*, 3D330 68T rG8
&;z+ \33jnn3,3"3822 CGQU 3J2$2"2r   r-   )collectionsr   r   r   structr   r   loggingr1   r   	getLoggerr   r>   r   r
   r   r   r   objectr    r-   r   r   r   <module>r      sv   8 $     	 !	9 		L 		< 		I 	v F2V F2r   