a
    kÄ#dk  ã                	   @   sx  d Z ddlZddlmZ ddlmZ ddlmZmZm	Z	m
Z
mZmZmZmZ ddlmZmZ ddlmZmZ G dd	„ d	eƒZd
ddddddddœZG dd„ deƒZdddddœZG dd„ deƒZG dd„ deƒZG dd„ deƒZG d d!„ d!eƒZG d"d#„ d#eƒZG d$d%„ d%eƒZG d&d'„ d'eƒZG d(d)„ d)eƒZ G d*d+„ d+eƒZ!eeeeeee e!dœZ"G d,d-„ d-eƒZ#e $d.e#i¡ dS )/a  
RFC 6551 - Routing Metrics Used for Path Calculation in LLNs

+----------------------------+
| Metrics & Constraint Types |
+----------------------------+
| DAGMC Option               |
+----------------------------+
| RPL-DIO                    |
+----------------------------+
é    N)Úorb)ÚPacket)ÚByteEnumFieldÚ	ByteFieldÚ
ShortFieldÚBitFieldÚBitEnumFieldÚFieldLenFieldÚStrLenFieldÚIntField)Ú_PhantomAutoPadFieldÚ_OptionsField)Ú
RPLOPTSSTRÚRPLOPTSc                   @   s   e Zd ZdZdd„ ZdS )Ú_DAGMetricContainerzDummy DAG Metric containerc                 C   sL   ||7 }| j }| j d u r$t |ƒd }|d d… t d|¡ |dd …  }|S )Né   é   ÚB©ÚlenÚstructÚpack©ÚselfÚpktZpayZtmp_len© r   úP/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/contrib/rpl_metrics.pyÚ
post_build!   s    
$z_DAGMetricContainer.post_buildN)Ú__name__Ú
__module__Ú__qualname__Únamer   r   r   r   r   r      s   r   úNode State and AttributesúNode Energyú	Hop CountúLink ThroughputúLink LatencyúLink Quality LevelúLink ETXú
Link Color)r   r   é   é   é   é   é   é   c                   @   sN   e Zd ZdZdZeddeƒeddddd	�edd
dd„ d�gZ	e
ddd„ƒZdS )ÚDAGMCObjUnknownz)
    Dummy unknown metric/constraint
    zUnknown DAGMC Object OptionÚotyper*   ÚolenNÚodatar   )Z	length_ofÚfmtÚ c                 C   s   | j S )N)r2   ©r   r   r   r   Ú<lambda><   ó    zDAGMCObjUnknown.<lambda>©Zlength_fromc                 O   s$   |r t |d ƒ}|tv r t| S | S )z4
        Dispatch hook for DAGMC sub-fields
        r   )r   Ú	DAGMC_CLS)ÚclsZ_pktÚ_ZkargsZopt_typer   r   r   Údispatch_hook>   s
    zDAGMCObjUnknown.dispatch_hook)N)r   r   r    Ú__doc__r!   r   ÚDAGMC_OBJTYPEr	   r
   Úfields_descÚclassmethodr=   r   r   r   r   r0   4   s   
ÿþr0   ZadditiveÚmaximumÚminimumZmultiplicative)r   r   r   r*   c                   @   sz   e Zd ZdZdZeddeƒedddƒedddƒed	ddƒed
ddƒedddƒeddde	ƒedddƒe
ddƒg	Zdd„ ZdS )ÚDAGMCObjzF
    Set the length field in DAG Metric Constraint Control Option
    zDummy DAG MC Objectr1   r   Zresflagsr,   ÚPr   ÚCÚOÚRÚAr*   Úprecr+   r   Nc                 C   sL   ||7 }| j }| j d u r$t |ƒd }|d d… t d|¡ |dd …  }|S )Nr+   r*   r   r   r   r   r   r   r   `   s    
$zDAGMCObj.post_build)r   r   r    r>   r!   r   r?   r   r   ÚAGG_RTMETRICr   r@   r   r   r   r   r   rD   P   s   






ø
rD   c                   @   sH   e Zd ZdZdZdZejeddƒe	dddƒe	dddƒe	d	ddƒg Zd
S )ÚRPLDAGMCNSAz/
    DAG Metric: Node State and Attributes
    r"   r   Úresr   Úflagsr-   ZAggZOverloadN©
r   r   r    r>   r!   r1   rD   r@   r   r   r   r   r   r   rL   i   s   


ûrL   c                   @   sR   e Zd ZdZdZdZejedddƒedddƒed	ddƒed
ddƒe	ddƒg ZdS )ÚRPLDAGMCNodeEnergyz!
    DAG Metric: Node Energy
    r#   r   rN   r   r+   ÚIr   ÚTÚEZE_EN©
r   r   r    r>   r!   r1   rD   r@   r   r   r   r   r   r   rP   y   s   



úrP   c                   @   s>   e Zd ZdZdZdZejedddƒedddƒe	dd	ƒg Zd
S )ÚRPLDAGMCHopCountz
    DAG Metric: Hop Count
    r$   r*   rM   r   r+   rN   ZHopCountr   NrT   r   r   r   r   rU   Š   s   

ürU   c                   @   s*   e Zd ZdZdZdZejeddƒg ZdS )ÚRPLDAGMCLinkThroughputz%
    DAG Metric: Link Throughput
    r%   r+   Z
Throughputr   N©	r   r   r    r>   r!   r1   rD   r@   r   r   r   r   r   rV   ™   s   þrV   c                   @   s*   e Zd ZdZdZdZejeddƒg ZdS )ÚRPLDAGMCLinkLatencyz"
    DAG Metric: Link Latency
    r&   r,   ZLatencyr   NrW   r   r   r   r   rX   ¦   s   þrX   c                   @   s>   e Zd ZdZdZdZejeddƒe	dddƒe	ddd	ƒg Zd
S )ÚRPLDAGMCLinkQualityLevelz.
    DAG Metric: Link Quality Level (LQL)
    r'   r-   rM   r   Úvalr*   Úcounterr,   NrO   r   r   r   r   rY   ³   s   

ürY   c                   @   s*   e Zd ZdZdZdZejeddƒg ZdS )ÚRPLDAGMCLinkETXz
    DAG Metric: Link ETX
    r(   r.   ZETXr   N)	r   r   r    r>   r!   r1   rD   r@   r   r   r   r   r   r\   Â   s   þr\   c                   @   s>   e Zd ZdZdZdZejeddƒe	dddƒe	d	dd
ƒg ZdS )ÚRPLDAGMCLinkColorz 
    DAG Metric: Link Color
    r)   r/   rM   r   Úcolorr   é
   r[   r-   NrO   r   r   r   r   r]   Ñ   s   

ür]   c                
   @   sF   e Zd ZdZdZeddeƒeddƒeddƒe	d	g e
d
dd„ d�gZdS )ÚRPLOptDAGMCz.
    Control Option: DAG Metric Container
    zDAG Metric Containerr1   r   r   NZautopadr   Úoptionsr/   c                 C   s
   d| j  S )Nr/   )r   r6   r   r   r   r7   ó   r8   zRPLOptDAGMC.<lambda>r9   )r   r   r    r>   r!   r   r   r   r   r   r0   r@   r   r   r   r   r`   ê   s   

ÿýr`   r   )%r>   r   Zscapy.compatr   Zscapy.packetr   Zscapy.fieldsr   r   r   r   r   r	   r
   r   Zscapy.layers.inet6r   r   Zscapy.contrib.rplr   r   r   r?   r0   rK   rD   rL   rP   rU   rV   rX   rY   r\   r]   r:   r`   Úupdater   r   r   r   Ú<module>	   sT   (ù
ýù
