
    7Ydy?                     *   d dl Z d dlZej                  j                  d      re j                  j	                  d       ej                  j                  d      re j                  j	                  d       ej                  j                  d      re j                  j	                  d       d dlZd dlZd dlZd dlm	Z	m
Z
mZmZmZmZmZmZmZmZmZ d ZdZdZd Zd ZdZd	Zd
ZdZdZdZdZdZ dZ!dZ"dZ#dZ$dZ%dZ&dZ'dZ(dZ)dZ*dZ+dZ,dZ-dZ.dZ/dZ0d Z1d!Z2d"Z3d Z4dZ5d	Z6d
Z7dZ8dZ9dZ:dZ;dZ<dZ=dZ>dZ?dZ@dZAdZBdZCdZDd ZEdZFd	ZGd
ZHdZIdZJdZKdZLdZMdZNdZOd ZPdZQdZRe j                  ZTd# ZUd$ ZV G d% d&      ZW G d' d(e      ZX G d) d*      ZY G d+ d,      ZZ G d- d.      Z[y)/    Nz/usr/share/pysharedz /usr/lib/python2.7/dist-packagesz /usr/lib/python2.7/site-packages)hexdumpparse_attributesMessageNestedU8AttrStrAttr
NulStrAttr
ConnectionNETLINK_GENERICU32AttrNLM_F_REQUESTN   O                           	   
                                                      c                 v    t         j                  d   dk  r| j                  |       y | j                  |       y Nr   r   )sysversion_info
fromstring	frombytes)astrings     ,/usr/lib/python3/dist-packages/dcbnetlink.py
from_bytesr4   v   s-    Q!,,v++f    c                 n    t         j                  d   dk  r| j                         S | j                         S r,   )r-   r.   tostringtobytes)r1   s    r3   to_bytesr9   }   s-    Q!	
	
r5   c                       e Zd Zd Zd Zy)DcbnlHdrc                      || _         || _        y Nlentype)selfr?   r@   s      r3   __init__zDcbnlHdr.__init__   s    $($)r5   c                 X    t        j                  d| j                  | j                        S )NBBxx)structpackr?   r@   rA   s    r3   _dumpzDcbnlHdr._dump   s    	VTXXtyy	11r5   N)__name__
__module____qualname__rB   rH    r5   r3   r;   r;      s    2r5   r;   c                   (    e Zd Zg dfdZed        Zy)DcbNlMessager   c           	          || _         || _        || _        t        j                  | ||t        d| j                        g|z          y )Nr   r>   )flagspayload)r@   cmdattrsr   rB   r;   )rA   r@   rR   rS   rP   s        r3   rB   zDcbNlMessage.__init__   sA    $)$($*	4U1488,-e35r5   c                     | j                         }|d   j                  }t        j                  d|d d       \  }}t	        ||      }t        |dd        |_        |S )Nr   rD   r   )recvrQ   rE   unpackrN   r   rS   )connmsgspacket
dcb_familyrR   dcbnlmsgs         r3   rU   zDcbNlMessage.recv   sW    	$7??&MM&&!*5/*c*c*(#F12J/(.	/r5   N)rI   rJ   rK   rB   staticmethodrU   rL   r5   r3   rN   rN      s     %'q 5 	 	r5   rN   c                       e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy)DcbControllerc                 V    t        t              | _        |j                         | _        y r=   )r
   NETLINK_ROUTErW   encodeintf)rA   rb   s     r3   rB   zDcbController.__init__   s    '$)kkm$)r5   c                 X    |j                   |   j                         rt        d      }|y )Nz$Netlink error: Bad value. see dmesg.)rS   u8OSError)rA   m	attr_typeerrs       r3   	check_errzDcbController.check_err   s,    WWY	7	83	9 r5   c                 n    g }t        dt        |      |      D ]  }|j                  |||dz            |S )Nr   r   )ranger?   append)rA   arrnlstis        r3   __parse_arrayzDcbController.__parse_array   s>    
#!SXq! a::c!AaCj	*r5   c                    t        t        | j                        }t        t        t
        t        |g      }|j                  | j                         t        j                  | j                        }|j                  d   j                         S )Nr@   rR   rP   rS   r   )r	   DCB_ATTR_IFNAMErb   rN   
RTM_GETDCBDCB_CMD_GSTATEr   sendrW   rU   rS   rd   rA   r1   rf   s      r3   get_dcb_statezDcbController.get_dcb_state   s_    $)),!*N
s$!&&		"!	
r5   c                 2   t        t        | j                        }t        t        |      }t        t        t        t        ||g      }|j                  | j                         t
        j                  | j                        }| j                  |t               y Nrs   )r	   rt   rb   r   DCB_ATTR_STATErN   
RTM_SETDCBDCB_CMD_SSTATEr   rw   rW   rU   ri   )rA   stater1   
state_attrrf   s        r3   set_dcb_statezDcbController.set_dcb_state   sg    $)),!ne,**N
:0!&&		"!..N#r5   c                 $   t        t        | j                        }t        t        t
        t        |g      }|j                  | j                         t        j                  | j                        }|j                  t           j                         S r{   )r	   rt   rb   rN   ru   DCB_CMD_GDCBXr   rw   rW   rU   rS   DCB_ATTR_DCBXrd   rx   s      r3   get_dcbxzDcbController.get_dcbx   sc    $)),!*M
s$!&&		"!	
		"	"	$$r5   c                 2   t        t        | j                        }t        t        |      }t        t        t        t        ||g      }|j                  | j                         t
        j                  | j                        }| j                  |t               y r{   )r	   rt   rb   r   r   rN   r}   DCB_CMD_SDCBXr   rw   rW   rU   ri   )rA   moder1   	mode_attrrf   s        r3   set_dcbxzDcbController.set_dcbx   sg    $)),!]T*)*M
9~/!&&		"!..M"r5   c                    t        t        | j                        }t        t        t
        t        |g      }|j                  | j                         t        j                  | j                        }|j                  t           j                         }t        j                  d      }t        ||t           j!                         dd         |d   S )Nrs   Br   r   r	   rt   rb   rN   ru   DCB_CMD_IEEE_GETr   rw   rW   rU   rS   DCB_ATTR_IEEEnestedarrayr4   DCB_ATTR_IEEE_PFCstrrA   r1   rf   ieees       r3   get_ieee_pfc_enzDcbController.get_ieee_pfc_en   s    $)),!*,<
s$!&&		"!	
		&	&	($kk#!Q&'++-ab12	
1+r5   c                    t        t        | j                        }t        t        t
        t        |g      }|j                  | j                         t        j                  | j                        }|j                  t           j                         }t        j                  d      }t        ||t           j!                         dd         |d   |d   dz  z   S )Nrs   r   r   r   r   r   r   r   s       r3   get_ieee_pfc_delayz DcbController.get_ieee_pfc_delay   s    $)),!*,<
s$!&&		"!	
		&	&	($kk#!Q&'++-ab12	
11	r5   c                 *   t        t        | j                        }t        t        t
        t        |g      }|j                  | j                         t        j                  | j                        }|j                  t           j                         }t        j                  d|t           j!                         d      \  }}}t#        j"                  d      }t%        ||t           j!                         dd         dd} ||d      \  }}	}
}}}}||
|fS )	Nrs   BBBr   r   r   r   c                 `    t        dt        |       |      D cg c]
  }| |||z     c}S c c}w )Nr   )rk   r?   )Arn   rp   s      r3   <lambda>z,DcbController.get_ieee_ets.<locals>.<lambda>   s+    aQ(;<1a!A#h< <s   +)r   )r	   rt   rb   rN   ru   r   r   rw   rW   rU   rS   r   r   rE   unpack_fromDCB_ATTR_IEEE_ETSr   r   r4   )rA   r1   rf   r   willingets_capcbsftc_tc_bwtc_rx_bwtc_tsaprio_tc
tc_reco_bwtc_reco_tsareco_prio_tcs                  r3   get_ieee_etszDcbController.get_ieee_ets   s    $)),!*,<
s$!&&		"!	
		&	&	($ ,,UD9J4K4O4O4QSTU'7Ckk#!Q&'++-ab12<!OPQRSTvL(Hfgz;	&(	""r5   c                    t        t        | j                        }t        t        t
        t        |g      }|j                  | j                         t        j                  | j                        }|j                  t           j                         }t        j                  d      }t        ||t           j!                         d d        t        j                  d      }t        ||t           j!                         dd         ||d d |d   fS )Nrs   r   r   I)r	   rt   rb   rN   ru   r   r   rw   rW   rU   rS   r   r   r   r4   DCB_ATTR_DCB_BUFFERr   )rA   r1   rf   r   prio2bufferbuffer_sizes         r3   get_ieee_dcb_bufferz!DcbController.get_ieee_dcb_buffer  s    $)),!*,<
s$!&&		"!	
		&	&	($C +[$23779"1=>C +[$23779!"=>	k"1o{1~	55r5   c                    |j                  |       t        |      t        |      z   }t        t        | j                        }t        t        |      }t        t        |g      }t        t        t        t        ||g      }|j                  | j                         t        j                  | j                        }| j!                  |t               y r{   )rl   r9   r	   rt   rb   r   r   r   r   rN   r}   DCB_CMD_IEEE_SETr   rw   rW   rU   ri   )	rA   _prio2buffer_buffer_size	_tot_size
dcb_bufferrb   dcb_buffer_strr   rf   s	            r3   set_dcb_bufferzDcbController.set_dcb_buffer  s    i %(>>*	OTYY	/$.
;.	/	0$*,<
d|-!&&		"!..M"r5   c           
      F   d}d}t        j                   dd      }t        j                   dd      }t        j                   dd      }t        j                  d|||d|dz  |dz	        t        ||z   |z         z   }t	        t
        | j                        }	t        t        |      }
t        t        |
g      }t        t        t        t        |	|g      }|j                  | j                          t        j#                  | j                         }| j%                  |t               y )	Nr   r   r   s@                                                                   s      BBBBBB   rs   )r   rE   rF   r9   r	   rt   rb   r   r   r   r   rN   r}   r   r   rw   rW   rU   ri   )rA   _pfc_en_delaypfc_capmbcrequestsindicationspadspfcrb   ieee_pfcr   rf   s                r3   set_ieee_pfczDcbController.set_ieee_pfc   s    '	#[[j)(C,+ 
S)	$$ 	HgwQRSTW_`hkv`vy}`}W~~#	OTYY	/$&,(	z	*$*,<
d|-!&&		"!..M"r5   c                    d}d}d}t        j                   dd      }t        j                   dd      }t        j                   dd      }	t        j                   dd      }
t        j                   dd      }t        j                   dd      }t        j                   dd      }t        t        |            D ]
  }||   ||<    t        t        |            D ]
  }||   ||<    t        t        |            D ]
  }||   ||<    t        j                  d|||      t        ||z   |z   |z   |z   |	z   |
z         z   }t        t        | j                        }t        t        |      }t        t        |g      }t        t        t        t         ||g      }|j#                  | j$                         t        j'                  | j$                        }| j)                  |t               y )Nr   r   s           r   rs   )r   rk   r?   rE   rF   r9   r	   rt   rb   r   r   r   r   rN   r}   r   r   rw   rW   rU   ri   )rA   _prio_tc_tsa_tc_bwr   r   r   r   r   r   r   r   r   r   uptcetsrb   ieee_etsr   rf   s                        r3   set_ieee_etszDcbController.set_ieee_ets7  s   ''	#[[i(({{3	**C++S),,[[i((;;sI&&KKY''#h- <b'"+<#d)3b48fRj3#f+9bvbz9E7GS1HX=P
>>!>"$/>02>>? 5@ 	@# 
OTYY	/$&,(	z	*$*,<
d|-!&&		"!..M"r5   c                    t        t        | j                        }t        t        t
        t        |g      }|j                  | j                         t        j                  | j                        }|j                  t           }|j                  t           j                         }t        j                  d|t           j!                         d      }|S )Nrs   QQQQQQQQr   )r	   rt   rb   rN   ru   r   r   rw   rW   rU   rS   r   r   rE   r   DCB_ATTR_IEEE_MAXRATEr   )rA   r1   rf   ieee_nestedr   
tc_maxrates         r3   get_ieee_maxratezDcbController.get_ieee_maxrateU  s    $)),!*,<
s$!&&		"!&+	
		&	&	($!!*T2G-H-L-L-NPQR*	r5   c                    t        j                  d|d   |d   |d   |d   |d   |d   |d   |d	   	      }t        t        | j                        }t        t        |      }t        t        |g      }t        t        t        t        ||g
      }|j                  | j                         t        j                  | j                        }| j!                  |t               y )Nr   r   r   r   r   r   r   r   r   rs   )rE   rF   r	   rt   rb   r   r   r   r   rN   r}   r   r   rw   rW   rU   ri   )rA   _tc_maxrater   rb   ieee_maxrater   rf   s          r3   set_ieee_maxratezDcbController.set_ieee_maxrated  s    {{:!n!n!n!n!n!n!n!n	* 
OTYY	/$.
;,	~	.$*,<
d|-!&&		"!..M"r5   c                    t        t        | j                        }t        t        t
        t        |g      }|j                  | j                         t        j                  | j                        }|j                  t           j                         }t        j                  d      }t        ||t           j!                         d d        t        j                  d      }t        ||t           j!                         dd         | j#                  |d      }|d   }|d   }|d   }|d   }	|d	   }
|d
   }|d   }|d   }|d   }|d   }|d   }|||||	|
||||||fS )Nrs   r   r   r   r   r   r   r   r   r   r   r   r   r   )r	   rt   rb   rN   ru   r   r   rw   rW   rU   rS   r   r   r   r4   DCB_ATTR_IEEE_QCNr   _DcbController__parse_array)rA   r1   rf   r   
rpg_enable
lst_paramsrppp_max_rpsrpg_time_resetrpg_byte_resetrpg_thresholdrpg_max_raterpg_ai_raterpg_hai_raterpg_gdrpg_min_dec_facrpg_min_ratecndd_state_machines                    r3   get_ieee_qcnzDcbController.get_ieee_qcnz  sq   $)),!*,<%!&&		"!	
		&	&	(${{3*Z/0446r:;kk#!Q&'++-ab12!!!A&*A,a=.a=.Q--A,1+A,a=&qM/A,!"~	\>>=R^`kmy  |B  DS  Ua  cu  
u  ur5   c                 `   t        t        | j                        }t        t        t
        t        |g      }|j                  | j                         t        j                  | j                        }|j                  t           j                         }t        j                  d|t           j!                         d      }t#        j"                  d      }t%        ||t           j!                         dd         | j'                  |d      }|d   }|d   }|d   }|d	   }	|d
   }
|d   }|||||	|
|fS )Nrs   r   r   r   @   r   r   r   r   r   r   )r	   rt   rb   rN   ru   r   r   rw   rW   rU   rS   r   r   rE   r   DCB_ATTR_IEEE_QCN_STATSr   r   r4   r   )rA   r1   rf   r   rppp_rp_centisecondslst_statisticsrppp_created_rpsignored_cnmestimated_total_ratecnms_handled_successfullymin_total_limiters_ratemax_total_limiters_rates               r3   get_ieee_qcnstatszDcbController.get_ieee_qcnstats  s1   $)),!*,<%!&&		"!	
		&	&	($++Jt<S7T7X7X7Z\]^kk#!Q,-113BC89%%a*.#A&q!+'*,Q/*1-*1-	/>RTm  pG  I`  
`  `r5   c                    t        |d         t        |d   |d   z   |d   z   |d   z   |d   z   |d   z   |d   z   |d	   z   |d
   z   |d   z   |d   z         z   }t        t        | j                        }t	        t
        |      }t        t        |g      }t        t        t        t        ||g      }|j                  | j                         t        j                  | j                        }| j                  |t               y )Nr   r   r   r   r   r   r   r   r   r   r   r   rs   )r9   r	   rt   rb   r   r   r   r   rN   r}   r   r   rw   rW   rU   ri   )rA   _qcnqcnrb   ieee_qcnr   rf   s          r3   set_ieee_qcnzDcbController.set_ieee_qcn  s$   aHT!WtAw%6a%@47%JTRSW%TW[\]W^%^aefgah%hkopqkr%ruyz{u|%|  @D  EG  @H  &H  KO  PR  KS  &S  T  	T#	OTYY	/$&,(	z	*$*,<t.!&&		"!..M"r5   c                 "   t        t        | j                        }t        t        t
        t        |g      }|j                  | j                         t        j                  | j                        }|j                  t           j                         }|t           }|j                         }t               }t!        t#        |            D ]C  }t%        j&                  d||   j(                        \  }}	}
t+        ||	|
      |j,                  |<   E |S )Nrs   BBH)r	   rt   rb   rN   ru   r   r   rw   rW   rU   rS   r   r   DCB_ATTR_IEEE_APP_TABLEget_app_tableDcbAppTablerk   r?   rE   rV   dataDcbAppapps)rA   r1   rf   r   ieee_app_tablerS   appTablerp   selectorpriorityprotocols              r3   get_ieee_app_tablez DcbController.get_ieee_app_table  s    $)),!*,<
s$!&&		"!	
		&	&	($/0.

&
&
(%](U ;a#)==a#F8XxXx:8==; 
/r5   c                    t        j                  d|||      }t        t        | j                        }t        t        |      }t        t        |g      }t        t        |g      }t        t        t        t        ||g      }	|	j                  | j                         t        j!                  | j                        }	| j#                  |	t               y Nr   rs   )rE   rF   r	   rt   rb   r   DCB_ATTR_IEEE_APPr   r   r   rN   r}   r   r   rw   rW   rU   ri   
rA   r  r  r  dcb_apprb   ieee_appr  r   rf   s
             r3   set_ieee_appzDcbController.set_ieee_app      ;;uh(C'otyy9$&0(1H:>.-.)9:$*,<
d|-!&&		"!..M"r5   c                    t        j                  d|||      }t        t        | j                        }t        t        |      }t        t        |g      }t        t        |g      }t        t        t        t        ||g      }	|	j                  | j                         t        j!                  | j                        }	| j#                  |	t               y r  )rE   rF   r	   rt   rb   r   r  r   r   r   rN   r}   DCB_CMD_IEEE_DELr   rw   rW   rU   ri   r  s
             r3   del_ieee_appzDcbController.del_ieee_app  r  r5   N)rI   rJ   rK   rB   ri   r   ry   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r	  r  r  rL   r5   r3   r^   r^      sr    

$%##(6 ##.#<#,u<`2#$##r5   r^   c                       e Zd Zd Zy)r  c                 .    || _         || _        || _        y r=   )r  r  r  )rA   r  r  r  s       r3   rB   zDcbApp.__init__  s    $-$-$-r5   N)rI   rJ   rK   rB   rL   r5   r3   r  r    s    r5   r  c                   0    e Zd Zd Zd Zd Zd Zd Zd Zy)r   c                     i | _         y r=   )r  rG   s    r3   rB   zDcbAppTable.__init__  s	    $)r5   c                     d}t        t        | j                              D ]$  }| j                  |   j                  |k(  s |dz   }& |S )Nr   r   )rk   r?   r  r  )rA   r  countrp   s       r3   countAppSelectorzDcbAppTable.countAppSelector  sI    
%TYY  a
iilx'AIE 
,r5   c                    g d}t        t        | j                              D ]]  }| j                  |   j                  |k(  s || j                  |   j                  xx   d| j                  |   j
                  z  z  cc<   _ t        d      D ]l  }d}d|z  }t        ||         dkD  r.||||   d d z   dz   z  }||   dd  ||<   t        ||         dkD  r.||   dk7  r||||   z   z  }|dk7  sbt        |       n y )N) r  r  r  r  r  r  r  z%02d,r   r  z	prio:%d dscp:r'   
)rk   r?   r  r  r  r  print)rA   r  srp   temppads         r3   printAppSelectorzDcbAppTable.printAppSelector  s   !TYY  @a
iilx'diil$))A,*?*? ??@ 8 
a
4
Q
3
ad)b.C!A$s)Od""DQ49AaD ad)b. dbjC!A$JD
bj	$K
r5   c                     | j                   j                         D ].  }|j                  t        k(  st	        d|j
                  z         0 y )Nz	prio:%d)r  valuesr  IEEE_8021QAZ_APP_SEL_ETHERTYPEr  r  )rA   apps     r3   printDefaultPriorityz DcbAppTable.printDefaultPriority  s<    YY &c	ll44	+
$%&r5   c                 4   t        t        | j                              D ]w  }| j                  |   j                  |k(  s |j	                  | j                  |   j                  | j                  |   j
                  | j                  |   j                         y y r=   )rk   r?   r  r  r  r  r  )rA   ctrlr  rp   s       r3   delAppEntryzDcbAppTable.delAppEntry  sr    TYY  [a
iilx'diil++TYYq\-B-BDIIaLDYDYZ[r5   c                 P    t        |      D ]  }|j                  ||dz	  |        y )Nr   )rk   r  )rA   r*  r  max_protocolrp   s        r3   setDefaultAppEntryzDcbAppTable.setDefaultAppEntry  s1     *aXqAvq)* 	r5   N)	rI   rJ   rK   rB   r  r#  r(  r+  r.  rL   r5   r3   r   r     s!    &&
[
	r5   r   )\r-   ospathexistsrl   socketrE   r   netlinkr   r   r   r   r   r   r	   r
   r   r   r   r`   ru   r}   	AF_UNSPECDCB_CMD_UNDEFINEDrv   r~   DCB_CMD_PGTX_GCFGDCB_CMD_PGTX_SCFGDCB_CMD_PGRX_GCFGDCB_CMD_PGRX_SCFGDCB_CMD_PFC_GCFGDCB_CMD_PFC_SCFGDCB_CMD_SET_ALLDCB_CMD_GPERM_HWADDRDCB_CMD_GCAPDCB_CMD_GNUMTCSDCB_CMD_SNUMTCSDCB_CMD_PFC_GSTATEDCB_CMD_PFC_SSTATEDCB_CMD_BCN_GCFGDCB_CMD_BCN_SCFGDCB_CMD_GAPPDCB_CMD_SAPPr   r   r   r   DCB_CMD_GFEATCFGDCB_CMD_SFEATCFGDCB_CMD_CEE_GETr  DCB_ATTR_UNDEFINEDrt   r|   DCB_ATTR_PFC_STATEDCB_ATTR_PFC_CFGDCB_ATTR_NUM_TCDCB_ATTR_PG_CFGDCB_ATTR_SET_ALLDCB_ATTR_PERM_HWADDRDCB_ATTR_CAPDCB_ATTR_NUMTCSDCB_ATTR_BCNDCB_ATTR_APPr   r   DCB_ATTR_FEATCFGDCB_ATTR_CEEDCB_ATTR_IEEE_UNSPECr   r   r   DCB_ATTR_IEEE_PEER_ETSDCB_ATTR_IEEE_PEER_PFCDCB_ATTR_IEEE_PEER_APPr   r   r   r   DCB_ATTR_IEEE_APP_UNSPECr  r&  version_PY_VERSIONr4   r9   r;   rN   r^   r  r   rL   r5   r3   <module>r^     s@  :  	77>>'(&'77>>453477>>4534    Q  Q  Q  Q 

	                                    !" kk2 27 (J# J#X
 ,	 ,	r5   