
    hk              	           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	e          Zd
ddddddddZ G d de          ZdddddZ G d de          Z G d de          Z G d de          Z G d  d!e          Z G d" d#e          Z G d$ d%e          Z G d& d'e          Z G d( d)e          Z  G d* d+e          Z!eeeeeee e!dZ" G d, d-e          Z# ej$        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                       e Zd ZdZd ZdS )_DAGMetricContainerzDummy DAG Metric containerc                     ||z  }| j         }| j         t          |          dz
  }|d d         t          j        d|          z   |dd          z   }|S )N      Blenstructpackselfpktpaytmp_lens       ]/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/contrib/rpl_metrics.py
post_buildz_DAGMetricContainer.post_build!   Y    s
(8#hhlG"1"gC111CG;
    N)__name__
__module____qualname__namer!    r#   r    r   r      s(        'D    r#   r   Node State and AttributesNode Energy	Hop CountLink ThroughputLink LatencyLink Quality LevelLink ETX
Link Color)r   r                     c                       e Zd ZdZdZ edde           edddd	           edd
d           gZ	e
dd            ZdS )DAGMCObjUnknownz)
    Dummy unknown metric/constraint
    zUnknown DAGMC Object Optionotyper1   olenNodatar   )	length_offmt c                     | j         S N)r:   r   s    r    <lambda>zDAGMCObjUnknown.<lambda><   s    sx r#   length_fromc                 `    |r+t          |d                   }|t          v rt          |         S | S )z4
        Dispatch hook for DAGMC sub-fields
        r   )r   	DAGMC_CLS)cls_pkt_kargsopt_types        r    dispatch_hookzDAGMCObjUnknown.dispatch_hook>   s6    
  	+47||H9$$ **
r#   r@   )r$   r%   r&   __doc__r'   r   DAGMC_OBJTYPEr
   r   fields_descclassmethodrL   r(   r#   r    r8   r8   4   s          )D =!];; =cJJJ;w+?+?A A ABK
    [  r#   r8   additivemaximumminimummultiplicative)r   r   r   r1   c                       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 ZdS )DAGMCObjzF
    Set the length field in DAG Metric Constraint Control Option
    zDummy DAG MC Objectr9   r   resflagsr3   Pr   CORAr1   precr2   r   Nc                     ||z  }| j         }| j         t          |          dz
  }|d d         t          j        d|          z   |dd          z   }|S )Nr2   r1   r   r   r   s       r    r!   zDAGMCObj.post_build`   r"   r#   )r$   r%   r&   rM   r'   r   rN   r   r	   AGG_RTMETRICr   rO   r!   r(   r#   r    rV   rV   P   s          !D =!];;8J1--8CA&&8CA&&8CA&&8CA&&<Q<888FAq))9UD))+K    r#   rV   c            	           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   Zd
S )RPLDAGMCNSAz/
    DAG Metric: Node State and Attributes
    r)   r   resr   flagsr4   AggOverloadN
r$   r%   r&   rM   r'   r9   rV   rO   r   r   r(   r#   r    ra   ra   i   sx          'DE&	%!Q1Q""* KKKr#   ra   c            	           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   ZdS )RPLDAGMCNodeEnergyz!
    DAG Metric: Node Energy
    r*   r   rc   r   r2   Ir   TEE_EN
r$   r%   r&   rM   r'   r9   rV   rO   r   r   r(   r#   r    rh   rh   y   s          DE&!Qaaa	%* KKKr#   rh   c                   t    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   Zd
S )RPLDAGMCHopCountz
    DAG Metric: Hop Count
    r+   r1   rb   r   r2   rc   HopCountr   Nrm   r(   r#   r    ro   ro      sg          DE&1!Q	*a  	* KKKr#   ro   c                   D    e Zd ZdZdZdZej         edd          gz   ZdS )RPLDAGMCLinkThroughputz%
    DAG Metric: Link Throughput
    r,   r2   
Throughputr   N	r$   r%   r&   rM   r'   r9   rV   rO   r   r(   r#   r    rr   rr      sE          DE&q!!* KKKr#   rr   c                   D    e Zd ZdZdZdZej         edd          gz   ZdS )RPLDAGMCLinkLatencyz"
    DAG Metric: Link Latency
    r-   r3   Latencyr   Nrt   r(   r#   r    rv   rv      sE          DE&A* KKKr#   rv   c                   t    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   Zd
S )RPLDAGMCLinkQualityLevelz.
    DAG Metric: Link Quality Level (LQL)
    r.   r4   rb   r   valr1   counterr3   Nrf   r(   r#   r    ry   ry      sg           DE&	%1Aq!!	* KKKr#   ry   c                   D    e Zd ZdZdZdZej         edd          gz   ZdS )RPLDAGMCLinkETXz
    DAG Metric: Link ETX
    r/   r5   ETXr   N)	r$   r%   r&   rM   r'   r9   rV   rO   r   r(   r#   r    r}   r}      sE          DE&
5!* KKKr#   r}   c                   t    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   ZdS )RPLDAGMCLinkColorz 
    DAG Metric: Link Color
    r0   r6   rb   r   colorr   
   r{   r4   Nrf   r(   r#   r    r   r      sg          DE&	%!R  Aq!!	* KKKr#   r   c            
       ~    e Zd ZdZdZ edde           edd           edd           e	d	g e
d
d           gZdS )RPLOptDAGMCz.
    Control Option: DAG Metric Container
    zDAG Metric Containerr9   r   r   Nautopadr   optionsr6   c                     d| j         z  S )Nr6   )r   rA   s    r    rB   zRPLOptDAGMC.<lambda>   s    SW r#   rC   )r$   r%   r&   rM   r'   r   r   r   r   r   r8   rO   r(   r#   r    r   r      s|          "D =!Z889UD))''	155 =B-D-DF F FGKKKr#   r   r   )%rM   r   scapy.compatr   scapy.packetr   scapy.fieldsr   r   r   r   r	   r
   r   r   scapy.layers.inet6r   r   scapy.contrib.rplr   r   r   rN   r8   r_   rV   ra   rh   ro   rr   rv   ry   r}   r   rF   r   updater(   r#   r    <module>r      sX  
 
             7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 B B B B B B B B 1 1 1 1 1 1 1 1	 	 	 	 	& 	 	 	 0!%"( " "    f   , #% %    v   2    (           "    x   
 
 
 
 
X 
 
 

 
 
 
 
( 
 
 
    x   
 
 
 
 
h 
 
 
        " &#(!# #		G 	G 	G 	G 	G% 	G 	G 	G ;          r#   