U
    tbRD                     @   s  d dl mZ d dlZd dlZd dlmZmZ d dlmZmZ ddddd	d
ddddd
Z	ddddZ
eG dd deZG dd deZeG dd deZG dd deZG dd deZeG dd deZG dd deZG d d! d!eZG d"d# d#eZdS )$    )total_orderingN)ceillog)defaultdictOrderedDict                   @      i   i   )
zNO-OFDMzNO-CCKz	NO-INDOORz
NO-OUTDOORZDFSzPTP-ONLYz	PTMP-ONLYzNO-IRzNO-HT40zAUTO-BW   )zDFS-FCCzDFS-ETSIzDFS-JPc                   @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )WmmRulec	           	      C   s4   || _ || _|| _|| _|| _|| _|| _|| _d S Nvo_cvi_cbe_cbk_cvo_apvi_apbe_apbk_ap)	selfr   r   r   r   r   r   r   r    r   k/home/jack/SDK/XuTao-WR3000-OpenWrt-21.02/build_dir/target-x86_64_musl/wireless-regdb-2022.08.12/dbparse.py__init__#   s    zWmmRule.__init__c                 C   s$   | j | j| j| j| j| j| j| jfS r   r   r   r   r   r   	_as_tuple-   s       zWmmRule._as_tuplec                 C   s   |d krdS |   |  kS NFr    r   otherr   r   r   __eq__1   s    zWmmRule.__eq__c                 C   s
   | |k S r   r   r#   r   r   r   __ne__6   s    zWmmRule.__ne__c                 C   s   |d krdS |   |  k S r!   r"   r#   r   r   r   __lt__9   s    zWmmRule.__lt__c                 C   s   t |  S r   hashr    r   r   r   r   __hash__>   s    zWmmRule.__hash__N)	__name__
__module____qualname__r   r    r%   r&   r'   r*   r   r   r   r   r      s   
r   c                   @   sF   e Zd ZdddZdd Zdd Zdd	 Zd
d Zdd Zdd Z	dS )FreqBandNc                 C   s    || _ || _|| _|pg | _d S r   )startendmaxbwcomments)r   r/   r0   bwr2   r   r   r   r   B   s    zFreqBand.__init__c                 C   s   | j | j| jfS r   r/   r0   r1   r   r   r   r   r    H   s    zFreqBand._as_tuplec                 C   s   |   |  kS r   r"   r#   r   r   r   r%   K   s    zFreqBand.__eq__c                 C   s
   | |k S r   r   r#   r   r   r   r&   N   s    zFreqBand.__ne__c                 C   s   |   |  k S r   r"   r#   r   r   r   r'   Q   s    zFreqBand.__lt__c                 C   s   t |  S r   r(   r   r   r   r   r*   T   s    zFreqBand.__hash__c                 C   s   d| j | j| jf S )Nz<FreqBand %.3f - %.3f @ %.3f>r4   r   r   r   r   __str__W   s
      zFreqBand.__str__)N
r+   r,   r-   r   r    r%   r&   r'   r*   r5   r   r   r   r   r.   A   s   
r.   c                   @   sF   e Zd ZdddZdd Zdd Zdd	 Zd
d Zdd Zdd Z	dS )PowerRestrictionNc                 C   s   || _ || _|pg | _d S r   )max_ant_gainmax_eirpr2   )r   r8   r9   r2   r   r   r   r   ]   s    zPowerRestriction.__init__c                 C   s   | j | jfS r   )r8   r9   r   r   r   r   r    b   s    zPowerRestriction._as_tuplec                 C   s   |   |  kS r   r"   r#   r   r   r   r%   e   s    zPowerRestriction.__eq__c                 C   s
   | |k S r   r   r#   r   r   r   r&   h   s    zPowerRestriction.__ne__c                 C   s   |   |  k S r   r"   r#   r   r   r   r'   k   s    zPowerRestriction.__lt__c                 C   s   t |  S r   r(   r   r   r   r   r*   n   s    zPowerRestriction.__hash__c                 C   s   dS )Nz<PowerRestriction ...>r   r   r   r   r   r5   q   s    zPowerRestriction.__str__)Nr6   r   r   r   r   r7   [   s   
r7   c                   @   s   e Zd Zdd ZdS )DFSRegionErrorc                 C   s
   || _ d S r   )
dfs_region)r   r;   r   r   r   r   u   s    zDFSRegionError.__init__Nr+   r,   r-   r   r   r   r   r   r:   t   s   r:   c                   @   s   e Zd Zdd ZdS )	FlagErrorc                 C   s
   || _ d S r   )flag)r   r>   r   r   r   r   y   s    zFlagError.__init__Nr<   r   r   r   r   r=   x   s   r=   c                   @   sD   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dS )
Permissionc                 C   s   t |tstt |tstt |ts2|d ks2t|| _|| _|| _d| _|D ]&}|t	krbt
||  jt	| O  _qN|| _d S Nr   )
isinstancer.   AssertionErrorr7   r   freqbandpowerwmmruleflagsflag_definitionsr=   Z	textflags)r   rC   rD   rF   rE   r>   r   r   r   r   ~   s    zPermission.__init__c                 C   s   | j | j| j| jfS r   )rC   rD   rF   rE   r   r   r   r   r       s    zPermission._as_tuplec                 C   s   |   |  kS r   r"   r#   r   r   r   r%      s    zPermission.__eq__c                 C   s
   | |k S r   r   r#   r   r   r   r&      s    zPermission.__ne__c                 C   s   |   |  k S r   r"   r#   r   r   r   r'      s    zPermission.__lt__c                 C   s   t |  S r   r(   r   r   r   r   r*      s    zPermission.__hash__c                 C   s   t | jt | j t | j S r   )strrC   rD   rE   r   r   r   r   r5      s    zPermission.__str__Nr6   r   r   r   r   r?   |   s   r?   c                   @   s>   e Zd ZdddZdd Zdd Zdd	 Zd
d ZeeZ	dS )CountryNc                 C   s<   |pg | _ |pg | _d| _|r8|tkr.t|t| | _d S r@   )_permissionsr2   r;   dfs_regionsr:   )r   r;   permissionsr2   r   r   r   r      s    

zCountry.__init__c                 C   s(   t |tst| j| | j  d S r   )rA   r?   rB   rJ   appendsortr   permr   r   r   add   s    zCountry.addc                 C   s   t |tst|| jkS r   )rA   r?   rB   rJ   rO   r   r   r   __contains__   s    zCountry.__contains__c                 C   s   dd | j D }dd| S )Nc                 S   s$   g | ]\}}d t |t |f qS )z(%s, %s))rH   ).0bpr   r   r   
<listcomp>   s     z#Country.__str__.<locals>.<listcomp>z<Country (%s)>z, )rJ   join)r   rr   r   r   r5      s    zCountry.__str__c                 C   s
   t | jS r   )tuplerJ   r   r   r   r   _get_permissions_tuple   s    zCountry._get_permissions_tuple)NN)
r+   r,   r-   r   rQ   rR   r5   rZ   propertyrL   r   r   r   r   rI      s   

rI   c                   @   s   e Zd ZdS )SyntaxErrorN)r+   r,   r-   r   r   r   r   r\      s   r\   c                   @   s   e Zd ZdddZd ddZdd Zd!d	d
Zdd Zdd Zd"ddZ	dd Z
dd Zdd Zdd Zdd Zdd Zdd ZdS )#DBParserNc                 C   s   |p
t jj| _d S r   )sysstderrwrite_warn_callout)r   warnr   r   r   r      s    zDBParser.__init__c                 C   s&   |rd| pd}t d| j|f d S )Nz (%s) zSyntax error in line %d%s)r\   _linenor   Ztxtr   r   r   _syntax_error   s    zDBParser._syntax_errorc                 C   s   |  d| j|f  d S )NzWarning (line %d): %s
)ra   rd   re   r   r   r   _warn   s    zDBParser._warnTc           	      C   sR  z| d\}}t|}W n tk
r2   d}Y nX z~| d\}}t|}t|}|dkrj| d|  |dkr| d|  ||kr| d||f  ||kr| d|  W n tk
r   | d	 Y nX t|||| jd
}g | _|| j|< || jkr.|r| d|| j| f  | j| | j|< || j	|< || j|< | j
| j|< d S )N@g      4@-r   zInvalid start freq (%d)zInvalid end freq (%d)zInverted freq range (%d - %d)z"Start and end freqs are equal (%d)zband must have frequency ranger2   z)Duplicate band definition ("%s" and "%s"))splitfloat
ValueErrorrf   r.   	_comments_banddup_bandrevrg   _bandsrd   	_bandline)	r   bnameZbanddefdupwarnZfreqsr3   r/   r0   rT   r   r   r   _parse_band_def   s@    

 

zDBParser._parse_band_defc                 C   sd   z"| dd\}}|s | d W n tk
r@   | d Y nX |tkrT| d | || d S )N:r   z''band' keyword must be followed by namez#band name must be followed by colonzInvalid band name)rk   rf   rm   rG   ru   )r   liners   r   r   r   _parse_band   s    
zDBParser._parse_bandc                 C   sd   z"| dd\}}|s | d W n tk
r@   | d Y nX |tkrT| d | || d S )Nrv   r   z('power' keyword must be followed by namez$power name must be followed by colonzInvalid power name)rk   rf   rm   rG   _parse_power_def)r   rw   pnamer   r   r   _parse_power   s    
zDBParser._parse_powerc                 C   s   z,|}|dkrd}t d}dd }||}W n tk
rJ   | d Y nX t||| jd}g | _|| j|< || jkr|r| d|| j| f  | j| | j|< || j|< || j|< | j	| j
|< d S )	NzN/A0r   c                 S   s4   |  dr(t| d d } dt|  S t| S d S )NZmWg      $@)endswithrl   mathZlog10)Zpwrr   r   r   conv_pwr  s    
z+DBParser._parse_power_def.<locals>.conv_pwrzinvalid power datarj   z*Duplicate power definition ("%s" and "%s"))rl   rm   rf   r7   rn   	_powerdup	_powerrevrg   _powerrd   
_powerline)r   rz   rw   rt   r9   r8   r   rU   r   r   r   ry     s0    

 

zDBParser._parse_power_defc                 C   sd   |d d   }|s| d |d}i | _|D ]&}|| jkrN| d|  d| j|< q2g | _d S )Nz,'wmmrule' keyword must be followed by region,z(region %s was added already to wmm rulesr   )striprf   rk   _current_regions
_wmm_rulesrg   rn   )r   rw   Zregionsregionr   r   r   _parse_wmmrule#  s    


zDBParser._parse_wmmrulec                 C   s   |dk r|  d|  |dk r,|  d|  ||krF|  d||f  t|d ddkrd|dk sr|  d|  t|d ddkr|dk s|  d|  |dk r|  d	|  |d
k r|  d|  d S )Nr   zInvalid cw_min value (%d)zInvalid cw_max value (%d)z$Inverted contention window (%d - %d)1i   z2Invalid cw_min value should be power of 2 - 1 (%d)z2Invalid cw_max value should be power of 2 - 1 (%d)zInvalid aifsn value (%d)r   zInvalid cot value (%d))rf   bincount)r   Zcw_minZcw_maxZaifsnZcotr   r   r   _validate_input1  s(    zDBParser._validate_inputc                 C   s    |t tt|dd  d k S )Nr   g       @)r   lenr   )r   varbytcntr   r   r   _validate_sizeE  s    zDBParser._validate_sizec           	      C   s   d}z | d\}}|s"| d W n tk
rB   | d Y nX tdd | dD }| j|  t||D ]@\}}| ||r| d||f  | jD ]}|| j| |< qqpd S )	N)       @r   g      ?r   rv   zwmm item must have ac prefixz)access category must be followed by colonc                 S   s    g | ]}t |d dd qS )=r   )intrk   )rS   vr   r   r   rV   P  s     z0DBParser._parse_wmmrule_item.<locals>.<listcomp>r   z&unexpected input size expect %d got %d)	rk   rf   rm   rY   r   zipr   r   r   )	r   rw   r   acZcvalrU   r   rT   rX   r   r   r   _parse_wmmrule_itemH  s     

zDBParser._parse_wmmrule_itemc                 C   s   z*| dd\}}| }|s(| d W n tk
rH   | d Y nX | d}i | _|D ]V}t|dkr|| d|  |d}|| jkrt	|| j
d	| j|< | j| | j|< q^g | _
d S )
Nrv   r   z*'country' keyword must be followed by namez&country name must be followed by colonr   r   zcountry '%s' not alpha2asciirj   )rk   r   rf   rm   _current_countriesr   rg   encode
_countriesrI   rn   )r   rw   cnameZcvalsr;   Zcnamesr   r   r   _parse_countryZ  s"    


zDBParser._parse_countryc              
   C   s  |d dkr\z6|dd   dd\}}d| j }| j||dd W q   | d Y qX nPz0| d	d\}}|s|| d
 |s| d W n tk
r   | d Y nX |d dkrF| dd}t|dkr|d }d}|d dks| d |d d }g }n|d }|d  d	}|dd  }d| j }| j||dd n| d	}|d }|dd  }d }|rd|d krz6|  ddd }	|	| j	 kr| d|	  W n  t
k
r   | d Y nX t| j|	   }|| jkr| d || jkr| d d| j|< d| j|< | j| }| j| }| j| }
| j| }zt|
|||}W n4 tk
r } z| d|j  W 5 d }~X Y nX | j D ]4\}}||kr| d|||f  n
|| qd S )Nr   (r   z),z
UNNAMED %dF)rt   z#Badly parenthesised band definitionr   z!country definition must have bandz"country definition must have powerz+country definition must have band and powerrc   r   )z$Badly parenthesised power definitionrE   r   zNo wmm rule for %sz*flags is empty list or no region was foundzband does not existzpower does not existTzInvalid flag '%s'z!Rule "%s, %s" added to "%s" twice)rk   rd   ru   rf   rm   r   ry   popr   keys
IndexErrorr   valuesrq   r   _bands_used_power_usedro   r   r?   r=   r>   r   itemsrg   rQ   )r   rw   bandrs   r   rz   rF   rD   wr   rT   rU   rP   er   cr   r   r   _parse_country_itemo  s~    












"
  
zDBParser._parse_country_itemc                 C   s  d | _ d | _i | _i | _i | _i | _i | _i | _i | _i | _	i | _
i | _i | _tdd | _g | _d| _|D ]}|  jd7  _| }|dd dkr| j|dd    |dddd}|sd | _g | _|dd }|sql|dd	 d
kr | |d	d   d | _ d | _g | _ql|dd dkrX| |dd   d | _ d | _g | _ql|dd dkr| |dd   g | _d | _ql| j d k	rd | _| | g | _ql|dd dkr| |dd   d | _ g | _ql| jd k	r| | d | _ g | _ql| d ql| j}i }| j D ]R\}}|| jkrJ||| j	| < q$| j	| |kr$| j| | _| d|  q$i }| j D ]R\}}|| jkr||| j
| < q| j
| |kr| j| | _| d|  q|S )Nc                   S   s   t  S r   )r   r   r   r   r   <lambda>      z DBParser.parse.<locals>.<lambda>r   r   # rc   	r	   r      rD      ZcountryrE   z*Expected band, power or country definitionzUnused band definition "%s"zUnused power definition "%s")r   r   rq   r   r   r   r   rp   r   ro   r   rr   r   r   r   rn   rd   r   rM   replacerk   rx   r{   r   r   r   r   rf   r   rg   )r   frw   	countriesZbandskr   rD   r   r   r   parse  s    


zDBParser.parse)N)N)T)T)r+   r,   r-   r   rf   rg   ru   rx   r{   ry   r   r   r   r   r   r   r   r   r   r   r   r]      s   


$
Er]   )	functoolsr   r^   r   r   r   collectionsr   r   rG   rK   objectr   r.   r7   	Exceptionr:   r=   r?   rI   r\   r]   r   r   r   r   <module>   s<    !