
    /I_X                    T   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s  J	r	  S SK
Js  Jr  S SKJs  Jr  S SKJr  S SK7  S SKJr  S SK7  S SKJr   " S S	5      r! " S
 S\\5      r"g! \\4 a7    S SKJr  S SKJ	r	  S SKJr  S SKJr  S SKJr  S SK7  S SKJr  S SK7  S SK Jr   NUf = f)    N)Counter)Addon)Link)*)utils)
moduleBasec                       \ rS rSrSrSrSrg)bridgeFlags+          N)__name__
__module____qualname____firstlineno__PORT_PROCESSEDPORT_PROCESSED_OVERRIDE__static_attributes__r       %/usr/share/ifupdown2/addons/bridge.pyr
   r
   +   s    N!r   r
   c                      \ rS rSrSrS0 SSSS/S/SS	._S
SSSS// SQS._SSS// SQ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S"/S'/S(SSS)._S*S+SS"/S,/S-S._S.S/SS"/S0/S1S._S2S3S4/SS/S5S6/S7S8._S9S:S4/SS/S;S</S=._S>S?SS"/S@/S-S._SASB/ SCQSD/SS	._SESF/ SGQSSH/SI._SJSKSS"/S-SL/SM._SNSO/ SGQSSP/SI._SQSR/ SGQSSS/SI._0 STSUSSV/S(SW/SM._SXSYSSV/SZS[/SM._S\S]SS"/S^S_/SM._S`SaSbSc/Sd._SeSfSS"/S"Sg/SM._ShSiSS"/SjSk/SM._SlSmSS"/SnSo/SM._SpSqSS"/SrSs/SM._StSuSv/SSSw/Sx._SySzS{// S|QS}._S~SS/SSS/SI._SSSS/S/S._SSSS"/SS/SM._SSSS/SS/S/S._SSSSV/S/S._SSS^S/S/S._SSSS/S/SS	._E0 SSSS/S._SSSS/S._SS/ SQSS/SI._SSS-S/S-S/SI._SSS^S-/S^S/SI._SS/ SQSSS/SI._SS/ SQSSS/SI._SS/ SQSSS/SI._SSSSS/S/S._SSSSS/S/S._SS/ SQSSS/SI._SSS/ SQS/S._SS/ SQ/ SQS}._SSSS/S._SSSS._SSS/ SQS._ES.rSr0 S \R                  _S*\R                  _S.\R                  _S\R                  _S\R                  _S\R                  _S\R                  _S\R                  _SA\R                   _SN\R"                  _SQ\R$                  _ST\R&                  _SX\R(                  _S>\R*                  _SJ\R,                  _S\\R.                  _S`\R0                  _\R2                  \R4                  \R6                  \R8                  \R:                  \R<                  \R>                  S.Er \!" \R                  S 4\R                  S 4\R                  S 4\R                  S 4\R                  \"4\R                  \#RH                  4\R                  \%RL                  4\R                   \#RN                  4\RP                  \#RH                  4\R"                  \#RH                  4\R$                  \#RH                  4\R&                  \"4\R(                  \"4\R*                  \"4\R,                  \"4\R.                  S 4\R0                  S 4\R2                  S 4\R4                  S 4\R6                  S 4\R8                  S 4\RR                  \#RH                  4\R:                  \"4\R<                  \#RH                  4\R>                  \"445      r*\RV                  \RX                  \RZ                  \R\                  \R^                  \R`                  \Rb                  \Rd                  \Rf                  \Rh                  S.
r5SSSSSSSSS.r6SSSS.r7\!" \RV                  \"4\RX                  \"4\R`                  S 4\RZ                  \#RH                  4\R\                  \#RH                  4\R^                  \#RH                  4\Rb                  \#RH                  4\Rd                  \#RH                  4\Rf                  S 4\Rh                  \#RH                  44
5      r8S r9\:S 5       r;\:S 5       r<\:S 5       r=\:S 5       r>\:S 5       r?\:S 5       r@\:S 5       rA\:S 5       rB\:S 5       rC\:S 5       rD\:GS  5       rE\:GS 5       rFGS rGGS rHGS rIGS rJGS rKGS rL\:GS 5       rMGS	 rNGS
 rOGSnGS jrPGS rQGS rRGS rSGSoGS jrTGS rUGSpGS jrVGS rWGS rXGS rYGS rZGS r[GS r\GS r]GS r^GS r_GS r`GSqGS jraGS rbGS rcGS  rdGS! reGS" rfGS# rgGS$ rhGS% riGS& rjGS' rkGS( rlGS) rm  GSrGS* jrnGS+ roGS, rpGS- rqGS. rrGS/ rsGS0 rt\:GS1 5       ruGS2 rv/ / 4GS3 jrwGS4 rxGS5 ryGS6 rzGS7 r{GS8 r|GS9 r}GS: r~GS; rGS< rGS= rGSnGS> jrGSnGS? jrGS@ r GSnGSA jrGSB r GSoGSC jrGSD rGSE rGSF rGSnGSG jrGSH rGSI rGSJ r\:GSK 5       rGSL r\:GSM 5       r\:GSN 5       r\:GSO 5       r\:GSP 5       r\:GSQ 5       r\:GSR 5       r\:GSS 5       r\:GST 5       r\GSU 5       rGSV rGSW rGSX rGSY rGSZ rGS[ rGS\rGS] r\:GS^ 5       rGS_ rGS` rGSa rGSrGSb jrGSnGSc jrGSd rGSe r GSnGSf jrGSnGSg jrGSh rGSnGSi jr\\\\\GSj.rGSk rGSrGSl jrGSmrGg(s  bridge0   z2ifupdown2 addon module to configure linux bridges a  Bridge configuration module. Supports both vlan aware and non vlan aware bridges. For the vlan aware bridge, the port specific attributes must be specified under the port. And for vlan unaware bridge port specific attributes must be specified under the bridge.bridge-vlan-awarezUvlan aware bridge. Setting this attribute to yes enables vlan filtering on the bridgeyesnozbridge-vlan-aware yes/no)help	validvalsexampledefaultbridge-portszbridge portsTz<interface-list>)z'bridge-ports swp1.100 swp2.100 swp3.100zbridge-ports glob swp1-3.100z#bridge-ports regex (swp[1|2|3].100))r   
multivaluerequiredr   r    
bridge-stpzbridge-stp yes/nozbridge-stp no)r   onoffr   )r   r    r   r!   bridge-bridgepriozbridge priority065535zbridge-bridgeprio 3276832768)r   
validranger    r!   bridge-ageingzbridge ageingzbridge-ageing 300300	bridge-fdzbridge forward delay255zbridge-fd 1515zbridge-gcintz*bridge garbage collection interval in secszbridge-gcint 44)r   r,   r    r!   compat
deprecatedbridge-hellozbridge set hello timezbridge-hello 22bridge-maxagezbridge set maxagezbridge-maxage 2020bridge-pathcostszbridge set port path costsz<interface-range-list>z<under the port (for vlan aware bridge): bridge-pathcosts 100zNunder the bridge (for vlan unaware bridge): bridge-pathcosts swp1=100 swp2=100100)r   r   r,   r    r!   bridge-portprioszbridge port priosz;under the port (for vlan aware bridge): bridge-portprios 32zLunder the bridge (for vlan unaware bridge): bridge-portprios swp1=32 swp2=32)r   r   r,   r    bridge-mclmczset multicast last member countzbridge-mclmc 2bridge-mcrouterzgSet bridge multicast routers: 0 - disabled - no, 1 - automatic (queried), 2 - permanently enabled - yes)r   r   r)   1r6   zbridge-mcrouter 1bridge-mcsnoopzset multicast snooping)r   r   r)   r>   zbridge-mcsnoop yes)r   r   r!   r    bridge-mcsqcz!set multicast startup query countzbridge-mcsqc 2)r   r,   r!   r    bridge-mcqifaddrz!set multicast query to use ifaddrzbridge-mcqifaddr nobridge-mcquerierzset multicast querierzbridge-mcquerier nobridge-hashelzset hash elasticity4096zbridge-hashel 4096bridge-hashmaxzset hash max512zbridge-hashmax 4096bridge-mclmiz,set multicast last member interval (in secs)r>   zbridge-mclmi 1bridge-mcmiz+set multicast membership interval (in secs)260zbridge-mcmi 260)r   r!   r    bridge-mcqpiz(set multicast querier interval (in secs)zbridge-mcqpi 255bridge-mcqiz&set multicast query interval (in secs)125zbridge-mcqi 125bridge-mcqriz/set multicast query response interval (in secs)10zbridge-mcqri 10bridge-mcsqiz.set multicast startup query interval (in secs)31zbridge-mcsqi 31bridge-mcqv4srcz0set per VLAN v4 multicast querier source addressz<number-ipv4-list>z1bridge-mcqv4src 100=172.16.100.1 101=172.16.101.1)r   r   r#   r3   r    bridge-portmcrouterzZSet port multicast routers: 0 - disabled, 1 - automatic (queried), 2 - permanently enabledz&<interface-disabled-automatic-enabled>)	z=under the port (for vlan aware bridge): bridge-portmcrouter 0z=under the port (for vlan aware bridge): bridge-portmcrouter 1z=under the port (for vlan aware bridge): bridge-portmcrouter 2zDunder the port (for vlan aware bridge): bridge-portmcrouter disabledzEunder the port (for vlan aware bridge): bridge-portmcrouter automaticzCunder the port (for vlan aware bridge): bridge-portmcrouter enabledzTunder the bridge (for vlan unaware bridge): bridge-portmcrouter swp1=0 swp2=1 swp2=2ziunder the bridge (for vlan unaware bridge): bridge-portmcrouter swp1=disabled swp2=automatic swp3=enabledz[under the bridge (for vlan unaware bridge): bridge-portmcrouter swp1=2 swp2=disabled swp3=1)r   r   r    bridge-portmcflzport multicast fast leave.z<interface-yes-no-0-1-list>z:under the port (for vlan aware bridge): bridge-portmcfl nozKunder the bridge (for vlan unaware bridge): bridge-portmcfl swp1=no swp2=nobridge-waitporta  wait for a max of time secs for the specified ports to become available,if no ports are specified then those specified on bridge-ports will be used here. Specifying no ports here should not be used if we are using regex or "all" on bridge_ports,as it wouldnt work.z<number-interface-list>zbridge-waitport 4 swp1 swp2)r   r!   r   r    bridge-maxwaitzforces to time seconds the maximum time that the Debian bridge setup scripts will wait for the bridge ports to get to the forwarding status, doesn"t allow factional part. If it is equal to 0 then no waiting is donezbridge-maxwait 3bridge-vidszbridge port vids. Can be specified under the bridge or under the port. If specified under the bridge the ports inherit it unless overridden by a bridge-vids attribute under the portz<number-comma-range-list>zbridge-vids 4000zbridge-vids 2000 2200-3000bridge-trunk)r   r#   r   r    aliasesbridge-pvidz9bridge port pvid. Must be specified under the bridge portzbridge-pvid 1)r   r,   r    bridge-accessz@bridge port access vlan. Must be specified under the bridge port4094zbridge-access 300bridge-allow-untaggedzwindicate if the bridge port accepts untagged packets or not.  Must be specified under the bridge port. Default is "yes"zbridge-allow-untagged yesbridge-port-vidszbridge vlansz'bridge-port-vids bond0=1-1000,1010-1020)r   r3   r    bridge-port-pvidszbridge port vlansz%bridge-port-pvids bond0=100 bond1=200bridge-learningzbridge port learning flag)r&   r'   z<interface-on-off-list>r&   zbridge-learning offbridge-igmp-versionzmcast igmp version3zbridge-igmp-version 2bridge-mld-versionzmcast mld versionzbridge-mld-version 1bridge-unicast-floodzbridge port unicast flood flagz?under the port (for vlan aware bridge): bridge-unicast-flood onzPunder the bridge (for vlan unaware bridge): bridge-unicast-flood swp1=on swp2=onbridge-multicast-floodz bridge port multicast flood flagzAunder the port (for vlan aware bridge): bridge-multicast-flood onzRunder the bridge (for vlan unaware bridge): bridge-multicast-flood swp1=on swp2=onbridge-broadcast-floodz bridge port broadcast flood flagzAunder the port (for vlan aware bridge): bridge-broadcast-flood onzRunder the bridge (for vlan unaware bridge): bridge-broadcast-flood swp1=on swp2=onbridge-vlan-protocolzbridge vlan protocolz802.1q802.1adzbridge-vlan-protocol 802.1qbridge-vlan-statszbridge vlan statsr'   zbridge-vlan-stats offbridge-arp-nd-suppressz bridge port arp nd suppress flagzAunder the port (for vlan aware bridge): bridge-arp-nd-suppress onzRunder the bridge (for vlan unaware bridge): bridge-arp-nd-suppress swp1=on swp2=onbridge-mcstatszbridge multicast stats)r&   r'   r>   r)   r   r   zbridge-mcstats offbridge-l2protocol-tunnelzlayer 2 protocol tunneling) allcdpzcdp lacpzcdp lacp lldpzcdp lacp lldp pvstzcdp lacp lldp stpzcdp lacp pvstzcdp lacp pvst stpzcdp lacp stpzcdp lldpzcdp lldp pvstzcdp lldp pvst stpzcdp lldp stpzcdp pvstzcdp pvst stpzcdp stplacpz	lacp lldpzlacp lldp pvstzlacp lldp pvst stpzlacp lldp stpz	lacp pvstzlacp pvst stpzlacp stplldpz	lldp pvstzlldp pvst stpzlldp stppvstzpvst stpstpz"<interface-l2protocol-tunnel-list>)zdunder the bridge (for vlan unaware bridge): bridge-l2protocol-tunnel swpX=lacp,stp swpY=cdp swpZ=allzWunder the port (for vlan aware bridge): bridge-l2protocol-tunnel lacp stp lldp cdp pvstzJunder the port (for vlan aware bridge): bridge-l2protocol-tunnel lldp pvstzDunder the port (for vlan aware bridge): bridge-l2protocol-tunnel stpzDunder the port (for vlan aware bridge): bridge-l2protocol-tunnel allbridge-ports-condone-regexzJbridge ports to ignore/condone when reloading config / removing interfacesFz5bridge-ports-condone-regex ^[a-zA-Z0-9]+_v[0-9]{1,4}$)r   r$   r    bridge-vlan-vni-mapzSingle vxlan supportz'bridge-vlan-vni-map 1000-1001=1000-1001)r   r    bridge-always-upzPEnabling this attribute on a bridge will enslave a dummy interface to the bridge)r   r   r&   r'   )r   r$   r   )mhelpattrs)rJ   rK   rM   rO   r`   rj   rb   c                     [        U 5      S-  $ Nd   intxs    r   <lambda>bridge.<lambda>  s    3q6C<r   c                     [        U 5      S-  $ rx   rz   r|   s    r   r~   r     s    Ar   c                     [        U 5      S-  $ rx   rz   r|   s    r   r~   r     s    SVc\r   c                     [        U 5      S-  $ rx   rz   r|   s    r   r~   r     s    Q#r   c                     [        U 5      S-  $ rx   rz   r|   s    r   r~   r      s    SVc\r   c                     [        U 5      S-  $ rx   rz   r|   s    r   r~   r   !  s    CFSLr   c                     [        U 5      S-  $ rx   rz   r|   s    r   r~   r   "  s    Q#r   c                     [        U 5      S-  $ rx   rz   r|   s    r   r~   r   #  s    s1v|r   c                     [        U 5      S-  $ rx   rz   r|   s    r   r~   r   $  s    Ar   c                     [        U 5      S-  $ rx   rz   r|   s    r   r~   r   %  s    s1v|r   )
r;   r9   rS   r_   rc   rR   rd   re   rk   ri   r   r   r   )disabledr)   r   	automaticr>   r   enabledr6   r   r   r   )r   r   r   c                 B    [         R                  R                  U S5      $ Nr   )r   )_ifla_brport_multicast_router_dict_to_intgetr|   s    r   r~   r   n  s    &:j:j:n:noprs:tr   c                     U $ Nr   r|   s    r   r~   r   t  s    r   c                    [         R                  " U 5        [        R                  " U /UQ70 UD6  U R                  R                  U l        U R                  5       U l        U R                  R                  U R                  R                  < S[        U R                  5      < 35        [        R                  " [        R                  R                  U R                  R                  SS95      U l        [        R                  R                  U R                  R                  SS9U l        [        R                  " [        R                  R%                  U R                  R                  SS95      U l        U R                  R                  SU R&                  -  5        [        R                  R%                  U R                  R                  S5      U l        U R                  R                  SU R(                  -  5        [        R                  " [        R                  R%                  U R                  R                  S	S95      U l        U R                  R                  S
U R*                  -  5         [        R                  " U R-                  S5      5      U l        U R                  R                  SU R.                  -  5        [        R                  R%                  U R                  R                  S5      =(       d    / U l        SU l        [        R                  " [        R                  R%                  U R                  R                  S5      5      U l        [        R                  " [        R                  R%                  U R                  R                  SS9SS9U l        [        R                  " [        R                  R%                  U R                  R                  SS9SS9U l        [=        U R:                  5      U l        U R@                  U RB                  U RD                  U RF                  U RH                  U RJ                  S.U l&        U RN                  U RP                  U RR                  U RT                  U RV                  U RX                  S.U l-        0 SU R\                  S 4_SU R\                  S 4_SU R^                  [`        Rb                  4_SU Rd                  [`        Rf                  4_SU Rd                  [`        Rh                  4_SU Rj                  [`        Rl                  4_SU Rj                  [`        Rn                  4_SU Rj                  [`        Rp                  4_SU Rj                  [`        Rr                  4_SU Rj                  [`        Rt                  4_SU Rv                  [`        Rx                  4_SU Rz                  [`        R|                  4_S U Rz                  [`        R~                  4_S!U Rz                  [`        R                  4_S"U Rz                  [`        R                  4_S#U Rz                  [`        R                  4_S$U Rz                  [`        R                  4_U Rz                  [`        R                  4U R                  [`        R                  4U R                  [`        R                  4U R                  [`        R                  4U R                  [`        R                  4U R                  [`        R                  4U R                  [`        R                  4U R                  [`        R                  4U R                  [`        R                  4U R                  [`        R                  4U R                  [`        R                  4S%.EU lP        U R                  U R                  U R                  U R                  U R                  U R                  U R                  U R                  U R                  S&.	U lU        [        R                  " [        R                  R%                  U R                  R                  S'5      SS9U lV        g ! [0         a    SU l         GNf = f)(Nz: using reserved vlan range r%   module_nameattrrh   warn_on_untagged_bridge_absencez0bridge: init: warn_on_untagged_bridge_absence=%s"vxlan_bridge_default_igmp_snoopingz3bridge: init: vxlan_bridge_default_igmp_snooping=%s#allow_arp_nd_suppress_only_on_vxlanz.bridge: init: arp_nd_suppress_only_on_vxlan=%s&net.bridge.bridge-allow-multiple-vlansTz'bridge: init: multiple vlans allowed %sbridge_mac_ifaceNNbridge_set_static_mac_from_port/vxlan_bridge_igmp_snooping_enable_port_mcrouter)r!   zbridge-vxlan-arp-nd-suppressF)rl   rq   rm   rp   ro   rn   rU   rT   rj   r   rA   r?   rB   r=   rf   r@   r<   rE   rC   r(   r`   )rb   r7   r/   r5   r-   rH   rO   rG   rM   rJ   rK   )	r9   r;   rS   r_   ri   rc   rd   re   rR   bridge_vxlan_port_learning)Wr   __init__r   	__class__r   name_get_reserved_vlan_range_resv_vlan_rangeloggerdebugstrr   get_boolean_from_stringpolicymanagerpolicymanager_apiget_attr_defaultdefault_stp_ondefault_vlan_statsget_module_globalsr   #_vxlan_bridge_default_igmp_snoopingarp_nd_suppress_only_on_vxlan
sysctl_getbridge_allow_multiple_vlans	Exceptionbridge_mac_iface_listr   r   r   bridge_vxlan_arp_nd_suppressr{    bridge_vxlan_arp_nd_suppress_int_l2protocol_tunnel_set_all_l2protocol_tunnel_set_stp_l2protocol_tunnel_set_cdp_l2protocol_tunnel_set_pvst_l2protocol_tunnel_set_lldp_l2protocol_tunnel_set_lacpl2protocol_tunnel_callback"_query_check_l2protocol_tunnel_all"_query_check_l2protocol_tunnel_stp"_query_check_l2protocol_tunnel_cdp#_query_check_l2protocol_tunnel_pvst#_query_check_l2protocol_tunnel_lldp#_query_check_l2protocol_tunnel_lacp&query_check_l2protocol_tunnel_callback_query_check_br_attr_wait_query_check_br_attr_stpr   IFLA_BR_STP_STATE#_query_check_br_attr_boolean_on_offIFLA_BR_MCAST_STATS_ENABLEDIFLA_BR_VLAN_STATS_ENABLED_query_check_br_attr_booleanIFLA_BR_VLAN_FILTERINGIFLA_BR_MCAST_QUERY_USE_IFADDRIFLA_BR_MCAST_SNOOPINGIFLA_BR_MCAST_QUERIERIFLA_BR_MCAST_ROUTER_query_check_br_attr_stringIFLA_BR_VLAN_PROTOCOL_query_check_br_attr_intIFLA_BR_MCAST_STARTUP_QUERY_CNTIFLA_BR_MCAST_LAST_MEMBER_CNTIFLA_BR_MCAST_HASH_MAXIFLA_BR_MCAST_HASH_ELASTICITYIFLA_BR_PRIORITYIFLA_BR_MCAST_IGMP_VERSIONIFLA_BR_MCAST_MLD_VERSION#_query_check_br_attr_int_divided100IFLA_BR_MAX_AGEIFLA_BR_FORWARD_DELAYIFLA_BR_HELLO_TIMEIFLA_BR_AGEING_TIMEIFLA_BR_MCAST_MEMBERSHIP_INTVL!IFLA_BR_MCAST_STARTUP_QUERY_INTVLIFLA_BR_MCAST_LAST_MEMBER_INTVL"IFLA_BR_MCAST_QUERY_RESPONSE_INTVLIFLA_BR_MCAST_QUERIER_INTVLIFLA_BR_MCAST_QUERY_INTVL%_bridge_attribute_query_check_handler_query_check_brport_attr_int'_query_check_brport_attr_boolean_yes_no'_query_check_brport_attr_boolean_on_off%_query_check_brport_attr_portmcrouter%_brport_attribute_query_check_handlerr   )selfargskargss      r   r   bridge.__init__y  s_   tD14151NN++	!%!>!>!@@W@WY\]a]r]rYstu#;;++<< NN33! = 
 #0"A"A"R"R//$ #S #

 05/L/L++>> NN336 ? 0
, 	L??@ 	A 4A3R3R3e3eNN##04
0 	O DDE 	F .3-J-J++>> NN33: ? .
* 	JTMoMoop	4/4/L/L HI0D, 	CdFfFffg%2%D%D%W%WX\XfXfXoXo  rD  &E  &K  IK" */4/L/L++>>'')J0
, @E?\?\++>> NN33F ?  @
< -2,I,I++>> NN333 ?  -
) 14D4U4U0V- 222222444444+
' ::::::<<<<<<7
3#6
t==tD#6
 > >E#6
 488$:P:PQ	#6
 tGGIiIij#6
  $"J"JDLkLk!l#6
  $"C"CTE`E`!a#6
 !B!BDDgDg h#6
 t@@$B]B]^#6
 !B!BDD^D^ _#6
  A A4C\C\]#6
 #T%E%EtGaGa$b#6
" T::D<`<`a##6
$ T::D<^<^_%#6
& t<<d>Y>YZ'#6
( d;;T=_=_`)#6
*  $"?"?AVAV!W+#6
, "D$A$A4CbCb#c-#6
. $(#@#@$B`B`"a"FFH\H\]BBDD^D^_!EEtG^G^_"FFH`H`a DDdFiFij!EEtGmGmn!EEtGkGkl!EEtGnGno!EEtGgGgh DDdFdFdeE#6
2L !% A A $ A A#KK#KK&*&R&R$($P$P&*&R&R&*&R&R#'#M#M
6
2 +0*G*G++>>'', +
'G  	4 04D,	4s   4*a a/.a/c                 *    U(       d  SnX4$ US-  nX4$ Nr   r   ifla_brport_group_maskifla_brport_group_maskhis     r   r   "bridge._l2protocol_tunnel_set_pvst  ,    ''*$ &?? %+$%??r   c                 *    U(       d  SnX4$ US-  nX4$ Nr   r   r   s     r   r   !bridge._l2protocol_tunnel_set_cdp  r   r   c                 *    U (       d  Sn X4$ U S-  n X4$ r   r   r   s     r   r   !bridge._l2protocol_tunnel_set_stp#  ,    %%(" &?? #c)"%??r   c                 *    U (       d  Sn X4$ U S-  n X4$ N   r   r   s     r   r   "bridge._l2protocol_tunnel_set_lacp+  r   r   c                 *    U (       d  Sn X4$ U S-  n X4$ Ni @  r   r   s     r   r   "bridge._l2protocol_tunnel_set_lldp3  s,    %%+" &?? #f,"%??r   c                     g)N)@     r   r   s     r   r   !bridge._l2protocol_tunnel_set_all;  s     -r   c                     U =(       a    U S-  $ r   r   r   s     r   r   )bridge._query_check_l2protocol_tunnel_stp@      %F*@3*FFr   c                     U=(       a    US-  $ r   r   r   s     r   r   )bridge._query_check_l2protocol_tunnel_cdpD      'J,Ds,JJr   c                     U=(       a    US-  $ r   r   r   s     r   r   *bridge._query_check_l2protocol_tunnel_pvstH  r  r   c                     U =(       a    U S-  $ r  r   r   s     r   r   *bridge._query_check_l2protocol_tunnel_lldpL  s    %I*@6*IIr   c                     U =(       a    U S-  $ r   r   r   s     r   r   *bridge._query_check_l2protocol_tunnel_lacpP  r	  r   c                 $    U S:H  =(       a    US:H  $ )Nr  r  r   r   s     r   r   )bridge._query_check_l2protocol_tunnel_allT  s    %*<=iBZ_hBiir   c                     U R                  X5      nUR                  [        R                  -  (       a  U R	                  U5      (       d  SnU R                  X5      nU R                  X5      nU=(       a    U$ )NF)check_bridge_vlan_aware_portlink_privflagsifaceLinkPrivFlagsBRIDGE_PORTcheck_bridge_port_vid_attrs#syntax_check_vxlan_in_vlan_aware_br(syntax_check_bridge_allow_multiple_vlans)r   ifaceobjifaceobj_getfuncretvalc1c2s         r   syntax_checkbridge.syntax_checkX  sg    228N""%7%C%CC33H==55hQ::8V}"r   c                    SnU R                   (       d  UR                  [        R                  -  (       a  UR                  (       a  S nUR                   H  nU" U5      =(       d    /  Hw  nUR                  [        R
                  -  (       d  M'  U R                  U5      nU(       a6  XG:w  a1  U R                  R                  UR                  < SU< S35        SnMu  UnMy     M     U$ )NTz	: ignore za: multiple vlans not allowed under bridge (sysctl net.bridge.bridge-allow-multiple-vlans not set)F)
r   	link_kindifaceLinkKindBRIDGElowerifacesVLAN_get_vlan_idr   errorr   )r   r  r  resultvlan_idbrport_nameobjsub_intf_vlan_ids           r   r  /bridge.syntax_check_bridge_allow_multiple_vlansa  s    //H4F4FI]I]4]bjbvbvG'33+K8>B>C}}}'9'999+/+<+<S+A("w'B KK--19/M N &+F$"2 ?  4 r   c                     UR                  S5      (       aU  U R                  U5      (       d  UR                  S5      (       a)  U R                  R                  SUR                  -  5        gg)NrZ   rY   zD%s: bridge-access given, bridge-vids and bridge-pvid will be ignoredFT)get_attr_valueget_ifaceobj_bridge_vids_valuer   warningr   r   r  s     r   r  "bridge.check_bridge_port_vid_attrsr  s_    ##O4400::$$]33KK !/19!? @r   c                 ^   UR                   [        R                  -  (       Ga
  U R                  U5      nU(       d  gSnU H  nU" U5      nU(       aT  US   R                  [
        R                  -  (       a/  U R                  R                  UR                  < SU< S35        SnU(       d  Mo  US   R                  S5      (       d  M  U R                  (       d  M  US   R                  [
        R                  -  (       a  M  U R                  SUS   R                  -  5        SnM     U$ g)NTr   : z<: vlan sub-interface is not supported in a vlan-aware bridgeFri   z@'bridge-arp-nd-suppress' is not supported on a non-vxlan port %s)r  r  BRIDGE_VLAN_AWARE_get_bridge_port_listr%  r&  r)  r   r+  r   r3  r   VXLAN	log_error)r   r  r  portsr,  	port_name
port_obj_ls          r   r  #bridge.check_bridge_vlan_aware_port{  s   ""%7%I%III..x8EF"	-i8
*Q-"9"9M<N<N"NKK%%)1	'C D #FJqM001IJJ666"1//-2E2EEENN $F$.qM$6$6$7 8 #F # Mr   c                 N    U R                  SUR                  < SU< S3U5        g )Nz:`bridge-access` attribute is mandatory when vxlan device (z ) is part of vlan aware bridge ())r=  r   )r   r  
bridgenames      r   _error_vxlan_in_vlan_aware_br$bridge._error_vxlan_in_vlan_aware_br  s     "--56>	@r   c                 v   U(       d  gUR                   [        R                  -  (       Ga  UR                  [        R
                  -  (       a  UR                  S5      (       a  gUR                  (       a  UR                  O/  H  nU" U5      nU(       d  M  US   nU R                  X25      nUR                  [        R                  -  (       d  MN  U R                  U5      nUR                  S5      nU(       a  U(       a  U R                  UUUS9(       a  M  U R                  UUR                  5          g   g)NTrZ   r   rY   )pvidF)r%  r&  r<  r  r  r  r3  upperifaces_get_bridge_vidsr:  r4  get_attr_value_first_compare_vidsrE  r   )	r   r  r  ifaceifaceobj_upper_listifaceobj_upperbridge_vidsvidsrH  s	            r   r  *bridge.syntax_check_vxlan_in_vlan_aware_br  s   !4!4449P9PSeSqSq9q&&77191E1E--2M&6u&=#*!4Q!7"33EL!003E3W3WWW>>xHD#88GD ##11+267;  2  =  = ::8;I;N;NP$! N" r   c                     U R                   [        R                  -  =(       d)    U R                  S5      =(       d    U R                  S5      $ )Nr"   r   )r%  r&  r'  rK  r  s    r   
_is_bridgebridge._is_bridge  sE    ""]%9%99 C--n=C--.AB	Dr   c                     / nUR                  S5      =(       d    /  H*  nUS:w  d  M  UR                  UR                  5       5        M,     SR                  U5      $ )Nr"   none )r3  extendsplitjoin)r   r  bridge_portsbrports       r   _get_ifaceobj_bridge_ports!bridge._get_ifaceobj_bridge_ports  sR    --n=CCF##FLLN3 D xx%%r   c                     U R                   R                  U5      (       a4  U R                   R                  U5      (       d  U R                  SU-  US9  gg)NzMmisconfiguration of bridge attribute(s) on existing non-bridge interface (%s)rT  FT)cachelink_existslink_is_bridger=  )r   r  ifnames      r   check_valid_bridgebridge.check_valid_bridge  sP    ::!!&))$**2K2KF2S2SNNjmss  GN  Hr   Nc                    U R                  U5      (       a   U R                  XR                  5      (       d  g UR                  [        R
                  :w  a  [        R                  Ul        U=R                  [        R                  -  sl        [        R                  " UR                  S5      5      (       aF  U=R                  [        R                  -  sl        U=R                  [        R                  -  sl        U=R                   ["        R$                  -  sl        [&        R(                  Ul        U R-                  UR                  U R/                  U5      U5      $ )Nr   )rU  rf  r   	link_typeifaceLinkTypeLINK_NALINK_MASTERr%  r&  r'  r   r   rK  r  r  r:  role	ifaceRoleMASTERifaceDependencyTypeMASTER_SLAVEdependency_typeparse_port_listr_  )r   r  ifacenames_alls      r   get_dependent_ifacenamesbridge.get_dependent_ifacenames  s    x((0G0GR_R_0`0`!6!66 - 9 98m222(()F)FGZ)[\\-"6"66##'9'K'KK#)))#6#C#C ##HMM$($C$CH$M$24 	4r   c                     U R                   R                  UR                  5      (       d  g U R                   R                  UR                  5      $ r   )rb  bridge_existsr   
get_slavesr6  s     r    get_dependent_ifacenames_running'bridge.get_dependent_ifacenames_running  s7    zz''66zz$$X]]33r   c                     UR                   nU(       a  U$ U R                  U5      nU(       a  U R                  UR                  U5      $ g r   )r(  r_  rs  r   )r   r  	port_listr>  s       r   r;  bridge._get_bridge_port_list  sE    
 ((	//9''u==r   c                 n    U R                  U5      nU(       a  U R                  UR                  U5      $ S $ r   )r_  rs  r   )r   r  r>  s      r   "_get_bridge_port_list_user_ordered)bridge._get_bridge_port_list_user_ordered  s2     //9=Bt##HMM59LLr   c                 x    UR                  S5      nU(       a"  U(       a  U$ [        R                  " SU-  5      $ g )Nrr   %s)rK  recompile)r   r  
get_stringbridge_port_condone_regexs       r   _get_bridge_port_condone_regex%bridge._get_bridge_port_condone_regex  s:    $,$A$AB^$_! %00::u'@@AAr   c                    UR                  S5      nU(       d  g  [        R                  " SUS5      nU(       d  g  [        US   5      nUS::  a  g  U R                  UR                  US   5      nU(       d  g U R                  R                  UR                  < S[        U5      < S35        [        R                  " 5       n[        R                  " 5       U-
  U:  ay  [        U V	s/ s H'  n	U R                  R                  U	5      (       a  M%  S	PM)     sn	5      (       a  g [        R                   " S5        [        R                  " 5       U-
  U:  a  Mx  g g ! [         a)    U R                  UR                  < SUS   < S35         g f = f! [         a  nUn S nAGN1S nAff = fs  sn	f ! [         a5  nU R                  UR                  < S
[        U5      < 35         S nAg S nAff = f)NrT   	[\s\t]\s*r   r   z: invalid waitport value ''z: waiting for ports z to exist ...Fz: unable to process waitport: )rK  r  r[  r{   r   log_warnr   rs  
IndexErrorr   infor   timerl   rb  rc  sleep)
r   r  portlistwaitport_valuewaitportvalswaitporttimewaitportliste	starttimeps
             r   _process_bridge_waitportbridge._process_bridge_waitport  s   !667HIv	.88L.!DL"<?3
 q &#33HMM4@O E  KKmmS%68 9		IIIK)+|;| :|!#zz55a8 | : ; ;

1	 IIK)+|;!  "--a: ;  ':  	.MMmmSV- . .	.s   F/ E 
F/ F 1F/ 9A0F/ )$F*F*F/ $2F/ 0F
F/ FF/ 
F'F"F/ "F''F/ /
G.9+G))G.c                      U R                  SU-  U5        g ! [         a.  nU R                  R                  [	        U5      5         S nAg S nAff = f)Nz'/proc/sys/net/ipv6/conf/%s/disable_ipv6)
write_filer   r   r  r   )r   portenabler  s       r   _enable_disable_ipv6bridge._enable_disable_ipv6  sD    	%OOELfU 	%KKSV$$	%s    
A$AAc                 8    U H  nU R                  X25        M     g r   )r  )r   r>  stater  s       r   handle_ipv6bridge.handle_ipv6$  s    A%%a/ r   c                    [         R                  " SU5      (       am   U R                  S5      S:X  aW  SnU HO  nU R                  U5      nU(       a)  Xd:w  a$  U R	                  SUR
                  -  S-   U5          OU(       d  MM  UnMQ     U R	                  UR
                  S-   U-   U5        g! [         a  nUS[        U5      -  -  n SnANCSnAff = f)	zpretty print bridge port add errors.
since the commands are batched and the kernel only returns error
codes, this function tries to interpret some error codes
and prints clearer errors z#RTNETLINK answers: Invalid argumentr   r)   Nz%s: zJnet.bridge.bridge-allow-multiple-vlans not set, multiple vlans not allowedz
%sr9  )r  searchr   _get_vlan_id_from_ifacenamer=  r   r   r   )r   errstrbridgeifaceobjbridgeportsvlanidbport
currvlanidr  s           r   _pretty_print_add_ports_error$bridge._pretty_print_add_ports_error(  s     99:FCC*??#KLPSS!F!,%)%E%Ee%L
!)3 $v~7J7J/J/{0| ~L!M %%:%/F "- 	~**T1F:NK  *&3q6/)*s$   AB- ;B- B- -
C7CCc                 T   U R                  U5      nU R                  U5      n/ nUR                  S5      nS n[        R                  " U5      (       a  U R                  UR                  U5      nU R                  X5        [        R                  R                  (       d  U R                  R                  UR                  5      nU(       a  U H  nU(       a  X;  d  M  U(       aE  UR                  U5      (       a/  U R                  R                  UR                  < SU< S35        M]  U R                   R#                  U5        U" U5      (       d  U R                   R%                  U5        U R'                  U/S5        M     O/ nU(       d  / $ Sn	[)        U5      R+                  [)        U5      5      n
/ n/ nU R-                  U5       H  nX;   d  M
  UR/                  U5        M     U(       a  UR/                  U5        U R0                  R3                  5         U GHN  n [        R                  R4                  (       dK  U R                  R7                  U5      (       d+  U R9                  UR                  < SU< S3U5        U	S-  n	Mo  U R                  R;                  U5      n[        R                  R4                  (       dA  U R=                  U5      (       d+  U R?                  UR                  < S	U< S
3SU-  -   5        M  U R0                  RA                  XR                  5        UR/                  U5        U R'                  U/S5        U R0                  RC                  U5        GMQ     U R0                  RK                  5         U R                  RM                  UR                  U5        U	(       a  U R9                  S5         URO                  U5        U$ ! [D         a0  nU R                  RG                  [I        U5      5         S nAGM  S nAff = f! [D         a     U$ f = f)Nrt   : port zA will stay enslaved as it matches with bridge-ports-condone-regexr)   r   z: bridge port z does not existr   z: skipping port , zinvalid ether addr %sr>   z+bridge configuration failed (missing ports))(r;  r  rK  r   r   bridge_always_upr   r  ifupdownflagsflagsPERFMODErb  ry  matchr   r  netlinklink_set_nomaster	link_downr  set
differencer  appendiproute2batch_startDRYRUNrc  r=  get_link_address_valid_ethaddrr  link_set_master
addr_flushr   r+  r   batch_commitforce_add_slave_listremove)r   r  r  r  bridgeportscondoneregexrunningbridgeportsr  dummy_brportr  errnewbridgeportsnewly_enslaved_portsnewbridgeports_orderedbr_port
bridgeport	hwaddressr  s                    r   
_add_portsbridge._add_ports@  sx   00:"&"E"Eh"O $889KL(()9::  00LL 	%%h<""++!%!6!6x}}!E!/E&%*B27N7T7TUZ7[7[ KK,,  @H  @M  @M  OT  .U  V$66u=  066 LL2259((%#6 0 &("I[)44S9K5LM!!#>>xHG(&--g6 I  #)),7!!#0J%++22

..z::NN%-]]J$@AIK1HC JJ77
C	$**11$:M:Mi:X:XMMX]]",#.0G#,1-#- . --j--H$++J7  *s3((4# 1, 	""$

''7KLNNHI	 !''5 $##  !!#a&)  	##	s9   "A(OA9OA$O	P 
P&$PP
P'&P'c                 >    SU R                   R                  U5      -  $ )z}
dummy brport will have pre-formated name: brport-if$BRIDGE_IFINDEX
That way we can avoid collision with existing interfaces
zbrport-if%d)rb  get_ifindex)r   bridge_names     r    get_dummy_brport_name_for_bridge'bridge.get_dummy_brport_name_for_bridge  s     tzz55kBBBr   c                 8   U R                  U5      nU R                  R                  U5      (       dW  U R                  R	                  U< SU< 35        U R
                  R                  USS9  U R
                  R                  U5        UR                  U5        U$ )Nz.: bridge-always-up yes: enslaving dummy port: dummy)re  kind)	r  rb  rc  r   r  r  link_addlink_up_forcer  )r   r  r  r  s       r   r  bridge.bridge_always_up  s}    <<[Izz%%l33KKU`bnopLL!!G!DLL&&|4%%l3r   c                    UR                  S5      nU(       d  g  [        U5      nU(       d  g U R
                  R                  SUR                  -  5         [        R                  " 5       n[        R                  " 5       U-
  U:  a  [        U Vs/ s H/  nU R                  SUR                  < SU< S35      S:w  d  M-  S	PM1     sn5      (       a  g [        R                  " S
5        [        R                  " 5       U-
  U:  a  M  g g ! [         a&    U R                  UR                  < SU< S35         g f = fs  snf ! [         a5  nU R                  UR                  < S[        U5      < 35         S nAg S nAff = f)NrU   z: invalid maxwait value 'r  z1%s: waiting for ports to go to fowarding state ..z/sys/class/net/z/brif/z/statera   Fr   z: unable to process maxwait: )rK  r{   r   r  r   r   r  r  rl   read_file_oneliner  r   )r   r  r  maxwaitr  r  r  s          r   _process_bridge_maxwaitbridge._process_bridge_maxwait  sF   //0@A	'lG
 L 	 	.		IIIK)+w6x 9x!--&mmQ01478 x 9 : : 

1 IIK)+w6  	MMx}} 	9  	.MMmmSV- . .	.sG   D
 :E ,D=D=E 2E 
-D:9D:=E 
F+E<<Fc              #      #    [         R                  " [        U5      S 5       H"  u  p#[        U5      nUS   S   US   S   4v   M$     g 7f)Nc                     U S   U S   -
  $ )Nr   r   r   )x_ys    r   r~   (bridge._ints_to_ranges.<locals>.<lambda>  s    3q6CPQF?r   r   r   )	itertoolsgroupby	enumeratelist)r   intsabs       r   _ints_to_rangesbridge._ints_to_ranges  sH     %%io7RSDAQAA$q'1R58## Ts   A	Ac           
      ~   / n U Hu  nSU;   aP  UR                  S5      u  pE[        U5      [        U5      pTUR                  [        [	        XES-   5      5      5        MY  [        U5      nUR                  U5        Mw     U$ ! [         a1    U R                  R                  SSR                  U5      -  5         U$ f = f)zpreturns expanded list of integers given set of string ranges
example: ['1', '2-4', '6'] returns [1, 2, 3, 4, 6]
-r   zunable to parse vids '%s' )
r[  r{   rZ  r  ranger  r   r   r5  r\  )r   	rangelistr,  partr  r  s         r   _ranges_to_intsbridge._ranges_to_ints  s     	!$;::c?DAq63q6qMM$uQA"78D	AMM!$ " 	  	KK = ggi0!1 2		s   A;B 7B<;B<c                 v    U R                  U5       VVs/ s H  u  p#X#:X  a  SU-  OSX#4-  PM     snn$ s  snnf )Nz%dz%d-%d)r  )r   	vids_intsstartends       r   _compress_into_rangesbridge._compress_into_ranges  sL    )-)=)=i)HJ)H:5  %|e5,1FF)HJ 	J Js   5c                 j    [        U5      R                  U5      [        U5      R                  U5      4$ r   )r  r  )r   
vids1_ints
vids2_intss      r   
_diff_vidsbridge._diff_vids  s,    :))*5s:7Q7QR\7]]]r   c                 "   U(       a#  U R                  U5      nU R                  U5      nOU R                  U5      nUn[        U5      R                  U5      nU(       a)  [        U5      U;   a  UR	                  [        U5      5        U(       a  gg)z4Returns true if the vids are same else return false FT)r  r  symmetric_differencer{   r  )r   vids1vids2rH  expand_ranger  r  set_diffs           r   rL  bridge._compare_vids  sw     --e4J--e4J--e4JJz?77
CCI)OOCI&r   c                    UR                  S5      nU(       Ga9  0 n[        R                  R                  (       d%  U R                  R                  UR                  5      n0 nUR                  5       nU H  nUR                  S5      u  pxXU'   M     [        [        UR                  5       5      5      R                  [        UR                  5       5      5      n	U	 H)  nU R                  R                  UR                  U5        M+     [        UR                  5       5       H,  nU R                  R                  UR                  XU   5        M.     g [        R                  R                  (       dt  U R                  R                  UR                  5      nU(       aG  [        UR                  5       5       H)  nU R                  R                  UR                  U5        M+     g g g )NrQ   =)rK  r  r  r  sysfsbridge_get_mcqv4srcr   r[  r  r  keysr  r  bridge_del_mcqv4srcbridge_set_mcqv4src)
r   r  attrvalrunning_mcqv4srcmcqssrclistskvk_to_dels
             r   _set_bridge_mcqv4src_compat"bridge._set_bridge_mcqv4src_compat  s`    //0AB! &&//#'::#A#A(--#P DmmoGwws|Q  4 0 5 5 789DDT$))+EVWH11(--C $))+&11(--GL '$$--#zz==hmmL.3356AMM55hmmQG 7   .r   c                    UR                  S5      nUR                  S5      nU(       d  U(       d  g U(       a  U R                  UR                  U5      nU(       d(  U R                  UR                  < SS< SU< S35        g U H  n UR	                  S5      u  pg[        U5      nU R                  R                  U5      nU(       a"  X:X  a  MK  U R                  R                  Xh5        U R                  R                  Xg5        M     U(       GaF  U R                  UR                  U5      nU(       d(  U R                  UR                  < SS< SU< S35        g U H  n UR	                  S5      u  pjU
R	                  S
5      nU R                  U5      nU R                  R                  U5      u  pU(       a|  U R                  X5      u  nnU(       a+  U R                  R!                  UU R#                  U5      5        U(       a-  U R                  R%                  UU R#                  U5      5        M  M  U R                  R%                  Xl5        M     g g ! [         a<  n	U R                  UR                  < SU< S[        U	5      < S	35         S n	A	GM  S n	A	ff = f! [         a<  n	U R                  UR                  < SU< S[        U	5      < S	35         S n	A	GM  S n	A	ff = f)Nr^   r]   z: could not parse 'rY  r  r  : failed to set pvid `` (rC  ,: failed to set vid `)rK  rs  r   r  r[  r{   rb  get_pvidr  bridge_vlan_del_pvidbridge_vlan_add_pvidr   r   r  get_pvid_and_vidsr  bridge_vlan_del_vid_listr  bridge_vlan_add_vid_list)r   r  bridge_port_pvidsbridge_port_vidsr  r  r  rH  running_pvidr  valrQ  vids_int_running_vidsvids_to_delvids_to_adds                    r   _set_bridge_vidinfo_compat!bridge._set_bridge_vidinfo_compat  s_   
 %99:MN#889KL )9 ++HMM;LMH (/B 13 4 9#$773<LTt9D#'::#6#6t#<L#'/$ MM>>tRMM66tB   ++HMM;KLH02BD E5"#''#,KT99S>D $ 4 4T :H&*jj&B&B4&HOA# $ G 3k& MMBB4$($>$>{$KM& MMBB4$($>$>{$KM ' >>tN!   ! 9MM&mmQA#8 9 998 ! 5MM"--CF#4 5 55s>   
AI6I$CJ#9J#
J $0JJ #
K)-0K$$K)c                 l    SU-  n U R                  U5      nU=(       a    US:g  $ ! [         a     gf = f)z4Returns True if running stp state is on, else False z"/sys/class/net/%s/bridge/stp_stater)   F)r  r   )r   rD  stp_state_filerunning_stp_states       r   _is_running_stp_state_onbridge._is_running_stp_state_onP  sG     >zI	 $ 6 6~ F$A):c)AA 		s   & 
33c                 v    UR                  S5      nU(       d  U R                  $ [        R                  " U5      $ )z;Returns true if user specified stp state is on, else False r%   )rK  r   r   r   )r   r  stp_attrs      r   _is_config_stp_state_onbridge._is_config_stp_state_onZ  s4     00>&&&,,X66r   c                     UR                  S5      nU(       a  U$ UR                  [        R                  -  (       a  U R                  b  U R                  $ U R                  S5      $ )Nr?   )rK  r  r  BRIDGE_VXLANr   get_attr_default_value)r   r  mcsnoops      r   get_bridge_mcsnoop_valuebridge.get_bridge_mcsnoop_valueb  sZ    //0@AN""%7%D%DD77C???**+;<<r   c           
      f    U R                   R                  U5      n[        U5      (       d  g U(       d3  [        R                  R                  U R                  R                  UUS9nU(       d+  Uc(  U R                  R                  U< SU< SU< S35        g U(       d\  U(       dU  UbR  U R                  U5      n	U	(       a9  U" U	5      n
X:w  a+  XU'   U R                  R                  U< SU< SU	< 35        g g g U(       ah  U" U5      nX:w  aZ  XU'   Ub,  U R                  R                  U< SU< SU< SU< S	35        g U R                  R                  U< SU< SU< 35        g g g ! [         a9  nU R                  R                  U< S
U< S
[        U5      < 35         S nAg S nAff = f)Nr   re  r   z: ignoring rY  z2: capability probably not supported on this systemz: reset z to default: : set z (cache rC  r9  )8_ifla_br_attributes_translate_user_config_to_netlink_mapr   callabler   r   get_iface_defaultr   r   r   r   r?  r  r   r5  r   )r   ifla_info_datalink_just_createdre  nl_attr	attr_nameuser_configcached_valuetranslate_funcdefault_valuedefault_value_nluser_config_nlr  s                r   *fill_ifla_info_data_with_ifla_br_attribute1bridge.fill_ifla_info_data_with_ifla_br_attributen  s   1	L!ZZ^^_fgNN+++==OO $ 7 7!" P  %)= !!%+Y#E F'8\=U !% ; ;I F  (6m'D$'7 3Cw/((&R[]j)kl 8 ! !/!<!1.<7+#/((vyZegs)tu((FI{)[\ 2   	LKK	3q6 JKK	Ls1   +E- A+E- A E- =AE- &E- -
F07/F++F0c                    [        5       nUR                  nU R                  R                  SU-  5        U R                  R                  U5      n U[        R                  ==   S-  ss'   U[        R                  ==   S-  ss'   U R                  R                  5        H8  u  pxU R                  UUUUUUR                  U5      UR                  U5      S9  M:     U R                  UUU[        R                  SU R                  U5      UR                  [        R                  5      S9  U(       ab  U R                  UUU[        R                   SUR                  S5      =(       d    U R"                  UR                  [        R                   5      S9   U R%                  U5      (       a  U R'                  U5      (       d  SU[        R(                  '   U R                  R                  SU-  5        UR*                  R-                  U R                  S5      [.        R0                  -  UR*                  UR                  '   ODU R'                  U5      (       a.  U R                  R                  S	5        SU[        R(                  '   U(       a  U R6                  R9                  XT5        g g ! [         a     GN0f = f! [         a5  n	U R                  R3                  U< S
[5        U	5      < 35         S n	A	NoS n	A	ff = f)Nz%s: applying bridge settingsry   )rI  rJ  re  rK  rL  rM  rN  r?   rh   r   z-%s: stp state reset, reapplying port settingsr   z9%s: bridge-stp not specified but running: turning stp offz: bridge stp: )dictr   r   r  rb  get_link_info_datar   r   r   _ifla_br_attributes_mapitemsrS  rK  r   r   rA  r   r   r;  r7  r   module_flags
setdefaultr
   r   r5  r   r  link_set_bridge_info_data)
r   r  rJ  bridge_vlan_awarerI  re  cached_ifla_info_datarL  rK  r  s
             r   up_apply_bridge_settingsbridge.up_apply_bridge_settings  s   7&@A $

 = =f E	 "$"H"HIcQI!$"H"HISPI #'">">"D"D"FI;;-"3#$99)D266w? <  #G 	77)///&55h?.2243N3NO 	8 		
 ;;-"377-$99:MNiRVRiRi266t7V7VW < 	I++H5544V<<=>N4#9#9:KK$$%TW]%]^ --88AF#;;< ))(--8
 0088KK$$%`a=>N4#9#9: LL226J m  		f  	IKKA GHH	Is2   6J* B+J; AJ; *
J87J8;
K:+K55K:c                    SnU Ht  n SU;   aD  UR                  S5      u  pV[        U5      [        U5      peU R                  XQR                  US9  MN  [        U5      nU R                  XQR                  5        Mv     U$ ! [        R
                   a  nUeS nAf[         a1    U R                  R                  UR                  < SU< S35         M  f = f)NTr  )r  z: unable to parse vid 'r  )	r[  r{   _handle_reserved_vlanr   
exceptionsReservedVlanExceptionr   r   r5  )r   r  rQ  retr  vavbr  s           r   _check_vidsbridge._check_vids  s    A6!8WWS\FB Wc"g..r==b.IQB..r==A  
 33  6###+==!%5 66s$   AA?&A??CB:CCc                     U R                   R                  U5      u  p#U(       a  U R                  U5      nOS nU(       a  SU-  nXE4$ S nXE4$ )Nr  )rb  r&  r  )r   	ifacenamerH  rQ  ret_vidsret_pvids         r   _get_running_vids_n_pvid_str#bridge._get_running_vids_n_pvid_str  sW    ZZ11)<
11$7HHTzH ## H##r   c           
         U(       d  UR                   [        R                  -  (       ah  UR                  [        R
                  -  (       dF  U(       a  U(       a  [        U5      S:  d	  US   U:w  a   U R                  UUR                  S   5        gU R                  U5      n U(       a  [        U5      OSn/ nUnSn	Un
 U R                  X5      (       d  gU R                   R#                  UR                  5      u  pU(       d  U(       d  SnS/nU(       a  U R%                  X5      u  pxU(       a  X:w  a  US:w  a  Un	U	(       a  X;   a  X;  a  UR'                  U	5         U(       a^  X;   a  UR1                  U
5        U R3                  SX5      nU R4                  R7                  UR                  U R9                  U5      U5         U	(       a&  U R4                  R=                  UR                  U	5         U(       a6  U R4                  R?                  UR                  U R9                  U5      U5         U
(       a.  U
W:w  a'  U R4                  RA                  UR                  U
5        ggg! [         a3    U R                  R                  UR                  < SU< S35        Sn GNf = f! [(        R*                   a  nUeSnAf[         aM  nU R-                  SUR                  -  S[/        U5      -  -   SU-  -   S	[/        U5      -  -   US
S9   SnAGNSnAff = f! [         aD  nU R;                  UR                  < S[/        U5      < S[/        U5      < S35         SnAGNSnAff = f! [         a;  nU R;                  UR                  < SU	< S[/        U5      < S35         SnAGNSnAff = f! [         aD  nU R-                  UR                  < S[/        U5      < S[/        U5      < S3US
S9   SnAGNSnAff = f! [         a;  nU R-                  UR                  < SU
< S[/        U5      < S3U5         SnAgSnAff = f)zThis method is a combination of methods _apply_bridge_vids and
_apply_bridge_port_pvids above. A combined function is
found necessary to do the deletes first and the adds later
because kernel does honor vid info flags during deletes.

r   r   Nz: unable to parse pvid 'r  z %s: failed to process vids/pvidsz
 vids = %sz
pvid = %s (%s)F)raise_errorz: failed to del vid `r   rC  z: failed to del pvid `r"  r  )!r%  r&  r<  r  r  SINGLE_VXLANlenrE  rI  r  r{   r   r   r5  r   rh  rb  r&  r  addrc  rd  r=  r   r  1remove_bridge_vlans_mapped_to_vnis_from_vids_listr  bridge_vlan_del_vid_list_selfr  r  r$  bridge_vlan_add_vid_list_selfr%  )r   bportifaceobjrQ  rH  isbridger-  pvid_intr0  r1  pvid_to_delpvid_to_addr+  r/  r  s                 r   _apply_bridge_vids_and_pvid"bridge._apply_bridge_vids_and_pvid  s    ]44}7J7JJS`SoSo  sE  sR  sR  TRts4y1}Q422=3@3L3LQ3OQ((.	$(s4yaH 0	=##M88)-)E)EmFXFX)Y&L  ! !sOOK> + +0A".K!8/ ,	I,%%k2!SSTXZgu{}}::=;M;M*.*D*D*5+78@B	D}}11-2D2D/:<	L}}::=;M;M*.*D*D*5+78@B	.{l:22=3E3E0;=  ;{{  	KK,114!9 :H		j // 	G 	=NN=)../1=s4y1HI'-.06A? )e  =	=  	I',,c+.>AH I I	I  	D',,k3q6C D D	D  	L!.!3!3S5E!$Q )*7U  L	L  	.!.!3!3[#a& J,. .	.s   $I+ J+ B
J+ #A%L 	-M/ 7=N7 53P +9J('J(+L?KLALL
M,(9M''M,/
N490N//N47
P9P  P
Q1QQc                 "    / nUR                  S5       H6  nUR                  U R                  UR                  S5      S   /5      5        M8     U$ ! [         a3  nU R
                  R                  S[        U5      -  5        / s SnA$ SnAff = f)zB
Get all vlans that the user wants to configured in vlan-vni maps
rs   r  r   z3get_bridge_vlans_mapped_to_vnis_as_integer_list: %sN)r3  rZ  r  r[  r   r   r   r   )r   r  rQ  vlans_vnis_mapr  s        r   /get_bridge_vlans_mapped_to_vnis_as_integer_list6bridge.get_bridge_vlans_mapped_to_vnis_as_integer_list  s    		D"*"9"9:O"PD00.2F2Fs2KA2N1OPQ #Q K 	KKSVYZ[V\\]I	s   AA 
B(B	B	Bc                 j   UR                   [        R                  -  (       d  U$ / nU(       a)  U R                  U5       H  nUR	                  U5        M     U(       a)  U R                  U5       H  nUR	                  U5        M     U H  n UR                  U5        M     U$ ! [         a     M(  f = f)z
For single vxlan we need to remove the vlans mapped to vnis
from the vids list otherwise they will get removed from the brport
)r  r  rs  r  r  r  r   )r   bridge_ifaceobjvxlan_ifaceobj	vids_listuser_config_vidsvidvlans          r   rv  8bridge.remove_bridge_vlans_mapped_to_vnis_from_vids_list  s    
 --0B0O0OOKKO\ '', ] KKN[ '', \ %D  & %   s   B$$
B21B2c                    S nS n/ nS nUR                  S5      nU(       a-  [        R                  " SU5      nUnSn	U R                  U5        OxUR                  S5      =(       d    Sn	U R	                  U5      n
U
(       a  [        R                  " SU
5      nUR                  S5      nU(       a  [        R                  " SU5      nU(       a  UnO	U(       a  UnU	S:X  a  U(       a  US   nOU(       a  UnOSnOS nU R                  XUS	5        g )
NrZ   r  r   r\   
[\s\t,]\s*rY   r   r>   F)rK  r  r[  r  r4  r~  )r   ry  rP  bridge_pvidrQ  pvids
vids_final
pvid_finalbport_accessallow_untagged
bport_vidsbport_pvidss               r   *_apply_bridge_vlan_aware_port_settings_all1bridge._apply_bridge_vlan_aware_port_settings_all  s     

$99/J88L,7DE"N,,];*??@WXa\aN<<]KJxxz:'<<]KK{;J$JU""1X
(
 
J(()3U	<r   c           
      z   SnUR                  S5      (       a  UR                  S5      (       a  g U R                  R                  SUR                  -  S-   5        U R	                  U5      nU(       a  [
        R                  " SU5      nOS nUR                  S5      nU(       a  [
        R                  " SU5      S	   nOS nUR                  R                  U R                  S	5      [        R                  -  (       a  S
nOSnU R                  U5      nU(       d)  U R                  R                  SUR                  -  5        g U R                  R                  5         U GH5  n	U R                  R!                  UR                  U	5      (       d0  U R                  R                  SUR                  -  SU	-  -   5        M_  U R                  R                  UR                  < SU	< 35        U" U	5      n
U
(       d  M  U
 H  nU(       d>  UR                  R                  U R                  S	5      [        R"                  -  (       a  MH   U(       a  U R%                  XU5        Md  U R&                  (       a  U R)                  UR                  X5        M  M     GM8     U R                  R5                  5         U(       a  [/        SUR                  -  5      eg ! [*        R,                   a  nUeS nAf[.         aC  nS
nU R                  R1                  UR                  < S[3        U5      < 35         S nAGM7  S nAff = f)NFr]   r^   z"%s: applying bridge configuration zspecific to portsr  rY   r  r   Tz%s: cannot find bridgeportsz%s: skipping bridge configz for port %s (missing port)z$: processing bridge config for port r9  z!%s: errors applying port settings)rK  r   r  r   r4  r  r[  rZ  r   r
   r   r;  r   r  r  rb  bridge_port_existsr   r  r   _check_untagged_bridgerc  rd  r   r5  r   r  )r   r  r  r]  r  rP  r  port_processed_overrider  r  bportifaceobjlistry  r  s                r   _apply_bridge_port_settings_all&bridge._apply_bridge_port_settings_all  s   ))*<==--.ABB ="--(*=> 	? 99(C-=;;33MB,<Q?;;!!%%dii5334&*#&+#00:;;:HMMIJ!!# E ::00FF  !=x}}!L5u<"= >KK'}}e5 6 0 7$!2 0"//33DIIcB //0(GG -KI==33HMM=c > "3 !@ 	""$>MNN  "77 G  CKK''8==#a&(IJs*   K"-KL:(K**L:77L55L:c                 0   UR                   [        R                  -  (       at  U" UR                  S   5      nU(       aW  US   (       aL  US   R                  [
        R                  -  (       d&  U R                  R                  SU-  5        SU l	        g g g g g )Nr   z%s: untagged bridge not found. Please configure a bridge with untagged bridge ports to avoid Spanning Tree Interoperability issue.F)
r%  r&  r)  r(  r  r  r  r   r5  r   )r   rD  bridgeportifaceobjr  lower_ifaceobj_lists        r   r  bridge._check_untagged_bridge  s    ''-*<*<<"23E3Q3QRS3T"U"':1'=+A.==@R@^@^^##  %i  lv  %v  w7<4 _ (>" =r   c                     U R                   R                  UR                  5      nU(       d:  UR                   H)  nU R                   R	                  U5      (       d  M%  SU4s  $    gSU4$ )NT)FNF)rb  get_bridge_name_from_portr   rI  rd  )r   r  rD  us       r   bridge_port_get_bridge_name"bridge.bridge_port_get_bridge_name'  s]    ZZ99(--H
 ))::,,Q//7N * j  r   c                    U(       aC  U R                   R                  UR                  U5        U R                  UR                  /S5        U R	                  X25      nU R                  X25      n U R                  XU5        g ! [         a6  nU R                  UR                  < S[        U5      < 3U5         S nAg S nAff = f)Nr>   r9  )
r  r  r   r  rJ  _get_bridge_pvidr  r   r=  r   )r   r  r  r  should_enslave_portrP  r  r  s           r    up_bridge_port_vlan_aware_bridge'bridge.up_bridge_port_vlan_aware_bridge3  s    LL((Dhmm_c2++KJ++KJ	;;HS^_ 	NNx}}c!f=xH	s   .B 
C,B<<Cc                    U R                  U5      u  p4U(       d  g U R                  R                  U5      nU(       a  U R                  UUUU5        U" U5      S   nU R	                  UR
                  /UUUS9  UR                  R                  U R
                  S5      [        R                  -  UR                  U R
                  '   g )Nr   )target_portsr  r  r]  )
r  rb  bridge_is_vlan_awarer  up_apply_brports_attributesr   rZ  r[  r
   r   )r   r  r  r  r  vlan_aware_bridger  s          r   up_bridge_portbridge.up_bridge_port@  s    +/+K+KH+U( JJ;;KH11(2B2=2EG
 +;7:((x}}o2A:J;L 	) 	N
 ,4+@+@+K+KDIIWX+Y\g\v\v+vdii(r   c                 v   UR                   [        R                  -  (       a  U R                  X5      (       d  gU(       dx  U R                  R                  UR                  5      (       dN  UR                  R                  U R                  S5      [        R                  -  UR                  U R                  '   gg)NFr   T)r  r  r:  r  rb  r  r   rZ  r[  r
   r   )r   r  r  rJ  s       r   up_check_bridge_vlan_aware!bridge.up_check_bridge_vlan_awareW  s    ""%7%I%II44XPP$TZZ-L-LX]]-[-[3;3H3H3S3STXT]T]_`3ado  eH  eH  4H%%dii0r   c                 v    [        5       nU R                  5        H  nUR                  S5      u  p4XAU'   M     U$ Nr  )rV  r[  )rM  configentryre  values        r   parse_interface_list_value!bridge.parse_interface_list_valuea  s:     &&(E!KK,MF"6N ) r   c                    Sn0 nUc  U R                   nXV:w  aE  U=U[        R                  '   nU R                  R	                  U< SU< SU(       a  SOS< 35        O U[        R                  	 UR                  S5      n	U	(       d   [        R                  R                  SS5      n	U	(       a  [        R                  " U	5      OUn
XR                  R                  U[        R                  5      :w  aC  U R                  R	                  U< SU< SU
(       a  SOS< 35        [        R                  U
0nSnXx4$ ! [
         a     Nf = f)	a4  
brport_ifaceobj.link_kind & ifaceLinkKind.VXLAN
and
brport_ifaceobj.link_privflags & ifaceLinkPrivFlags.BRIDGE_PORT

Checks are not performed in this function and must be verified
 before. This is done this way to avoid calling this method on
 non vlan & bridge port interfaces thus wasting a bit less time
Nr9  z: set bridge-learning r&   r'   zvxlan-learningvxlanzE: vxlan learning and bridge learning out of sync: set vxlan-learning )r   r   IFLA_BRPORT_LEARNINGr   r  r   rK  r   r   r   r   r   rb  get_link_info_data_attributeIFLA_VXLAN_LEARNING)r   r  brport_ifaceobjr.  brport_ifla_info_slave_datauser_config_brport_learning_nlcached_brport_learningr  rI  brport_vxlan_learning_configbrport_vxlan_learning_config_nls              r   $sync_bridge_learning_to_vxlan_brport+bridge.sync_bridge_learning_to_vxlan_brporti  sR    )1-1-L-L* *C 11'(A(AB( KK5STY^-^`/0I0IJ (7'K'KL\']$ ,+8+J+J+[+[\ceu+v( , +0*G*GHd*e' 	( +jj.U.UVacgc{c{.||KK5TTZ_-_a #668WXND ##=  s   D: :
EEc                    UR                   nS n [        5       n[        5       n	/ n
0 nUR                  R                  U R                   S5      [        R
                  -  nU R                  R                  U5      nU(       aH  / nU H>  nX;  a%  U R                  R                  U< SU< S35        M-  UR                  U5        M@     UnU GH  nU" U5      nU(       d  M  SnUU;  au  U Ho  nU(       a  M  UR                  R                  U R                   S5      [        R                  -  (       d  MJ  SnU R                  R                  U< SU< S35          O   U(       a  M  U
R                  U5        US   U	U'   [        5       UU'   [        R                  R                  (       d'  UU;  a!  U R                  R                  U5      UU'   GM  0 UU'   GM     U
(       d  U R!                  U5        g U R                  R                  U< SU
< 35        U R                  R#                  U5      n0 n0 n0 nU R$                  R'                  5        GHk  u  nnUR)                  U5      nU R*                  R                  U5      nU(       d  M<  U(       d3  [,        R.                  R1                  U R2                  R4                  UUS	9nU(       a  S
U;   a   U R7                  U5      n[=        U	R?                  5       5       GH  nUR)                  U5      nUR                   n[        R                  R                  (       d#  UR                  U0 5      R                  US 5      nOS nU(       d'  [A        U5      [        :X  a  UR                  U5      nOUnU(       d3  [,        R.                  R1                  U R2                  R4                  UUS	9nUnU[B        RD                  :X  a  UUU'    U(       ad  U RF                  (       aR  URH                  [J        RL                  -  (       d0  U R                  RO                  UR                   < SU< S35        GMS  OU(       aZ  U RF                  (       d  U RQ                  SS5      nObU RF                  (       a%  URH                  [J        RL                  -  (       a  GM  O+U[B        RR                  :X  a  U RU                  XoUUU5        GM  U(       a  U" U5      n U U:w  aO  U X   U'   U R                  R                  U< SU< SU< SU< 35        U R                  RW                  SU-  5        U[B        RX                  :X  a  U UU'   UUU'   GMf  GMi  Uc  GMo  U R[                  U5      n!U!(       d  GM  U" U!5      n"U[B        RX                  :X  a  UUU'   U R\                  UU'   URH                  [J        RL                  -  (       a  GM  [        R                  R                  (       db  X;  a]   U R                  R_                  U[B        R`                  5      (       a,  U"U:w  a#  U R                  RW                  U< SU< S35        GM_   U"U:w  d  GMi  U R                  R                  U< SU< SU< SU!< 35        U R                  RW                  SU-  5        U"X   U'   GM     GMn     S n$[=        UR'                  5       5       GH<  u  nn%U	R                  U5      nU(       Ga  URH                  [J        RL                  -  (       Ga  URd                  [f        Rh                  -  (       Ga  U Rk                  UR                   UUU%UR                  U5      UR                  U5      5      u  n&n'U Rl                  (       a*  [n        Rp                  " U Rs                  U5      5      (       d  U(       ay  U%R                  [B        Rt                  5      (       dU  U R                  Rw                  U5      S:w  a6  SU%[B        Rt                  '   U R                  R                  U< SU< S35        UR                  U5      n(U(cR  U$c  U Ry                  UUUU	U5      n$U$(       a&  Sn)U R                  R                  U< SU< S35        O,U Rz                  n)O[}        [n        Rp                  " U(5      5      n)U R                  R_                  U[B        RD                  5      n*U)U*:w  aU  U)U%[B        RD                  '   U((       d:  U R                  R                  U< SU R~                  (       a  SOS< SU< S35        O U%[B        RD                  	 URd                  [f        R                  -  (       ai  UnU R                  R_                  U[B        R                  5      n+U+(       d6  U R                  R                  U< SU< S 35        S!U%[B        R                  '   OS n&0 n'U%(       d
  U'(       d  GM   U R                  R                  UU&U'U%S"9  GM?     U R!                  U5        U(       a  U R                  U5        g g ! [8         a    U R;                  SU< SU< S35         GM  f = f! [8         a     GM  f = f! [8         a:  n#U R                  RW                  U< SU< S[c        U#5      < 35         S n#A#GNfS n#A#ff = f! [8         a     GNf = f! [8         a;  n#U R                  RO                  U< SU< S[c        U#5      < 35         S n#A#GMB  S n#A#ff = f! [8         a&  n#U R;                  [c        U#5      U5         S n#A#GN#S n#A#ff = f)#Nr   z: not enslaved to bridge z: ignored for nowFTr  z: already processedz&: applying bridge port configuration: rD  r  zerror while parsing 'rY  r  r9  z?: 'bridge-arp-nd-suppress' is not supported on a non-vxlan portri   r!   rE  
(cache %s)z0: bridge port peerlink: ignoring bridge-learningz: peerlink check: z2: no configuration detected, resetting to default r   z:: vxlan bridge igmp snooping: enable port multicast routerz: QinQ bridge detected: z : set bridge-arp-nd-suppress offz: set bridge-arp-nd-suppress r&   r'   z by default on vxlan port (rC  z-: enabling vlan_tunnel on single vxlan devicer   )re  r  rI  ifla_info_slave_data)Er   rV  rZ  r   r
   r   rb  ry  r   r  r  r   r  r  r  get_link_info_slave_data'bridge_process_vidinfo_mcqv4src_maxwaitget_bridge_multicast_snooping_ifla_brport_attributes_maprY  rK  <_ifla_brport_attributes_translate_user_config_to_netlink_mapr   r   rH  r   r   r  r   r=  r  valuestyper   IFLA_BRPORT_NEIGH_SUPPRESSr   r%  r&  r<  r5  get_mod_subattrIFLA_BRPORT_GROUP_FWD_MASKifla_brport_group_fwd_maskr   r  r?  r   "get_link_info_slave_data_attributeIFLA_BRPORT_PEER_LINKr   r  r  r  r  r   r   r   rA  IFLA_BRPORT_MULTICAST_ROUTER get_bridge_port_multicast_routeris_qinq_bridger   r{   r   rs  IFLA_BRPORT_VLAN_TUNNELr  $link_set_brport_with_info_slave_dataapply_bridge_port_vlan_vni_map),r   r  r  r]  r  r  re  single_vxlan_device_ifaceobjbrports_ifla_info_slave_databrport_ifaceobj_dictbrport_name_list"cache_brports_ifla_info_slave_datar  running_brportsnew_targetsr.  r  brport_listport_already_processedbrportifaceobjcached_bridge_mcsnoopbridge_ports_learningbridge_ports_vxlan_arp_suppresscached_bridge_ports_learningrL  rK  	br_configrO  r  brport_configrN  rM  rR  r!   default_netlinkr  qinq_bridger  r  rI  user_config_neigh_suppressconfig_neigh_suppress"brport_neigh_suppress_cached_valuebrport_vlan_tunnel_cached_values,                                               r   r  "bridge.up_apply_brports_attributes  sB
   '+$P	-.2f(.2f .013.&.&;&;&?&?		3&OR]RuRu&u#"jj33F;O  #/K"9((]hjp)qr#**;7	 $0
 #.'.t4;-2* #77.9N#:#:~?Z?Z?^?^_c_h_hjm?nq|  rL  rL  @L  @L9= 6 $ 0 0U[]a1b c % /: 21(//55@^,T2=AV4T:,22;;L`@`GKzzGjGjkoGp>tDGI>tD1 (4 $<<XFKKVUefg$(JJ$L$LV$T!$&!.0++-( '+&F&F&L&L&N"	7$99)D	!%!b!b!f!fgn!o%   !. ? ? Q Q$(NN$;$;%& !R !I  i'%(,(G(G	(RI
 (,,@,G,G,I'JO$3$H$H$SM"1"6"6K(..77'I'M'Mk[]'^'b'bcjlp'q'+(  	?d2 -6MM+,FM,5M((5(G(G(Y(Y(,(?(?#.!* )Z ) #0K
 $"A"AAGR7D%*#'#E#EoNgNgjwj}j}N}$(KK$7$7;C==+9W %X %-!2'+'I'I262F2FG_aj2kK%)%G%GOLeLehuh{h{L{$, !D$C$CC 778T8C\S ! #)7)D)\9Q_8EgN KK,,FKYbdo-pq KK--l\.IJ"d&?&?? BP1+>HT8E @ &1"&"="=i"H"7.<W.EO&$*C*CC MY <[ IEIEdEd 5k B#2#<#<}?R?R#R$,'4':':'C'CHo%x+/::+X+XYdfj  gA  gA  ,B  ,B/>,/N040A0AEK[CZ 1[,4	 ,B  /,> $ 0 04:KT[2] !^ $ 1 1,2M NUd < I' Rm (KI 'O@ K =AA]AcAcAe<f88"6":":;"G#'11M4G4GGG'669K9W9WWW ,0+T+TU]UbUbUdU`UpUjUnUnozU{UqUuUu  wB  VC,D(D. LLQVQnQn 99(CR R/  ;>>t?`?`aa$(JJ$O$OP[$\`a$a]^78Y8YZ KK,,sy  |G  .H  I 2Q1T1TU`1a.19&.*.*=*= ( + / 4 0+K '451 KK,,ou  xC  .D  E484Y4Y103E4Q4QRl4m0n-9=9f9f#77:6
 -0RRWl3D4S4ST9 !KK,,#)43T3T4Z_+_al!n! ;D<[<[ \ '558J8W8WW7F4:>**:g:g' 88;7
  ? KK,,flny-z{XY78T8TU  D%'N...ZII#.!%+91L	 J C =gT 88B
 (//0LM (e  ) % NNiYb+cd$%h  ) %$%~ ,5 %x(,(9(9Z`bmorstou:v(w(w%xr  ) ! !< % Z++FKQTUVQW,XYYZ
  	-NN3q68,,	-s)  Cl'  l' 6:l' 4.l' &Bl' 5C l' i	'Dl' )A'i5l' *i5>l' ?3i52B8l' /l' 
A9l' Ajl' )K l' 
kBl' =kl' 	$i2-l' 1i22l' 5
j?l' jl' 
k/k l' kl' 
kl' kl' 
l$)/ll' l$$l' '
m1mmc                    UR                   n U R                  R                  5         UR                  S5       H  n UR	                  S5      u  pEU R                  U/5      nU R                  U/5      n[        U5      [        U5      :w  a  U R                  U5      s  $ U R                  R                  X&S5        U R                  R                  X&U5        M     U R                  R                  5         g! [
         a    U R                  U5      s s  $ f = f! [
         a+  nU R                  U< S[        U5      < 35         SnAgSnAff = f)zh
bridge vlan add vid <vlan-id> dev vxlan0
bridge vlan add dev vxlan0 vid <vlan-id> tunnel_info id <vni>
rs   r  Fz8: error while processing bridge-vlan-vni-map attribute: N)r   r  r  r3  r[  r   ._bridge__warn_bridge_vlan_vni_map_syntax_errorr  rt  rx   bridge_vlan_add_vlan_tunnel_infor  r=  r   )	r   r  
vxlan_namevlan_vni_map	vlans_strvni_strvlansvnisr  s	            r   r  %bridge.apply_bridge_port_vlan_vni_map	  s*   
 ]]
	rMM%%' ( 7 78M NV)5););C)@&I ,,i[9++WI6u:T*GGUU ;;JuU>>zRVW !O" MM&&( ! VGGUUV  	rNN]gilmniopqq	rsB   .D C6AD AD 6DD DD 
E#!E		Ec                 @    U R                   R                  SU-  5        g )Nz(%s: syntax error: bridge-vlan-vni-map %s)r   r5  )r   user_config_vlan_vni_maps     r   '__warn_bridge_vlan_vni_map_syntax_error.bridge.__warn_bridge_vlan_vni_map_syntax_error!	  s    FIaabr   c                    UR                   [        R                  -  (       a+  UR                  S5      =(       d    SR	                  5       S:H  $ U H  nXb:X  a  M
  UR                  U5      nU(       d  M$  UR                  [        R                  -  (       d  MH  UR                  =(       d    /  HK  nU" U5      =(       d    /  H3  n	U	R                  S5      =(       d    SR	                  5       S:X  d  M1        g   MM     M     g)zDetect QinQ bridge
Potential improvement: We could add a ifaceobj.link_privflags called
BRIDGE_QINQ but for now it is not necessary.
rf   r  rg   zvlan-protocolTF)
r  r  r:  rK  lowerr   r%  r&  r)  r(  )
r   r  r.  r  r  r  qinq_running_brportqinq_running_brport_ifaceobjlower_ifacelower_ifaceobjs
             r   r  bridge.is_qinq_bridge$	  s     ""%7%I%II112HIORVVX\eee (7#&5/C/G/GH[/\,3/99M<N<NNN'C'O'O'USU'U.>{.K.Qr.QN . C CO T ZXZaacgpp'+ /R (V (7 r   c                     U R                  U5        U R                  U5        U R                  XR                  U5      5        g r   )r2  r  r  r;  r6  s     r   r  .bridge.bridge_process_vidinfo_mcqv4src_maxwait@	  s7    ''1((2$$X/I/I(/STr   c           	      <   SnSnU(       a  UR                  SS5      R                  5        Hj  nU(       d  M  U R                  R                  U5      n	[	        U	5      (       d)  U R
                  R                  U< SU< SU< S35        M`  U	" Xg5      u  pgMl     U R                  R                  U[        R                  5      n
SnUc  SnU
c  Sn
Xe:w  ab  U(       aF  U R
                  R                  U< SU< S	U< 35        U R
                  R                  S
U-  5        SnXcU   [        R                  '   Xz:w  aa  U(       aD  U R
                  R                  U< SU< S	U< 35        U R
                  R                  S
U
-  5        XsU   [        R                  '   gg)z
Support for IFLA_BRPORT_GROUP_FWD_MASK and IFLA_BRPORT_GROUP_FWD_MASKHI
Since this is the only ifupdown2 attribute dealing with more than 1 netlink
field we need to have special handling for that.
r   r!  rY  r9  z7: bridge-l2protocol-tunnel ignoring invalid parameter 'r  TNz: set bridge-l2protocol-tunnel r  F)replacer[  r   r   rG  r   r5  rb  r  r   IFLA_BRPORT_GROUP_FWD_MASKHIr  r   r  )r   re  r.  r  rM  !cached_ifla_brport_group_fwd_maskr  ifla_brport_group_fwd_maskhigroupcallback#cached_ifla_brport_group_fwd_maskhilog_mask_changes               r   r  !bridge.ifla_brport_group_fwd_maskE	  s    &'"'($$,,S#6<<>::>>uE))KK''pv  yD  FK  )L  MOWXr  PRL.0L ? /3jj.[.[\gim  jK  jK  /L+ -401-.623/
 &J  fVacn!op!!,1R"RS"'Ys5d6U6UV'N  fVacn!op!!,1T"TU[w5d6W6WX	 Or   c           
         UR                  S5      nU(       d  [        R                  R                  SSS9n U(       a9  [	        U5        U R
                  R                  UR                  < SU< 35        U$  g ! [         aC  nU R
                  R                  UR                  < SU< S[        U5      < 35         S nAg S nAff = f)Nmtuaddressr   z: set bridge mtu z: invalid bridge mtu r9  )rK  r   r   r   r{   r   r  r   r   r5  r   )r   r  user_config_mtur  s       r   get_bridge_mtubridge.get_bridge_mtuv	  s    "77>+==NN% O O
	lO$  HMM?![\&&    	lKK8==Racfghci jkk	ls   ?A: :
C9CCc           
      
   UR                   n[        R                  R                  (       a  SnO%U R                  R                  UR                   5      nU(       d[  U R                  R                  U5        SnU R                  U5      nU(       a%  U R                  R                  X6[        U5      5        O SnU R                  R                  SU-  5        U R                  XU5      nU R                  XU5         U R!                  X5      nU R#                  XUUS9  Sn
 U R                  R+                  UR                   5      n
U
(       d   UR,                  [.        R0                  :w  a  U R2                  R5                  5         U
 Ho  nU" U5      nU(       aB  US   R6                  [8        R:                  -  (       a  U R2                  R=                  U5        MT  U R2                  R?                  U5        Mq      U R2                  RA                  5         g g U RE                  UUUS	9  UR,                  [.        R0                  :w  a  U R2                  R5                  5         U
 Ho  nU" U5      nU(       aB  US   R6                  [8        R:                  -  (       a  U R2                  R=                  U5        MT  U R2                  R?                  U5        Mq      U R2                  RA                  5         O  U RK                  X5        g ! [$         a6  n	U R                  R'                  U< S[)        U	5      < 35         S n	A	GN#S n	A	ff = f! [$         a5  n	U R                  RC                  U< S[)        U	5      < 35         S n	A	g S n	A	ff = f! [F        RH                   a  n	U	eS n	A	f[$         a6  n	U R                  R'                  U< S
[)        U	5      < 35         S n	A	GNS n	A	ff = f! [$         a6  n	U R                  RC                  U< S[)        U	5      < 35         S n	A	GN/S n	A	ff = f! UR,                  [.        R0                  :w  a  U R2                  R5                  5         U
 Ho  nU" U5      nU(       aB  US   R6                  [8        R:                  -  (       a  U R2                  R=                  U5        MT  U R2                  R?                  U5        Mq      U R2                  RA                  5         f ! [$         a5  n	U R                  RC                  U< S[)        U	5      < 35         S n	A	f S n	A	ff = ff = f! [$         a?  n	U R                  R'                  UR                   < S[)        U	5      < 35         S n	A	g S n	A	ff = f)NFTz%s: bridge already exists)r  z: apply bridge ports settings: r  r   r9  )r  r]  z: apply bridge settings: z: setting bridge mac address: )&r   r  r  r  rb  rc  r  link_add_bridger  r  link_set_mtur{   r   r  r  r_  r  r  r   r5  r   ry  ri  rj  rk  r  r  r  r  KEEP_LINK_DOWNr  link_upr  r   r  rc  rd  _up_bridge_mac)r   r  r  re  rc  rJ  
bridge_mtur]  r  r  running_portsr  ifaceobj_lists                r   	up_bridgebridge.up_bridge	  s\   ''K**00?KLL((0 $,,X6J

''C
OL %KK86AB ;;HXij%%hCTU	Z#'??8#N ,,XIZBV - X
 	C JJ11(--@M  !!]%:%::))+&A$4Q$7M%-*:*I*IL^LmLm*m//2 MM))!, 'CMM..0 ; 00BRCT 1 V !!]%:%::))+&A$4Q$7M%-*:*I*IL^LmLm*m//2 MM))!, 'CMM..0 ;	`;?  	ZKKQTUVQW XYY	Z4 ! CKK%%&#a&&ABBC // 	G 	TKK63q6 RSS	T ! CKK%%&#a&&ABBC !!]%:%::))+&A$4Q$7M%-*:*I*IL^LmLm*m//2 MM))!, 'CMM..0  CKK%%&#a&&ABBC ;   	`KKWZ[\W] ^__	`s   ;"L  ,N
 ;M N
 O& 3T9 
M+M  M
N+NN
O#N  O#-+OP) O##P) &
P&0+P!!P&)B.T6S32T63
T2=+T-(T6-T22T69
V5U==Vc                 <   U R                   (       a4  U R                   S   (       a   U R                   S   (       a  U R                   $ U R                  (       a  U R                  R                  SU R                  -  5        U R                   H  nU" U5      nS nU(       a9  U H3  n[        R
                  " UR                  S5      5      nU(       d  M1  UnM5     U(       d"  U R                  R                  U5      (       d  Mv  U(       d  U R                  R                  U5      nXF4U l         U R                   s  $    gU R                  (       a  U R                  U5      =(       d    /  H  n	U" U	5      =(       d    /  H  n
U
R                  [        R                  :w  d  M#  [        R
                  " U
R                  S5      5      nU(       a  UR                  5       nOU R                  R                  U	5      nU(       d  M  X4U l         U R                   s  s  $    M     g)Nr   r   zbridge mac iface list: %sr  r   )r   r   r   r   r   strip_hwaddressrK  rb  rc  r  r   r  r%  r&  r<  r  )r   r  re  r  bridge_mac_intfr'  	iface_macr/  iface_user_configured_hwaddressr  port_objs              r   _get_bridge_macbridge._get_bridge_mac	  s     T%:%:1%=$BWBWXYBZ(((%%KK9D<V<VVW#'#=#= 0 A 	 ,:?:O:OPSPhPhitPu:v7::(GI	  - !)?)?)P)P  $

 ; ;O LI *9(D%,,,' $>T - 11 ??IORO 0 6 <" <H))]-@-@@:?:O:OPXPmPmnyPz:{7:(G(M(M(OI
 )-

(C(CD(II$9594ED1#'#8#88 != P& r   c                     UR                   [        R                  -  (       dG  U(       a?  UR                  S5      (       a(  U R                  R                  UR                  US SS S9  g g g g )Nr  T)r  r   remote)r  r  r:  r3  r  bridge_fdb_addr   )r   r  
bridge_macs      r   _add_bridge_mac_to_fdbbridge._add_bridge_mac_to_fdb	  sh    &&);)M)MMR\aiaxax  zC  bD  bDMM((
VZcg(h bDR\Mr   c                    UR                  S5      (       a  gUR                  nU R                  XU5      u  pEU R                  R	                  U< SU< SU< S35        U(       a  U R
                  R                  U5      nU R                  R	                  U< SU< 35        U(       a/  [        R                  " U5      [        R                  " U5      :X  a  gU R                  R                  U< SU< S35         U R                  R                  X55        gU R                  XR
                  R                  U5      5        g! [         a5  nU R                  R                  U< S	[        U5      < 35         SnAgSnAff = f)
a  
We have a day one bridge mac changing problem with changing ports
(basically bridge mac changes when the port it inherited the mac from
gets de-enslaved).

We have discussed this problem many times before and tabled it.
The issue has aggravated with vxlan bridge ports having auto-generated
random macs...which change on every reboot.

ifupdown2 extract from policy files an iface to select a mac from and
configure it automatically.
r  Nz: _get_bridge_mac returned (r  rC  z: cached hwaddress value: z: setting bridge mac to port z macr9  )r3  r   r0  r   r   rb  r  r   mac_str_to_intr  r  link_set_addressr   r   r6  )r   r  r  re  mac_intfr5  rN  r  s           r   r$  bridge._up_bridge_mac	  s+    "";// #33HFVW"Hj: 	;   ::66v>LKK&,WX 4 4\ BeFZFZ[eFf fKKPXYZ>--fA
 ''**2M2Mf2UV	  >  VSV!<==>s   =E 
F+E>>Fc                    UR                   [        R                  -  (       a  U R                  X5        g UR                  [
        R                  -  (       a  U R                  X5        g [        U R                  R                  S0 5      R                  5       5      n[        UR                  R                  5       5       H7  nXC;   d  M
  U R                  R                  UR                  < SU< S35        M9     g )Nrv   z#: invalid use of bridge attribute (z) on non-bridge stanza)r  r  r  r  r%  r&  r'  r(  r  _modinfor   r  r  r   r5  r   )r   r  r  bridge_attributesifaceobj_config_attrs        r   _up
bridge._up)
  s    ""%7%C%CC;-"6"66NN86 !%T]]%6%6w%C%H%H%J K(,X__-A-A-C(D$'<KK''+3==:N)P Q )Er   c                 b   U R                  U5      (       d  g UR                  nU R                  R                  U5      (       d  g  U R                  R                  U R                  U5      5         U R                  R                  U5      nU(       aT  U R                  US5        UR                  [        R                  :w  a$  U H  nU R                  R                  U5        M       U R                  R                  U5        g ! [         a     Nf = f! [         a6  nU R                  UR                  < S[        U5      < 3U5         S nANhS nAff = f! [         aM  nUR!                  ["        R$                  5        U R&                  R)                  [        U5      5         S nAg S nAff = f)Nr)   r9  )rU  r   rb  rc  r  link_delr  r   ry  r  ri  rj  rk  r  r=  r   
set_statusifaceStatusERRORr   r+  )r   r  r  re  r&  r  r  s          r   _downbridge._down8
  sN   x((zz%%f--	LL!!$"G"G"OP	I JJ11&9M  4%%)>)>>*..q1 +	&LL!!&)  		  	INNx}}c!f=xHH	I  	& 1 12KKc!f%%	&sD   *D 1A6D (E 
DD
E,EE
F.!AF))F.c                 $   0 nU(       a  SnU HF  n U R                   R                  U5      u  pgU(       a  USU< SSR                  U5      < 3-  nMF  MH     XCS'   SnU H5  n U R                   R	                  U5      n	U	(       a  USU< SU	< 3-  nM5  M7     XS'   U R                   R                  UR
                  5      u  pjU
(       a#  SR                  U R                  U
5      5      US'   U$ ! [         a     M  f = f! [         a     M  f = f)Nr  rY  r  r!  r]   r^   rV   )rb  r&  r\  r   r#  r   r  )r   ifaceobjrunningr>  running_attrsrunning_bridge_port_vidsr  r.  r/  running_bridge_port_pvidr+  running_bridge_vidss              r   _query_running_vidinfo_compat$bridge._query_running_vidinfo_compatT
  s)   ')$&*jj&B&B1&EOA#0q69hh|6L5N N0 $  1I,-')$#'::#6#6q#9L#0q8D5F F0 $  2J-.!%!=!=o>R>R!S+.88D4N4NOb4c+dM-(% !  ! s$   A C0$/D0
C>=C>
DDc                 x   0 n/ n/ nU HW  nU R                  U5      u  pU(       a   UR                  SR                  U5      5        U	(       d  MF  UR                  U	5        MY     S n
U(       aA  [        U5      R	                  5       S   u  pU[        U5      :X  a  XS'   UR                  5       n
S nU(       aJ  [        U5      R	                  5       S   u  pU[        U5      :X  a  US:w  a  XS'   UR                  5       S   nU GH2  nU" U5      nU(       d  M  / nS nU R                  U5      u  pU(       a  X:w  a  UnU	(       a  X:w  a  U	nU(       a  UU;   a  UR                  U5        U(       dL  U(       aE  US:w  a?  US   R                  SU5        US   R                  S5        US   R                  S5        M  U(       a  US:w  a  US   R                  SU5        OUS   R                  S5        U(       a'  US   R                  SSR                  U5      5        GM  US   R                  S5        GM5     U$ )NrY  r   rV   r>   rY   rZ   )
rn  r  r\  r   most_commonrt  r[  r  replace_configdelete_config)r   rK  r  r  rL  running_bridgeport_vidsrunning_bridgeport_pvidsr  rQ  rH  rP  vidvalfreqr  ry  r  
bport_pvids                    r   _query_running_vidinfobridge._query_running_vidinfor
  s    #%#%  E<<UCLT'..sxx~>t(//5 ! "#$;<HHJ1M>Fc+&&-3M*"LLNk##$<=IIKAN>Fc+&&6S=-3M*"LLN1-k !E,U3M JJ<<UCLT+ z+ zjJ6!!*-:*2CQ..
KQ--m<Q--m<s!2"11-L  "00?"11-25((:2FH  "00?9 !: r   c                    U R                   R                  UR                  5      n[        UR	                  5       5       VVs/ s H  u  p4U< SU< 3PM     nnnUR                  5         SR                  U5      nU$ s  snnf )Nr  rY  )r  r  r   r  rY  sortr\  )r   rK  r  r  ir  mcqs          r   _query_running_mcqv4srcbridge._query_running_mcqv4src
  si    ::99/:N:NO,01A1G1G1I,JK,JDA!Q,JK		hhtn
 Ls   A=c                 F   UR                   n0 nSnS n U R                  5       S:X  a  SnU R                  R                  U5      n	SR                  U R                  R                  U5      5      /US'   [        U	R                  [        R                  5      5      n
U
[        R                  " U R!                  SS5      5      :w  a  U
(       a  S	OS
/US'   U
=(       a    UnU(       a  [        R"                  [        R$                  [        R&                  [        R(                  [        R*                  [        R,                  [        R.                  [        R0                  [        R2                  [        R4                  [        R6                  [        R8                  [        R:                  S.nO'[=        U R>                  5      n U[        R                  	 U	R                  [        R@                  5      nU[        R                  " U R!                  SS5      5      :w  a  U(       a  SOS/US'    U[        R@                  	 S nS n0 [        RB                  S _[        RD                  U_[        RF                  U_[        RH                  U_[        RJ                  U_[        R8                  U_[        R6                  U_[        R.                  U_[        R0                  U_[        R2                  U_[        R:                  U_[        RL                  U_[        R"                  U_[        R*                  U_[        R$                  U_[        R&                  U_nURO                  5        HX  u  nnU R!                  US5      nU	R                  U5      nUc  M.  UR                  U[
        5      " U5      nUU:w  d  MR  U/UU'   MZ     U(       a4  U(       d  0 nU RQ                  UU[S        URU                  5       5      5      nOU RW                  UU5      nU(       aI  URY                  [S        URO                  5       5       VVs0 s H  u  nnU(       d  M  UU/_M     snn5        U R[                  U5      nU(       a  U/US'   U(       a  U$ U(       Ga  U(       Gd  SSSSSSSS.n[S        URO                  5       5       GH  u  nn[        U R                  R]                  U5      5      nU(       a+  UU R!                  SS5      :w  a  US==   SU< SU< 3-  ss'   [        U R                  R_                  U5      5      nU(       a+  UU R!                  SS5      :w  a  US==   SU< SU< 3-  ss'   [        R`                  " U R                  Rc                  U5      5      nU(       a+  UU R!                  SS5      :w  a  US==   SU< SU< 3-  ss'   [        R`                  " U R                  Re                  U5      5      nU(       a+  UU R!                  SS5      :w  a  US==   SU< SU< 3-  ss'   [        R`                  " U R                  Rg                  U5      5      nU(       a+  UU R!                  SS5      :w  a  US==   SU< SU< 3-  ss'   [        R`                  " U R                  Ri                  U5      5      nU(       a+  UU R!                  SS5      :w  a  US==   SU< SU< 3-  ss'   [        R`                  " U R                  Rk                  U5      5      nU(       d  GMp  UU R!                  SS5      :w  d  GM  US==   SU< SU< 3-  ss'   GM     URY                  [S        URO                  5       5       VVs0 s H  u  nnU(       d  M  UU/_M     snn5        U$ ! [         a@  nU R                  R	                  UR                   < S[        U5      < 35         S nAGNS nAff = f! [         a     GN.f = f! [         a     GNf = fs  snnf s  snnf )Nr   r>   r   r9  rY  r"   r%   r!   r   r   )rA   rB   r=   rj   r?   r<   rG   rM   rJ   r@   rO   rH   rK   rh   r&   r'   c                     [        U S-  5      $ rx   )r   r|   s    r   r~   -bridge._query_running_attrs.<locals>.<lambda>
  s    #a3h-r   c                     U (       a  S$ S$ Nr   r   r   r|   s    r   r~   re  
  s    qe6Jd6Jr   c                 "    U R                  5       $ r   )r  r|   s    r   r~   re    s
    !'')r   rQ   r  )r9   r;   r_   rc   rd   re   ri   r9   r  r;   r_   rc   rd   re   ri   )6r   $systcl_get_net_bridge_stp_user_spacer   r   r  r   rb  rW  r\  ry  boolr   r   r   r   r   r  r   r   r   r   r   r   r   r   r   r   r   r   r   rV  rX  r   r   r   r   r   r   r   rY  r[  r  r  rP  updatera  get_brport_costget_brport_priorityget_onff_from_onezeroget_brport_learningget_brport_unicast_floodget_brport_multicast_floodget_brport_broadcast_floodget_brport_neigh_suppress)r   rK  r  r]  re  bridgeattrdictuserspace_stpr>  r  bridge_ifla_info_data
cached_stpskip_kernel_stp_attrsbridge_attributes_mapcached_vlan_statslambda_nl_value_int_divide100!lambda_nl_value_to_yes_no_boolean(bridge_attr_value_netlink_to_string_dictrL  attr_nlrP  rN  cached_value_stringbridgevidinfor  r  r`  
portconfigr  s                               r   _query_running_attrsbridge._query_running_attrs
  s    !%%	H88:cA ! !%

 = =f E +.((4::3H3H3P*Q)R~&
 /33D4J4JKL
66$$\9=
 
 6@ET+JN<( * <} $($G$G$($>$>#'#<#<"&"B"B"&"="= $ B B $ D D $ G G $ @ @ $ D D $ F F#BB#==%!  %))E)E$F!)$*@*@A 255d6U6UV = =$$%8)D!
 
 <M4RW2XN./	%d&E&EF )@%,J)4
&&(;4
$$&C4
   "?4
 &&(E	4

 ##%B4
 //1N4
 224Q4
 002O4
 335R4
 ,,.K4
 **,I4
 '')J4
 //1R4
 '')J4
 &&(I4
  %%'H!4
0& #8"="="?Iw 00IFM044W=L#"J"N"NwX["\]i"j 33-@,Ay) #@  778H8<UZZ\8JLM !>>?DFM  d=;N;N;P6Q "(6Qda%& #*!qc'6Q "( ) **?;14N,- !! */1/1.035575757J U[[]+1

22156d223E3<> >12A6FF2

66q9:d223E3<> >12A6FF2//

0N0Nq0QR--.?KK0115EE1//

0S0STU0VW--.D.79 956Q:JJ6//

0U0UVW0XY--.F.79 978q!<LL8//

0U0UVW0XY--.F.79 978q!<LL8//

0T0TUV0WXA--.F.79 978q!<LL8M ,P !!tJ<L<L<N7O #*7Otq!'( $+1s77O #* + S  	HKK)=)=s1vFGG	HX    		^"(x#*sS   ^( _5 -` >`
`
`
`
(
_225_--_25
``
``c                     U R                  U5      nUR                  S5      nU(       aL  UR                  5       nUR                  5         SR	                  U5      nUR                  SX3U:w  a  SOS5        g g )NrQ   rY  r   r   )ra  rK  r[  r^  r\  update_config_with_status)r   r  ifaceobjcurrrunning_mcqsr  r  mcqsouts          r   _query_check_mcqv4srcbridge._query_check_mcqv4srck  sj    33H=//0AB==?DIIKhhtnG223D%G,CqL	 r   c                 l   UR                  S5      nU(       a  U R                  X5      nU(       d-  U R                  U< SU< S35        UR                  SSS5        g SnU H_  n UR	                  S5      u  pU	R	                  S5      n
U R
                  R                  U5      u  pU R                  XUSS	9(       d  S
nM_  Ma     UR                  SXF5        UR                  S5      nU(       a  U R                  UR                  U5      nU(       d  U R                  U< SU< S35        g Sn/ nU H`  nUR	                  S5      u  nnU R
                  R                  U5      u  nnUR                  U< SU< 35        U[        U5      :w  d  M^  S
nMb     UR                  SSR                  U5      [        U5      5        U R                  U5      nUS   (       a  UR                  US   US   S5        g g ! [         a2  nU R                  U< SU< S[        U5      < S35         S nAGM  S nAff = f)Nr]   z$: could not parse 'bridge-port-vids r  rG  r   Fr  r!  )rH  r
  Tz: failure checking vid  (rC  r^   z%: could not parse 'bridge-port-pvids rY  r   r  )rK  rs  r  r  r[  rb  r&  rL  r   r   r   r  r{   r\  get_ifaceobj_bridge_vids)r   re  r  r  bridge_port_vids_user_configr}  r+  port_configr  vids_rawpacked_vidsr+  r/  r  r  r  running_pvid_configr  rH  r.  rQ  s                        r   _query_check_bridge_vidinfo"bridge._query_check_bridge_vidinfou  s    (0'D'DEW'X$',,VRI!')EG H667I7TUVE(
f%0%6%6s%;ND"*.."5K151M1Md1S.L--klin-o $ p  ) 223EGck
 //0CD++HMM7CH!'2 3E"$ wws|t"&**">">t"Da#**dL+IJ3t9, E  22#,-E
 ,,X672247DGRH E ! fMMP[]`ab]c"deefs   &AG77
H3&H..H3c                     [         R                  R                  (       aH  U R                  (       d6  UR                  [
        R                  -  (       a  UR                  SS5        g g g g )Nr?   r   )r  r  WITHDEFAULTSr   r  r  r>  rT  r6  s     r   _query_check_snooping_wdefault%bridge._query_check_snooping_wdefault  sP    ,,<<++.@.M.MM##$4d; N = -r   c                    U R                  U5      (       d  g UR                  nU R                  R                  U5      (       d  U R                  R                  SU-  5        g U R                  U5        U R                  UR                  U R                  5       5      n[        R                  R                  (       a  SU;  a  UR                  S5        U(       d  g SU;   a,  U R                  XU R                  R                  U5      U5        SU;   a#  UR!                  SU R#                  US5      S5        / SQnSnU H<  nX;   d  M
  UR!                  XR%                  U5      S	5        UR                  U5        M>     ['        U5      R)                  U5      n	U R                  R+                  U5      n
U R-                  XX5        U R/                  XAX)5        U R1                  XAU5        U R3                  X5        U R5                  XAU5        g )
Nz%s: bridge: does not existr%   r"   rr   Tr   )	rW   r"   rV   rW   rQ   r]   r^   rk   rr   )rY   r\   r   )rU  r   rb  rx  r   r  r  dict_key_subsetr  get_mod_attrsr  r  r  r  query_check_bridge_portsry  r  r  rK  r  r  rW  _query_check_bridge_attributes(_query_check_brport_attributes_on_bridger  r  (_query_check_l2protocol_tunnel_on_bridge)r   r  r  r  re  user_config_attributesfilter_attributesignore_attributesr   bridge_configr^  s              r   _query_check_bridgebridge._query_check_bridge  s   x((zz''//KK9VDE++H5!%!5!5hootGYGYG[!\ ++DZ0Z")),7%33))($**BWBWX^B_aqr'+AA22,33HdC



 &D-66t=Z=Z[_=`bcd!((. &
 23>>?PQ $

 = =f E++HMi55fd((<H""8:55fUr   c                 J   UR                  S5      nU(       a  UR                  S5        [        R                  " U5      (       aM   U R                  R                  U R                  U5      5      nUR                  SU(       a  SOSU(       + 5        g g ! [         a    Sn N1f = f)Nrt   Fr   r   )	rK  r  r   r   rb  rc  r  r   r  )r   re  r  r  r  r  rc  s          r   _query_check_bridge_always_up$bridge._query_check_bridge_always_up  s    #889KL  !34(()9::$"jj44T5Z5Z[a5bc 22"$$ ;  $#$s   *B B"!B"c           	      2   [        U5       Hk  nU R                  R                  US5      u  pg[        U5      (       d  M3  U" XQR	                  U5      X$R                  U5      5        UR                  U5        Mm     U R                  UR                  XU5        g )Nr   )r  r   r   rG  rK  r  r  r   )r   r  r  r  r^  r   query_check_handlernetlink_attrs           r   r  %bridge._query_check_bridge_attributes  s    'D040Z0Z0^0^_ceq0r-+,,#D*G*G*M|]v]v  xD  ^E  F$$T* ( 	**8==(R_`r   c           	         0 nU GH9  nU R                   R                  U5      nU R                  R                  U5      nU(       a  U(       d)  U R                  R	                  U< SU< SU< S35        Mq  / n	Sn
U R                  XR                  U5      5      =(       d    /  Hu  nUR                  S5      u  pX;  a   U R                  R                  U5      =oU'   OX\   nU" XUR                  U5      5      u  pU	R                  U5        U(       d  Ms  Sn
Mw     UR                  USR                  U	5      U
5        GM<     g )Nz.: query-check: missing handler for attribute: r  rC  r   r  r   rY  )r  r   r   r   r5  rs  rK  r[  rb  r  r  r  r\  )r   re  r  r  r  brports_info_slave_datar   r~  brport_query_check_handlerrunning_configstatusr  r  r  info_slave_dataport_statuss                   r   r  /bridge._query_check_brport_attributes_on_bridge  s-   "$!D66::4@G)-)S)S)W)WX\)]&"<##agimov$wxNF#33F<Y<YZ^<_`fdff*0056FJjjFiFijnFooOd&C&=&CO+EdTcTgTghoTp+q(%%k2;F  g 22(5 "r   c                 (    UR                  XS5        g r   )r  )r   
wait_valuer  __s       r   r    bridge._query_check_br_attr_wait>  s    ..tCr   c                     U(       d6  [         R                  R                  (       a  U R                  (       a  SOSnOg [        R
                  " U5      nUR                  UU(       a  SOSU[        U5      :g  5        g )Nr&   r'   r   r   )r  r  r  r   r   r   r  rj  )r   r   	stp_valuer  rN  user_config_to_nls         r   r   bridge._query_check_br_attr_stpB  s\    ""//$($7$7DU	!99)D..!Etl!33	
r   c                 T    UR                  U [        U5      [        U5      U:g  5        g r   r  r   r{   r   rM  r  rN  s       r   r   bridge._query_check_br_attr_intQ  s(    ..,	
r   c                 ^    US-  nUR                  U [        U5      [        U5      U:g  5        g rx   r  )r   rM  r  rN  r  s        r   r   *bridge._query_check_br_attr_int_divided100Y  s1    #..J%	
r   c                 j    UR                  U U(       a  SOS[        R                  " U5      U:g  5        g rg  r  r   r   r  s       r   r   #bridge._query_check_br_attr_booleanb  s-    ..!Et))+6,F	
r   c                 j    UR                  U U(       a  SOS[        R                  " U5      U:g  5        g )Nr&   r'   r  r  s       r   r   *bridge._query_check_br_attr_boolean_on_offj  s-    .. De))+6,F	
r   c                 L    UR                  U UUR                  5       U:g  5        g r   )r  r  r  s       r   r   "bridge._query_check_br_attr_stringr  s'    ..</	
r   c                 X    U < SU(       a  SOS< 3[         R                  " U5      U:g  4$ )Nr  r&   r'   r   r   r  rM  rN  s      r   r   .bridge._query_check_brport_attr_boolean_on_offz  s+    % ?@%B_B_`kBlp|B|||r   c                 X    U < SU(       a  SOS< 3[         R                  " U5      U:g  4$ )Nr  r   r   r  r  s      r   r   .bridge._query_check_brport_attr_boolean_yes_no~  s+    4 ?@%B_B_`kBlp|B|||r   c                 0    U < SU< 3[        U5      U:g  4$ r  rz   r  s      r   r   #bridge._query_check_brport_attr_int  s    -s;/?</OOOr   c                     U< SU R                   R                  U5      < 3U R                  R                  U5      U:g  4$ r  )-_ifla_brport_multicast_router_dict_int_to_strr   r   )clsr  rM  rN  s       r   r   ,bridge._query_check_brport_attr_portmcrouter  sA     SNNRRS_`a99==kJlZ
 	
r   c                 D   [         R                  " UR                  S5      5      (       a+   UR                  U R	                  UR
                  5      5        / nU" UR
                  5      =(       d    /  H,  nUR                  U R                  U5      =(       d    / 5        M.     U(       d  U(       d  g  U R                  U5      R                  5       nSU;   d  SU;   a  UnO>/ n[        S[        U5      5       H   n	Xy   U;   d  M  UR                  Xy   5        M"     Un [        U5      R                  U5      n
U R!                  U5      nU(       a_  U
 Vs/ s H  oR#                  U5      (       d  M  UPM     nnU H0  n U
R                  U5        X;  d  M  UR                  SU-  5        M2     UR'                  SU(       a  SR)                  U5      OSU
(       d  S5        g S	5        g ! [         a     GNf = f! [         a    Un Nf = fs  snf ! [$         a     Nf = f)
Nrt   regexglobr   rq  r"   rY  r  r   )r   r   rK  r  r  r   r   rZ  r;  r_  r[  r  rt  r  r  r  r  r  
ValueErrorr  r\  )r   r  r  running_port_listr  bridge_all_portsr/  r}  orderedr_  r  r  r  condone_portss                 r   r  bridge.query_check_bridge_ports  s    (()F)FGY)Z[[!(()N)Nx}})]^ #HMM28b8C##D$>$>s$C$IrJ 9 !)9	*77AGGII )#v':-	q#i.1A |'88y|4 2 $	 *+@@AQR
$($G$G$Q!$.8bjd<[<[\`<aTjMb%%%d+
 /$$Vd]3 & 	..#,CHHY"A	
 &'	
W  .  	*)I	* c
 " sM   *G* 3-G; ! G; G; H2H H*
G87G8;H
	H

HHc                 f    SUR                  S5      4nUS   (       d  SUR                  S5      4nU$ )NrV   r   rW   rK  )r   r  rQ  s      r   r  bridge.get_ifaceobj_bridge_vids  s8    x<<]KLAw"H$A$A.$QRDr   c                 *    U R                  U5      S   $ r   )r  r6  s     r   r4  %bridge.get_ifaceobj_bridge_vids_value  s    ,,X6q99r   c                     U" U5      nU H4  nU R                  U5      nU(       d  M  [        R                  " SU5      s  $    g )Nr  )r4  r  r[  )r   rD  r  	ifaceobjsr  rQ  s         r   rJ  bridge._get_bridge_vids  s@    $Z0	!H66x@DtBHH]D99 " r   c                 b    U" U5      nS nU H  nUR                  S5      nU(       d  M    U$    U$ )NrY   r  )r   rD  r  r  rH  r  s         r   r  bridge._get_bridge_pvid  s?    $Z0	!H00?Dt	 " r   c                    U R                   R                  U5      u  pgUR                  S5      nU(       a:   [        U5      n	UR                  S[        U5      Xi:g  =(       d    US   U	:g  5        g UR                  S5      nU(       a+   [        U5      nUR                  S[        U5      Xl:g  5        OUR                  [        R                  -  (       aD  UR                  [        R                  -  (       a  UR                  [        R                  -  (       at   [        U R                  X%5      5      nU(       a)  U(       a  Xl:w  a  [        R                  Ul        SUl        O)U(       a  US:w  a  [        R                  Ul        SUl        U R%                  U5      u  pU(       a  [&        R(                  " SU5      nU R+                  U5      n/ nU R-                  U5      nU H5  nUU;   a  UR/                  U5        M  UU;  d  M$  UR/                  U5        M7     UnU(       a  U R1                  XUS	S
9(       d>  U Vs/ s H  n[        U5      PM     nnUR                  USR3                  U5      S5        g UR                  USR3                  U5      S5        g UR                  [        R                  -  (       aD  UR                  [        R                  -  (       aw  UR                  [        R                  -  (       aT  U R5                  X%5      nU(       a;  U(       a  U R1                  UXvS	S
9(       d  [        R                  Ul        SUl        g g g g g ! [         a3  n
UR                  SUS5        [        U< S[        U
5      < 35      eS n
A
ff = f! [         a3  n
UR                  SUS5        [        U< S[        U
5      < 35      eS n
A
ff = f! [        [        4 a    Sn GNf = fs  snf )NrZ   r   z: bridge-access invalid value: r   rY   z: bridge-pvid invalid value: zbridge pvid errorr  F)r
  rY  zbridge vid error)rb  r&  rK  r{   r  r  r   r   r  rM  HAS_SIBLINGSOLDEST_SIBLINGr  	TypeErrorrF  rG  r  
status_strr  r  r[  r  r  r  rL  r\  rJ  )r   re  r  r  r  r  r+  r/  brport_vid_access_user_configvid_intr  brport_pvid_user_configrH  rL  rQ  vlans_mapped_with_vnisnew_running_vidsr  r  orP  s                        r    _query_check_bridge_port_vidinfo'bridge._query_check_bridge_port_vidinfo  sy   %)ZZ%A%A&%I"
 )1(E(Eo(V%(Z;<
 22L!'E<?g+E
 
 #+"?"?"N"X23
 22L!$
 >>E$6$66!3!33!5!55400OP #|';*5*;*;L'.AL+!\Q%6&1&7&7#*='77A	((<.4
 %)$X$XYa$b! "2248 q''#**1-33#**1-	 !
 +< d&8&8\hm&8&n/;<|!s1v||<55i,/HH\,BAG 55i,/HHTNA?>>E$6$66!3!33!5!55 ..{M;L))+|`e)f$/$5$5l!(:l% g  6 4Q  Z66HeghiQTUVQW XYYZ&  X66}F]_`avsSTv VWWX" z* : =sG   M 	N O  O2
N#.NN
O#.OOO/.O/)rY   rV   rW   rZ   r9   r;   rR   r_   rS   rc   rd   re   ri   rk   c                 
   UR                   nU R                  R                  U5      (       d  UR                  XR                  S5        g U R                  R                  U5      nU(       d  U R                  R                  SU-  5        g U R                  R                  U5      (       a  U R                  XEXU5        U R                  R                  U5      nUR                  S5      nU(       aR  UR                  [        R                  5      nUR                  SU(       a  SOS[         R"                  " U5      U:g  5        UR                  S5      n	U	(       ag  UR                  [        R$                  5      nUR                  SU R&                  R                  U5      U R(                  R                  U	5      U:g  5        S[        R*                  4S[        R,                  4S	[        R.                  4S
[        R0                  4S[        R2                  44 Hc  u  pUR                  U
5      nU(       d  M  UR                  U5      nUR                  U
U(       a  SOS[         R"                  " U5      U:g  5        Me     S[        R4                  4S[        R6                  44 HY  u  pUR                  U
5      nU(       d  M  UR                  U5      n UR                  U
[9        U5      [;        U5      U:g  5        M[     U RA                  X5        SnU RC                  U R                  RE                  UR                   5      5      u  nnURG                  S5      =(       d    /  H  nU(       a  UR                  SUS5        M   URI                  S5      u  nnU RM                  U/5      nU RM                  U/5      n U H  nURO                  U5        M      U H  nURO                  U5        M     UR                  SUS5        M     U(       d*  U(       d  U(       a  UR                  SU< SU< 3S5        g g g ! [<         a@  nUR                  U
[9        U5      S5        [?        U< SU
< S[9        U5      < 35      eS nAff = f! [>         a)    UR                  SUS5        U RK                  U5      s s  $ f = f! [>         a    UR                  SUS5        Sn GM}  f = f! [>         a    UR                  SUS5        Sn GM  f = f)Nr   z#%s: unable to determine bridge namerS   r   r   rR   r_   rc   rd   re   ri   r&   r'   r9   r;   r9  z invalid value: Frs   r  Tr   )(r   rb  link_is_bridge_port&check_n_update_config_with_status_many_query_check_brport_attributesr  r   r5  r  r  r  rK  r   r   IFLA_BRPORT_FAST_LEAVEr  r   r   r  r  r   r  IFLA_BRPORT_UNICAST_FLOODIFLA_BRPORT_MCAST_FLOODIFLA_BRPORT_BCAST_FLOODr  IFLA_BRPORT_COSTIFLA_BRPORT_PRIORITYr   r{   r  r   &_query_check_l2protocol_tunnel_on_portget_vlan_vni_rangesget_vlan_vnir3  r[  r  r  r  )r   r  r  r  re  r  brport_info_slave_dataportmcflrN  portmcrouterrL  r~  attribute_valuer  failcached_vlanscached_vnisbridge_vlan_vni_mapr  r  
vlans_list	vnis_listr  vnis                           r   _query_check_bridge_portbridge._query_check_bridge_portP  s    zz--f55??==q jj::6BKK E NO::**;7711&x_op!%!D!DV!L
 001BC155d6Q6QRL22!%4--h7<G  445JK155d6W6WXL22%BBFF|T>>BB<PT`` #D$=$=>')G)GH)4+G+GH)4+G+GH)4+J+JK#
I ';;IFO"155g>L22$%--o>,N#
2 $T%:%:;#T%>%>?#
I ';;IFO"155g>LZ66%(L8#
* 	33HK
 $($<$<TZZ=T=TU]UbUb=c$d!k#+#:#:;P#Q#WUW#W667LNacdeY%8%>%>s%C"	7
 --yk:J,,gY7I&D ''- '$C&&s+ % 223HJ]_`aM $XP  22%'5 *5ti  Z66y#lBSUVWfiQTUVQW XYYZ(  Y667LNacdeCCDWXXY"  667LNacde  667LNacdesN   (P<R	>R?S&<
R;RR	.R<;R<?S#"S#&T
	T
c                 l   / n/ nU (       d  X4$ S nS nU  H  u  pVnU[         R                  -  (       a  UnUnM$  U[         R                  -  (       a<  UR                  [	        X5S-   5      5        UR                  [	        XFS-   5      5        Mx  UR                  U5        UR                  U5        M     X4$ r   )r   BRIDGE_VLAN_INFO_RANGE_BEGINBRIDGE_VLAN_INFO_RANGE_ENDrZ  r  r  )bridge_vlan_tunnelr  r   tunnel_vlan_rangetunnel_vni_rangetunnel_vlan
tunnel_vnitunnel_flagss           r   r  bridge.get_vlan_vni_ranges  s    !; 5G1K\d???$/!#-  ? ??U#4AoFGE"2NCD [)J' 6H {r   c           	      6   UR                  S5      nU(       a2  Sn U R                  UR                  U5        UR                  SX45        g g ! [         aB  nU R                  R                  SUR                  < S[        U5      < 35        Sn S nAN[S nAff = f)Nrk   r   query: r9  r   )rK  _query_check_l2protocol_tunnelr   r   r   r   r   r  )r   r  r  user_config_l2protocol_tunnelr,  r  s         r   r   -bridge._query_check_l2protocol_tunnel_on_port
  s    (0(E(EF`(a%(F33HMMC`a 223MOlu )  !!X]]CF"KLs   A 
B8BBc           	      H   UR                  S5      nU(       a  SU;   a,   U R                  U5      n[        UR                  5       5      nO0 nU R                  R                  U5      n U H-  nU R                  UU(       a  UR                  U5      OU5        M/     SnUR                  SXH5        gg! [         a    UR                  SUS5         gf = f! [         aB  n	U R                  R                  SUR                  < S[        U	5      < 35        Sn Sn	A	N~Sn	A	ff = f)z
In case the bridge-l2protocol-tunnel is specified under the bridge and not the brport
We need to make sure that all ports comply with the mask given under the bridge
rk   r  r   Nr   r  r9  )rK  r  r  r  r   r  rb  ry  r  r   r   r   r   r   )
r   re  r  r  r  config_per_port_dictr  r.  r,  r  s
             r   r  /bridge._query_check_l2protocol_tunnel_on_bridge  s   
 )1(E(EF`(a%(33+/+J+JKh+i("&';'@'@'B"CK
 (*$"jj33F;	#.K77#AU,00=[x $/
  223MOlu- )
 !  ::;UWtvwx  !!X]]CF"KLs)   *B2 )5C 2CC
D!8DD!c                 |   U R                   R                  U[        R                  5      nU R                   R                  U[        R                  5      n[
        R                  " SU5       HM  nU R                  R                  U5      n[        U5      (       d  M0  U" XC5      (       a  M?  [        SXXC4-  5      e   g )Nz,|\s*zO%s: bridge-l2protocol-tunnel: protocol '%s' not present (cached value: %d | %d))rb  r  r   r  r  r  r[  r   r   rG  r   )r   r.  r  cached_ifla_brport_group_maskhicached_ifla_brport_group_maskprotocolr  s          r   r  %bridge._query_check_l2protocol_tunnel5  s    *.***W*WXcei  fG  fG  +H'(,

(U(UVacg  dC  dC  )D%*GHHBBFFxPH!! =__#$w'2>[&}%~   Ir   c           
      &   U R                   R                  U[        R                  5      nU R                   R                  U[        R                  5      n/ n[        U R                  R                  5       5       Hn  u  pxUS:X  aC  U" XT5      (       a6  [        U R                  R                  5       5      nUR                  S5          O$U" XT5      (       d  M]  UR                  U5        Mp     U(       a  U(       a"  UR                  SSR                  U5      5        g U(       an  UR                  S5      n	U	(       a-  UR                  SU	< SU< SSR                  U5      < 35        g UR                  SU< SSR                  U5      < 35        g g g )Nrl   rk   rY  r  r!  )rb  r  r   r  r  r  r   rY  r  r  r  update_configr\  rK  rT  )
r   r.  r  r  r#  r$  running_protocolsprotocol_namer  current_configs
             r   '_query_running_bridge_l2protocol_tunnel.bridge._query_running_bridge_l2protocol_tunnelA  s   *.***W*WXcei  fG  fG  +H'(,

(U(UVacg  dC  dC  )D%'+D,W,W,],],_'`#M%(3P*r*r$()T)T)Y)Y)[$\!!((/7YY!((7 (a --.H#((SdJef !0!E!EF`!a!#223M]kmxz}  {C  {C  DU  {V  PW  X#223MZegjgogo  qB  hC  PD  E ! r   c                 z    U R                  U5      (       a  U R                  XU5        g U R                  XU5        g r   )rU  r  r  )r   r  r  r  s       r   _query_checkbridge._query_checkW  s5    ??8$$$$X=MN))(*:<r   c                     U R                   R                  UR                  5      (       a3  UR                  SS5        UR	                  U R                  UUSS95        g UR	                  U R                  US 5      5        g )Nr   r   T)r]  )rb  r  r   r(  update_config_dictr  )r   rK  r  s      r   _query_running_bridgebridge._query_running_bridge^  s~    ::**?+?+?@@))*=uE..t/H/H/>/?AE 0I 0G H
 ..t/H/H/>0F Gr   c                    U R                  5       S:X  a  g [        U R                  R                  UR                  5      5      nU(       a'  X0R                  SS5      :w  a  UR                  SU5        [        U R                  R                  UR                  5      5      nU(       a)  X0R                  SS5      :w  a  UR                  SU5        g g g )Nr>   r9   r!   r;   )ri  r   rb  rl  r   r  r(  rm  )r   rK  rD  r  s       r    _query_running_bridge_port_attrs'bridge._query_running_bridge_port_attrsi  s    446#=

**?+?+?@A**+=yII))*<a@

../C/CDE**+=yII))*<a@ J1r   c                    U R                   R                  UR                  5      nS nS nU(       d)  U R                  R	                  SUR                  -  5        g U R                   R                  U5      (       d%   U R                  UR                  U" U5      S   S9  g U R                  UR                  US9  U R                  UR                  5      u  pxU(       a  X;   a  UR                  U5        U" U5      n	U	(       a(  U	S   R                  S5      nU	S   R                  S5      nU(       d   U(       a  US:w  a  UR                  S	U5        O_U(       a-  U(       a  Xt:w  a!  UR                  SS
R                  U5      5        U(       a$  US:w  a  U(       a  X:w  a  UR                  SU5        [         R"                  " U R                   R%                  UR                  5      5      n
U
(       a'  XR'                  SS5      :w  a  UR                  SU
5        [         R"                  " U R                   R)                  UR                  5      5      n
U
(       a'  XR'                  SS5      :w  a  UR                  SU
5        [         R"                  " U R                   R+                  UR                  5      5      n
U
(       a'  XR'                  SS5      :w  a  UR                  SU
5        [         R"                  " U R                   R-                  UR                  5      5      n
U
(       a'  XR'                  SS5      :w  a  UR                  SU
5        [         R"                  " U R                   R/                  UR                  5      5      n
U" UR                  5      S   nU
(       ak  XR'                  SS5      :w  aV  U R0                  (       a3  U R0                  (       a4  UR2                  [4        R6                  -  (       a  UR                  SU
5        U R9                  X5        g ! [         a?  nU R                  R                  UR                  < S[        U5      < 35         S nAg S nAff = f)Nz%s: unable to find bridgenamer   )r  z,: q_query_running_bridge_l2protocol_tunnel: )r  rV   rY   r>   rZ   rY  r_   r!   rc   rd   re   ri   )rb  r  r   r   r5  r  r,  r   r   r   rn  r  r3  rK  r(  r\  r   rn  ro  r  rp  rq  rr  rs  r   r%  r&  r<  r6  )r   rK  r  rD  rP  r  r  r*  bridge_port_pvidbridgeifaceobjlistr  ry  s               r   _query_running_bridge_port!bridge._query_running_bridge_portu  s    ZZ990?0D0DF
KK ?-22!3 4zz..z::w<<_=Q=Qcst~c  AB  dC<  D 44_5I5I[j4k/3/P/P;J;O;O0Q,	 0 D ''(89-j9+A.==mL;+A.CCMR;$43&,,_*:<  #'7'F"00(+1A(BD$4$;#(8(G#11-(8: ''

(F(FG[G[(\]**+<iHH))*;Q?''

(K(KOL`L`(ab**+A9MM))*@!D''

(M(MoNbNb(cd**+CYOO))*BAF''

(M(MoNbNb(cd**+CYOO))*BAF''

(L(L_MaMa(bc
 ))=)=>qA%%&>	JJ3300%%(;(;;))*BAF--oJy  w!!XgXlXlnqrsnt"uvvws   ;#P 
Q'(5Q""Q'c                 d    U R                   R                  UR                  5      (       a  U R                  X5        g U R                   R	                  UR                  5      (       a  U R                  X5        g g ! [         a*  n[        UR                  < S[        U5      < 35      eS nAff = f)Nr9  )rb  rx  r   r3  r  r;  r   r   )r   rK  r  r  s       r   _query_runningbridge._query_running  s    	Gzz''(<(<==**?M//0D0DEE//R F 	G(<(<c!fEFF	Gs   ;A; ;A; ;
B/%B**B/c                     UR                   [        R                  -  (       a  UR                  S5      (       a  gU R                  (       a  UR                  SS5        gg)z6add default policy attributes supported by the module r%   Nr   )r%  r&  r'  rK  r   r(  )r   r  kwargss      r   _querybridge._query  sH    ##m&:&::)),77""<7 r   c                    U(       d  gUR                   [        R                  -  (       a  UR                  [        R
                  -  (       dy  U R                  U5      =(       d    /  HZ  nU" U5       HK  nUR                   [        R                  -  (       d  M'  U=R                  [        R
                  -  sl            g   M\     gUR                  [        R                  -  (       a  UR                   [        R                  -  (       ab  UR                  (       a  UR                  O/  H>  nU" U5      =(       d    /  H&  nU=R                  [        R
                  -  sl        M(     M@     ggg)ag  
Quick fix for BRIDGE_VXLAN

BRIDGE_VXLAN is not set on the bridge because the VXLAN hasn't been processed yet
(because its defined after the bridge in /e/n/i), here is what happens:

- ifupdownmain:populate_dependency_info()
- loops over all the intf from /e/n/i (with the example config:
    ['lo', 'eth0', 'swp1', 'swp2', 'bridge', 'vni-10', 'bridge.100', 'vlan100'])
    ----> bridge is first in the list of interface (that we care about)

- ifupdownmain:query_lowerifaces()
- bridge:get_dependent is called (debug: bridge: evaluating port expr '['swp1', 'swp2', 'vni-10']')
- ifupdownmain:preprocess_dependency_list()
- calls ifupdownmain:_set_iface_role_n_kind() on all the brports:

in _set_iface_role_n_kind:
ifaceobj is the brport
upperifaceobj is the bridge

it tries to see if the bridge has a VXLAN:

if (ifaceobj.link_kind & ifaceLinkKind.VXLAN)         and (upperifaceobj.link_kind & ifaceLinkKind.BRIDGE):
upperifaceobj.link_privflags |= ifaceLinkPrivFlags.BRIDGE_VXLAN

but because the bridge is first in the /e/n/i ifupdown2 didn't
call vxlan:get_dependent_ifacenames so VXLAN is not set on ifaceobj

:return:
N)
r%  r&  r'  r  r  r>  r;  r<  r  rI  )r   r  r  r  r  rM  r  s          r   __re_evaluate_bridge_vxlan!bridge.__re_evaluate_bridge_vxlan  s   @   4 44X=T=TWiWvWv=v228<BB'7'=O&00=3F3FFF //3E3R3RR/ (> C $$'9'E'EE(J\J\_l_r_rJr191E1E--2M'7'>'D"'DO#226H6U6UU2 (E N KsEr   )zpre-upz	post-downquery-checkcurrzquery-runningqueryc                 H    [        U R                  R                  5       5      $ )z-returns list of ops supported by this module )r  _run_opsr  )r   s    r   get_opsbridge.get_ops
  s    DMM&&())r   c                    U R                   R                  U5      nU(       d  gU R                  R                  (       d  UR                  [
        R                  -  (       d"  UR                  [        R                  -  (       aD  U R                  (       a3  U R                  R                  S[        R                  -  5        SU l
        U R                  X5        US:X  a	  U" XUUS9  gU" XUS9  g)a  run bridge configuration on the interface object passed as
    argument. Can create bridge interfaces if they dont exist already

Args:
    **ifaceobj** (object): iface object

    **operation** (str): any of 'pre-up', 'post-down', 'query-checkcurr',
                         'query-running'

Kwargs:
    **query_ifaceobj** (object): query check ifaceobject. This is only
        valid when op is 'query-checkcurr'. It is an object same as
        ifaceobj, but contains running attribute values and its config
        status. The modules can use it to return queried running state
        of interfaces. status is success if the running state is same
        as user required state in ifaceobj. error otherwise.
Nzl%s: missing - bridge operation may not work as expected. Please check if 'bridge-utils' package is installedFrG  )r  )rJ  r   requirementsbridge_utils_is_installedr  r  r  r%  r&  r'  bridge_utils_missing_warningr   r5  r   	brctl_cmd!_bridge__re_evaluate_bridge_vxlan)r   r  	operationquery_ifaceobjr  
op_handlers         r   run
bridge.run  s    $ ]]&&y1
!!;;,,/A/M/MMQYQcQcfsfzfzQz99KK !XZ_ZiZi!j k05D- 	''C))t~(8: t8HIr   )r   r   r   r   r   r   r   r   r   rP  r   r   r   r   r   r   r   r   r   r   r   )F)r>   )NTr   )r   r   r   r   __doc__r>  rP  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   rX  rV  r{   r   r   r   upperget_int_from_boolean_and_stringr   r   rF  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r   staticmethodr   r   r   r   r   r   r   r   r   r   r   r   r"  r  r  r  rE  r  rU  r_  rf  ru  rz  r;  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rL  r  r2  r7  r;  rA  rS  r_  rh  rn  r~  r  rv  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r(  r0  r6  r$  rA  rH  rP  r[  ra  r  r  r  r  r  r  r  r  r   r   r   r   r   r   r   r   r   r   classmethodr   r  r  r4  rJ  r  r  r  r  r  r   r  r  r,  r/  r3  r6  r;  r>  rB  rR  rJ  rK  rV  r   r   r   r   r   r   0   sV   >%
K
) $T]67"K
 &" 01
K
( ++,7	)K
4  )"Gn56"	"5K
@ '"Gn/0 	AK
L ."El*+	MK
Z D"El,-"[K
j /"El,-	kK
v +"El./	wK
B 467"GnRd !	!CK
V +67"GnQb	!WK
h 9"El,-	iK
t  B9/0 	 uK
@ 04 01	AK
L ;"El,-	MK
X ;412	!YK
d /412	!eK
p -"Fm01	qK
| &"Fm 12	}K
H F"El,-	IK
T E -.UK
^ B"El ./	_K
j @"El -.	kK
v I"El-.	wK
B H"El-.	CK
N J25"OP OK
\ "tFG
$]K
z 4;<Pa	 {K
L . 789: MK
f #  #El./
gK
| ?
 #9:&0 ++}K
X +"Fm+,	YK
d :"Fm/0	eK
p $- $T]78 &qK
B &EF!CK
L  +CD"MK
V 3E12	 WK
b ",!3Z34	$cK
n !+!3Z23	#oK
z #8E]np	%{K
H	 %:EWh	'I	K
Z	 %:EWh	'[	K
l	 #.#&	29:	%m	K
x	  + "E]34	"y	K
D
 %:E Wh	'E
K
V
 0 A01	W
K
b
 '4!:DI+)c
K
z )h % WX+{K
D ".D$EK
L j!7!MK
RHh $( 
.T//. 	//. 	--	.
 	11. 	d,,. 	T22. 	T88. 	 : :.. 	444/.2 	D??3.4 	D665.6 	;;7.8 	$559.: 	::;.< 	<<=.> 	<<?.@ 	t::A.B 8855??>>  $>>::"<<[.h @D '')?@$$&<=!!#9:%%'=>""C(((%*G*GH''3 &&(M(MN((%*G*GH00%2O2OP'')F)FG//5((#.//51137113IJ002HI--/EF++-CD446LM335KL ,,e.K.KL,,c2--u/L/LM++S1[.	
0@<j !55 11  6644 $ > >   $@@"&">"> #'">">$($C$C #'"A"AG$#N 	1- 51 DH&&,""C(..0tu((%*G*GH&&(E(EF++U-J-JK))5+H+HI))5+H+HI,,k:,,e.K.KL	
D@X
t @ @ @ @ @ @ @ @ @ @ - - G G K K K K J J G G j j"0@
2 D D
&4 4
M.B%0L0Y$vC	.2$
(J^"H4<5|7
=9LvEKN$$t.l6 @D?C(<TDOL=
!w.  @$D gi  @B WNr
r:c8U
/xb$<`|1fi*WXQ&8> ,0;z 05sjL=I~<CVJ$a!F D D
 
 
 
 
 
 
 
 
 
 
 } } } } P P 
 
5
n:^;@&""]~  4
vv>
E,<	G
A 59KKZG8-V` ''H*$J $Jr   r   )#r  r  r  collectionsr   ifupdown2.lib.addonr   ifupdown2.ifupdown.exceptionsifupdownrc   ifupdown2.ifupdown.policymanagerr    ifupdown2.ifupdown.ifupdownflagsr  ifupdown2.nlmanager.nlmanagerr   ifupdown2.ifupdown.ifaceifupdown2.ifupdown.utilsr   ifupdown2.ifupdownaddons.cache#ifupdown2.ifupdownaddons.modulebaser   ImportErrorModuleNotFoundError	lib.addonifupdown.exceptionsifupdown.policymanagerifupdown.ifupdownflagsnlmanager.nlmanagerifupdown.ifaceifupdown.utilsifupdownaddons.cacheifupdownaddons.modulebaser
   r   r   r   r   <module>rs     s    
   5)66<<<<2*.0>"" "
B<JUJ B<J+ 	() 5,22( $&45s   =A( (<B'&B'