
    /I_                    
   S SK r S SKrS SKrS SKJr  S SKJr  S SK JrJrJ	r	J
r
Jr  S SKJr  S SKJrJrJr  SSKJr  \R&                  " \5      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(Sr)Sr*Sr+Sr,Sr-S r.S!r/S"r0S#r1S$r2S%r3S&r4Sr5Sr6Sr7S'r8S(r9S)r:\9\:-  r;S*r<S(r=S)r>S*r?S
r@S+rAS,rB\A\B-  ) rCSrDSrESrFS'rGSrHS-rIS.rJS/rKS(rLS)rMS*rNS
rOS0rPS,rQS1rRSrSS2 rT\T" S5      rU\T" S5      rV\T" S5      rW\D\E-  \F-  \G-  \H-  \I-  \J-  \K-  \L-  \M-  \N-  \O-  \P-  \Q-  \T" \S5      -  \R-  \U-  \V-  \W-  rXS S S3S4S5S6S7.rYSrZ\[" 5       r\\]" \ 5       V s/ s H  o R                  S85      (       d  M  U PM     sn  H  r_\_\\\`" \ \_5      '   M     S9\\\Z'   S: raS;rbS<rcS=rdS>reS?S?S?S?S?S?S?S?S@S@S@S@S@S@SA.rfSB rgSC rhSD riSE rjSSF jrkSG rl " SH SI5      rm " SJ SK\n5      ro " SL SM\o5      rp " SN SO\o5      rq " SP SQ\o5      rr " SR SS\o5      rs " ST SU\o5      rt " SV SW\t5      ru " SX SY\o5      rv " SZ S[\v5      rw " S\ S]\o5      rx " S^ S_\o5      ry " S` Sa\o5      rz " Sb Sc\z5      r{ " Sd Se\o5      r| " Sf Sg\o5      r} " Sh Si\o5      r~ " Sj Sk\o5      r " Sl Sm\n5      r " Sn So\5      r " Sp Sq\5      r " Sr Ss\\m5      r " St Su\o5      r " Sv Sw\o5      r " Sx Sy\o5      r " Sz S{\5      r " S| S}\5      r " S~ S\5      r " S S\5      r " S S\5      rgs  sn f )    N)hexlify)pformat)	AF_UNSPECAF_INETAF_INET6	AF_BRIDGEhtons)	printable)packunpackcalcsize   )	ipnetwork      i݆  l                                                       $   %   &   P   Q   R   T   U   V                   @      @            c                 T    U S:  a  [        SU -  5      eU (       a
  SU S-
  -  n U $ Sn U $ )zS
The api is a reimplementation of "nl_mgrp" function from
iproute2/include/utils.h
   z%d Invalid Groupr   r   )	Exception)groups    */usr/share/ifupdown2/nlmanager/nlpacket.pynl_mgrpr<      s=    
 rz*U233&+uqy! 23                )globaluniversenowherehostlinksiteAF_AF_MPLSc                 .    [         R                  U S5      $ )NUNKNOWN)	AF_FAMILYget)familys    r;   get_family_strrO      s    ==++r=   [   \   ]   ^   FT)FNr   0nooffslowNoneTr   1onyesfastc                 .    [         R                  U 5        g N)logsetLevel)levels    r;   set_log_levelrb      s    LLr=   c                 B    S[        U 5      SS  R                  U5      -   $ )N0xr   )hexzfill)valuedigitss     r;   zfilled_hexri      s"    #e*QR.&&v...r=   c                 "    U S   S:X  a  U SS n U $ )zi
Remove the last character if it is a NULL...having that NULL
causes python to print a garbage character
r   N )lines    r;   remove_trailing_nullrn      s    
 Bx1}CRyKr=   c                 P   ^  SR                  U 4S j[        SSS5       5       5      $ )N:c              3   8   >#    U  H  nS T-  XS-    v   M     g7f)z%012xr   Nrl   ).0imac_ints     r;   	<genexpr><lambda>.<locals>.<genexpr>   s!     )`P_17W+<aA*FP_s   r      r   )joinrange)rt   s   `r;   <lambda>rz      s!    )`PUVWY[]^P_)`!`r=   c           
      *   [        SUSS 5      u  pEpg/ nXEXg4 H?  n	[        U	5      n
U
[        S S ;   a  UR                  U
5        M.  UR                  S5        MA     U(       a  SXXEXgSR	                  U5      U4-  $ SXXVUSR	                  U5      U4-  $ )	NBBBBr   r   .z*  %2d: [%dm0x%02x%02x%02x%02x[0m  %s  %s z!  %2d: 0x%02x%02x%02x%02x  %s  %s)r   chrr
   appendrx   )line_numbercolordataextrac1c2c3c4in_asciicchar_cs              r;   data_to_color_textr      s    fd1Qi0RRHbQYs^#OOF#OOC   A[Y[acikipipqyiz  }B  EC  C  	C.+22rwwW_O`bg1hhhr=   c                 *    [        U S-   S-  5      S-  $ )Nr   r   )int)lengths    r;   padded_lengthr      s    
q !A%%r=   c                   f
   \ rS rSrSrSrSrSrSrSr	Sr
\S	\S
\S\S\S\	S\
S0rSrSrSrSrSrSr\S\S\S\S\S\S0rSSSSSSSSS.rSrSr\S\S0rSrSrSrSrSr\S\S \S!\S"\S#0rSrSrSr\S$\S%\S&0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.r0Sr1S/r2S0r3S1r4S2r5S3r6S4r7S5r8S6r9S7r:S8r;S9r<0 \!S:_\"S;_\#S<_\$S=_\%S>_\&S?_\'S@_\(SA_\)SB_\*SC_\+SD_\,SE_\-SF_\.SG_\/SH_\0SI_\1SJ_\2SK\3SL\4SM\5SN\6SO\7SP\8SQ\9SR\:SS\;ST\<SU0Er=Sr>Sr?Sr@SrASrBSrCSrDS'rESrFS(rGS)rHS*rIS+rJS,rKS-rLS.rMSrNS/rOS0rPS1rQS2rRS3rSS4rTS5rUS6rVS7rWSVrXSWrY\YrZ0 \>SX_\?SY_\@SZ_\AS[_\BS\_\CS]_\DS^_\ES__\FS`_\GSa_\HSb_\ISc_\JSd_\KSe_\LSf_\MSg_\NSh_\OSi\PSj\QSk\RSl\SSm\TSn\USo\VSp\WSq\XSr\YSs\ZSt0Er[Sr\Sr]Sr^Sr_Sr`Sra\\Su\]Sv\^Sw\_Sx\`Sy\aSz0rb0 S{S_S|S_S}S_S~S_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SSSSS.ErcS{S|S}S~SSSS.rdSSSSSSSSSSSSSSSS.reSSSSSS.rfSSSSSSS.rgSSSS.rhSriSrjSrkSrlSrmSrnSroS'rpSrqSrr\rrs\iS\jS\kS\lS\mS\nS\oS\pS\qS\rS\sS0rtSruSrvSrwSrxSrySrzSr{S'r|Sr}S(r~S)rS*rS+rS,rS-rS.rSrS/rS0rS1rS2rS3rS4rS5rS6rS7rSVrSrSrSrSrSrSrSrSrSWrSrSr0 \uS_\vS_\wS_\xS_\yS_\zS_\{S_\|S_\}S_\~S_\S_\S_\S_\S_\S_\S_\S_0 \S_\S_\S_\S_\S_\S_\S_\S_\S_\S_\S_\S_\S_\S_\S_\S_\S_E\S\S\S\S0ErSrSrSrSrSrSrSrS'rSrS(rS)rS*rS+rS,rS-rS.rSrS/rS0rS1rS2rS3rS4rS5rS6rS7rSVrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSr0 \S_\S_\S_\S_\S_\S_\S_\S_\S_\S_\S_\S_\S_\S_\S_\S_\S_0 \S_\S_\S_\S_\S_\S_\S_\S_\S_\S_\S_\S_\S_\S_\S_\S_\S_E\S\GS \GS\GS\GS\GS\GS\GS\GS\GS\GS	0ErSrSr\GS
\GS0rSrSrSrSrSrSrSrS'rSrS(rS)rS*rS+rS,rS-rS.rSrS/rS0rS1rS2rS3rS4rS5rS6r0 \GS_\GS_\GS_\GS_\GS_\GS_\GS_\GS_\GS_\GS_\GS_\GS_\GS_\GS_\GS_\GS_\GS_\GS\GS\GS\GS \GS!\GS"\GS#\GS$0ErSrSrSrSrSrSrSrS'rSrS(rS)rS*rS+rS,rS-rS.rSrS/rS0rS1rS2r0 \GS%_\GS&_\GS'_\GS(_\GS)_\GS*_\GS+_\GS,_\GS-_\GS._\GS/_\GS0_\GS1_\GS2_\GS3_\GS4_\GS5_\GS6\GS7\GS8\GS90ErSrSrSrSGr SGrSGrSGr\GS:\GS;\GS<G\ GS=G\GS>G\GS?G\GS@0GrGSAGrGgB(C  &NetlinkPacket_IFLA_LINKINFO_Attributes   r   r   r   r   r   r      IFLA_INFO_UNSPECIFLA_INFO_KINDIFLA_INFO_DATAIFLA_INFO_XSTATSIFLA_INFO_SLAVE_KINDIFLA_INFO_SLAVE_DATAIFLA_INFO_MAXIFLA_VLAN_UNSPECIFLA_VLAN_IDIFLA_VLAN_FLAGSIFLA_VLAN_EGRESS_QOSIFLA_VLAN_INGRESS_QOSIFLA_VLAN_PROTOCOL   騈  802.1Q802.1ad)r   z802.1qr   z802.1ADz802.1Adz802.1aDr   r   IFLA_MACVLAN_UNSPECIFLA_MACVLAN_MODEr,   r   MACVLAN_MODE_PRIVATEMACVLAN_MODE_VEPAMACVLAN_MODE_BRIDGEMACVLAN_MODE_PASSTHRUMACVLAN_MODE_SOURCEIFLA_XFRM_UNSPECIFLA_XFRM_LINKIFLA_XFRM_IF_ID   	   
      rw         r   r   r   r   r   r   r      r    r!   r@   r?   IFLA_VXLAN_UNSPECIFLA_VXLAN_IDIFLA_VXLAN_GROUPIFLA_VXLAN_LINKIFLA_VXLAN_LOCALIFLA_VXLAN_TTLIFLA_VXLAN_TOSIFLA_VXLAN_LEARNINGIFLA_VXLAN_AGEINGIFLA_VXLAN_LIMITIFLA_VXLAN_PORT_RANGEIFLA_VXLAN_PROXYIFLA_VXLAN_RSCIFLA_VXLAN_L2MISSIFLA_VXLAN_L3MISSIFLA_VXLAN_PORTIFLA_VXLAN_GROUP6IFLA_VXLAN_LOCAL6IFLA_VXLAN_UDP_CSUMIFLA_VXLAN_UDP_ZERO_CSUM6_TXIFLA_VXLAN_UDP_ZERO_CSUM6_RXIFLA_VXLAN_REMCSUM_TXIFLA_VXLAN_REMCSUM_RXIFLA_VXLAN_GBPIFLA_VXLAN_REMCSUM_NOPARTIALIFLA_VXLAN_COLLECT_METADATAIFLA_VXLAN_REPLICATION_NODEIFLA_VXLAN_REPLICATION_TYPEr"   <   IFLA_BOND_UNSPECIFLA_BOND_MODEIFLA_BOND_ACTIVE_SLAVEIFLA_BOND_MIIMONIFLA_BOND_UPDELAYIFLA_BOND_DOWNDELAYIFLA_BOND_USE_CARRIERIFLA_BOND_ARP_INTERVALIFLA_BOND_ARP_IP_TARGETIFLA_BOND_ARP_VALIDATEIFLA_BOND_ARP_ALL_TARGETSIFLA_BOND_PRIMARYIFLA_BOND_PRIMARY_RESELECTIFLA_BOND_FAIL_OVER_MACIFLA_BOND_XMIT_HASH_POLICYIFLA_BOND_RESEND_IGMPIFLA_BOND_NUM_PEER_NOTIFIFLA_BOND_ALL_SLAVES_ACTIVEIFLA_BOND_MIN_LINKSIFLA_BOND_LP_INTERVALIFLA_BOND_PACKETS_PER_SLAVEIFLA_BOND_AD_LACP_RATEIFLA_BOND_AD_SELECTIFLA_BOND_AD_INFOIFLA_BOND_AD_ACTOR_SYS_PRIOIFLA_BOND_AD_USER_PORT_KEYIFLA_BOND_AD_ACTOR_SYSTEMIFLA_BOND_CL_STARTIFLA_BOND_AD_LACP_BYPASSIFLA_BOND_AD_INFO_UNSPECIFLA_BOND_AD_INFO_AGGREGATORIFLA_BOND_AD_INFO_NUM_PORTSIFLA_BOND_AD_INFO_ACTOR_KEYIFLA_BOND_AD_INFO_PARTNER_KEYIFLA_BOND_AD_INFO_PARTNER_MACz
balance-rrzactive-backupzbalance-xor	broadcastz802.3adzbalance-tlbzbalance-albrT   rY   23456)r   r   r   r   )r   r   r   r   r   r   r   )layer2layer3+4layer2+3encap2+3encap3+4rT   rY   r   r   r   r   r   r   r   r   r   r   r   r  r  )r   r   r   r   r   )alwaysbetterfailurer   r   r   r  r  r  )r   r   r   2   IFLA_BOND_SLAVE_UNSPECIFLA_BOND_SLAVE_STATEIFLA_BOND_SLAVE_MII_STATUS"IFLA_BOND_SLAVE_LINK_FAILURE_COUNTIFLA_BOND_SLAVE_PERM_HWADDRIFLA_BOND_SLAVE_QUEUE_ID IFLA_BOND_SLAVE_AD_AGGREGATOR_ID(IFLA_BOND_SLAVE_AD_ACTOR_OPER_PORT_STATE*IFLA_BOND_SLAVE_AD_PARTNER_OPER_PORT_STATEIFLA_BOND_SLAVE_CL_STARTIFLA_BOND_SLAVE_AD_RX_BYPASS   r   r   r   r8   r2   !   "   =   >   IFLA_BRPORT_UNSPECIFLA_BRPORT_STATEIFLA_BRPORT_PRIORITYIFLA_BRPORT_COSTIFLA_BRPORT_MODEIFLA_BRPORT_GUARDIFLA_BRPORT_PROTECTIFLA_BRPORT_FAST_LEAVEIFLA_BRPORT_LEARNINGIFLA_BRPORT_UNICAST_FLOODIFLA_BRPORT_PROXYARPIFLA_BRPORT_LEARNING_SYNCIFLA_BRPORT_PROXYARP_WIFIIFLA_BRPORT_ROOT_IDIFLA_BRPORT_BRIDGE_IDIFLA_BRPORT_DESIGNATED_PORTIFLA_BRPORT_DESIGNATED_COSTIFLA_BRPORT_IDIFLA_BRPORT_NOIFLA_BRPORT_TOPOLOGY_CHANGE_ACKIFLA_BRPORT_CONFIG_PENDINGIFLA_BRPORT_MESSAGE_AGE_TIMERIFLA_BRPORT_FORWARD_DELAY_TIMERIFLA_BRPORT_HOLD_TIMERIFLA_BRPORT_FLUSHIFLA_BRPORT_MULTICAST_ROUTERIFLA_BRPORT_PADIFLA_BRPORT_MCAST_FLOODIFLA_BRPORT_MCAST_TO_UCASTIFLA_BRPORT_VLAN_TUNNELIFLA_BRPORT_BCAST_FLOODIFLA_BRPORT_GROUP_FWD_MASKIFLA_BRPORT_NEIGH_SUPPRESSIFLA_BRPORT_ISOLATEDIFLA_BRPORT_BACKUP_PORTIFLA_BRPORT_PEER_LINKIFLA_BRPORT_DUAL_LINKIFLA_BRPORT_GROUP_FWD_MASKHI#   r#   r$   r%   '   (   )   *   +   ,   IFLA_BR_UNSPECIFLA_BR_FORWARD_DELAYIFLA_BR_HELLO_TIMEIFLA_BR_MAX_AGEIFLA_BR_AGEING_TIMEIFLA_BR_STP_STATEIFLA_BR_PRIORITYIFLA_BR_VLAN_FILTERINGIFLA_BR_VLAN_PROTOCOLIFLA_BR_GROUP_FWD_MASKIFLA_BR_ROOT_IDIFLA_BR_BRIDGE_IDIFLA_BR_ROOT_PORTIFLA_BR_ROOT_PATH_COSTIFLA_BR_TOPOLOGY_CHANGE IFLA_BR_TOPOLOGY_CHANGE_DETECTEDIFLA_BR_HELLO_TIMERIFLA_BR_TCN_TIMERIFLA_BR_TOPOLOGY_CHANGE_TIMERIFLA_BR_GC_TIMERIFLA_BR_GROUP_ADDRIFLA_BR_FDB_FLUSHIFLA_BR_MCAST_ROUTERIFLA_BR_MCAST_SNOOPINGIFLA_BR_MCAST_QUERY_USE_IFADDRIFLA_BR_MCAST_QUERIERIFLA_BR_MCAST_HASH_ELASTICITYIFLA_BR_MCAST_HASH_MAXIFLA_BR_MCAST_LAST_MEMBER_CNTIFLA_BR_MCAST_STARTUP_QUERY_CNTIFLA_BR_MCAST_LAST_MEMBER_INTVLIFLA_BR_MCAST_MEMBERSHIP_INTVLIFLA_BR_MCAST_QUERIER_INTVLIFLA_BR_MCAST_QUERY_INTVL"IFLA_BR_MCAST_QUERY_RESPONSE_INTVL!IFLA_BR_MCAST_STARTUP_QUERY_INTVLIFLA_BR_NF_CALL_IPTABLESIFLA_BR_NF_CALL_IP6TABLESIFLA_BR_NF_CALL_ARPTABLESIFLA_BR_VLAN_DEFAULT_PVIDIFLA_BR_PADIFLA_BR_VLAN_STATS_ENABLEDIFLA_BR_MCAST_STATS_ENABLEDIFLA_BR_MCAST_IGMP_VERSIONIFLA_BR_MCAST_MLD_VERSIONIFLA_VRF_UNSPECIFLA_VRF_TABLEIFLA_GRE_UNSPECIFLA_GRE_LINKIFLA_GRE_IFLAGSIFLA_GRE_OFLAGSIFLA_GRE_IKEYIFLA_GRE_OKEYIFLA_GRE_LOCALIFLA_GRE_REMOTEIFLA_GRE_TTLIFLA_GRE_TOSIFLA_GRE_PMTUDISCIFLA_GRE_ENCAP_LIMITIFLA_GRE_FLOWINFOIFLA_GRE_FLAGSIFLA_GRE_ENCAP_TYPEIFLA_GRE_ENCAP_FLAGSIFLA_GRE_ENCAP_SPORTIFLA_GRE_ENCAP_DPORTIFLA_GRE_COLLECT_METADATAIFLA_GRE_IGNORE_DFIFLA_GRE_FWMARKIFLA_GRE_ERSPAN_INDEXIFLA_GRE_ERSPAN_VERIFLA_GRE_ERSPAN_DIRIFLA_GRE_ERSPAN_HWIDIFLA_IPTUN_UNSPECIFLA_IPTUN_LINKIFLA_IPTUN_LOCALIFLA_IPTUN_REMOTEIFLA_IPTUN_TTLIFLA_IPTUN_TOSIFLA_IPTUN_ENCAP_LIMITIFLA_IPTUN_FLOWINFOIFLA_IPTUN_FLAGSIFLA_IPTUN_PROTOIFLA_IPTUN_PMTUDISCIFLA_IPTUN_6RD_PREFIXIFLA_IPTUN_6RD_RELAY_PREFIXIFLA_IPTUN_6RD_PREFIXLENIFLA_IPTUN_6RD_RELAY_PREFIXLENIFLA_IPTUN_ENCAP_TYPEIFLA_IPTUN_ENCAP_FLAGSIFLA_IPTUN_ENCAP_SPORTIFLA_IPTUN_ENCAP_DPORTIFLA_IPTUN_COLLECT_METADATAIFLA_IPTUN_FWMARKIFLA_VTI_UNSPECIFLA_VTI_LINKIFLA_VTI_IKEYIFLA_VTI_OKEYIFLA_VTI_LOCALIFLA_VTI_REMOTEIFLA_VTI_FWMARKrl   N(  __name__
__module____qualname____firstlineno__r   r   r   r   r   r   r   ifla_info_to_stringr   r   r   r   r   r   ifla_vlan_to_stringifla_vlan_protocol_dictr   r   ifla_macvlan_to_stringr   r   r   r   r   macvlan_mode_to_stringr   r   r   ifla_xfrm_to_stringr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   ifla_vxlan_to_stringr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   ifla_bond_to_stringr   r   r   r   r   r   ifla_bond_ad_to_stringifla_bond_mode_tblifla_bond_mode_pretty_tblifla_bond_xmit_hash_policy_tbl%ifla_bond_xmit_hash_policy_pretty_tblifla_bond_primary_reselect_tbl%ifla_bond_primary_reselect_pretty_tblr  r  r	  r
  r  r  r  r  r  r  r  ifla_bond_slave_to_stringr  r  r  r  r  r  r  r  r  r   r!  r"  r#  r$  r%  r&  r'  r(  r)  r*  r+  r,  r-  r.  r/  r0  r1  r2  r3  r4  r5  r6  r7  r8  r9  r:  r;  r<  ifla_brport_to_stringrD  rE  rF  rG  rH  rI  rJ  rK  rL  rM  rN  rO  rP  rQ  rR  rS  rT  rU  rV  rW  rX  rY  rZ  r[  r\  r]  r^  r_  r`  ra  rb  rc  rd  re  rf  rg  rh  ri  rj  rk  rl  rm  rn  ro  rp  ifla_br_to_stringrq  rr  ifla_vrf_to_stringrs  rt  ru  rv  rw  rx  ry  rz  r{  r|  r}  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  ifla_gre_to_stringr  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  ifla_iptun_to_stringr  r  r  r  r  r  r  ifla_vti_to_string__static_attributes__rl   r=   r;   r   r      s   
 NNM 	1//155 LO 	 2 1 6 7 4    	31    	 6 3 5 7 5 NO 	,*+ $%#$M#$#$O#$#$N#$N#$#$#$#%#%#%N#%#%#%O#%#%#%#% #% #%#%#%N#% #%#&#&': 	'9 	'8	
 	'9 	'7 	'7 	'< 	': 	'9 	'> 	'9 	'7 	': 	':  	'8!" 	':#$ 	':'<$'E$'E'>'>'7$'E#'D#'D#'D9D +,*+N*+*+*+*+*+*+*+*+*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*<.@.> 	.F 	.@	
 	.A 	.C 	.E 	.F 	 .G 	.F 	".I 	.A 	#.J 	 .G 	#.J  	.E!" 	!.H#$ 	$.K.C.E#.K.F.C.A#.K".J!.I.B .H;@ +,*+ *+*+*+!*+! 	!.H$.L#.K#.K%.M%.Ma 	q 	Q	
 	1 	q 	q 	Q 	Q 	Q 	Q 	Q 	Q 	Q 	
1  	
1!" 	
1#$ +2 ! &"& -) &" -) 34232323&232323$23,23.242J  	6N6M"6R*6Z#6S 6P(6X06`26b 6P$6T!" '(&'&'&'&'&'&'&'&'&'&(&(&(&(&(&(&(&(N&(N&(#&(&(!&(#&(&(&( &(O&(&(&(&(&(&(&(&(&(&(&( '*>'*=' 	*@' 	*<	'
 	*<' 	*=' 	*?' 	*B' 	*@' 	"*E' 	*@' 	"*E' 	"*E' 	*?' 	*A'  	$*G!'" 	$*G#'$ 	*:%'& 	*:''( 	(*K)'* 	#*F+', 	&*I-'. 	(*K/'0 	*B1'2 	*=3'4 	%*H5'6 	*;7'8 	 *C9': 	#*F;'< 	 *C='> 	 *C?'@ 	#*FA'B 	#*FC'D 	*@E'F 	 *C*A*A$*HM'R +,N*+*+*+O*+*+*+*+*+*+)+O)+)+)+)+)+$)+)+)+!)+)+)+)+)+)+")+)+!)+)+!)+#)+#)+")+)+)+&)+%)+)+)+)+)+K)+)+)+)+.-=.-D. 	-A. 	->	.
 	-B. 	-@. 	-?. 	-E. 	-D. 	-E. 	->. 	-@. 	-@. 	-E. 	 -F.  	)-O!." 	-B#.$ 	-@%.& 	&-L'.( 	-?).* 	-A+., 	-@-.. 	-C/.0 	-E1.2 	'-M3.4 	-D5.6 	&-L7.8 	-E9.: 	&-L;.< 	(-N=.> 	(-N?.@ 	'-MA.B 	$-JC.D 	"-HE.F 	+-Q)-P -G!-H!-H!-H]"-I#-J"-I!-H[.f /0O./N 	.?.> #$O"#M"#O"#O"#M"#M"#N"#O"#L"#L"$"$"$"$N"$"$"$"$"$"$"$O"$"$"$"$&7o 	&7 	&7	
 	o 	o 	&6 	&7 	n 	n 	&9 	&< 	&9 	&6 	&;  	&<!" 	&<#$ 	&<!&A&:&7&=&;&;&<3> /0./O./././N./N././././.0.0.0.0.0".0.0.0.0.0.0.A.? 	.@ 	.A	
 	.> 	.> 	.F 	.C 	.@ 	.@ 	.C 	.E 	$.K 	!.H 	'.N  	.E!" 	.F#$ 	.F.F#.K.A+6 OMMMNOO 	/ooo.//r=   r   c                      \ rS rSrS rS rS rS rS r\	S 5       r
S rS	 rS
 rS rS rS&S jr\	S&S j5       r\	S&S j5       r\	S&S j5       r\	S&S j5       r\	S&S j5       r\	S&S j5       r\	S&S j5       r\	S&S j5       r\	S 5       r\	S&S j5       r\	S 5       r\	S 5       r\	S 5       r\	S 5       r\	S 5       r\	S 5       r \	S 5       r!\	S  5       r"\	S! 5       r#\	S" 5       r$\	S# 5       r%\	S$ 5       r&S%r'g)'	Attributei  c                     Xl         X l        SU l        [        U R                  5      U l        S U l        S U l        S U l        S U l        SU l	        SU l
        X0l        g )N=HHF)atypestringHEADER_PACKr   
HEADER_LENPACKLENrawrg   nestednet_byteorderr_   )selfr  r  loggers       r;   __init__Attribute.__init__  sV    
 "4#3#34	
"r=   c                     U R                   $ r^   )r  r  s    r;   __str__Attribute.__str__  s    {{r=   c                     Xl         g r^   rg   r  rg   s     r;   	set_valueAttribute.set_value      
r=   c                     Xl         g r^   )r  )r  r  s     r;   
set_nestedAttribute.set_nested  s    r=   c                     Xl         g r^   )r  )r  r  s     r;   set_net_byteorderAttribute.set_net_byteorder  s    *r=   c                 &    U S-  nU(       a  SU-
  $ g)zN
Return the number of bytes that should be added to align on a 4-byte boundry
r   r   rl   )r   	remainders     r;   pad_bytes_neededAttribute.pad_bytes_needed  s    
 QJ	y= r=   c                 d    U R                  U5      nU(       a  USU-  R                  S5      -  nU$ )N utf-8)r  encode)r  r   r  pads       r;   r  Attribute.pad  s3    ##F+D3J&&w//C
r=   c                    U R                   (       d  [        S5      eU R                  U R                   -   nU R                  nU R                  (       a	  U[
        -  nU R                  (       a	  U[        -  n[        U R                  X5      [        U R                  U R                  5      -   nU R                  X5      nU$ )Nz^Please define an encode() method in your child attribute class, or do not use AttributeGeneric)r  r9   r  r  r  NLA_F_NESTEDr  NLA_F_NET_BYTEORDERr   r  r  rg   r  )r  r   attr_type_with_flagsr  s       r;   r  Attribute.encode  s    xx|}}488+#zz;;#7,#F #7:M#M 4##VBT$))UYU_U_E``hhv#
r=   c                    Xl         U R                  n[        U R                  USU R                   5      u  p4[        U5      U l        [        U5      U l        [        U R                  5      U l        U R                  [        -  (       a  SOSU l
        U R                  [        -  (       a  SOSU l        U R                  [        -  U l        U R                  U:X  d   SX R                  4-  5       eg)zU
The first two bytes of an attribute are the length, the next two bytes are the type
NTFz=This object changes attribute type from %d to %d, this is bad)r   r  r   r  r  r   r   r   attr_endr  r  r  r  NLA_TYPE_MASK)r  r   
prev_atypedata1data2s        r;   decode_length_typeAttribute.decode_length_type  s     	ZZ
 0 0$7G2HI%jZ
%dkk2"jj<7dU%)ZZ2E%ET5ZZ-/
 zzZ'  	D)hlv  yC  yC  lD  *D  	D'r=   c           	         U R                   U R                  :X  a  SnOSU R                   -  nS[        U R                  S5      U R                  U[        U R                  S5      U R                  (       a  SOSU R
                  (       a  SOSU R                  U 4-  nUR                  [        X#U R                  SS U5      5        US	-   $ )
z5
Add the "Length....Type..." line to the dump buffer
,  padded to %d, z#Length %s (%d)%sType %s%s%s (%d) %sr   z (NLA_F_NESTED set)r   z (NLA_F_NET_BYTEORDER set)r   r   )	r  r   ri   r  r  r  r   r   r   )r  dump_bufferr   r   	padded_tor   s         r;   dump_first_lineAttribute.dump_first_line  s     ==DKK'I)DMM9I5dkk1-t{{djj!,+/;;'B262D2D."** 	-k$))Aa.RWXYQr=   c           
          U R                  XU5      n[        SU R                  S-  5       H:  nUS-  nUS-   nUR                  [	        X#U R
                  XV S5      5        US-  nM<     U$ )Nr   r   r   )r   ry   r  r   r   r   r  r  r   r   xstartends          r;   
dump_linesAttribute.dump_lines  su    **;UKq$--*+AEE!)C1+diiPUFZ\^_`1K	 , r=   Nc                 l    U(       a"  [        U5      (       a  U" U R                  5      $ U R                  $ r^   )callablerg   )r  objs     r;   get_pretty_valueAttribute.get_pretty_value  s%    8C==tzz?"zzr=   c                     U S   $ )Nr   rl   r   _s     r;   decode_one_byte_attribute#Attribute.decode_one_byte_attribute  s     Awr=   c                 &    [        SU SS 5      S   $ )N=Hr   r   r   r   r  s     r;   decode_two_bytes_attribute$Attribute.decode_two_bytes_attribute      dD1I&q))r=   c                 &    [        SU SS 5      S   $ )Nz!Hr   r   r   r  r  s     r;   -decode_two_bytes_network_byte_order_attribute7Attribute.decode_two_bytes_network_byte_order_attribute  s     dD1I&q))r=   c                 &    [        SU SS 5      S   $ )N=Lr   r,   r   r  r  s     r;   decode_four_bytes_attribute%Attribute.decode_four_bytes_attribute  r  r=   c                 &    [        SU SS 5      S   $ )N=Qr   rw   r   r  r  s     r;   decode_eight_bytes_attribute&Attribute.decode_eight_bytes_attribute  s    dD2J'**r=   c                 F    [        SU SS 5      u  p#[        US-  U-  5      $ )N>LHxxr   rw   r   )r   mac_int_to_strr   r  r  r  s       r;   decode_mac_address_attribute&Attribute.decode_mac_address_attribute  s*    a4erkE122r=   c                 N    [         R                  " [        SU SS 5      S   5      $ )N>Lr   r,   r   )r   IPv4Addressr   r  s     r;   decode_ipv4_address_attribute'Attribute.decode_ipv4_address_attribute  s%    $$VD$q)%<Q%?@@r=   c                 \    [        SU SS 5      u  p#[        R                  " US-  U-  5      $ )N>QQr   r   r3   )r   r   IPv6Addressr'  s       r;   decode_ipv6_address_attribute'Attribute.decode_ipv6_address_attribute"  s0    tAbz2$$Ub[5%899r=   c                     0 nU SU nU(       aa  [        SUS S 5      u  pE[        U5      nU[        R                  :X  a$  [        SUSS 5      u  px[	        US-  U-  5      X%'   X6S  nU(       a  Ma  U$ )Nr   r  r%  rw   r   )r   r   Linkr   r&  )	r   info_data_endifla_bond_ad_infoad_attr_dataad_data_lengthad_data_typead_data_endr  r  s	            r;   decode_bond_ad_info_attribute'Attribute.decode_bond_ad_info_attribute'  s    Am,-3E<;K-L*^'7KtAAA!'a1C!D2@"uAT2U!/'5L l ! r=   c                 `    [         R                  R                  [        SU SS 5      S   5      $ )N>Hr   r   r   )r5  r  rM   r   r  s     r;   decode_vlan_protocol_attribute(Attribute.decode_vlan_protocol_attribute8  s+    ++//tT!AY0G0JKKr=   c                     U R                  S5        UR                  S5        UR                  U5        U R                  S5        UR                  U5        g )NHHr   Bxxxr   sub_attr_pack_layoutsub_attr_payloadinfo_data_typeinfo_data_values       r;   encode_one_byte_attribute#Attribute.encode_one_byte_attribute@  sH    ##D)"/##F+0r=   c           	      n    [         R                  U UU[        R                  R	                  US5      5      $ Nr   )r  rK  r5  r  rM   rF  s       r;   &encode_bond_xmit_hash_policy_attribute0Attribute.encode_bond_xmit_hash_policy_attributeI  4    22 //33OQG	
 	
r=   c           	      n    [         R                  U UU[        R                  R	                  US5      5      $ rN  )r  rK  r5  r  rM   rF  s       r;   encode_bond_mode_attribute$Attribute.encode_bond_mode_attributeR  s4    22 ##'';	
 	
r=   c           	      n    [         R                  U UU[        R                  R	                  US5      5      $ rN  )r  rK  r5  r  rM   rF  s       r;   &encode_bond_primary_reselect_attribute0Attribute.encode_bond_primary_reselect_attribute[  rQ  r=   c                     U R                  S5        UR                  S5        UR                  U5        U R                  S5        UR                  U5        g )NrC  r   HxxrE  rF  s       r;   encode_two_bytes_attribute$Attribute.encode_two_bytes_attributed  sH    ##D)"/##E*0r=   c                     U R                  S5        UR                  S5        UR                  U5        U R                  S5        UR                  U5        g )NrC  r,   LrE  rF  s       r;   encode_four_bytes_attribute%Attribute.encode_four_bytes_attributem  sH    ##D)"/##C(0r=   c                     U R                  S5        UR                  S5        UR                  U5        U R                  S5        UR                  U5        g )NrC  rw   QrE  rF  s       r;   encode_eight_bytes_attribute&Attribute.encode_eight_bytes_attributev  sH    ##D)#/##C(0r=   c                     U R                  S5        UR                  S5        UR                  U5        U R                  S5        U(       a  UR                  UR                  5        g UR                  / SQ5        g )NrC  r,   r|   )r   r   r   r   )r   extendpackedrF  s       r;   encode_ipv4_attributeAttribute.encode_ipv4_attribute  s_    ##D)"/##F+##O$:$:;##L1r=   c                 6   U R                  S5        UR                  S5        UR                  U5        U R                  S5        U(       a;  [        SUR                  5      u  pEUR                  U5        UR                  U5        gUR                  SS/5        g)z
def decode_ipv6_address_attribute(data, _=None):
    (data1, data2) = unpack(">QQ", data[4:20])
    return IPv6Address(data1 << 64 | data2)
rC  r   QQ<QQr   N)r   r   rf  re  )rG  rH  rI  rJ  r  r  s         r;   encode_ipv6_attributeAttribute.encode_ipv6_attribute  s     	##D)#/##D)!%)?)?@LE##E*##E*##QF+r=   c                 (   U R                  S5        UR                  S5        UR                  U5        [        R                  R                  U5      nU(       d  [	        SU-  5      eU R                  S5        UR                  [        U5      5        g )NrC  r   z vlan protocol %s not implementedrY  )r   r   r  rM   NotImplementedErrorr	   )rG  rH  rI  rJ  vlan_protocols        r;   encode_vlan_protocol_attribute(Attribute.encode_vlan_protocol_attribute  sz    ##D)"/ ?VVZZ[jk%&H?&Z[[##E*m 45r=   c                     U R                  S5        UR                  S5        UR                  U5        U R                  S5        [        SU5      nUR                  [        SU5      S   5        g )NrC  r   rY  r?  z<Hr   )r   r   r   )rG  rH  rI  rJ  swapeds        r;   encode_vxlan_port_attribute%Attribute.encode_vxlan_port_attribute  sb    ##D)"/##E* dO,tV 4Q 78r=   c                 0   U R                  S5        UR                  S5        UR                  U5        U R                  S5        UR                  SS5      R                  SS5      R                  5        H  nUR                  [        US5      5        M      g )NrC  r   6Bxxr~    rp   r   )r   replacesplitr   )rG  rH  rI  rJ  mbytes        r;   encode_mac_address_attribute&Attribute.encode_mac_address_attribute  s|    ##D)#/##F+$,,S#6>>sCHNNPE##CrN3 Qr=   )r  r  r  r  r  r  r   r   r_   r  r  r  r  rg   r^   )(r  r  r  r  r  r  r  r  r  staticmethodr  r  r  r  r   r  r  r  r  r  r  r"  r(  r-  r2  r<  r@  rK  rO  rS  rV  rZ  r^  rb  rg  rl  rq  ru  r}  r  rl   r=   r;   r  r    s
   + 	 	$D$*	
   * * * *
 * * + + 3 3 A A : : ! !  L L 1 1 
 
 
 
 
 
 1 1 1 1 1 1 
2 
2 , ," 6 6 
9 
9 4 4r=   r  c                   *    \ rS rSrSrS rS rS rSrg)AttributeCACHEINFOi  z
struct ifa_cacheinfo {
    __u32       ifa_prefered;
    __u32       ifa_valid;
    __u32       cstamp; /* created timestamp, hundredths of seconds */
    __u32       tstamp; /* updated timestamp, hundredths of seconds */
};
c                 r    [         R                  XX$5        SU l        [        U R                  5      U l        g )Nz=IIIIr  r  r  r   r  r  r  r  rN   r  s        r;   r  AttributeCACHEINFO.__init__  )    47	DII&r=   c                     U R                   u  pp4[        U R                  U R                  U R                  -   U R
                  5      [        U R                  XX45      -   $ r^   )rg   r   r  r  r  r  r  )r  ifa_prefered	ifa_validcstamptstamps        r;   r  AttributeCACHEINFO.encode  s\    26**/D$$doo&@4::NQUVZV_V_am  {A  RJ  J  	Jr=   c                 8   U R                  U5         [        U R                  U R                  SS  5      U l        g ! [
        R                   aI    U R                  R                  U < SU R                  < S[        U R                  SS  5      < 35         g f = f)Nr    unpack of  failed, data 0x)	r  r   r  r   rg   structerrorr_   r   r  
parent_msgr   s      r;   decodeAttributeCACHEINFO.decode  sx    %	l		499QR=9DJ|| 	lHHNN$		SZ[_[d[defeg[hSijk	ls   (< ABBr  r  rg   N	r  r  r  r  __doc__r  r  r  r  rl   r=   r;   r  r    s    '
Jlr=   r  c                   &    \ rS rSrS rS rS rSrg)AttributeFourByteListi  c                 0    [         R                  XX$5        g r^   r  r  r  s        r;   r  AttributeFourByteList.__init__      47r=   c                    U R                  U5        U R                  S-
  S-  nSU-  U l        [        U R                  5      U l         [        U R                  U R                  SS  5      U l        g ! [        R                   aH    U R                  R                  U < SU R                  < S[        U R                  SS  5      < 35        e f = f)Nr   =%dLr  r  )r  r  r  r   r  r   r   rg   r  r  r_   r   r  r  r   	wordcounts       r;   r  AttributeFourByteList.decode  s    %]]Q&*	Y&	DII&			499QR=9DJ|| 	HHNN$		SZ[_[d[defeg[hSijk	s   	(A2 2ACc                     U R                  XU5      nSnU R                   H?  nUR                  [        X#U R                  SU-  SUS-   -   U5      5        US-  nUS-  nMA     U$ )Nr   r   )r   rg   r   r   r   )r  r  r   r   idxvals         r;   r   AttributeFourByteList.dump_lines  sz    **;UK::C1+diiPQRUPUVWY\]^Y^V_F`befg1K1HC  r=   r  Nr  r  r  r  r  r  r  r  rl   r=   r;   r  r    s    8
r=   r  c                   &    \ rS rSrS rS rS rSrg)AttributeFourByteValuei  c                 r    [         R                  XX$5        SU l        [        U R                  5      U l        g )Nr  r  r  s        r;   r  AttributeFourByteValue.__init__  s)    47	DII&r=   c                    U R                  U5        U R                  S:X  d   SX R                  4-  5       e [        [        U R                  U R
                  SS  5      S   5      U l        g ! [        R                   aH    U R                  R                  U < SU R                  < S[        U R
                  SS  5      < 35        e f = f)Nr,   +Attribute length for %s must be 8, it is %dr   r   r  r  r  r  r   r   r  r   rg   r  r  r_   r   r  s      r;   r  AttributeFourByteValue.decode   s    %}}!h#PTXZgZgSh#hh!	VDIItyy}=a@ADJ|| 	HHNN$		SZ[_[d[defeg[hSijk	   4A- -AC	c           	          U R                  XU5      nUR                  [        X#U R                  SS U R                  5      5        US-   $ Nr   r,   r   r   r   r   r   rg   r  r  r   r   s       r;   r  !AttributeFourByteValue.dump_lines
  G    **;UK-k$))Aa.RVR\R\]^Qr=   r  Nr  rl   r=   r;   r  r    s    '
r=   r  c                   ,    \ rS rSrS rS rS rS rSrg)AttributeTwoByteValuei  c                 r    [         R                  XX$5        SU l        [        U R                  5      U l        g )Nz=Hxxr  r  s        r;   r  AttributeTwoByteValue.__init__  s)    47	DII&r=   c                    U R                  U5        U R                  S:X  d   SX R                  4-  5       e [        [        U R                  U R
                  SS 5      S   5      U l        g ! [        R                   aH    U R                  R                  U < SU R                  < S[        U R
                  SS 5      < 35        e f = f)Nr,   r  r   r   r  r  r   r  r  s      r;   r  AttributeTwoByteValue.decode      %}}!h#PTXZgZgSh#hh!	VDIItyy1~>qABDJ|| 	HHNN$		SZ[_[d[defgh[iSjkl	r  c                     U R                   U R                  -   n[        U R                  US-
  U R                  5      [        U R
                  U R                  5      -   nU R                  X5      nU$ )Nr   r  r  r   r  r  r  rg   r  r  r   r  s      r;   r  AttributeTwoByteValue.encode!  W    488+4##VAXtzz:T$))TZZ=XXhhv#
r=   c           	          U R                  XU5      nUR                  [        X#U R                  SS U R                  5      5        US-   $ r  r  r  s       r;   r   AttributeTwoByteValue.dump_lines'  r  r=   r  N	r  r  r  r  r  r  r  r  r  rl   r=   r;   r  r        '
r=   r  c                   &    \ rS rSrS rS rS rSrg)AttributeStringi-  c                 L    [         R                  XX$5        S U l        S U l        g r^   r  r  r  r  r  s        r;   r  AttributeString.__init__/       47	r=   c                    [        U R                  [        5      (       a  [        U R                  5      U l        S[        U R                  5      -  U l        [        U R                  5      U l        U R                  U R                  -   n[        U R                  XR                  5      [        U R                  U R                  R                  5       5      -   nU R                  X5      nU$ )N%ds)
isinstancerg   strlenr  r   r  r  r   r  r  r  r  r  s      r;   r  AttributeString.encode4  s     djj#&&TZZDJC

O+	DII&488+4##VZZ84		4::K\K\K^;__hhv#
r=   c                    U R                  U5        SU R                  S-
  -  U l        [        U R                  5      U l         [        [        U R                  U R                  SU R                   5      S   5      R                  S5      U l	        g ! [        R                   aR    U R                  R                  U < SU R                  < S[        U R                  SU R                   5      < 35        e f = f)Nr  r   r   r  r  r  )r  r   r  r   r  rn   r   r   r  rg   r  r  r_   r   r  s      r;   r  AttributeString.decodeA  s    %T[[1_-	DII&	-fTYY		!DKK@X.YZ[.\]ddelmDJ|| 	HHNN$		SZ[_[d[defgkgrgr[sStuv	s   AB A&C8r  N)r  r  r  r  r  r  r  r  rl   r=   r;   r  r  -  s    
	r=   r  c                        \ rS rSrS rS rSrg)AttributeStringInterfaceNameiM  c                 2    [         R                  XX#U5        g r^   )r  r  r  s        r;   r  %AttributeStringInterfaceName.__init__O  s      ffEr=   c                 h    U(       a%  [        U5      [        :  a  [        S[        -  5      eXl        g )Nz'interface name exceeds max length of %d)r  IF_NAME_SIZEr9   rg   r  s     r;   r  &AttributeStringInterfaceName.set_valueR  s&    SZ,.ETUU
r=   r  N)r  r  r  r  r  r  r  rl   r=   r;   r  r  M  s    Fr=   r  c                   ,    \ rS rSrS rS rS rS rSrg)AttributeIPAddressiX  c                 H   [         R                  XX$5        X0l        U R                  [        :X  a  SU l        OPU R                  [
        :X  a  SU l        O4U R                  [        :X  a  SU l        O[        SU R                  -  5      e[        U R                  5      U l	        g )Nr+  r0  $%s is not a supported address family)
r  r  rN   r   r  r   r   r9   r   r  r  s        r;   r  AttributeIPAddress.__init__Z  sw    47;;'!DI[[H$DI[[I%DI BT[[PQQDII&r=   c                    U R                  U5          UR                  n UR                  n[	        U[
        5      (       aU  U R                  [
        R                  :X  a  UR                  nO*U R                  [
        R                  :X  a  UR                  nU R                  [        [        4;   aA  [        R                  " [!        U R"                  U R$                  SS  5      S   X45      U l        g U R                  [(        :X  aH  [!        U R"                  U R$                  SS  5      u  pV[        R*                  " US-  U-  X45      U l        g U R,                  R/                  SR1                  U R                  5      5        g ! [         a    S n GNrf = f! [         a    Sn GNxf = f! [2        R4                   aO    S U l        U R,                  R5                  U < SU R"                  < S[7        U R$                  SS  5      < 35        e f = f)Nr   r   r3   z;AttributeIPAddress: decode: unsupported address family ({})r  r  )r  	prefixlenAttributeErrorscoper  Router  RTA_SRCsrc_lenRTA_DSTdst_lenrN   r   r   r   IPv4Networkr   r  r   rg   r   IPv6Networkr_   debugformatr  r  r   )r  r  r   r  r  r  r  s          r;   r  AttributeIPAddress.decodel  s   %	!&00	"(( *e,,::. * 2 2IZZ5==0 * 2 2I{{w	22&226$))TYYqr]3STU3VXai
(!'		499QR=!A&225B;3F	Y
 \ccdhdodopq+ " ! 	! " & || 	DJHHNN$		SZ[_[d[defeg[hSijk	sT   F F CF) 2AF) 4F) FF) FF) F&"F) %F&&F) )A#Hc                 6   U R                   U R                  -   nU R                  [        [        [
        4;  a  [        SU R                  -  5      e[        U R                  XR                  5      U R                  R                  -   nU R                  X5      nU$ )Nr  )r  r  rN   r   r   r   r9   r   r  r  rg   rf  r  r  s      r;   r  AttributeIPAddress.encode  st    488+;;w)<<BT[[PQQ4##VZZ84::;L;LLhhv#
r=   c           
      L   U R                  XU5      nU R                  [        :X  a:  UR                  [	        X#U R
                  SS U R                  5      5        US-  nU$ U R                  [        :X  ac  [        SU R                  S-  5       HD  nUS-  nUS-   nUR                  [	        X#U R
                  XV U R                  5      5        US-  nMF     U$ U R                  [        :X  a8  UR                  [	        X#U R
                  SS U R                  5      5        US-  nU$ r  )r   rN   r   r   r   r   rg   r   ry   r  r   r  s          r;   r  AttributeIPAddress.dump_lines  s   **;UK;;'!1+diiPQRSnVZV`V`ab1K  [[H$1dmmQ./Aai""#5k$))TYJ^`d`j`j#klq 	 0 	 [[I%1+diiPQRSnVZV`V`ab1Kr=   )r  r  rN   rg   Nr  rl   r=   r;   r  r  X  s    '$ Dr=   r  c                   (   ^  \ rS rSrU 4S jrSrU =r$ )AttributeIPAddressNoMaski  c                 d   > [         [        U ]
  " U0 UD6  U R                  R                  U l        g r^   )superr  r  rg   ip)r  argskwargs	__class__s      r;   r  AttributeIPAddressNoMask.decode  s'    &4dEfEZZ]]
r=   r  )r  r  r  r  r  r  __classcell__r  s   @r;   r  r    s    # #r=   r  c                   ,    \ rS rSrS rS rS rS rSrg)AttributeMACAddressi  c                 r    [         R                  XX$5        SU l        [        U R                  5      U l        g )Nr%  r  r  s        r;   r  AttributeMACAddress.__init__  r  r=   c                    U R                  U5         U R                  S:X  a6  [        R                  " [	        SU R
                  SS  5      S   5      U l        g U R                  S:X  aM  [	        U R                  U R
                  SS  5      u  p4US-  U-  U l        [        U R                  5      U l        g U R                  S:X  a6  [        R                  " [	        SU R
                  SS  5      S   5      U l        g U R                  R                  SU R                  -  5        S U l        g ! [        R                   aH    U R                  R                  U < S	U R                  < S
[        U R
                  SS  5      < 35        e f = f)Nr,   r+  r   r   r   r   r   z0Length of MACAddress attribute not supported: %dr  r  )r  r   r   r,  r   r   rg   r  r  r&  r1  r_   infor  r  r   )r  r  r   r  r  s        r;   r  AttributeMACAddress.decode  s5   %
	{{a&226$		!"3Nq3QR
 "!'		499QR=!A B;.+DHH5
"&226$		"#3OPQ3RS
 PSWS^S^^_!
|| 	HHNN$		SZ[_[d[defeg[hSijk	s!   AD, AD, 6AD, </D, ,AFc                 J   U R                   U R                  -   n[        U R                  R	                  SS5      R	                  SS5      S5      n[        U R                  US-
  U R                  5      [        U R                  US-	  US-  5      -   nU R                  X5      nU$ )Nr~   r   rp   r   r     )
r  r  r   rg   rz  r   r  r  r  r  )r  r   mac_rawr  s       r;   r  AttributeMACAddress.encode  s    488+djj((b199#rBBG4##VAXtzz:T$))WXZ]\cfp\p=qqhhv#
r=   c           	      &   U R                  XU5      nUR                  [        X#U R                  SS U R                  5      5        US-  n[        U R                  5      S:  a-  UR                  [        X#U R                  SS 5      5        US-  nU$ )Nr   r,   r   rw   )r   r   r   r   rg   r  r  s       r;   r  AttributeMACAddress.dump_lines  s    **;UK-k$))Aa.RVR\R\]^qtyy>R1+diiPQRToVW1Kr=   )r  r  r  rg   Nr  rl   r=   r;   r   r     s    '
8r=   r   c                   &    \ rS rSrS rS rS rSrg)AttributeMplsLabeli  c                 J    [         R                  XX$5        X0l        SU l        g )Nz>HBB)r  r  rN   r  r  s        r;   r  AttributeMplsLabel.__init__  s    47	r=   c                    U R                  U5         [        U R                  U R                  SS  5      u  p4U l        US-  U l        US-  S-	  U l        US-  US-	  -  U l        U R                  U l        g ! [        R                   aO    S U l        U R                  R                  U < SU R                  < S[        U R                  SS  5      < 35        e f = f)Nr   r   r   r  r  )r  r   r  r   ttls_bittraffic_classlabelrg   r  r  r_   r   )r  r  r   
label_highlabel_low_tc_ss        r;   r  AttributeMplsLabel.decode  s    %
	5;DIItyyQRQS}5U2Z'#-DJ#1C#7A"=D$/n.ABDJDJ|| 	DJHHNN$		SZ[_[d[defeg[hSijk	s   A#A7 7A#Cc                     U R                  XU5      nUR                  [        X#U R                  SS SU R                  U R
                  U R                  U R                  4-  5      5        US-  nU$ )Nr   r,   z+label %s, TC %s, bottom-of-stack %s, TTL %dr   )r   r   r   r   r  r  r  r  r  s       r;   r  AttributeMplsLabel.dump_lines  sv    **;UK-k$))Aa..[/3zz4;M;Mtzz[_[c[c.d/ef 	g 	qr=   )r  rN   r  r  r  r  rg   Nr  rl   r=   r;   r  r    s    
r=   r  c                        \ rS rSrS rS rSrg)AttributeGenerici  c                 L    [         R                  XX$5        S U l        S U l        g r^   r  r  s        r;   r  AttributeGeneric.__init__
  r  r=   c                    U R                  U5        U R                  S-
  S-  nSU-  U l        [        U R                  5      U l         SR                  [        [        [        U R                  U R                  SS  5      5      5      U l
        g ! [        R                   aH    U R                  R                  U < SU R                  < S[        U R                  SS  5      < 35        e f = f)Nr   r  r   r  r  )r  r  r  r   r  rx   mapr  r   r   rg   r  r  r_   r   r  s       r;   r  AttributeGeneric.decode  s    %]]Q&*	Y&	DII&	S&DIIabM*J!KLDJ|| 	HHNN$		SZ[_[d[defeg[hSijk	s   	AB AC+r  N)r  r  r  r  r  r  r  rl   r=   r;   r  r    s    

r=   r  c                   ,    \ rS rSrS rS rS rS rSrg)AttributeOneByteValuei  c                 t    [         R                  XX#U5        SU l        [        U R                  5      U l        g )Nz=Bxxx)r  r  r  r   r  r  s        r;   r  AttributeOneByteValue.__init__  s+    !!$vvF	DII&r=   c                    U R                  U5        U R                  S:X  d   SX R                  4-  5       e [        [        U R                  U R
                  SS 5      S   5      U l        g ! [        R                   aH    U R                  R                  U < SU R                  < S[        U R
                  SS 5      < 35        e f = f)Nr,   r  r   r   r  r  r   r  r  s      r;   r  AttributeOneByteValue.decode#  r  r  c                     U R                   U R                  -   n[        U R                  US-
  U R                  5      [        U R
                  U R                  5      -   nU R                  X5      nU$ )Nr   r  r  s      r;   r  AttributeOneByteValue.encode-  r  r=   c           	          U R                  XU5      nUR                  [        X#U R                  SS U R                  5      5        US-   $ r  r  r  s       r;   r   AttributeOneByteValue.dump_lines3  r  r=   r  Nr  rl   r=   r;   r"  r"    r  r=   r"  c                   :    \ rS rSrSrS rS rS rS rS
S jr	S	r
g)AttributeIFLA_AF_SPECi9  z}
value will be a dictionary such as:
{
    Link.IFLA_BRIDGE_FLAGS: flags,
    Link.IFLA_BRIDGE_VLAN_INFO: (vflags, vlanid)
}
c                 <    [         R                  XX$5        X0l        g r^   r  r  rN   r  s        r;   r  AttributeIFLA_AF_SPEC.__init__A      47r=   c                 6   U R                   /nSU R                  [        -  /nSn/ nU R                  R	                  5        H  u  pVU[
        R                  :X  a  UR                  XV45        M-  U[
        R                  :X  a!  U H  u  pxUR                  XWU445        M     Mb  U R                  R                  [        SU-  5        M     U GH  u  pVSS/n	SU/n
SnU[
        R                  :X  a#  U	R                  S5        U
R                  U5        OMU[
        R                  :X  a9  U	R                  S5        U
R                  US   5        U
R                  US   5        [        SR                  U	5      5      nXU'   [        U R                  U5      5       H  nU	R                  S5        M     U	SS  n	UR                  U	5        UR                  U
5        GM     SR                  U5      n[        U5      nXU'   [!        U/UQ76 nU R#                  X5      nU$ )	Nr   z;Add support for encoding IFLA_AF_SPEC sub-attribute type %d=rC  Hr   r   r  )r  r  r  rg   itemsr5  IFLA_BRIDGE_FLAGSr   IFLA_BRIDGE_VLAN_INFOr_   SYSLOG_EXTRA_DEBUGr   rx   ry   r  re  r   r  )r  pack_layoutpayloadattr_length_indexsub_attr_to_addsub_attr_typesub_attr_value	vlan_flagvlan_idrG  rH  sub_attr_length_indexsub_attr_lengthr  r   r  s                   r;   r  AttributeIFLA_AF_SPEC.encodeE  s   ''(djj</0 /3zz/?/?/A+] 6 66&&'FG$"<"<<,:(Y#**Mw;O+PQ -; /1nq~1~ 0B 0?+]$';  !=1$%! 6 66$++C0 ''7$"<"<<$++D1 ''q(9: ''q(9:&rww/C'DEO6E23 400AB$++C0 C $8#;  34NN+,9 0?< ggk* +&%+!";))hhv#
r=   c           
         U R                  U5        0 U l        U R                  SS nU(       Ga  [        SUSS 5      u  p4[	        U5      nU(       d  U R
                  R                  S5        gUSU nU R                  [        :X  Ga3  U[        R                  :X  a/  [        SUSS 5      S   U R                  [        R                  '   GOU[        R                  :X  a  [        R                  U R                  ;  a  / U R                  [        R                  '   U R                  [        R                     R                  [        [        SUSS 5      5      5        GO`U[        R                  :X  Ga  SnSnSn	U(       a  [        SUSS 5      u  p[	        U
5      nUSU nU[        R                  :X  a  [        SU5      S   nOGU[        R                   :X  a  [        SU5      S   nO#U[        R"                  :X  a  [        SU5      S   n	XlS nU(       a  M  [        R                  U R                  ;  a  / U R                  [        R                  '   U R                  [        R                     R                  XxU	45        GO:U R
                  R                  [$        S	UR'                  U5      XCU4-  5        GOU R                  [(        :X  a  U[*        :X  a  0 nU(       a  [        SUSS 5      u  nn[	        U5      nU[        R,                  :X  a  U R/                  U5      UU'   ODU R
                  R                  [$        S
UR1                  U5      UUU4-  5        UUS nU(       a  M  XR                  [*        '   O?0 U R                  U'   O/U R
                  R                  [$        SU R                  X54-  5        X%S nU(       a  GM  gg)a  
value is a dictionary such as:
{
    Link.IFLA_BRIDGE_FLAGS: flags,
    Link.IFLA_BRIDGE_VLAN_INFO: (vflags, vlanid)
    Link.IFLA_BRIDGE_VLAN_TUNNEL_INFO: [
            __u32 tunnel_id;
            __u16 tunnel_vid;
            __u16 tunnel_flags;
    ]
}

FROM: David Ahern
The encoding of the IFLA_AF_SPEC attribute varies depending on the family
used for the request (RTM_GETLINK) message. For AF_UNSPEC the encoding
has another level of nesting for each address family with the type encoded
first. i.e.,
    af_spec = nla_nest_start(skb, IFLA_AF_SPEC)
    for each family:
        af = nla_nest_start(skb, af_ops->family)
        af_ops->fill_link_af(skb, dev, ext_filter_mask)
        nest_end
    nest_end

This allows the parser to find the address family by looking at the first
type.

Whereas AF_BRIDGE encoding is just:
    af_spec = nla_nest_start(skb, IFLA_AF_SPEC)
    br_fill_ifvlaninfo{_compressed}(skb, vg)
    nest_end

which means the parser can not use the attribute itself to know the family
to which the attribute belongs.

/include/uapi/linux/if_link.h
/*
 * IFLA_AF_SPEC
 *   Contains nested attributes for address family specific attributes.
 *   Each address family may create a attribute with the address family
 *   number as type and create its own attribute structure in it.
 *
 *   Example:
 *   [IFLA_AF_SPEC] = {
 *       [AF_INET] = {
 *           [IFLA_INET_CONF] = ...,
 *       },
 *       [AF_INET6] = {
 *           [IFLA_INET6_FLAGS] = ...,
 *           [IFLA_INET6_CONF] = ...,
 *       }
 *   }
 */

r   Nr  parsed a zero length sub-attrr  r   r   r  zYAdd support for decoding IFLA_AF_SPEC sub-attribute type %s (%d), length %d, padded to %dzbAdd support for decoding AF_INET6 IFLA_AF_SPEC sub-attribute type %s (%d), length %d, padded to %dzVAdd support for decoding IFLA_AF_SPEC sub-attribute family %d, length %d, padded to %d)r  rg   r   r   r   r_   r  rN   r   r5  r5  r6  r   tupleIFLA_BRIDGE_VLAN_TUNNEL_INFOIFLA_BRIDGE_VLAN_TUNNEL_IDIFLA_BRIDGE_VLAN_TUNNEL_VIDIFLA_BRIDGE_VLAN_TUNNEL_FLAGSr7  !get_ifla_bridge_af_spec_to_stringr   r   IFLA_INET6_ADDR_GEN_MODEr   get_ifla_inet6_af_spec_to_string)r  r  r   rA  r<  sub_attr_endsub_attr_data	tunnel_id
tunnel_vidtunnel_flagss_sub_attr_lengths_sub_attr_types_sub_attr_endd
inet6_attrinet6_attr_lengthinet6_attr_typeinet6_attr_ends                     r;   r  AttributeIFLA_AF_SPEC.decode  sz   p 	%
yy}/5eT"1X/F,_(9L">? <0M{{i' !D$:$::9?mTUVWFX9YZ[9\DJJt556"d&@&@@11CAC

4#=#=>JJt99:AA%uVcdefgVhHiBjk"d&G&GG !"I!"J#$L'?Ee][]\]M^?_<*)67H)I)!N;*d.M.MM(.tQ(:I,0P0PP)/a);J,0R0RR+1$?1+=L(5o(F (-  88

JHJ

4#D#DEJJt@@AHH)amInoHHLL!3 6]","N"N}"]"/,"P6P Q
 	) H,!#J'?Ee][]\]M^?_<*O)67H)I +d.K.KK:>:X:XYf:gJ7 " HHLL 2!V %/$O$OP_$`$35F#"!" )6no(F7 (-8 ,6JJx(02DJJ}-2 / 2V $_K2L M &DA dr=   c           
         U R                  XU5      nSnSnSn[        SU R                  S-  5       GH,  nUS-  nUS-   n	X%:X  a  SnU(       a  Sn[        SU R                  XS-    5      u  p[        U
5      nX,S-  -   nX:X  a  SnOS	U-  nU R                  [        :X  a=  S
[        U
S5      U
U[        US5      U[        R                  R                  U5      4-  nOTU R                  [        :X  a=  U[        :X  a  SnOU[        :X  a  SnOSU-  nSU[        U
S5      X[        US5      U4-  nOSnUR                  [!        X#U R                  X U5      5        US-  nGM/     U$ )Nr   r   Tr   r   Fr  ,z padded to %d,3Nested Attribute - Length %s (%d)%s Type %s (%d) %sr   r   zUnsupported family %dzANested Attribute Structure for %s - Length %s (%d)%s Type %s (%d))r   ry   r  r   r   r   rN   r   ri   r5  ifla_bridge_af_spec_to_stringrM   r   r   r   r   r   )r  r  r   r   r   next_sub_attr_linesub_attr_liner  r  r  rA  r<  rM  r  rN   s                  r;   r   AttributeIFLA_AF_SPEC.dump_linesG  s   **;UKq$--*+AEE!)C0 $ %39%5WXQXAY3Z0,_=%0!O%D"2 #I 0< ?I;;)+Q(!<o&(:M!??CCMRTTE
 [[I-$0!+&'1!*!8=!H_OQ ?#M15}c E
 1+diiPUFZ\abc1KU ,X r=   Nc                 h   U(       a"  [        U5      (       a  U" U R                  5      $ 0 nU R                  [        :X  aM  U R                  R	                  5        H-  u  p4SU[
        R                  R                  U5      4-  nXBU'   M/     U$ U R                  [        :X  a  U R                  R	                  5        Hs  u  pg0 nU[        :X  a  [
        R                  n	OU[        :X  a  [
        R                  n	OM?  UR	                  5        H  u  p4SX9R                  U5      4-  nXHU'   M      UnMu     U$ )N(%2d) %s)r
  rg   rN   r   r4  r5  r^  rM   r   r   ifla_inet6_af_spec_to_stringr   ifla_inet_af_spec_to_string)
r  r  value_prettysub_key	sub_valuesub_key_prettyrN   family_attrfamily_value_prettyfamily_af_spec_to_strings
             r;   r  &AttributeIFLA_AF_SPEC.get_pretty_value|  s   8C==tzz?" ;;)#(,

(8(8(:$!+w8Z8Z8^8^_f8g.h!h/8^, );& ! [[I%)-)9)9);%&(#X%/3/P/P,w&/3/O/O,,7,=,=,?(W%/7<X<XY`<a2b%bN:C7 -@  3 *< r=   rN   rg   r^   r  r  r  r  r  r  r  r  r  r  r  rl   r=   r;   r,  r,  9  s%    AF}'~3jr=   r,  c                   *    \ rS rSrSrS rS rS rSrg)AttributeRTA_MULTIPATHi  a  
/* RTA_MULTIPATH --- array of struct rtnexthop.
 *
 * "struct rtnexthop" describes all necessary nexthop information,
 * i.e. parameters of path to a destination via this nexthop.
 *
 * At the moment it is impossible to set different prefsrc, mtu, window
 * and rtt for different paths from multipath.
 */

struct rtnexthop {
    unsigned short rtnh_len;
    unsigned char  rtnh_flags;
    unsigned char  rtnh_hops;
    int            rtnh_ifindex;
};
    c                     [         R                  XX$5        X0l        S U l        S U l        SU l        [        U R
                  5      U l        SU l        SU l	        g )Nz=HBBLr   r   )
r  r  rN   r  r  	RTNH_PACKr   RTNH_LENIPV4_LENIPV6_LENr  s        r;   r  AttributeRTA_MULTIPATH.__init__  sJ    47	  0r=   c           	         U R                   [        :X  a  U R                  nO U R                   [        :X  a  U R                  nU R
                  U R                  U R
                  -   W-   [        U R                  5      -  -   n[        U R                  X R                  5      nSnSnU R                  U R
                  -   U-   nU R                   H  u  pxU[        U R                  XdXX5      -  nU[        U R                  U R
                  U-   [        R                  5      -  nU R                   [        :X  a  U[        SU5      -  nMy  U R                   [        :X  d  M  U[        SUS-	  US-  5      -  nM     U R                  X#5      nU$ )Nr   r+  r0  r3   l    )rN   r   ru  r   rv  r  rt  r  rg   r   r  r  rs  r  RTA_GATEWAYr  )	r  ip_lenr   r  
rtnh_flags	rtnh_hopsrtnh_lennexthoprtnh_ifindexs	            r;   r  AttributeRTA_MULTIPATH.encode  sH    ;;'!]]F[[H$]]F T]]T__%Dv%MQTUYU_U_Q`$`a4##VZZ8
	==4??2V;'+zz#W 4iVVC 4(($//F*BEDUDUVVC{{g%tD'**(tE7b='<^2^__ (2 hhv#
r=   c                    U R                  U5        / U l        U R                  SS  nU(       Ga  [        U R                  US U R
                   5      u  p4pVX R
                  S  n[        U R                  U R                  S U R                   5      u  pxX R                  S  nU R                  [        :X  ah  [        U5      U R                  :  a  O[        R                  " [        SUS U R                   5      S   5      n	U R                  R                  XXE45        OU R                  [        :X  an  [        U5      U R                   :  a  O|[        SUS U R                    5      u  p[        R"                  " U
S-  U-  5      n	U R                  R                  XXE45        X#U R
                  -
  U R                  -
  S  nU(       a  GM  [%        U R                  5      U l        g )Nr   r+  r   r0  r3   )r  rg   r   r   rs  rt  r  r  rN   r   r  ru  r   r,  r   r   rv  r1  rE  )r  r  r   r}  r{  r|  r  	attr_typeattr_lengthr~  r  r  s               r;   r  AttributeRTA_MULTIPATH.decode  s   %
yy}>DT^^UYZh[_[h[hUi>j;X9'D'-d.>.>		JZ4??@['\$Y()D{{g%t9t}},#//tT.4===Q0RST0UV

!!7*"PQ(t9t}},!'tNT]]/C!D#//e0CD

!!7*"PQ$--/?ABD) d, 4::&
r=   )ru  rv  r  r  rt  rs  rN   rg   Nr  rl   r=   r;   rq  rq    s    $@'r=   rq  c            (       P   \ rS rSrSr\R                  0 S0 \R                  \R                  _\R                  \R                  _\R                  \R                  _\R                  \R                  _\R                  \R                  _\R                  \R                  _\R                  \R                  _\R                   \R                  _\R"                  \R                  _\R$                  \R                  _\R&                  \R                  _\R(                  \R                  _\R*                  \R                  _\R,                  \R                  _\R.                  \R0                  _\R2                  \R0                  _\R4                  \R0                  _0 \R6                  \R0                  _\R8                  \R:                  _\R<                  \R:                  _\R>                  \R:                  _\R@                  \R:                  _\RB                  \R:                  _\RD                  \R:                  _\RF                  \R:                  _\RH                  \R:                  _\RJ                  \R:                  _\RL                  \R:                  _\RN                  \RP                  _\RR                  \RP                  _\RT                  \RP                  _\RV                  \RP                  _\RX                  \RP                  _\RZ                  \RP                  _E\R\                  \R^                  0E_S\R`                  \R                  \Rb                  \R                  \Rd                  \R                  \Rf                  \R                  \Rh                  \R                  \Rj                  \R                  \Rl                  \R                  \Rn                  \R0                  \Rp                  \R:                  \Rr                  \R:                  \Rt                  \R:                  \Rv                  \R:                  \Rx                  \R:                  \Rz                  \R|                  \R~                  \R                  0_S\R                  \R0                  \R                  \R^                  0_S\R                  \R:                  0_S0 \R                  \R                  _\R                  \R                  _\R                  \R                  _\R                  \R                  _\R                  \R                  _\R                  \R                  _\R                  \R                  _\R                  \R                  _\R                  \R                  _\R                  \R                  _\R                  \R                  _\R                  \R                  _\R                  \R                  _\R                  \R                  _\R                  \R:                  _\R                  \R:                  _\R                  \R:                  _\R                  \R:                  \R                  \R:                  \R                  \R                  \R                  \R                  \R                  \R                  \R                  \R                  0E_S\R                  \R:                  0_S	\R                  \R:                  \R                  \R:                  0_S
\R                  \R                  \R                  \R                  \R                  \R                  \R                  \R0                  \R                  \R0                  \R                  \R0                  \R                  \R0                  \R                  \R0                  \R                  \R0                  \R                  \R:                  \R                  \R:                  \R                  \R:                  \R                  \R                  \R                  \R                  0_S\R                  \R                  \R                  \R                  \R                  \R                  \R                  \R0                  \R                  \R0                  \R                  \R0                  \R                  \R0                  \R                  \R0                  \R                  \R0                  \R                  \R:                  \R                  \R:                  \R                  \R:                  \R                  \R                  \R                  \R                  0_S\R                  \R                  \R                  \R                  \R                  \R                  \R                  \R0                  \R                  \R0                  \R                  \R0                  \R                  \R0                  \R                  \R0                  \R                  \R0                  \R                  \R:                  \R                  \R:                  \R                  \R:                  \R                  \R                  \R                  \R                  0_S\R                  \R                  \R                  \R                  \R                  \R                  \R                  \R0                  \R                  \R0                  \R                  \R0                  \R                  \R0                  \R                  \R0                  \R                  \R0                  \R                  \R:                  \R                  \R:                  \R                  \R:                  \R                  \R                  \R                  \R                  0_S\R                  \R                  \R                  \R                  \R                  \R                  \R                  \R0                  \R                  \R0                  \R                  \R0                  \R                  \R0                  \R                  \R0                  \R                  \R0                  \R                  \R:                  \R                  \R:                  \R                  \R:                  \R                  \R                  \R                  \R                  0_S\R                  \R                  \R                  \R                  \R                  \R                  \R                  \R0                  \R                  \R0                  \R                  \R0                  \R                  \R0                  \R                  \R0                  \R                  \R0                  \R                  \R:                  \R                  \R:                  \R                  \R:                  \R                  \R                  \R                  \R                  0_S\R                  \R                  \R                  \R                  \R                  \R                  \R                  \R0                  \R                  \R0                  \R                  \R0                  \R                  \R0                  \R                  \R:                  \R                  \R                  \R                  \R                  0
_S\R                  \R                  \R                  \R                  \R                  \R                  \R                  \R0                  \R                  \R0                  \R                  \R0                  \R                  \R0                  \R                  \R:                  \R                  \R                  \R                  \R                  0
_S\R                  \R                  \R                  \R                  \R                  \R                  \R                  \R0                  \R                  \R0                  \R                  \R0                  \R                  \R0                  \R                  \R:                  \R                  \R                  \R                  \R                  0
_S\R                  \R:                  \R                  \R:                  \R                  \R:                  \R                  \R                  \R                  \R                  0_S\R                  \R:                  \R                  \R:                  \R                  \R:                  \R                  \R                  \R                  \R                  00E\R                  0 \R                  \R                  _\GR                   \R                  _\GR                  \R                  _\GR                  \R                  _\GR                  \R                  _\GR                  \R                  _\GR
                  \R                  _\GR                  \R                  _\GR                  \R                  _\GR                  \R                  _\GR                  \R                  _\GR                  \R                  _\GR                  \R                  _\GR                  \R                  _\GR                  \R                  _\GR                  \R                  _\GR                  \R                  _\GR                   \R                  \GR"                  \R                  \GR$                  \R                  \GR&                  \R0                  \GR(                  \R0                  \GR*                  \R0                  \GR,                  \R0                  \GR.                  \R0                  \GR0                  \R0                  \GR2                  \R0                  \GR4                  \R:                  \GR6                  \R:                  0E\GR8                  \R                  \GR:                  \R                  \GR<                  \R                  \GR>                  \R                  \GR@                  \R0                  \GRB                  \R0                  \GRD                  \R:                  \GRF                  \R:                  0S.0r\R                  \R                  \GRJ                  \R                  \GRL                  0\R                  \GRN                  00 \R                  \GRP                  _\R                  \GRP                  _\R                  \GRP                  _\R                  \GRP                  _\R                  \GRP                  _\R                  \GRP                  _\R                  \GRP                  _\R                  \GRP                  _\R                  \GRP                  _\R                  \GRP                  _\R                  \GRP                  _\R                  \GRP                  _\R                  \GRP                  _\R                  \GRN                  _\R                  \GRN                  _\R                  \GRN                  _\R                  \GRN                  _\R                  \GRN                  \R                  \GRR                  \R                  \GRR                  \R                  \GRT                  \R                  \GRT                  \R                  \GRV                  0E\Rj                  \GRP                  \Rb                  \GRP                  \Rf                  \GRP                  \Rd                  \GRP                  \R`                  \GRX                  \Rh                  \GRZ                  \Rl                  \GR\                  \Rn                  \GRJ                  \Rp                  \GRN                  \Rr                  \GRN                  \Rt                  \GRN                  \Rv                  \GRN                  \Rx                  \GRN                  \Rz                  \GR^                  0\R                  \GRN                  00 \R                  \GRP                  _\R                  \GRP                  _\R                  \GRP                  _\R                  \GRP                  _\R                  \GRP                  _\R                  \GRP                  _\R                  \GRP                  _\R                   \GRP                  _\R"                  \GRP                  _\R$                  \GRP                  _\R&                  \GRP                  _\R(                  \GRP                  _\R*                  \GRP                  _\R,                  \GRP                  _\R.                  \GRJ                  _\R2                  \GRJ                  _\R4                  \GRJ                  _0 \R6                  \GRJ                  _\R<                  \GRN                  _\R>                  \GRN                  _\R@                  \GRN                  _\R8                  \GRN                  _\RB                  \GRN                  _\RD                  \GRN                  _\RF                  \GRN                  _\RH                  \GRN                  _\RJ                  \GRN                  _\RL                  \GRN                  _\RT                  \GR`                  _\RN                  \GR`                  _\RR                  \GR`                  _\RV                  \GR`                  _\RX                  \GR`                  _\RZ                  \GR`                  _E\R\                  \GRL                  0E\R                  \GRP                  \R                  \GRP                  \R                  \GRP                  \R                  \GRJ                  \R                  \GRJ                  \R                  \GRJ                  \R                  \GRJ                  \R                  \GRJ                  \R                  \GRJ                  \R                  \GRN                  \R                  \GRN                  \R                  \GRN                  \R                  \GRR                  \R                  \GRR                  0\R                  \GRP                  \R                  \GRP                  \R                  \GRP                  \R                  \GRJ                  \R                  \GRJ                  \R                  \GRJ                  \R                  \GRJ                  \R                  \GRJ                  \R                  \GRJ                  \R                  \GRN                  \R                  \GRN                  \R                  \GRN                  \R                  \GRR                  \R                  \GRR                  0\R                  \GRP                  \R                  \GRP                  \R                  \GRP                  \R                  \GRJ                  \R                  \GRJ                  \R                  \GRJ                  \R                  \GRJ                  \R                  \GRJ                  \R                  \GRJ                  \R                  \GRN                  \R                  \GRN                  \R                  \GRN                  \R                  \GRR                  \R                  \GRR                  0\R                  \GRP                  \R                  \GRP                  \R                  \GRP                  \R                  \GRJ                  \R                  \GRJ                  \R                  \GRJ                  \R                  \GRJ                  \R                  \GRJ                  \R                  \GRJ                  \R                  \GRN                  \R                  \GRN                  \R                  \GRN                  \R                  \GRT                  \R                  \GRT                  0\R                  \GRP                  \R                  \GRP                  \R                  \GRP                  \R                  \GRJ                  \R                  \GRJ                  \R                  \GRJ                  \R                  \GRJ                  \R                  \GRJ                  \R                  \GRJ                  \R                  \GRN                  \R                  \GRN                  \R                  \GRN                  \R                  \GRT                  \R                  \GRT                  0\R                  \GRP                  \R                  \GRP                  \R                  \GRP                  \R                  \GRJ                  \R                  \GRJ                  \R                  \GRJ                  \R                  \GRJ                  \R                  \GRJ                  \R                  \GRJ                  \R                  \GRN                  \R                  \GRN                  \R                  \GRN                  \R                  \GRT                  \R                  \GRT                  0S.\R                  S0 \R                  \GRP                  _\GR                   \GRP                  _\GR                  \GRP                  _\GR                  \GRP                  _\GR                  \GRP                  _\GR                  \GRP                  _\GR
                  \GRP                  _\GR                  \GRP                  _\GR                  \GRP                  _\GR                  \GRP                  _\GR                  \GRP                  _\GR                  \GRP                  _\GR                  \GRP                  _\GR                  \GRP                  _\GR                  \GRP                  _\GR                  \GRP                  _\GR                  \GRP                  _\GR                   \GRP                  \GR"                  \GRP                  \GR$                  \GRP                  \GR&                  \GRJ                  \GR(                  \GRJ                  \GR*                  \GRJ                  \GR,                  \GRJ                  \GR.                  \GRJ                  \GR0                  \GRJ                  \GR2                  \GRJ                  \GR4                  \GRN                  \GR6                  \GRN                  0E00r\R                  0 S\GRd                  _S\GRf                  _S\GRh                  _S\GRj                  _S\GRl                  _S\GRn                  _S
\GRp                  _S\GRp                  _S\GRp                  _S\GRp                  _S\GRp                  _S\GRp                  _S\GRr                  _S\GRr                  _S\GRt                  _S\GRt                  _S\GRt                  _S	\GRv                  0E\R                  \GRx                  \GRz                  S.0rS rS rS rS"S jrS"S jrS rS rS rS"S  jrS!rg)#AttributeIFLA_LINKINFOi  
value is a dictionary such as:

{
    Link.IFLA_INFO_KIND : 'vlan',
    Link.IFLA_INFO_DATA : {
        Link.IFLA_VLAN_ID : vlanid,
    }
}
bridgebondvlanmacvlanvxlanvrfxfrmgregretaperspanip6gre	ip6gretap	ip6erspanipipsitip6tnlvtivti6)r  r  )r  r  r  r  r  r  r  r  r  r  r  r  c                 0    [         R                  XX$5        g r^   r  r  s        r;   r  AttributeIFLA_LINKINFO.__init__
  r  r=   c           
      d   SU[         -  /nU(       d+  U R                  R                  [        SU< SU< S35        U$ UR                  5        H^  u  pUR	                  U	5      nU(       a  U" XX5        M(  U R                  R                  [        SUUUR	                  U	5      U	4-  5        M`     U$ )Nr   zAdd support for encoding z for z
 link kindz4Add support for encoding %s %s sub-attribute %s (%d))r  r_   r7  r4  rM   )r  rG  r<  sub_attr_type_stringr=  encode_handlers!ifla_info_nested_attr_to_str_dictkindrH  rI  rJ  encode_handlers               r;   encode_ifla_info_nested_data3AttributeIFLA_LINKINFO.encode_ifla_info_nested_data
  s    }|;<HHLL"BVX\],  # 6D5I5I5K1!0!4!4^!D!"#7>kHHLL*N0 =AA.Q*		 6L"  r=   c                    U R                   /nSU R                  [        -  /nSnU R                  R	                  [
        R                  5      nU R                  R	                  [
        R                  5      nU(       d%  US;  a  U R                  R                  SU-  5        g U(       d  US:w  a  [        SU-  5      eU R                  R                  5        GH2  u  pgSS/nSU/n	Sn
U[
        R                  [
        R                  4;   a?  UR                  S[        U5      -  5        U	R                  UR                  S	5      5        GOZU[
        R                  :X  a  U R!                  UUS
UU R"                  R	                  [
        R                  0 5      R	                  U5      U R$                  R	                  [
        R                  0 5      R	                  U5      U5      n	OU[
        R&                  :X  a  U R!                  UUSUU R"                  R	                  [
        R&                  0 5      R	                  U5      U R$                  R	                  [
        R&                  0 5      R	                  U5      U5      n	O&U R                  R                  [(        SU-  5        GM  [+        SR-                  U5      5      nXU
'   US   < SU R/                  U5      -  < 3US'   USS  nUR1                  U5        UR1                  U	5        GM5     SR-                  U5      n[+        U5      nXU'   [3        U/UQ76 nU R5                  X5      nU$ )Nr   )r  r  r  r  dummyr  r  r  r  r  r  r  r  r  r  r  r  r  ip6ip6ipip6r  openvswitchzUnsupported IFLA_INFO_KIND %sr  z#Unsupported IFLA_INFO_SLAVE_KIND %sr2  rC  r  r  r   r   z<Add support for encoding IFLA_LINKINFO sub-attribute type %dr   rk   r  r   )r  r  r  rg   rM   r5  r   r   r_   r  r9   r4  r   r  r  r   r  %encode_ifla_info_nested_data_handlers/ifla_info_nested_data_attributes_to_string_dictr   r7  r   rx   r  re  r   r  )r  r8  r9  r:  r  
slave_kindr<  r=  rG  rH  r@  rA  r   r  s                 r;   r  AttributeIFLA_LINKINFO.encode  s   ''(djj</0jjnnT%8%89jjnnT%>%>?
d +
 
2 HHNN:TAB*0AJNOO 04zz/?/?/A+]$';  !=1$%!!4!4d6O6O PP$++EC4G,GH ''(=(=g(FG$"5"55#'#D#D(!$">>BB4CVCVXZ[__`deHHLLTM`M`bdeiijno$  $";";;#'#D#D(!*">>BB4C\C\^`aeefpqHHLLTMfMfhjkoopz{$  /1or1  A&rww/C'DEO6E23 2Fb1I3QUQfQfgvQwKw'x $
 $8#;  34NN+,a 0Bd ggk* +&%+!";))hhv#
r=   Nc                 v     [         U   $ ! [         a#    U R                  R                  SU-  5        Us $ f = f)Nz%s: unsupported boolean value)value_to_bool_dictKeyErrorr_   r  )r  rg   defaults      r;   get_bool_value%AttributeIFLA_LINKINFO.get_bool_value}  s<    	%e,, 	HHNN:UBCN	s    *88c           
           X   $ ! [          a;    U R                  R                  SU< SU< SUR                  5       < S35        Us $ f = f)Nzunsupported z value  ())r  r_   r  keys)r  tblattrrg   r  s        r;   	get_index AttributeIFLA_LINKINFO.get_index  s@    	: 	HHNNT5#((*UVN	s    AA
Ac                 v   USU n0 nU(       d$  U R                   R                  U< SU< 35        U$ U R                  R                  U0 5      R                  U5      n	U R                  R                  U0 5      R                  U5      n
U	(       a  U
(       d-  U R                   R                  [
        U< SU< SU< 35        U$ U(       a  [        SUS S 5      u  p[        U5      nU	R                  U5      n U(       a  U" X}5      X'   OBU R                   R                  [
        SU< SU< SU
R                  US5      < S	U< S
3	5         X}S  nU(       a  M  U$ ! [         aR  nU R                   R                  U< SU< SU
R                  US5      < SU< S	[        U5      < S
3
5         S nANfS nAff = f)Nr   z  is not known...we cannot parse z: decode: unsupported ry  r  zAdd support for decoding z, attribute rK   r  r  : z: attribute )
r_   warning%decode_ifla_info_nested_data_handlersrM   r  r7  r   r   r9   r  )r  r  ifla_info_nested_kind_strr<  sub_attr_type_strr   rM  rN  ifla_info_nested_dataifla_info_nested_data_handlersr  info_nested_data_lengthinfo_nested_data_typeinfo_nested_data_endhandleres                   r;   decode_ifla_info_nested_data3AttributeIFLA_LINKINFO.decode_ifla_info_nested_data  s   Q|, "HHG`bstuX %$U .2-W-W-[-[\ikm-n-r-rsw-x*040d0d0h0hivxz0{00  AE  1F-19Z&(*CTKL %$A $GMeUbcedeUfGgD,+89P+Q(<@@AVWG"KRS`Kw1H HHLL 2 %>$($E$I$IJ_aj$k$9!"	, %22G$HM= $m@ %$ % 
(( !: $ A E EF[]f g 5 #A	 	
s    9E AE 
F8&AF33F8c                 D   U R                  U5        0 U l        U R                  SS nU(       Ga  [        SUSS 5      u  p4[	        U5      nU[
        -  (       a	  U[
        -  nU(       d  U R                  R                  S5        gU[        R                  [        R                  4;   a?  [        [        SUS-
  -  USU 5      S   5      R                  S5      U R                  U'   GO)U[        R                  :X  af  U R                  U R                  R                  [        R                  5      S[        R                  S	X%5      U R                  [        R                  '   OU[        R                   :X  af  U R                  U R                  R                  [        R                  5      S
[        R                   SX%5      U R                  [        R                   '   O5U R                  R                  ["        SUR%                  U5      XCU4-  5        X%S nU(       a  GM  gg)r  r   Nr  rD  r  r   r  r   r   r   r   zZAdd support for decoding IFLA_LINKINFO sub-attribute type %s (%d), length %d, padded to %d)r  rg   r   r   r   r  r_   r  r5  r   r   rn   r  r   r  rM   r   r7  get_ifla_info_stringr  r  r   rA  r<  rM  s         r;   r  AttributeIFLA_LINKINFO.decode  s    	%
yy} /5eT"1X/F,_(9L|+-">?!4!4d6O6O PP,@Q`cdQdHegklmn}g~A  AB  BC  -D  -K  -K  LS  -T

=)$"5"55262S2SJJNN4#6#679I'')93

4../ $";";;8<8Y8YJJNN4#<#<=?U--/E9

4445 &p!66}E}gstu &DG dr=   c           
      *   U R                  XU5      nSnSnSn[        SU R                  S-  5       H  nUS-  nUS-   n	X%:X  a  SnU(       a  Sn[        SU R                  XS-    5      u  p[        U
5      nX,S-  -   nX:X  a  SnOS	U-  nU[        -  (       a	  U[        -  nS
[        U
S5      U
U[        US5      U[        R                  R                  U5      U4-  nOSnUR                  [        X#U R                  X U5      5        US-  nM     U$ )Nr   r   Tr   r   Fr  r  r  z8Nested Attribute - Length %s (%d)%s Type %s (%d) %s (%s))r   ry   r  r   r   r   r  ri   r5  r  rM   r   r   r  r  r   r   r   r_  r`  r  r  r  rA  r<  rM  r  s                 r;   r  !AttributeIFLA_LINKINFO.dump_lines  s?   **;UKq$--*+AEE!)C0 $ %39%5WXQXAY3Z0,_=%0!O%D"2 $I 1L @I </!\1MR$_a8/"$]A61155mDmUU 1+diiPUFZ\abc1KA ,D r=   c                    U(       a"  [        U5      (       a  U" U R                  5      $ U R                  nU R                  R                  [        R                  5      nU R                  R                  [        R
                  5      n[        R                  U R                  R                  [        R                  0 5      R                  U5      [        R                  U R                  R                  [        R                  0 5      R                  U5      0nU(       d  U(       a  0 nU R                  R                  5        H  u  pgSU[        R                  R                  US5      4-  nUn	U[        R                  [        R                  4;   aG  UR                  U0 5      n
0 n	UR                  5        H  u  pSXR                  US5      4-  nXU'   M!     XU'   M     U$ Nrc  rK   )r
  rg   rM   r5  r   r   r   r  r   r4  r  )r  r  rf  ifla_info_kindifla_info_slave_kind	kind_dictrg  rh  ri  sub_value_prettykind_to_string_dictsub_sub_keysub_sub_valuesub_sub_key_prettys                 r;   r  'AttributeIFLA_LINKINFO.get_pretty_value"  s   8C==tzz?""&**"&**..1D1D"E"&**..1J1J"K !U!U!Y!YZ^ZmZmoq!r!v!v  xF  "G%%t'['['_'_`d`y`y{}'~  (C  (C  DX  (Y
	 1L(,

(8(8(:$!+w8P8P8T8TU\^g8h.i!i#, t22D4M4MNN*3--*D'')$8A8I4-7;H_H_`kmvHw:x-x*?L);< 9J 0@^, ); r=   r  r^   )r  r  r  r  r  r   r   rK  r  r  rR  rS  rZ  r[  r\  r]  rh  ri  rj  rm  rn  ro  rp  rJ  r  rM  rP  rk  rH  r  rE  rF  rG  rI  rQ  r^  r_  r`  ra  rc  r"  rd  rb  re  rf  rg  rL  r@  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r(  r   r<  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r   r   r   r   r   r-  r   r   r2  r   rr  r   r   r{  r|  r}  ru  rv  r  r  r  r  rt  rw  rx  ry  rz  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r   r!  r"  r#  r*  r+  r0  r2  r5  r3  r4  r:  r;  r7  r  r&  r'  r(  r)  r6  r<  r  r9  r  r	  r  r  r  r  r  r
  r  rZ  rq  r^  rK  rg  rl  ru  rS  rO  rV  r}  rb  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rl   r=   r;   r  r    s%   	 	/== b@
 -6MMyOrOr- 7NNPYPsPs- 7WWYbY|Y|	-
 7KKYMpMp- 7MMyOrOr- 7UUW`WzWz- 7LLiNqNq- 7OOQZQtQt- 7PPR[RuRu- 7PPR[RuRu- 7QQS\SvSv- 7RRT]TwTw- 7QQS\SvSv- 7PPR[RuRu-$ 7GGImIm%-& 7MMyOsOs'-( 7HH)JnJn)-* 7PPR[RvRv+-0 7JJILqLq1-2 7LLiNsNs3-4 7II9KpKp5-6 7FF	HmHm7-8 7HH)JoJo9-: 7MMyOtOt;-< 7TTV_V{V{=-> 7MMyOtOt?-@ 7TTV_V{V{A-B 7VVXaX}X}C-H 7UUW`W}W}I-J 7RRT]TzTzK-L 7VVXaX~X~M-N 7PPR[RxRxO-P 7YY[d  \B  \BQ-R 7XXZc  [A  [AS-X 7LLiNvNvY-b@
^ 6EEyGjGj6LLiNqNq6MMyOrOr6OOQZQtQt6QQS\SvSv6OOQZQtQt6QQS\SvSv 7RRT]TxTx 7GGInIn6HH)JoJo6JJILqLq6JJILqLq6HH)JoJo 7PPR[RxRx 7HH)JqJq1_b@
R 6CCYEiEi 7II9KsKsSb@
` 6HH)JoJoab@
h  !6EEyGjGj! 7EEyGjGj! 7JJILoLo	!
 7GGIlIl! 7EEyGjGj! 7HH)JmJm! 7HH)JmJm! 7JJILoLo! 7SSU^UxUx! 7SSU^UxUx! 7LLiNqNq! 7LLiNqNq! 7RRT]TwTw!" 7FF	HH#!( 7DDiFkFk)!* 7FF	HmHm+!, 7HH)JoJo-!. 7GGInIn6LLiNsNs 7GGIpIp6GGIpIp 7HH)JqJq6HH)JqJqA!ib@
l 6EEyGlGlmb@
r 6FF	HmHm6EEyGlGlsb@
L 6CCYEhEh6CCYEhEh6HH)JmJm 7FF	HlHl6FF	HlHl6JJILpLp6KKYMqMq6KKYMqMq6KKYMqMq 7DDiFkFk6DDiFkFk6DDiFkFk 7EEyGnGn6FF	HoHo+Mb@
z 6CCYEhEh6CCYEhEh6HH)JmJm 7FF	HlHl6FF	HlHl6JJILpLp6KKYMqMq6KKYMqMq6KKYMqMq 7DDiFkFk6DDiFkFk6DDiFkFk 7EEyGnGn6FF	HoHo+{b@
h 6CCYEhEh6CCYEhEh6HH)JmJm 7FF	HlHl6FF	HlHl6JJILpLp6KKYMqMq6KKYMqMq6KKYMqMq 7DDiFkFk6DDiFkFk6DDiFkFk 7EEyGnGn6FF	HoHo+ib@
V 6CCYEhEh6CCYEhEh6HH)JmJm 7FF	HlHl6FF	HlHl6JJILpLp6KKYMqMq6KKYMqMq6KKYMqMq 7DDiFkFk6DDiFkFk6DDiFkFk 7EEyGnGn6FF	HoHo+Wb@
D 6CCYEhEh6CCYEhEh6HH)JmJm 7FF	HlHl6FF	HlHl6JJILpLp6KKYMqMq6KKYMqMq6KKYMqMq 7DDiFkFk6DDiFkFk6DDiFkFk 7EEyGnGn6FF	HoHo+Eb@
r 6CCYEhEh6CCYEhEh6HH)JmJm 7FF	HlHl6FF	HlHl6JJILpLp6KKYMqMq6KKYMqMq6KKYMqMq 7DDiFkFk6DDiFkFk6DDiFkFk 7EEyGnGn6FF	HoHo+sb@
f 6EEyGjGj6EEyGjGj6JJILoLo 7LLiNrNr6MMyOsOs6MMyOsOs6MMyOsOs 7FF	HmHm 7GGIpIp6HH)JqJq#gb@
L	 6EEyGjGj6EEyGjGj6JJILoLo 7LLiNrNr6MMyOsOs6MMyOsOs6MMyOsOs 7FF	HmHm 7GGIpIp6HH)JqJq#M	b@
r	 6EEyGjGj6EEyGjGj6JJILoLo 7LLiNrNr6MMyOsOs6MMyOsOs6MMyOsOs 7FF	HmHm 7GGIpIp6HH)JqJq#s	b@
\
 6DDiFkFk6DDiFkFk6DDiFkFk 7EEyGnGn6FF	HoHo	]
b@
p
 6DDiFkFk6DDiFkFk6DDiFkFk 7EEyGnGn6FF	HoHo	q
b@
F 	/CC#6HH)JmJm# 7GGIlIl# 7HH)JmJm	#
 7JJILoLo# 7MMyOrOr# 7KKYMpMp# 7PPR[RuRu# 7KKYMpMp# 7PPR[RuRu# 7PPR[RuRu# 7VVXaX{X{# 7QQS\SvSv# 7SSU^UxUx# 7NNPYPsPs#  7NNPYPsPs!#" 7QQS\SvSv##$ 7NNPYPsPs%#& 7LLiNqNq6LLiNqNq6QQS\SvSv 7KKYMqMq6RRT]TxTx6RRT]TxTx6EEyGkGk6EEyGkGk6QQS\SwSw6SSU^UyUy 7GGInIn6NNPYPuPuE#L 7LLiNqNq6QQS\SvSv6__aj  bE  bE6SSU^UxUx 7OOQZQuQu6WWYbY}Y} 7RRT]TyTy6YY[d  \A  \AK4F
IY-)x 	/== 7CCYEiEi 7II9KsKs 7HH)JoJo!6EEyGjGj! 7EEyGjGj! 7JJILoLo	!
 7GGIlIl! 7EEyGjGj! 7HH)JmJm! 7HH)JmJm! 7JJILoLo! 7SSU^UxUx! 7SSU^UxUx! 7LLiNqNq! 7LLiNqNq! 7RRT]TwTw!" 7DDiFkFk#!$ 7FF	HmHm%!& 7HH)JoJo'!( 7GGInIn)!* 7LLiNsNs 7GGIhIh6GGIhIh 7HH)JiJi6HH)JiJi 7FF	HmHmA!H 7OOQZQtQt6LLiNqNq6OOQZQtQt6MMyOrOr 7EEyGkGk 7QQS\  TD  TD 7QQS\  TD  TD 7RRT]TxTx 7GGInIn6HH)JoJo6JJILqLq6JJILqLq6HH)JoJo 7PPR[RxRx7> 7EEyGlGl-6MMyOrOr- 7NNPYPsPs- 7WWYbY|Y|	-
 7KKYMpMp- 7MMyOrOr- 7UUW`WzWz- 7LLiNqNq- 7OOQZQtQt- 7PPR[RuRu- 7PPR[RuRu- 7QQS\SvSv- 7RRT]TwTw- 7QQS\SvSv- 7PPR[RuRu-$ 7GGImIm%-& 7MMyOsOs'-( 7HH)JnJn)-* 7PPR[RvRv+-0 7LLiNsNs1-2 7II9KpKp3-4 7FF	HmHm5-6 7JJILqLq7-8 7HH)JoJo9-: 7MMyOtOt;-< 7TTV_V{V{=-> 7MMyOtOt?-@ 7TTV_V{V{A-B 7VVXaX}X}C-H 7VVXaX~X~I-J 7UUW`W}W}K-L 7RRT]TzTzM-N 7PPR[RxRxO-P 7YY[d  \B  \BQ-R 7XXZc  [A  [AS-X 7LLiNvNvY-p 7CCYEhEh6CCYEhEh6HH)JmJm 7FF	HlHl6FF	HlHl6JJILpLp6KKYMqMq6KKYMqMq6KKYMqMq 7DDiFkFk6DDiFkFk6DDiFkFk 7EEyGfGf6FF	HgHg+2 7CCYEhEh6CCYEhEh6HH)JmJm 7FF	HlHl6FF	HlHl6JJILpLp6KKYMqMq6KKYMqMq6KKYMqMq 7DDiFkFk6DDiFkFk6DDiFkFk 7EEyGfGf6FF	HgHg+2 7CCYEhEh6CCYEhEh6HH)JmJm 7FF	HlHl6FF	HlHl6JJILpLp6KKYMqMq6KKYMqMq6KKYMqMq 7DDiFkFk6DDiFkFk6DDiFkFk 7EEyGfGf6FF	HgHg+2 7CCYEhEh6CCYEhEh6HH)JmJm 7FF	HlHl6FF	HlHl6JJILpLp6KKYMqMq6KKYMqMq6KKYMqMq 7DDiFkFk6DDiFkFk6DDiFkFk 7EEyGfGf6FF	HgHg+2 7CCYEhEh6CCYEhEh6HH)JmJm 7FF	HlHl6FF	HlHl6JJILpLp6KKYMqMq6KKYMqMq6KKYMqMq 7DDiFkFk6DDiFkFk6DDiFkFk 7EEyGfGf6FF	HgHg+2 7CCYEhEh6CCYEhEh6HH)JmJm 7FF	HlHl6FF	HlHl6JJILpLp6KKYMqMq6KKYMqMq6KKYMqMq 7DDiFkFk6DDiFkFk6DDiFkFk 7EEyGfGf6FF	HgHg+qO@
` 	/CC #6HH)JmJm# 7GGIlIl# 7HH)JmJm	#
 7JJILoLo# 7MMyOrOr# 7KKYMpMp# 7PPR[RuRu# 7KKYMpMp# 7PPR[RuRu# 7PPR[RuRu# 7VVXaX{X{# 7QQS\SvSv# 7SSU^UxUx# 7NNPYPsPs#  7QQS\SvSv!#" 7NNPYPsPs##$ 7NNPYPsPs%#& 7LLiNqNq6LLiNqNq6QQS\SvSv 7KKYMqMq6RRT]TxTx6RRT]TxTx6EEyGkGk6EEyGkGk6QQS\SwSw6SSU^UyUy 7GGInIn6NNPYPuPuE#%F
cw-)t	 	/== @
:NN@
:NN@
 ;PP@
 <NN	@

 =TT@
 9LL@
 9LL@
 <OO@
 <OO@
 <OO@
 ?RR@
 ?RR@
 9LL@
 :MM@
 :OO@
  9NN!@
" <QQ#@
$ :NN%@
( 	/CC<RR:TTF
+7368 8iV1%f7'r)Vr=   r  c                   :    \ rS rSrSrS rS rS rS rS
S jr	S	r
g)AttributeIFLA_PROTINFOiC  z"
IFLA_PROTINFO nested attributes.
c                 <    [         R                  XX$5        X0l        g r^   r.  r  s        r;   r  AttributeIFLA_PROTINFO.__init__G  r0  r=   c                 .   U R                   /nSU R                  [        -  /nSnU R                  [        4;  a  [        SU R                  -  5      eU R                  R                  5        GH  u  pESS/nSU/nSnU R                  [        :X  Ga]  U[        R                  [        R                  [        R                  [        R                  [        R                  [        R                  [        R                  [        R                   [        R"                  [        R$                  [        R&                  [        R(                  [        R*                  [        R,                  [        R.                  [        R0                  [        R2                  4;   a$  UR5                  S5        UR5                  U5        GO4U[        R6                  [        R8                  [        R:                  [        R<                  [        R>                  4;   a#  UR5                  S5        UR5                  U5        OU[        R@                  [        RB                  4;   a#  UR5                  S5        UR5                  U5        OyU[        RD                  [        RF                  [        RH                  4;   a#  UR5                  S5        UR5                  U5        O#U RJ                  RK                  [L        S	U-  5        [O        S
RQ                  U5      5      n	XU'   US   < SU RS                  U	5      -  < 3US'   USS  nURU                  U5        URU                  U5        GM     S
RQ                  U5      n[O        U5      n
XU'   [W        U/UQ76 nU RY                  X5      nU$ )Nr   z#Unsupported IFLA_PROTINFO family %dr2  rC  Br3  r]  ra  z<Add support for encoding IFLA_PROTINFO sub-attribute type %dr   rk   r  r   )-r  r  r  rN   r   r9   rg   r4  r5  r  r  r  r  r  r  r   r!  r"  r#  r*  r+  r/  r0  r:  r;  r7  r   r  r&  r'  r(  r)  r  r9  r,  r-  r.  r_   r7  r   rx   r  re  r   r  )r  r8  r9  r:  r<  r=  rG  rH  r@  rA  r   r  s               r;   r  AttributeIFLA_PROTINFO.encodeK  s   ''(djj</0;;yl*ADKKOPP 04zz/?/?/A+]$';  !=1$%!{{i' T%;%;%)%:%:%)%;%;%)%=%=%)%@%@%)%>%>%)%C%C%)%>%>%)%C%C%)%C%C%)%I%I%)%D%D%)%;%;%)%F%F%)%?%?%)%?%?%)%D%D!%F F" )//4$++N; #t'@'@'+'G'G'+'G'G'+':':'+':':	'< <
 )//4$++N; #t'<'<d>Z>Z&[[(//4$++N; #t'I'I'+'K'K'+'B'B'D D )//4$++N; HHLL!35s  wD  6D  E&rww/C'DEO6E23 2Fb1I3QUQfQfgvQwKw'x $
 $8#;  34NN+,A 0BD ggk* +&%+!";))hhv#
r=   c                    U R                  U5        0 U l        U R                  SS nU(       Ga  [        SUSS 5      u  p4[	        U5      nU(       d  U R
                  R                  S5        gU R                  [        :X  Gab  U[        R                  [        R                  [        R                  [        R                  [        R                  [        R                  [        R                   [        R"                  [        R$                  [        R&                  [        R(                  [        R*                  [        R,                  [        R.                  [        R0                  [        R2                  [        R4                  4;   a   U R7                  U5      U R                  U'   GO=U[        R8                  [        R:                  [        R<                  [        R>                  [        R@                  4;   a   [        SUSS 5      S   U R                  U'   OU[        RB                  [        RD                  4;   a   [        SUSS	 5      S   U R                  U'   OU[        RF                  [        RH                  [        RJ                  4;   a   [        S
USS 5      S   U R                  U'   O5U R
                  R                  [L        SURO                  U5      XCU4-  5        X%S nU(       a  GM  gg)z
value is a dictionary such as:
{
    Link.IFLA_BRPORT_STATE : 3,
    Link.IFLA_BRPORT_PRIORITY : 8
    Link.IFLA_BRPORT_COST : 2
    ...
}
r   Nr  rD  r  r   r   r  r,   r!  rw   zZAdd support for decoding IFLA_PROTINFO sub-attribute type %s (%d), length %d, padded to %d)(r  rg   r   r   r   r_   r  rN   r   r5  r  r  r  r  r  r  r   r!  r"  r#  r*  r+  r/  r0  r:  r;  r7  r  r  r&  r'  r(  r)  r  r9  r,  r-  r.  r7  get_ifla_brport_stringr  s         r;   r  AttributeIFLA_PROTINFO.decode  sf    	%
yy}/5eT"1X/F,_(9L">?{{i' !T%;%;%)%:%:%)%;%;%)%=%=%)%@%@%)%>%>%)%C%C%)%>%>%)%C%C%)%C%C%)%I%I%)%D%D%)%;%;%)%F%F%)%?%?%)%?%?%)%D%D!%F F" 150N0Nt0TDJJ}- #t'@'@'+'G'G'+'G'G'+':':'+':':	'< <
 17tT!AY0G0JDJJ}- #t'<'<d>Z>Z&[[06tT!AY0G0JDJJ}- #t'I'I'+'K'K'+'B'B'D D 17tT!BZ0H0KDJJ}- HHLL!3  6R!+!B!B=!QS`s  !A6A B &Di dr=   c           
         U R                  XU5      nSnSnSn[        SU R                  S-  5       H  nUS-  nUS-   n	X%:X  a  SnU(       a{  Sn[        SU R                  XS-    5      u  p[        U
5      nX,S-  -   nX:X  a  SnOS	U-  nS
[        U
S5      U
U[        US5      U[        R                  R                  U5      4-  nOSnUR                  [        X#U R                  X U5      5        US-  nM     U$ )Nr   r   Tr   r   Fr  r  r  r]  )r   ry   r  r   r   r   ri   r5  r  rM   r   r   r  s                 r;   r  !AttributeIFLA_PROTINFO.dump_lines  s)   **;UKq$--*+AEE!)C0 $ %39%5WXQXAY3Z0,_=%0!O%D"2 $I 1L @IM$_a8/"$]A63377FHH 1+diiPUFZ\abc1K; ,> r=   Nc                     U(       a"  [        U5      (       a  U" U R                  5      $ 0 nU R                  R                  5        H0  u  p4SU[        R                  R                  US5      4-  nUnXbU'   M2     U$ r  )r
  rg   r4  r5  r  rM   )r  r  rf  rg  rh  ri  r  s          r;   r  'AttributeIFLA_PROTINFO.get_pretty_value  st    8C==tzz?"$(JJ$4$4$6 W'7D4N4N4R4RSZ\e4f*ggN(+;( %7
 r=   rn  r^   ro  rl   r=   r;   r  r  C  s%    YvC'J&Pr=   r  c                   4   \ rS rSrSrSr\" \5      r0 \S_\	S_\
S_\S_\S_\S	_\S
_\S_\S_\S_\S_\S_\S_\S_\S_\S_\S_\S\S\S\S\S\S\S\ S\!S0	Er"\#S\$S0r%S1S! jr&S" r'S# r(S2S$ jr)S% r*S& r+S' r,S( r-S) r.S* r/S2S+ jr0S, r1S- r2S. r3S2S/ jr4S0r5g )3NetlinkPacketi#  a  
Netlink Header

0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                          Length                             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|            Type              |           Flags              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      Sequence Number                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      Process ID (PID)                       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
IHHII
NLMSG_NOOPNLMSG_ERROR
NLMSG_DONENLMSG_OVERRUNRTM_NEWLINKRTM_DELLINKRTM_GETLINKRTM_SETLINKRTM_NEWADDRRTM_DELADDRRTM_GETADDRRTM_NEWNEIGHRTM_DELNEIGHRTM_GETNEIGHRTM_NEWROUTERTM_DELROUTERTM_GETROUTERTM_NEWQDISCRTM_DELQDISCRTM_GETQDISCRTM_NEWNETCONFRTM_GETNETCONFRTM_DELNETCONF
RTM_NEWMDB
RTM_DELMDB
RTM_GETMDBinetinet6Nc                     Xl         0 U l        S/U l        SU l        X l        S U l        X@l        S U l        XPl        X`l	        SU l
        U(       a  X0l        g [        U l        g )Nr   r   r   )msgtype
attributesr  r   r  message	use_colorrN   rxtx
priv_flagsr_   )r  r
  r  owner_loggerr  r  r  s          r;   r  NetlinkPacket.__init__[  sX    "4 
$#HDHr=   c                 "    U R                  5       $ r^   )get_type_stringr  s    r;   r  NetlinkPacket.__str__m  s    ##%%r=   c                     X!;   a  X   $ g)zo
Used to do lookups in all of the various FOO_to_string dictionaries
but returns 'UNKNOWN' if the key is bogus
rK   rl   )r  	to_stringindexs      r;   
get_stringNetlinkPacket.get_stringp  s    
 ##r=   c                 `    U(       d  U R                   nU R                  U R                  U5      $ r^   )r
  r  type_to_string)r  r
  s     r;   r  NetlinkPacket.get_type_stringy  s%    llGt22G<<r=   c                     / nU R                   R                  5        H,  u  p#U R                  U-  (       d  M  UR                  U5        M.     SR	                  U5      $ )Nr  )flag_to_stringr4  flagsr   rx   )r  fooflagflag_strings       r;   get_flags_stringNetlinkPacket.get_flags_string~  sN    #'#6#6#<#<#>TzzD  

;' $? yy~r=   c                    Xl         X l        X0l        X@l        USU R                   U l        XPR                  U U l        U R                  5         U R                  5         U R                  [        :w  a  U R                  5         g g rN  )r   r   seqpid
header_LENheader_datamsg_datadecode_netlink_headerdecode_service_headerr
  r  decode_attributes)r  r   r   r'  r(  r   s         r;   decode_packetNetlinkPacket.decode_packet  sp    ! 
$//27""$""$ <<;&""$ 'r=   c                    / nU[         -  (       a  UR                  S5        U[        -  (       a  UR                  S5        U[        -  (       a  UR                  S5        U[        -  (       a  UR                  S5        U[
        [        [        [        [        [        [        4;   a~  U[        -  (       a  UR                  S5        O>U[        -  (       a  UR                  S5        U[        -  (       a  UR                  S5        U[        -  (       a  UR                  S5        OU[         ["        [$        [&        [(        [*        4;   a|  U[,        -  (       a  UR                  S	5        U[.        -  (       a  UR                  S
5        U[0        -  (       a  UR                  S5        U[2        -  (       a  UR                  S5        SR5                  U5      $ )NNLM_F_REQUESTNLM_F_MULTI	NLM_F_ACK
NLM_F_ECHO
NLM_F_DUMPNLM_F_MATCH
NLM_F_ROOTNLM_F_ATOMICNLM_F_REPLACE
NLM_F_EXCLNLM_F_CREATENLM_F_APPENDr  )r2  r   r3  r4  r5  r  r  r  r  r   r  r  r6  r7  r8  r9  r  r  r  r  r  r  r:  r;  r<  r=  rx   )r  msg_typer   r!  s       r;   get_netlink_header_flags_string-NetlinkPacket.get_netlink_header_flags_string  s:   = JJ';JJ}%9JJ{#:JJ|$ [,l\jlvwwz!

<(;&JJ}-:%JJ|,|#

>* +{L,P\^hii}$

?+z!

<(|#

>*|#

>*yy~r=   c           
         U R                   (       d  g U R                  nSnU R                  (       a  [        OS nU(       a  SU-  OSnU(       a  SOSnU R                  R                  SU< SU< 35        [        SUS-  5       GHY  nUS-  nUS-   nU R                  S	:X  a#  [        S
XU 5      S   n	S[        U	S5      U	4-  n
OU R                  S:X  aL  [        SXU 5      u  pS[        US5      XR                  U5      [        US5      U R                  X5      4-  n
OuU R                  S:X  a#  [        S
XU 5      S   n	S[        U	S5      U	4-  n
OBU R                  S:X  a#  [        S
XU 5      S   n	S[        U	S5      U	4-  n
OSU R                  -  n
U R                  R                  [        U R                  X1Xx U
5      5        U =R                  S	-  sl        GM\     g )Nr   [%dmr   [0m  zNetlink Headerr   r   r   r  Length %s (%d)r,   r   rC   Type %s (%d - %s), Flags %s (%s)r   Sequence Number %s (%d)Process ID %s (%d)Unexpected line number %d)r  r*  r  redr  r   ry   r   r   ri   r  r?  r   )r  r*  netlink_header_lengthr   color_start	color_endr  r  r  r   r   r  r  s                r;   r,  #NetlinkPacket.decode_netlink_header  s   zz&& !#~~4,1j5(r!&IB	+y QRq/145AEE!)C1$dKc$:;A>(Ka,@$+GG!!Q&!'k.D!E: *E3G3G3N *D,P,PQV,^`` !!Q&dKc$:;A>1[q5I44PP!!Q&dKc$:;A>,D!0Dd/KK3d6F6FF##$6t7G7G\aPfhm$no!3 6r=   c                    U R                   (       a4  U R                  R                  S5        U R                  (       a  [        OSnU R
                  U R                  S nU(       Ga  [        SUSS 5      u  p4U(       d  U R                  R                  S5        g[        U5      U:  a*  U R                  R                  S[        U5      U4-  5        gU R                  US5      n[        U5      nUR                  XSU 5        U R                   (       aT  UR                  U R                  U R                  W5      U l        U R                  (       a  U[        :X  a  [         nO[        nX&S nU(       a  GM  gg)z4
Decode the attributes and populate the dump_buffer
z  AttributesNr  r   zLength is zerozBuffer underrun %d < %dr   )r  r  r   r  greenr+  r  r   r_   r  r  add_attributer   r  r  r   blue)r  r   r   r   r  r  r  s          r;   r.  NetlinkPacket.decode_attributes  s#   
 ::##N3!^^EE}}TXXY'"(Ra"9V /04y6!8CIv;NNO%%i6D %V,HKK1X./zz#'??43C3CTEUEUW\#]  >>~ $ %	?D? dr=   c                 |   U[         -  (       a  SOSnU[        -  (       a  SOSnU[        -  nXR                  ;   ab  U R                  U   u  pV U R                  [
        [        [        4;  a0  U[        R                  :X  a  U R                  [        :X  a  Sn[        nO>SU-  n[        nU R                  R                  SXR                   R"                  4-  5        U" XU R                  U R                  5      nUR%                  U5        UR'                  U5        UR)                  U5        XpR*                  U'   U$ )NTFr  zUNKNOWN_ATTRIBUTE_%dzOAttribute %d is not defined in %s.attribute_to_class, assuming AttributeGeneric)r  r  r  attribute_to_classr
  r  r  r  r  r  rN   rI   r  r  r_   r  r  r  r  r  r  r  )r  r  rg   r  r  attr_string
attr_classr  s           r;   rQ  NetlinkPacket.add_attribute  s)   "\1u ),? ?U-	
 ///(,(?(?	(J%[
 ||NNN#SSXaejererXrw{  xC  xC  GN  xN'/
 19<K)JHHNNl%~~'>'>?@ A )$++txxHu}- &*	"r=   c                 V    XR                   ;  a  U$ U R                   U   R                  $ r^   )r  rg   )r  r  r  s      r;   get_attribute_value!NetlinkPacket.get_attribute_valueB  s&    OO+Ny)///r=   c                 \    XR                   ;   a  U R                   U   u  p#U$ [        U5      $ )zR
Example: If attr_type is Address.IFA_CACHEINFO return the string 'IFA_CACHEINFO'
)rU  r  )r  r  rV  rW  s       r;   get_attr_stringNetlinkPacket.get_attr_stringH  s3     ///(,(?(?	(J%[9~r=   c                    Xl         X l        [        5       nU R                  R	                  5        H  nX4R                  5       -  nM     U R                  [        U R                  5      -   [        U5      -   U l	        [        U R                  U R                  U R                  U R                  U R                   U R                  5      U l        U(       d  U R                  U l        OU R                  U-   U l        U R                  U R                  -   U l        U R"                  (       a  U R%                  5         U R'                  5         U R)                  5         U R+                  SX R                  U R                   U R                  U R                  U R-                  U R                  U R                  5      4-  5        g g )Nz3TXed %s, length %d, seq %d, pid %d, flags 0x%x (%s))r'  r(  bytesr  valuesr  r)  r  bodyr   r   header_PACKr
  r   r*  r+  r  r  r,  r-  r.  dumpr?  )r  r'  r(  attrsr  s        r;   build_messageNetlinkPacket.build_messageQ  sC   OO**,D[[]"E - ooDII6UC 0 0$++t||TZZY]YaYacgckckl IIDM II-DM''$--7::&&(&&(""$IIK[[$((DHHdjj;;DLL$**UWW X	 r=   c                 X   UR                  5        H  u  p4[        U[        5      (       aC  U R                  R	                  SU-  [        U5      -   S-   5        U R                  XBS-   5        M]  U R                  R	                  SU-  [        U5      -   S-   [        U5      -   5        M     g )Nry  rp   r   r  )r4  r  dictr_   r  r  pretty_display_dict)r  dicra   kvs        r;   rj  !NetlinkPacket.pretty_display_dictk  s    99;CA!T""s5y3q61C78((!G4s5y3q61D83q6AB r=   c           	         0 nUc1  SX R                   U R                  U R                  U R                  4-  nU R                  R                  5        H,  u  p4SX0R                  U5      4-  nUR                  5       X%'   M.     U R                  (       aJ  U R                  R                  U< SSR                  U R                  5      < S[        U5      < S35        g U R                  R                  U5        U R                   H  nU R                  R                  U5        M      U R                  R                  S5        U R                  R                  S5        U R                  US5        g )Nz.RXed %s, length %d, seq %d, pid %d, flags 0x%xrc  
z

Attributes Summary
r   zAttributes Summaryr   )r   r'  r(  r   r  r4  r]  r  r  r_   r  rx   r  r   rj  )r  descrV  r  attr_obj
key_stringrm   s          r;   rd  NetlinkPacket.dumpt  s   <Ct[[Z^ZbZbdhdldlnrnxnxFyyD%)__%:%:%<!Y#y2F2Fy2Q&RRJ&.&?&?&AK# &= >>HHNN $))D,<,<"=w{?SU V
 HHNN4 ((t$ )HHNN2HHNN/0$$[!4r=   )r  r  r  rN   r   r*  r   r   r_   r  r+  r
  r(  r  r  r'  r  r  )NTFFr^   )6r  r  r  r  r  rc  r   r)  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r  r   r   af_family_to_stringr  r  r  r  r$  r/  r?  r,  r.  rQ  rZ  r]  rf  rj  rd  r  rl   r=   r;   r  r  #  s     K;'J 	 		
 	 	 	 	 	 	 	 	 	 	 	  	!" 	#$ 	(((5N< 	fg
$&=
%+b'"R*#X$L0X4C5r=   r  c                       \ 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\4\S\4\S\4\S\4\	S\4\
S\4\S\4\S\4\S\4\S\40
rSrSrSrSrSrSrSrSr\S\S\S\S\S\S \S!\S"0rS'S$ jrS% rS&r g#)(Addressi  a  
Service Header
0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Family    |     Length    |     Flags     |    Scope      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                     Interface Index                         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
r   r   r   r   r   r   r   r   r,   r   
IFA_UNSPECIFA_ADDRESS	IFA_LOCAL	IFA_LABELIFA_BROADCASTIFA_ANYCASTIFA_CACHEINFOIFA_MULTICAST	IFA_FLAGSIFA_RT_PRIORITYr   r2   r3   r4   IFA_F_SECONDARYIFA_F_NODADIFA_F_OPTIMISTICIFA_F_DADFAILEDIFA_F_HOMEADDRESSIFA_F_DEPRECATEDIFA_F_TENTATIVEIFA_F_PERMANENTNc                 t    [         R                  XX#U5        SU l        [        U R                  5      U l        g )N4Bir  r  r  r   r  r  r
  r  r  r  s        r;   r  Address.__init__  s+    teYG	DII&r=   c                 d   U R                   U R                  :X  a  g [        U R                  U R                  S U R
                   5      u  U l        U l        U l        U l	        U l
        U R                  (       Ga  U R                  (       a  [        OS nU(       a  SU-  OSnU(       a  SOSnU R                  R                  SU< SU< 35        [!        SU R
                  S-  5       GHC  nU R"                  S:X  a  S	[%        U R                  S
5      ['        U R                  5      U R                  [%        U R                  S
5      U R                  [%        U R                  S
5      [%        U R                  S
5      U R                  4-  nOEU R"                  S:X  a&  S[%        U R                  S5      U R                  4-  nOSU R"                  -  nUS-  nUS-   nU R                  R                  [)        U R"                  XR                  Xg U5      5        U =R"                  S-  sl        GMF     g g )NrB  r   rC  rD  Service Headerr   r   r   z:Family %s (%s:%d), Length %s (%d), Flags %s, Scope %s (%d)r   r   Interface Index %s (%d)r,   rI  r   )r   r)  r   r  r+  r  rN   r  r   r  ifindexr  r  yellowr  r   ry   r   ri   rO   r   r  r   rL  rM  r  r   r  r  s           r;   r-  Address.decode_service_header  s    ;;$//) 499dmmITXX67	dndj$*	 :::"nnF$E05*u,2K%*	I##k9$UV1dhhk*##q(X(a8.:UW[WbWb(;T^^(Q7(Q7EEE
 %%*5T\\ST9UW[WcWc8ddE7$:J:JJEAai  ''(:4;K;KUTaTabgTlns(tu  A%   + r=   )r  r  rN   r   r  r  r  FNT)!r  r  r  r  r  rx  ry  rz  r{  r|  r}  r~  r  r  r  r  r  r  r  r  rU  r  r  r  r  r  r  r  r  r  r  r-  r  rl   r=   r;   rw  rw    s"   	 JKIIMKMMIO 	'78(:;&89o6*<=(:;*<=*<=&67,.DE OKOOO 	-M.-/.--	N'
&r=   rw  c                   h   \ 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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&0 \S%_\S&_\S'_\S(_\S)_\	S*_\
S+_\S,_\S-_\S._\S/_\S0_\S1_\S2_\S3_\S4_\S5_0 \S6_\S7_\S8_\S9_\S:_\S;_\S<_\S=_\S>_\S?_\S@_\ SA_\!SB_\"SC_\#SD_\$SE_\%SF_E\&SG0Er'0 \SH_\SI_\SJ_\SK_\SL_\	SM_\
SN_\SO_\SP_\SQ_\SR_\SS_\ST_\SU_\SV_\SW_\SX_0 \SY_\SZ_\S[_\S\_\S]_\S^_\S__\S`_\Sa_\Sb_\Sc_\ Sd_\!Se_\"Sf_\#Sg_\$Sh_\%Si_E\&Sj0Er(SoSl jr)Sm r*Snr+gk)pErrori  r   r   r   r   r   r   r   r   r,   r   r   r   rw   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r  r   r   r   r8   r2   r  r  NLE_SUCCESSNLE_FAILURENLE_INTRNLE_BAD_SOCK	NLE_AGAIN	NLE_NOMEM	NLE_EXIST	NLE_INVAL	NLE_RANGENLE_MSGSIZENLE_OPNOTSUPPNLE_AF_NOSUPPORTNLE_OBJ_NOTFOUND
NLE_NOATTRNLE_MISSING_ATTRNLE_AF_MISMATCHNLE_SEQ_MISMATCHNLE_MSG_OVERFLOWNLE_MSG_TRUNC
NLE_NOADDRNLE_SRCRT_NOSUPPORTNLE_MSG_TOOSHORTNLE_MSGTYPE_NOSUPPORTNLE_OBJ_MISMATCHNLE_NOCACHENLE_BUSYNLE_PROTO_MISMATCHNLE_NOACCESSNLE_PERMNLE_PKTLOC_FILENLE_PARSE_ERR	NLE_NODEVNLE_IMMUTABLENLE_DUMP_INTRNLE_ATTRSIZESuccesszUnspecific failurezInterrupted system callz
Bad socketz	Try againzOut of memoryzObject existszInvalid input data or parameterzInput data out of rangezMessage size not sufficientzOperation not supportedzAddress family not supportedzObject not foundzAttribute not availablezMissing attributezAddress family mismatchz Message sequence number mismatchz Kernel reported message overflowz!Kernel reported truncated messagez,Invalid address for specified address familyz"Source based routing not supportedzNetlink message is too shortz%Netlink message type is not supportedz Object type does not match cachezUnknown or invalid cache typezObject busyzProtocol mismatchz	No AccesszOperation not permittedz#Unable to open packet location filezUnable to parse objectzNo such devicezImmutable attributez(Dump inconsistency detected, interruptedzAttribute max length exceededNc                 t    [         R                  XX#U5        SU l        [        U R                  5      U l        g )Nz=iLHHLLr  r  s        r;   r  Error.__init__c  s+    teYG	DII&r=   c           
         U R                   U R                  :X  a  g [        U R                  U R                  S U R
                   5      u  U l        U l        U l        U l	        U l
        U l        U R                  (       Ga  U R                  (       a  [        OS nU(       a  SU-  OSnU(       a  SOSnU R                  R!                  SU< SU< 35        [#        SU R
                  S-  5       GH  nU R$                  S:X  ab  ['        U R                  5      nS	U R                  < S
U R(                  R+                  U5      < SU R,                  R+                  U5      < S3nGO<U R$                  S:X  a'  S[/        U R                  S5      U R                  4-  nGOU R$                  S:X  az  S[/        U R                  S5      U R                  U R1                  U R                  5      [/        U R                  S5      U R3                  U R                  U R                  5      4-  nO{U R$                  S:X  a&  S[/        U R                  S5      U R                  4-  nOEU R$                  S:X  a&  S[/        U R                  S5      U R                  4-  nOSU R$                  -  nUS-  nUS-   nU R                  R!                  [5        U R$                  XR                  Xx U5      5        U =R$                  S-  sl        GM     g g )NrB  r   rC  rD  r  r   r   r   zError Number z is r  r  r   rE  r,   r   rF  rG  r   rH  rI  r   )r   r)  r   r  r+  r  negative_errnobad_msg_lenbad_msg_typebad_msg_flagbad_msg_seqbad_msg_pidr  r  r  r  r   ry   r   abserror_to_stringrM   error_to_human_readable_stringri   r  r?  r   )	r  r   rL  rM  r  error_numberr   r  r  s	            r;   r-  Error.decode_service_headerh  s    ;;$//) 499dmmITXX67	@	d.0A		D,d.> :::"nnF$E05*u,2K%*	I##k9$UV1dhhk*##q(#&t':':#;L<@<O<OQUQeQeQiQijvQwy}  z]  z]  za  za  bn  zo  pE %%*,D<L<La0PRVRbRb/ccE%%*>$T%6%6:D<M<MtOcOcdhduduOv$T%6%6:D<`<`aearartx  uF  uF  =GHHE %%*5TEUEUWX9Y[_[k[k8llE%%*0K@P@PRS4TVZVfVf3ggE 8$:J:JJEAai  ''(:4;K;KUTaTabgTlns(tu  A%  7 + r=   )r  r  r  r  r  r  r  r  r  ),r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r-  r  rl   r=   r;   r  r    sP    !K K H L I I I I I K M   J  O   M J     K H  L H O M I M M L$$$ 	
$ 		$
 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	 2$ 	 2$ 	$ 	 2$  	 1!$" 	 2#$$ 	 2%$& 	'$( 	)$* 	 5+$, 	 2-$. 	 7/$0 	 21$2 	3$4 	
5$6 	 47$8 	9$: 	
;$< 	 1=$> 	?$@ 	A$B 	C$D 	E$F 	G$OL$&y$&3$& 	8$& 	|	$&
 	{$& 	$& 	$& 	@$& 	8$& 	<$& 	8$& 	=$& 	1$& 	8$& 	2$&  	8!$&" 	A#$&$ 	A%$&& 	B'$&( 	M)$&* 	C+$&, 	=-$&. 	F/$&0 	A1$&2 	>3$&4 	}5$&6 	27$&8 	{9$&: 	8;$&< 	D=$&> 	7?$&@ 	/A$&B 	4C$&D 	IE$&F 	>G$&"L'
+&r=   r  c                      \ 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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'S&r(S'r)S(r*S)r+S*r,S+r-S,r.S-r/S.r0S/r1S0r2S1r3S2r4S3r5S4r6S5r7S6r80 \S7\94_\S8\:4_\S9\:4_\S:\;4_\	S;\<4_\
S<\<4_\S=\=4_\S>\94_\S?\94_\S@\94_\SA\<4_\SB\94_\SC\>4_\SD\<4_\SE\94_\SF\94_\SG\?4_0 \SH\?4_\SI\@4_\SJ\94_\SK\=4_\SL\94_\SM\94_\SN\94_\SO\94_\SP\94_\SQ\A4_\ SR\<4_\!SS\94_\"ST\<4_\#SU\94_\$SV\94_\%SW\94_\&SX\94_E0 \'SY\94_\(SZ\94_\)S[\94_\*S\\94_\+S]\94_\,S^\?4_\-S_\<4_\.S`\<4_\/Sa\94_\0Sb\94_\1Sc\<4_\2Sd\<4_\3Se\<4_\4Sf\<4_\5Sg\<4_\6Sh\<4_\7Si\<4_E\8Sj\<40ErBSrCSrDSrESrFSrGS#rHSkrISlrJSmrKSnrLSorMSprNSqrOSrrPSsrQStrRSurSSvrTSwrUSxrV0 \CSy_\DSz_\ES{_\FS|_\GS}_\HS~_\IS_\JS_\KS_\LS_\MS_\NS_\OS_\PS_\QS_\RS_\SS_\TS\US\VS0ErWSrXSrYSrZSr[Sr\Sr]S	r^\XS\YS\ZS\[S\\S\]S\^S0r_Sr`SraSrbSrcSrdSreS	rfS
rgSrhSriSrjSrkSrlSrmS#rnSmroSrpSrqSrrSrsSrtSruSrvSrwSrxSnrySrz\zr{Sr|Sr}Sr~SrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSr0 \`S_\aS_\bS_\cS_\dS_\eS_\fS_\gS_\hS_\iS_\jS_\kS_\lS_\mS_\nS_\oS_\pS_0 \qS_\rS_\sS_\tS_\uS_\vS_\wS_\xS_\yS_\zS_\{S_\|S_\}S_\~S_\S_\S_\S_E0 \S_\S_\S_\S_\S_\S_\S_\S_\S_\S_\S_\S_\S_\S_\S_\S_\S_E\S\S\S\S\S\S\S\S\S\S0
ErSrSrSrSrSrSrS	rS
rSrSr\S\S\S\S\GS \GS\GS\GS\GS0	rSrSrSrSr\GS\GS\GS\GS0rSrSrSr\GS	\GS
0rSrSr\GS\GS0rSrSrSrSrSrSrSr\GS\GS\GS\GS0rSrSrSrSrSrS#r\GS\GS\GS\GS\GS\GS0rSrSrSrSr\GS\GS\GS\GS0rSrSrSrSr\GS\GS\GS\GS0rGS8GS  jrGS! rGS" rGS# rGS$ rGS% rGS& rGS' rGS( rGS) rGS* rGS+ rGS, rGS- rGS. rGS/ rGS0 rGS1 rGS2 rGS3 rGS4 rGS5 rGS6 rGS7rGg(9  r5  i  a  
Service Header

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Family    |   Reserved  |          Device Type              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                     Interface Index                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      Device Flags                             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      Change Mask                              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
r   r   r   r   r   r   r   r   r,   r   r   r   rw   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r  r   r   r   r8   r2   r  r  r=  r#   r$   r%   r>  r?  r@  rA  rB  rC  -   .   /   0   1   r  3   IFLA_UNSPECIFLA_ADDRESSIFLA_BROADCASTIFLA_IFNAMEIFLA_MTU	IFLA_LINK
IFLA_QDISC
IFLA_STATS	IFLA_COSTIFLA_PRIORITYIFLA_MASTERIFLA_WIRELESSIFLA_PROTINFOIFLA_TXQLENIFLA_MAPIFLA_WEIGHTIFLA_OPERSTATEIFLA_LINKMODEIFLA_LINKINFOIFLA_NET_NS_PIDIFLA_IFALIASIFLA_NUM_VFIFLA_VFINFO_LISTIFLA_STATS64IFLA_VF_PORTSIFLA_PORT_SELFIFLA_AF_SPEC
IFLA_GROUPIFLA_NET_NS_FDIFLA_EXT_MASKIFLA_PROMISCUITYIFLA_NUM_TX_QUEUESIFLA_NUM_RX_QUEUESIFLA_CARRIERIFLA_PHYS_PORT_IDIFLA_CARRIER_CHANGESIFLA_PHYS_SWITCH_IDIFLA_LINK_NETNSIDIFLA_PHYS_PORT_NAMEIFLA_PROTO_DOWNIFLA_GSO_MAX_SEGSIFLA_GSO_MAX_SIZEIFLA_PADIFLA_XDP
IFLA_EVENTIFLA_NEW_NETNSIDIFLA_IF_NETNSIDIFLA_CARRIER_UP_COUNTIFLA_CARRIER_DOWN_COUNTIFLA_NEW_IFINDEXIFLA_MIN_MTUIFLA_MAX_MTUr3   r4   r-   r.   r/   r   r5   i    r1   r0   i   r6   i   i   IFF_UPIFF_BROADCAST	IFF_DEBUGIFF_LOOPBACKIFF_POINTOPOINTIFF_NOTRAILERSIFF_RUNNING	IFF_NOARPIFF_PROMISCIFF_ALLMULTI
IFF_MASTER	IFF_SLAVEIFF_MULTICASTIFF_PORTSELIFF_AUTOMEDIAIFF_DYNAMICIFF_LOWER_UPIFF_DORMANTIFF_ECHOIFF_PROTO_DOWNIF_OPER_UNKNOWNIF_OPER_NOTPRESENTIF_OPER_DOWNIF_OPER_LOWERLAYERDOWNIF_OPER_TESTINGIF_OPER_DORMANT
IF_OPER_UPi  i  i  i  i  i  i  i  i  i  i  i  i  i   i  i  i  i  i  i  i  i  i	  i
  i  i  i  i  i  i  i  i  i  i   i!  i"  i#  i$  i4  i5  i6  r  i  ARPHRD_NETROMARPHRD_ETHERARPHRD_EETHERARPHRD_AX25ARPHRD_PRONETARPHRD_CHAOSARPHRD_IEEE802ARPHRD_ARCNETARPHRD_APPLETLKARPHRD_DLCI
ARPHRD_ATMARPHRD_METRICOMARPHRD_IEEE1394ARPHRD_EUI64ARPHRD_INFINIBANDARPHRD_SLIPARPHRD_CSLIPARPHRD_SLIP6ARPHRD_CSLIP6ARPHRD_RSRVDARPHRD_ADAPTARPHRD_ROSE
ARPHRD_X25ARPHRD_HWX25
ARPHRD_CAN
ARPHRD_PPPARPHRD_CISCOARPHRD_HDLCARPHRD_LAPBARPHRD_DDCMPARPHRD_RAWHDLCARPHRD_TUNNELARPHRD_TUNNEL6ARPHRD_FRADARPHRD_SKIPARPHRD_LOOPBACKARPHRD_LOCALTLKARPHRD_FDDI
ARPHRD_BIF
ARPHRD_SITARPHRD_IPDDPARPHRD_IPGREARPHRD_PIMREGARPHRD_HIPPI
ARPHRD_ASHARPHRD_ECONETARPHRD_IRDAARPHRD_FCPPARPHRD_FCALARPHRD_FCPLARPHRD_FCFABRICARPHRD_IEEE802_TRARPHRD_IEEE80211ARPHRD_IEEE80211_PRISMARPHRD_IEEE80211_RADIOTAPARPHRD_IEEE802154ARPHRD_PHONETARPHRD_PHONET_PIPEARPHRD_CAIFARPHRD_VOIDARPHRD_NONEIFLA_INET6_UNSPECIFLA_INET6_FLAGSIFLA_INET6_CONFIFLA_INET6_STATSIFLA_INET6_MCASTIFLA_INET6_CACHEINFOIFLA_INET6_ICMP6STATSIFLA_INET6_TOKENrK  eui64nonestable_secretrandomIFLA_INET_UNSPECIFLA_INET_CONFBRIDGE_FLAGS_MASTERBRIDGE_FLAGS_SELFr5  IFLA_BRIDGE_MODEr6  rF  BRIDGE_VLAN_INFO_MASTERBRIDGE_VLAN_INFO_PVIDBRIDGE_VLAN_INFO_UNTAGGEDBRIDGE_VLAN_INFO_RANGE_BEGINBRIDGE_VLAN_INFO_RANGE_ENDBRIDGE_VLAN_INFO_BRENTRYIFLA_BRIDGE_VLAN_TUNNEL_UNSPECrG  rH  rI  RTEXT_FILTER_VFRTEXT_FILTER_BRVLANRTEXT_FILTER_BRVLAN_COMPRESSEDRTEXT_FILTER_SKIP_STATSNc                 t    [         R                  XX#U5        SU l        [        U R                  5      U l        g )NBxHiIIr  r  s        r;   r  Link.__init__c  s+    teYG	TYY'r=   c                 :    U R                  U R                  U5      $ r^   )r  link_type_to_stringr  r  s     r;   get_link_type_stringLink.get_link_type_stringh      t77??r=   c                 :    U R                  U R                  U5      $ r^   )r  rd  r  s     r;   rL  %Link.get_ifla_inet6_af_spec_to_stringk  s    t@@%HHr=   c                 :    U R                  U R                  U5      $ r^   )r  re  r  s     r;   get_ifla_inet_af_spec_to_string$Link.get_ifla_inet_af_spec_to_stringn  s    t??GGr=   c                 :    U R                  U R                  U5      $ r^   )r  r^  r  s     r;   rJ  &Link.get_ifla_bridge_af_spec_to_stringq  s    tAA5IIr=   c                 :    U R                  U R                  U5      $ r^   )r  r  r  s     r;   r  Link.get_ifla_info_stringt  r  r=   c                 :    U R                  U R                  U5      $ r^   )r  r  r  s     r;   get_ifla_vlan_stringLink.get_ifla_vlan_stringw  r  r=   c                 :    U R                  U R                  U5      $ r^   )r  r  r  s     r;   get_ifla_vxlan_stringLink.get_ifla_vxlan_stringz      t88%@@r=   c                 :    U R                  U R                  U5      $ r^   )r  r  r  s     r;   get_ifla_vrf_stringLink.get_ifla_vrf_string}      t66>>r=   c                 :    U R                  U R                  U5      $ r^   )r  r  r  s     r;   get_ifla_bond_slave_stringLink.get_ifla_bond_slave_string  s    t==uEEr=   c                 :    U R                  U R                  U5      $ r^   )r  r  r  s     r;   get_ifla_macvlan_stringLink.get_ifla_macvlan_string      t::EBBr=   c                 :    U R                  U R                  U5      $ r^   )r  r  r  s     r;   get_macvlan_mode_stringLink.get_macvlan_mode_string  r  r=   c                 :    U R                  U R                  U5      $ r^   )r  r  r  s     r;   get_ifla_gre_stringLink.get_ifla_gre_string  r  r=   c                 :    U R                  U R                  U5      $ r^   )r  r  r  s     r;   get_ifla_vti_stringLink.get_ifla_vti_string  r  r=   c                 :    U R                  U R                  U5      $ r^   )r  r  r  s     r;   get_ifla_iptun_stringLink.get_ifla_iptun_string  r  r=   c                 :    U R                  U R                  U5      $ r^   )r  r  r  s     r;   get_ifla_bond_stringLink.get_ifla_bond_string  r  r=   c                 :    U R                  U R                  U5      $ r^   )r  r  r  s     r;   get_ifla_bond_ad_stringLink.get_ifla_bond_ad_string  r  r=   c                 :    U R                  U R                  U5      $ r^   )r  r  r  s     r;   r  Link.get_ifla_brport_string      t995AAr=   c                 :    U R                  U R                  U5      $ r^   )r  r  r  s     r;   get_ifla_br_stringLink.get_ifla_br_string  s    t55u==r=   c                 :    U R                  U R                  U5      $ r^   )r  bridge_vlan_to_stringr  s     r;   get_bridge_vlan_stringLink.get_bridge_vlan_string  r  r=   c                 :    U R                  U R                  U5      $ r^   )r  bridge_flags_to_stringr  s     r;   get_bridge_flags_stringLink.get_bridge_flags_string  r  r=   c           
         U R                   U R                  :X  a  g [        U R                  U R                  S U R
                   5      u  U l        U l        U l        U l	        U l
        U R                  (       Ga  U R                  (       a  [        OS nU(       a  SU-  OSnU(       a  SOSnU R                  R                  SU< SU< 35        [!        SU R
                  S-  5       GH  nU R"                  S:X  at  S	[%        U R                  S
5      ['        U R                  5      U R                  [%        U R                  S5      U R                  U R)                  U R                  5      4-  nOU R"                  S:X  a&  S[%        U R                  S5      U R                  4-  nOwU R"                  S:X  a.  S[%        U R                  S5      < SU R+                  5       < S3nO9U R"                  S:X  a  S[%        U R                  S5      -  nOSU R"                  -  nUS-  nUS-   nU R                  R                  [-        U R"                  XR                  Xg U5      5        U =R"                  S-  sl        GM     g g )NrB  r   rC  rD  r  r   r   r   z+Family %s (%s:%d), Device Type %s (%d - %s)r   r   r  r,   r   zDevice Flags r  r  zChange Mask %srI  r   )r   r)  r   r  r+  r  rN   device_typer  r   change_maskr  r  r  r  r   ry   r   ri   rO   r  r$  r   r  s           r;   r-  Link.decode_service_header  s    ;;$//) 499dmmITXX67		d&				 :::"nnF$E05*u,2K%*	I##k9$UV1dhhk*##q(I(a8.:UW[WbWb()9)91=t?O?OQUQjQjkok{k{Q|~~E %%*5T\\ST9UW[WcWc8ddE%%*6A$**a6PRVRgRgRijE%%*,{4;K;KQ/OOE7$:J:JJEAai  ''(:4;K;KUTaTabgTlns(tu  A%  # + r=   c                 J    U R                   [        R                  -  (       a  gg)NTF)r   r5  r  r  s    r;   is_up
Link.is_up  s    ::#r=   )r  r  r  r  rN   r   r  r  )r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r   r  r  r  r  r"  r  r,  rU  r  r  r  r	  r
  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   oper_to_stringr!  r"  r#  r$  r%  r&  r'  r(  r)  r*  r+  r,  r-  r.  r/  r0  r1  r2  r3  r4  r5  r6  r7  r8  r9  r:  r;  r<  r=  r>  r?  r@  rA  rB  rC  rD  rE  rF  rG  rH  rI  rJ  rK  rL  rM  rN  rO  rP  rQ  rR  rS  rT  rU  rV  rW  rX  rY  rZ  r[  r\  r]  r~  r^  r_  r`  ra  rb  rc  rd  re  rK  _Link__IFLA_INET6_MAXrd  IN6_ADDR_GEN_MODE_EUI64IN6_ADDR_GEN_MODE_NONE IN6_ADDR_GEN_MODE_STABLE_PRIVACYIN6_ADDR_GEN_MODE_RANDOMifla_inet6_addr_gen_mode_dictrj  rk  _Link__IFLA_INET_MAXre  rl  rm  r  BRIDGE_MODE_VEBBRIDGE_MODE_VEPABRIDGE_MODE_UNDEFr5  rn  r6  rF  r^  ro  rp  rq  rr  rs  rt  r  ru  rG  rH  rI  bridge_vlan_tunnel_to_stringrv  rw  rx  ry  rtext_to_stringr  r  rL  r  rJ  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r-  r  r  rl   r=   r;   r5  r5    sf   $ KLNKHIJJIMKMMKHKNMMOLKLMNLJNMLOHHJO    L L5/?@50CD5 	 02EF5 	/KL	5
 	
,BC5 	-CD5 	o>5 	.>?5 	-=>5 	1AB5 	/EF5 	1AB5 	1GH5 	/EF5 	
,<=5  	/?@!5" 	 02GH#5$ 	1FG%5& 	1GH'5( 	 13CD)5* 	@+5, 	/?@-5. 	 24DE/50 	0@A152 	1AB354 	 02BC556 	0EF758 	.DE95: 	 02BC;5< 	1GH=5> 	 24DE?5@ 	 46FGA5B 	 46FGC5D 	0@AE5F 	 35EFG5H 	 68HII5J 	 57GHK5L 	 35EFM5N 	 57GHO5P 	 13HIQ5R 	 35KLS5T 	 35KLU5V 	
,<=W5X 	
,<=Y5Z 	.DE[5\ 	 24JK]5^ 	 13IJ_5` 	#:<R"Sa5b 	 #<>T"Uc5d 	#57M"Ne5f 	>3I"Jg5h 	>3I"Ji5r FMILONKIKLJIMKMKLKHN(/ 	+ 	.	
 	+ 	* 	- 	+ 	- 	. 	, 	+ 	/ 	- 	/  	-!" 	.#$ 	-**)N0 OLOOJ 	!2!5!9!2!2N !"M !L !M !K !M !L !N !M !O "K "J "O "O "L " #K #L #L #M #L #L #K #J #L #J #J #L ,K #K #L #N #M #N #K #K #O #O #K #J #J #L #L #M #L #J #M #K #K #K #K #O # # # # # #M # #K &K &K>O>N> 	O> 	M	>
 	O> 	N> 	$4> 	O> 	$5> 	M> 	L> 	$5> 	$5> 	N> 	$7>  	M!>" 	N#>$ 	N%>& 	O'>( 	N)>* 	N+>, 	M->. 	L/>0 	N1>2 	L3>4 	L5>6 	N7>8 	M9>: 	M;>< 	N=>> 	$4?>@ 	OA>B 	$4C>D 	ME>F 	MG>H 	$5I>J 	$5K>L 	MM>N 	LO>P 	LQ>R 	NS>T 	NU>V 	OW>X 	NY>Z 	L[>\ 	O]>^ 	M_>` 	Ma>b 	Mc>d 	Me>f 	$5g>h 	$7$6$<!$?$7O$8MMM{>B #$"#"#O"#"#"#"#"#"#"# 	&9&8&7&8&8&<&=&8 &@
$   '($  	 (/ (	%! NO 	0.#  	31
 O #$  	 3 2 7$'E	%! $*#)#)#) #)#) 	 '@'>!'B$'E"'C 'A &'"!""#$%! 	'(H"$@#%B%'F	$ $ &,O%+%+"%+ 	):)>&)I)B	O(
@IHJ@@A?FCC??A@CB>BC#&J r=   r5  c                   ,    \ rS rSrSr S rS rS rSrg)AttributeMDBA_MDBi  z
/* Bridge multicast database attributes
 * [MDBA_MDB] = {
 *     [MDBA_MDB_ENTRY] = {
 *         [MDBA_MDB_ENTRY_INFO] {
 *                struct br_mdb_entry
 *                [MDBA_MDB_EATTR attributes]
 *         }
 *     }
 * }
c                 0    [         R                  XX$5        g r^   r  r  s        r;   r  AttributeMDBA_MDB.__init__  r  r=   c           	      *   U R                  U5        U R                  SS  nUR                  [        :X  Ga"  / U l        U(       Ga  [        SUS S 5      u  p4[        U5      nUSU n0 n/ U[        R                  '   U(       d  U R                  R                  S5        g U[        R                  :X  Gaz  U(       Gar  0 n[        SUS S 5      u  p[        U	5      nU
[        R                  :X  Ga1  [        SUSS 5      u  ppXX/n[        SUSS 5      S	   nU[        [        5      :X  a'  [        R                  " [        S
USS 5      S	   5      nO.[        SUSS 5      u  nn[        R                   " US-  U-  5      nUR#                  U5         [        SUSS 5      u  nnU[        R$                  :X  a4  UR#                  [        R$                  [        SUSS 5      S	   S-  05        UU[        R                  '   U[        R                     R#                  U5        XkS  nU(       a  GMr  U R                  R#                  U5        X%S  nU(       a  GM  g g 0 U l        U(       Gaw  [        SUS S 5      u  p4[        U5      nUSS  nU(       d  U R                  R                  S5        g U[        R                  :X  Ga  [        SUS S 5      u  pU
[        R                  :X  a  0 U R                  [        R                  '   [        SUSS 5      u  ppXX4n[)        U5      n[        SUSS 5      S	   nUS:X  a'  [        R                  " [        S
USS 5      S	   5      nO.[        SUSS 5      u  nn[        R                   " US-  U-  5      nUR#                  U5        UU R                  [        R                     [        R                  '   X%S  nU(       a  GMv  g g ! [&        R                   a    U R                  R                  S5         GN'f = f)Nr   r  rD  z=LBBHrw   r  r   r   r   r+  r   r0  r3   r2   r#   =Ir?  {Gz?zNo TimerAttributer,   )r  r   r
  r  rg   r   r   MDBMDBA_MDB_ENTRYr_   r  MDBA_MDB_ENTRY_INFOr	   ETH_P_IPr   r,  r1  r   MDBA_MDB_EATTR_TIMERr  list)r  r  r   rA  r<  rM  rN  	mdb_entrynested_mdb_entrynested_attr_lengthnested_attr_typenested_attr_endr  stater   vidr  protoip_addrr  r  timer_attr_lengthtimer_attr_types                          r;   r  AttributeMDBA_MDB.decode  s   %yy}+DJ39%bq3J0,_= $Q| 4	02	#,,-&HHNN#BC C$6$66'+-(@Fu][]\]M^@_=+*78J*K+s/F/FF;A'-XYZ\J];^8WU$+%#<D$*4b0D$Ea$HE$h7*3*?*?t][]^`Ma@bcd@e*f17mBr>R1S1:1F1FuPR{UZGZ1[ KK0DFLUS`acdfSgFh C!2?#28P8P"P$(KK1I1IFSWXefhikXlLmnoLprvKv0w$x DH,S-?-?@%c&8&89@@AQR(56F(G1 (-2 

!!),M*M $R DJ39%bq3J0,_= $QR&HHNN#BC C$6$66<B5WYXYIZ<[9''3+B+BB9;

3#5#564:7=QRSUCV4W1u 'e8#Dz &tM"R,@ A! D A:&/&;&;F4WYZ\I]<^_`<a&bG-3E-2:N-ONUE-6-B-B5B;QVCV-WGG,RV

3#5#56s7N7NOM*1 $ $*<< D $/B CDs   AO /PPc           	          U R                  XU5      nUR                  [        X#U R                  SS U R                  5      5        US-   $ Nr   r   r   r  r  s       r;   r  AttributeMDBA_MDB.dump_lines7  G    **;UK-k$))Aa.RVR\R\]^Qr=   r  N	r  r  r  r  r  r  r  r  r  rl   r=   r;   r  r    s    
8H+Tr=   r  c                   *    \ rS rSrSrS rS rS rSrg)AttributeMDBA_ROUTERi?  z
/*
 * [MDBA_ROUTER] = {
 *    [MDBA_ROUTER_PORT] = {
 *        u32 ifindex
 *        [MDBA_ROUTER_PATTR attributes]
 *    }
 * }
 */
 c                 0    [         R                  XX$5        g r^   r  r  s        r;   r  AttributeMDBA_ROUTER.__init__K  r  r=   c                    U R                  U5        U R                  SS  nUR                  [        :X  Gaw  / U l        U(       Gag  [        SUS S 5      u  p4[        U5      nUSU n0 nU(       d  U R                  R                  S5        g U[        R                  :X  a  [        SUS S 5      S   nUSS  n0 n	0 n
U(       a  [        SUS S 5      u  pUSS  n[        U5      nU[        R                  :X  a'  [        SUS S 5      S   S-  U	[        R                  '   OCU[        R                  :X  a$  [        SUS S	 5      S   U
[        R                  '   O[        S
5      eXnS  nU(       a  M  XU
/U[        R                  '   U R                  R                  U5        X%S  nU(       a  GMf  g g 0 U l        U(       a  [        SUS S 5      u  p4[        U5      nUSS  nU(       d  U R                  R                  S5        g U[        R                  :X  a  [        SUS S 5      S   nWU R                  [        R                  '   X%S  nU(       a  M  g g )Nr   r  rD  r  r   r  r  z=Br   zInvalid Router Port Attribute)r  r   r
  r  rg   r   r   r_   r  r  MDBA_ROUTER_PORTMDBA_ROUTER_PATTR_TIMERMDBA_ROUTER_PATTR_TYPEr9   r   )r  r  r   rA  r<  rM  rN  router_entryr  
timer_info	type_infonested_sub_attr_lengthnested_sub_attr_typenested_sub_attr_datanested_sub_attr_ends                  r;   r  AttributeMDBA_ROUTER.decodeN  sS   %yy}+DJ39%bq3J0,_= $Q| 4!&HHNN#BC C$8$88$T-*;<Q?G$1!"$5M!#J!#I'IOPUVcdfefVgIhF//<QR/@,.;<R.S+/33N3NNGMdSgikjkSlGmnoGprvFvJs'B'BC1S5O5OODJ4PdegfgPhDijkDlIc&@&@A"+,K"LL(56J(K (- ;BY9WL!5!56

!!,/M*; $@ DJ39%bq3J0,_= $QR&HHNN#BC C$8$88$T-*;<Q?G3:

3//0M* $r=   c           	          U R                  XU5      nUR                  [        X#U R                  SS U R                  5      5        US-   $ r  r  r  s       r;   r  AttributeMDBA_ROUTER.dump_lines  r  r=   r  Nr  rl   r=   r;   r  r  ?  s    		82+hr=   r  c                   ,    \ rS rSrS rS rS rS rSrg)AttributeMDBA_SET_ENTRYi  c                 L    [         R                  XX$5        S U l        S U l        g r^   r  r  s        r;   r   AttributeMDBA_SET_ENTRY.__init__  s     47	r=   c                     Xl         g r^   r  r  s     r;   r  !AttributeMDBA_SET_ENTRY.set_value  r  r=   c                 6   U R                   (       Ga  U R                   u  pp4pVU[        [        5      :X  a  SU l        [	        SUR
                  5      S   n[        R                  " U5      n[        U R                  5      U l	        U R                  U R                  -   n[        U R                  XR                  5      [        U R                  XX4XV5      -   n	OU[        [        5      :X  a  SU l        [	        SUR
                  5      u  p[        U R                  5      U l	        U R                  U R                  -   n[        U R                  XR                  5      [        U R                  XX4XU5      -   n	O[        SU-  5      eU R!                  X5      n	U	$ g )N=IBBHLxxxxxxxxxxxxHxxz<Lr   
=IBBHQQHxxrk  %d Invalid Proto)rg   r	   r  r  r   rf  r   r,  r   r  r  r   r  r  
ETH_P_IPV6r9   r  )r  r  r   r  r  r  r  reorderr   r  r  r  s               r;   r  AttributeMDBA_SET_ENTRY.encode  sP   :::59ZZ2WUh'3	 ryy1!4**73#DII.48834++VZZ@4		SZchoqCyy%
++(	!'ryy!9#DII.48834++VZZ@4		SZchot  }B  DC  C   2U :;;((6'CJ+ r=   c                 &   U R                  U5        U R                  S:X  a  [        SUSS 5      S   nU[        [        5      :X  a/  SU l        [        U R
                  U R                  SS  5      u  pEpgpOmU[        [        5      :X  aL  SU l        [        U R
                  U R                  SS  5      u  pEpgpn[        R                  " U	S	-  U
-  5      nO[        S
U-  5      e[        U R
                  5      U l        XEXgX4U l        g [        S5      e)Nr2   r  r   r   r   r	  r   r
  r3   r  zInvalid Attribute Length)r  r   r   r	   r  r  r   r  r   r1  r9   r   r  rg   )r  r  r   r  r  r   r  r  r  r  r  s              r;   r  AttributeMDBA_SET_ENTRY.decode  s    %;;"4b-a0Eh'3	9?		499UVUW=9Y6B%
++(	BHTXT]T]^_^`TaBb?E**5B;+>? 2U :;;		*DH!%R?DJ677r=   r  N)	r  r  r  r  r  r  r  r  r  rl   r=   r;   r  r    s    
28r=   r  c                       \ 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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&Sr'SS jr(S	 r)S
r*g)r  i  a8  
Service Header
0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Family    |    Reserved1  |           Reserved2           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                     Interface Index                         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

struct br_port_msg {
__u8  family;
__u32 ifindex;
};

RTM_GETMDB - Service Header

/* Bridge multicast database attributes
 * [MDBA_MDB] = {
 *     [MDBA_MDB_ENTRY] = {
 *         [MDBA_MDB_ENTRY_INFO] {
 *                struct br_mdb_entry
 *                [MDBA_MDB_EATTR attributes]
 *         }
 *     }
 * }
 * [MDBA_ROUTER] = {
 *    [MDBA_ROUTER_PORT] = {
 *        u32 ifindex
 *        [MDBA_ROUTER_PATTR attributes]
 *    }
 * }
 */

 struct br_mdb_entry {
        __u32 ifindex;
    #define MDB_TEMPORARY 0
    #define MDB_PERMANENT 1
        __u8 state;
    #define MDB_FLAGS_OFFLOAD      (1 << 0)
    #define MDB_FLAGS_FAST_LEAVE   (1 << 1)
        __u8 flags;
        __u16 vid;
        struct {
            union {
                __be32    ip4;
                struct in6_addr ip6;
            } u;
            __be16        proto;
        } addr;
    };
r   r   r   r   Nc           	         [         R                  XX#XEU5        U R                  (       a<  U[        [        4;   a,  U R
                  S[        4U R                  S[        40U l	        O=U R
                  S[        4U R                  S[        4U R                  S[        40U l	        SU l        [        U R                  5      U l        g )NMDBA_SET_ENTRY_UNSPECMDBA_SET_ENTRYMDBA_UNSPECMDBA_MDBMDBA_ROUTERBxxxi)r  r  r  r  r  r  r  r  r  rU  r  r  r  r  r  r   r  )r  r
  r  r  r  r  r  s          r;   r  MDB.__init__)  s    teYBO77w:z"::  #:<L"M##&68O%P'
D#   =2B"C
,=>  =2F"G'D# 	TYY'r=   c                    U R                   U R                  :X  a  g [        U R                  U R                  S U R
                   5      u  U l        U l        U R                  (       Ga_  U R                  (       a  [        OS nU(       a  SU-  OSnU(       a  SOSnU R                  R                  SU< SU< 35        U R                  R                  U R                  5        U R                  R                  [        SU[        [        R                   " SU R                  5      5      S[#        U R                  S	5      U R                  4-  5      5        U R                  R                  [        S	U[        [        R                   " S
U R                  5      5      S[#        U R                  S5      U R                  4-  5      5        g g )NrB  r   rC  rD  r  r   !IzFamily %s (%d)r   rs   zIfindex %s (%d)r,   )r   r)  r   r  r+  r  rN   r  r  r  r  r  r   r   	bytearrayr  r   ri   )r  r   rL  rM  s       r;   r-  MDB.decode_service_header:  sX   ;;$//)%+DIIt}}Ydhh7O%P"T\:::"nnF$E05*u,2K%*	I##k9$UV##DMM2##$6q%6;;W[]a]h]hKiAj.>+dkk[\B]_c_j_jAk.k%m n##$6q%6;;WZ\`\h\hKiAj.?;t||]^C_aeamamBn.n%p q r=   )r  r  rU  rN   r  )FNTFF)+r  r  r  r  r  r  r  r  _MDB__MDBA_MAXMDBA_MAXr  r  _MDB__MDBA_SET_ENTRY_MAXMDBA_SET_ENTRY_MAXMDB_FLAGS_OFFLOADMDB_FLAGS_FAST_LEAVEMDBA_MDB_UNSPECr  _MDB__MDBA_MDB_MAXMDBA_MDB_MAXMDBA_MDB_ENTRY_UNSPECr  _MDB__MDBA_MDB_ENTRY_MAXMDBA_MDB_ENTRY_MAXMDBA_MDB_EATTR_UNSPECr  _MDB__MDBA_MDB_EATTR_MAXMDBA_ROUTER_UNSPECr  _MDB__MDBA_ROUTER_MAXMDBA_ROUTER_MAXMDBA_ROUTER_PATTR_UNSPECr  r  _MDB__MDBA_ROUTER_PATTR_MAXMDBA_ROUTER_PATTR_MAXMDB_RTR_TYPE_DISABLEDMDB_RTR_TYPE_TEMP_QUERYMDB_RTR_TYPE_PERMMDB_RTR_TYPE_TEMPr  r-  r  rl   r=   r;   r  r    s   3h KHKJ>H N.2 %$ ONN%)L3a7%91%< ,q0O #$"#"#"##:Q#>("qr=   r  c                      ^  \ 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SrSrSrSrSr\S\4\S\4\S\4\S\4\	S\4\
S\4\S\4\S\4\S\40	rSS jrU 4S jrSrU =r $ )NetconfiK  ap  
RTM_NEWNETCONF - Service Header

0               1
0 1 2 3 4 5 6 7 8
+-+-+-+-+-+-+-+-+
|   Family      |
+-+-+-+-+-+-+-+-+

RTM_GETNETCONF - Service Header

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Family    |   Reserved  |          Device Type              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                     Interface Index                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      Device Flags                             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      Change Mask                              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
r   r   r   r   r   r   r   r   r,   r   rk   r   r2   r3   NETCONFA_UNSPECNETCONFA_IFINDEXNETCONFA_FORWARDINGNETCONFA_RP_FILTERNETCONFA_MC_FORWARDINGNETCONFA_PROXY_NEIGH$NETCONFA_IGNORE_ROUTES_WITH_LINKDOWNNETCONFA_INPUTNETCONFA_BC_FORWARDINGc                     [         R                  XX#U5        U[        :X  a"  SU l        [	        U R                  5      U l        g SU l        [	        U R                  5      U l        g )Nr{  rD  )r  r  r  r  r   r  r  s        r;   r  Netconf.__init__  sL    teYGn$ DI +DH DI +DHr=   c                   > U R                   U R                  :X  a  g U R                  [        :X  a  [        [
        U ]  5         g [        U R                  U R                  S U R                   5      u  U l        U R                  (       a  U R                  (       a  [        OS nU(       a  SU-  OSnU(       a  SOSnU R                  R!                  SU< SU< 35        U R                  R!                  [#        SU[%        [&        R(                  " SU R                  5      5      S[+        U R                  S	5      [-        U R                  5      U R                  4-  5      5        g g )
NrB  r   rC  rD  r  r   r  Family %s (%s:%d)r   )r   r)  r
  r  r  r7  r-  r   r  r+  r  rN   r  r  r  r  r   r   r  r  r   ri   rO   )r  r   rL  rM  r  s       r;   r-  Netconf.decode_service_header  sP   ;;$//)<<>)'468
 $DIIt}}Ydhh/GHNT[zz"&..d49j50r).IB	  ''+y(YZ  ''(:1eYv{{[_aealalOmEn  qD  HS  TX  T_  T_  ab  Hc  es  tx  t  t  e@  BF  BM  BM  GN  qN  )O  P r=   )r  r  rN   r  )!r  r  r  r  r  r9  r:  r;  r<  r=  r>  r?  r@  rA  _Netconf__NETCONFA_MAXNETCONFA_MAXNETCONFA_ALLNETCONFA_IFINDEX_ALLNETCONFA_IFINDEX_DEFAULTNETCONF_ATTR_FAMILYNETCONF_ATTR_IFINDEXNETCONF_ATTR_RP_FILTERNETCONF_ATTR_FWDINGNETCONF_ATTR_MC_FWDINGNETCONF_ATTR_PROXY_NEIGHNETCONF_ATTR_IGNORE_RT_LINKDWNr  r  rU  r  r-  r  r  r  s   @r;   r7  r7  K  s   2 /0O././././././(./N././N/=/AL.0L.0.0 !# #%%+" 	3DFV2W3EG]2^3HJ`2a3GI_2`3KMc2d3IKa2b,3Y[q2r3CE[2\3KMc2d
	,P Pr=   r7  c                   B   \ 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\4\S\4\S\4\S\4\	S\4\
S\4\S\4\S\4\S\4\S\4\S\40rSrSrSrSrSrSr\S\S\S\S\S\S 0rSrSrSr Sr!Sr"Sr#S!r$S"r%Sr&\S#\S$\ S%\!S&\"S'\#S(\$S)\%S*\&S+0	r'S3S- jr(S. r)S/ r*S0 r+S1 r,S2r-g,)4Neighbori  aO  
Service Header

0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Family    |    Reserved1  |           Reserved2           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                     Interface Index                         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           State             |     Flags     |     Type      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
r   r   r   r   r   r   r   r   r,   r   r   
NDA_UNSPECNDA_DST
NDA_LLADDRNDA_CACHEINFO
NDA_PROBESNDA_VLANNDA_PORTNDA_VNINDA_IFINDEX
NDA_MASTERNDA_LINK_NETNSIDr   r4   NTF_USENTF_SELF
NTF_MASTER	NTF_PROXYNTF_EXT_LEARNED
NTF_ROUTERr2   r3   NUD_NONENUD_INCOMPLETENUD_REACHABLE	NUD_STALE	NUD_DELAY	NUD_PROBE
NUD_FAILED	NUD_NOARPNUD_PERMANENTNc                 t    [         R                  XX#U5        SU l        [        U R                  5      U l        g )NBxxxiHBBr  r  s        r;   r  Neighbor.__init__  s+    teYG	DII&r=   c                 :    U R                  U R                  U5      $ r^   )r  state_to_stringr  s     r;   get_state_stringNeighbor.get_state_string  s    t33U;;r=   c                    / nU[         R                  -  (       a  UR                  S5        U[         R                  -  (       a  UR                  S5        U[         R                  -  (       a  UR                  S5        U[         R
                  -  (       a  UR                  S5        U[         R                  -  (       a  UR                  S5        U[         R                  -  (       a  UR                  S5        U[         R                  -  (       a  UR                  S5        U[         R                  -  (       a  UR                  S5        S	R                  U5      $ )
Nrg  rh  ri  rj  rk  rl  rm  rn  r  )rT  rg  r   rh  ri  rj  rk  rl  rm  rn  rx   )r  states
for_strings      r;   get_states_stringNeighbor.get_states_string  s    
H+++./H***o.H&&&k*H&&&k*H&&&k*H'''l+H&&&k*H***o.yy$$r=   c                    / nU[         R                  -  (       a  UR                  S5        U[         R                  -  (       a  UR                  S5        U[         R                  -  (       a  UR                  S5        U[         R
                  -  (       a  UR                  S5        U[         R                  -  (       a  UR                  S5        SR                  U5      $ )Nr`  ra  rb  rc  re  r  )rT  r`  r   ra  rb  rc  re  rx   )r  r   rx  s      r;   r$  Neighbor.get_flags_string$  s    
8###i(8$$$j)8&&&l+8%%%k*8&&&l+yy$$r=   c                    U R                   U R                  :X  a  g [        U R                  U R                  S U R
                   5      u  U l        U l        U l        U l	        U l
        U R                  (       Ga  U R                  (       a  [        OS nU(       a  SU-  OSnU(       a  SOSnU R                  R                  SU< SU< 35        [!        SU R
                  S-  5       GH  nU R"                  S:X  a:  S	[%        U R                  S
5      ['        U R                  5      U R                  4-  nOU R"                  S:X  a&  S[%        U R                  S5      U R                  4-  nOU R"                  S:X  a  S[%        U R                  S5      U R                  U R)                  U R                  5      [%        U R                  S
5      U R                  U R+                  U R                  5      [%        U R                  S5      U R                  4-  nOSU R"                  -  nUS-  nUS-   nU R                  R                  [-        U R"                  XR                  Xg U5      5        U =R"                  S-  sl        GM     g g )NrB  r   rC  rD  r  r   r   r   rE  r   r   r  r,   r   z0State %s (%d) %s, Flags %s (%s) %s, Type %s (%d)rI  r   )r   r)  r   r  r+  r  rN   r  r  r   neighbor_typer  r  r  r  r   ry   r   ri   rO   ry  r$  r   r  s           r;   r-  Neighbor.decode_service_header8  s    ;;$//)
 499dmmITXX67	5		TZ!3 :::"nnF$E05*u,2K%*	I##k9$UV1dhhk*##q(/;t{{A3NP^_c_j_jPkmqmxmx2yyE%%*5T\\ST9UW[WcWc8ddE%%*N$TZZ3TZZAWAWX\XbXbAc$TZZ3TZZAVAVW[WaWaAb$T%7%7;T=O=OQQE
 8$:J:JJEAai  ''(:4;K;KUTaTabgTlns(tu  A%  ! + r=   )r  r  rN   r   r  r~  r  r  ).r  r  r  r  r  rU  rV  rW  rX  rY  rZ  r[  r\  r]  r^  r_  r  r  r   r  r  r  rU  r`  ra  rb  rc  rd  re  r  rf  rg  rh  ri  rj  rk  rl  rm  rn  rs  r  rt  ry  r$  r-  r  rl   r=   r;   rT  rT    s     JGJMJHHGKJ 	L*:;I'?@L*=>O-BCL*@AJ(=>J(89I'=>M+ABL*@A.0@A  GHJIOJ 	9:<;,<N HNMIIIJIM 	)
O'
<%:%(!&r=   rT  c                   &   \ 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SrSrSrSrSrSrSr0 \S\4_\S\4_\S\4_\S\4_\	S\4_\
S\4_\S \4_\S!\4_\S"\4_\S#\4_\S$\4_\S%\4_\S&\4_\S'\4_\S(\4_\S)\4_\S*\4_\S+\4\S,\4\S-\4\S.\4\S/\4\S0\40Er Sr!S1r"S2r#S3r$S4r%\!S5\"S6\#S7\$S8\%S90r&Sr'S:r(S2r)S3r*S4r+\'S;\(S<\)S=\*S>\+S?0r,\'S@\+SA\*SB\)SC\(SD0r-Sr.Sr/Sr0Sr1Sr2Sr3Sr4Sr5Sr6Sr7Sr8Sr9Sr:Sr;Sr<\.SE\/SF\0SG\1SH\2SI\3SJ\4SK\5SL\6SM\7SN\8SO\9SP\:SQ\;SR\<SS0r=Sr>Sr?Sr@SrASrBSrCS	rDS
rESrFSrGSrHSrI\>ST\?SU\@SV\ASW\BSX\CSY\DSZ\ES[\FS\\GS]\HS^\IS_0rJS`rKSarLSbrMScrN\KSd\LSe\MSf\NSg0rOStSi jrPSj rQSuSk jrRSuSl jrSSuSm jrTSuSn jrUSo rV0 4Sp jrW0 4Sq jrXSr rYSsrZgh)vr  i\  aO  
Service Header

0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Family    |  Dest length  |   Src length  |     TOS       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Table ID   |   Protocol    |     Scope     |     Type      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                          Flags                              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
r   r   r   r   r   r   r   r   r,   r   r   r   rw   r   r   r   r   r   r   r   r   r   r   
RTA_UNSPECr  r  RTA_IIFRTA_OIFry  RTA_PRIORITYRTA_PREFSRCRTA_METRICSRTA_MULTIPATHRTA_PROTOINFORTA_FLOWRTA_CACHEINFORTA_SESSIONRTA_MP_ALGO	RTA_TABLERTA_MARKRTA_MFC_STATSRTA_VIA
RTA_NEWDSTRTA_PREFRTA_ENCAP_TYPE	RTA_ENCAP   r@   r?   r>   RT_TABLE_UNSPECRT_TABLE_COMPATRT_TABLE_DEFAULTRT_TABLE_MAINRT_TABLE_LOCALrA   RT_SCOPE_UNIVERSERT_SCOPE_SITERT_SCOPE_LINKRT_SCOPE_HOSTRT_SCOPE_NOWHERErB   rD   rE   rF   rG   RT_PROT_UNSPECRT_PROT_REDIRECTRT_PROT_KERNELRT_PROT_BOOTRT_PROT_STATICRT_PROT_GATED
RT_PROT_RART_PROT_MRTRT_PROT_ZEBRART_PROT_BIRDRT_PROT_DNROUTEDRT_PROT_XORPRT_PROT_NTKRT_PROT_DHCPRT_PROT_EXABGP
RTN_UNSPECRTN_UNICAST	RTN_LOCALRTN_BROADCASTRTN_ANYCASTRTN_MULTICASTRTN_BLACKHOLERTN_UNREACHABLERTN_PROHIBIT	RTN_THROWRTN_NATRTN_XRESOLVEr-   r.   r/   r   RTM_F_NOTIFYRTM_F_CLONEDRTM_F_EQUALIZERTM_F_PREFIXNc                 t    [         R                  XX#U5        SU l        [        U R                  5      U l        g )Nz=8BIr  r  s        r;   r  Route.__init__  s+    teYG	DII&r=   c                     U R                  U R                  5      nU(       a  SU-  $ U R                  [        :X  a  gU R                  [        :X  a  gg )Nz%sz	0.0.0.0/0z::/0)rZ  r  rN   r   r   )r  dsts     r;   get_prefix_stringRoute.get_prefix_string"  sF    &&t||4#:{{g%"( )r=   c                 X    Uc  U R                   nU R                  U R                  U5      $ r^   )protocolr  prot_to_stringr  s     r;   get_protocol_stringRoute.get_protocol_string-  s'    =MMEt22E::r=   c                 X    Uc  U R                   nU R                  U R                  U5      $ r^   )
route_typer  rt_type_to_stringr  s     r;   get_rt_type_stringRoute.get_rt_type_string2  s'    =OOEt55u==r=   c                 X    Uc  U R                   nU R                  U R                  U5      $ r^   )r  r  scope_to_stringr  s     r;   get_scope_stringRoute.get_scope_string7  s'    =JJEt33U;;r=   c                 X    Uc  U R                   nU R                  U R                  U5      $ r^   )table_idr  table_to_stringr  s     r;   get_table_id_stringRoute.get_table_id_string<  s'    =MMEt33U;;r=   c                 Z    U(       a!  UR                  U5      nUc  [        U5      nU$ S nU$ r^   )rM   r  )r  r  ifname_by_indexifnames       r;   _get_ifname_from_indexRoute._get_ifname_from_indexA  s6    $((1F~W  Fr=   c                 p   U R                  U R                  5      nU R                  U R                  5      n/ nU(       a@  U R                  U R                  5      nU R	                  XQ5      nUR                  X&45        U$ U(       a/  U H)  u  p'pU R	                  Xq5      nUR                  X&45        M+     U$ r^   )rZ  ry  r  r  r  r   )
r  r  r~  	multipathnexthopsrta_oifr  r  r{  r|  s
             r;   get_nexthopsRoute.get_nexthopsL  s    **4+;+;<,,T-?-?@	..t||<G00JFOOW-.  BK>
44\S 12 CL r=   c                     / nU R                  U5       H  u  p4UR                  SU< SU< 35        M      SR                  U5      $ )Nz via z on r\  )r  r   rx   )r  r  outputr~  r  s        r;   get_nexthops_stringRoute.get_nexthops_string]  sB    !%!2!2?!CWMMWf=> "D xxr=   c                 8   U R                   U R                  :X  a  g [        U R                  U R                  S U R
                   5      u	  U l        U l        U l        U l	        U l
        U l        U l        U l        U l        U R                  (       Ga  U R                   (       a  ["        OS nU(       a  SU-  OSnU(       a  SOSnU R$                  R'                  SU< SU< 35        [)        SU R
                  S-  5       GH  nU R*                  S:X  a  S	[-        U R                  S
5      [/        U R                  5      U R                  [-        U R                  S
5      U R                  [-        U R                  S
5      U R                  [-        U R                  S
5      U R                  4	-  nGOU R*                  S:X  a  S[-        U R                  S
5      U R                  U R1                  5       [-        U R                  S
5      U R                  U R3                  5       [-        U R                  S
5      U R                  U R5                  5       [-        U R                  S
5      U R                  U R7                  5       4-  nO9U R*                  S:X  a  S[-        U R                  S5      -  nOSU R*                  -  nUS-  nUS-   nU R$                  R'                  [9        U R*                  XR                  Xg U5      5        U =R*                  S-  sl        GM     g g )NrB  r   rC  rD  r  r   r   r   zQFamily %s (%s:%d), Source Length %s (%d), Destination Length %s (%d), TOS %s (%d)r   r   zSTable ID %s (%d - %s), Protocol %s (%d - %s), Scope %s (%d - %s), Type %s (%d - %s)r   zFlags %sr,   rI  r   )r   r)  r   r  r+  r  rN   r  r  tosr  r  r  r  r   r  r  r  r  r   ry   r   ri   rO   r  r  r  r  r   r  s           r;   r-  Route.decode_service_headere  sm    ;;$//)
 499dmmITXX67	dlDL$(	tz4?	 :::"nnF$E05*u,2K%*	I##k9$UV1dhhk*##q(o(a8.:UW[WbWb(q94<<(q94<<(15txxAAE
 %%*q(:DMM4KcKcKe(:DMM4KcKcKe(Q7TEZEZE\(!<dootOfOfOhjjE
 %%*&TZZ)CCE7$:J:JJEAai  ''(:4;K;KUTaTabgTlns(tu  A%  + + r=   )r  r  r  rN   r   r  r  r  r  r  r  r  r^   )[r  r  r  r  r  r  r  r  r  r  ry  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rq  rU  r  r  r  r  r  r  r  r  r  r  r  r  rtnl_rtscope_tabr  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r-  r  rl   r=   r;   r  r  \  sB     JGGGGKLKKMMHMKKIHMGJHNI'78$67 	$67 	$:;	
 	$:; 	(:; 	)?@ 	(:; 	(89 	*@A 	*:; 	%56 	*:; 	(89 	(89  	&<=!" 	%56#$ 	*:;$45'78%56)+;<&67/8 OOMN 	,,-?+O MMM 	/OOO.O 	8)vvv NNLNMJKMLLKLN 	+-+>+?<=?>->=>+N( JKIMKMMOLI GL 	,-+/-//+.+)." LLNL 	)	N'
	;
>
<
<
	 ,. " 35  &&r=   r  c                   (    \ rS rSrSrSS jrS rSrg)Donei  aZ  
NLMSG_DONE

Service Header
0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                             TBD                             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Nc                 t    [         R                  XX#U5        SU l        [        U R                  5      U l        g )Nrs   r  r  s        r;   r  Done.__init__  s+    teYG	DII&r=   c           
      &   [        U R                  U R                  S U R                   5      nU R                  (       a  U R
                  (       a  [        OS nU(       a  SU-  OSnU(       a  SOSnU R                  R                  SU< SU< 35        [        SU R                  S-  5       H`  nSnUS-  nUS-   nU R                  R                  [        U R                  X R                  Xx U5      5        U =R                  S-  sl        Mb     g g )	NrB  r   rC  rD  r  r   r   r   )r   r  r+  r  r  r  r  r  r   ry   r   r   )	r  r!  r   rL  rM  r  r   r  r  s	            r;   r-  Done.decode_service_header  s    TYYitxx 89::"nnF$E05*u,2K%*	I##k9$UV1dhhk*Aai  ''(:4;K;KUTaTabgTlns(tu  A%  + r=   )r  r  r  )r  r  r  r  r  r  r-  r  rl   r=   r;   r  r    s    	'
&r=   r  )r   )socketloggingr  binasciir   pprintr   r   r   r   r   r	   r  r
   r   r   r   r   r   	getLoggerr  r_   r7  r  r  INFINITY_LIFE_TIMEr  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r2  r3  r4  r5  r8  r7  r6  r9  r:  r;  r<  r=  r  r  r  RTMGRP_LINKRTMGRP_NOTIFYRTMGRP_NEIGH	RTMGRP_TCRTMGRP_IPV4_IFADDRRTMGRP_IPV4_MROUTERTMGRP_IPV4_ROUTERTMGRP_IPV4_RULERTMGRP_IPV6_IFADDRRTMGRP_IPV6_MROUTERTMGRP_IPV6_ROUTERTMGRP_IPV6_IFINFORTMGRP_DECnet_IFADDRRTMGRP_DECnet_ROUTERTMGRP_IPV6_PREFIXRTNLGRP_MDBr<   RTNLGRP_IPV4_NETCONFRTNLGRP_IPV6_NETCONFRTNLGRP_MPLS_NETCONF
RTMGRP_ALL	RT_SCOPESrI   ri  rL   dir
startswithrN   getattrrO   rJ  rP  r  rR  r  rb   ri   rn   r&  r   r   r   objectr  r  r  r  r  r  r  r  r  r   r  r  r"  r,  rq  r  r  r  rw  r  r5  r  r  r  r  r7  rT  r  r  )r  s   0r;   <module>r     s  >      A A  ) )  ! 
   




 	
 
K'
 
 $'::; 	           	 r{ r{ r{  M)L89D !#568IJL\] !#568IJL^_ ## &99 <C;;OP !	! $8	8 ;O	O Rf	f
 	  F	 #FFu/EtFF)/Igff%& G 	' , 
			 
	

	
 $/ ai$&Q
 Q
hw4 w4t	l l4I 6Y .I :i @? S Sl#1 #1) 1h @y (, :`I `HY'Y Y'xGY GT"\Y \@f5F f5R`&m `&Fd&M d&Nv=@ vrl	 l`G9 GT48i 48pHq- HqT\Pd \P~o&} o&do&M o&d	&= &Kg Gs   L $L 