
    hJ                     8   d 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mZmZmZmZmZmZmZmZ ddlmZ ddlmZmZ ddlmZ ddl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% G d de          Z&d Z' G d de          Z( G d de          Z) G d  d!e          Z* G d" d#e          Z+ eee+d$%           dS )&a  
    Operation, administration and maintenance (OAM)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    :author:    Sergey Matsievskiy, matsievskiysv@gmail.com

    :description:

        This module provides Scapy layers for the OAM protocol.

        normative references:
          - ITU-T Rec. G.8013/Y.1731 (08/2019) - Operation, administration and
            maintenance (OAM) functions and mechanisms for Ethernet-based
            networks (https://www.itu.int/rec/T-REC-G.8013)
          - ITU-T Rec. G.8031/Y.1342 (01/2015) - Ethernet linear protection
            switching (https://www.itu.int/rec/T-REC-G.8031)
          - ITU-T Rec. G.8032/Y.1344 (02/2022) - Ethernet ring protection
            switching (https://www.itu.int/rec/T-REC-G.8032)
    )BitEnumFieldBitField	ByteFieldConditionalField	EnumFieldFCSField
FlagsFieldIntFieldLenField	LongFieldMACFieldMultipleTypeFieldNBytesFieldOUIFieldPacketFieldPadFieldPacketListField
ShortFieldFieldListField)Dot1Q)Packetbind_layers)crc32Nc                   "     e Zd ZdZ fdZ xZS )
MepIdFieldz<
    Short field with insignificant three leading bytes
    c                 h    t          t          |                               |||dz  n|           d S )Ni  )superr   __init__)selfnamedefault	__class__s      U/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/contrib/oam.pyr   zMepIdField.__init__<   sC    j$((g&9'F""w	
 	
 	
 	
 	
    )__name__
__module____qualname____doc__r   __classcell__r"   s   @r#   r   r   7   sB         
 
 
 
 
 
 
 
 
r$   r   c                   |   e Zd ZdZdZ edd           edd           e eddd	
          d f eddd	
          d fg eddd	
                     e e e	ddgdz   edd          d           d f e	ddgdz   edd          d           d fg e
ddd                    d          gZd ZdS )MegIdz
    MEG ID
    zMEG IDresv   formatr   length   Bfmtc                     | j         dk    S N    r/   ps    r#   <lambda>zMegId.<lambda>P       ah"n r$      c                     | j         dk    S N!   r8   r9   s    r#   r;   zMegId.<lambda>T   r<   r$   -   valuesvaluec                     | j         S Nr0   pkts    r#   r;   zMegId.<lambda>_       cj r$   )
count_fromc                     | j         dk    S r6   r8   xs    r#   r;   zMegId.<lambda>`       !(b. r$   c                     | j         S rE   rF   rG   s    r#   r;   zMegId.<lambda>e   rI   r$   c                     | j         dk    S r?   r8   rL   s    r#   r;   zMegId.<lambda>f   rN   r$   )szc                 
    d|fS Nr$    r   ss     r#   extract_paddingzMegId.extract_paddingn       Avr$   N)r%   r&   r'   r(   r    r   r   r   r   r   r   fields_descrW   rT   r$   r#   r,   r,   B   s         D 		&!	(A HXrs333,,
 HXrs333,,	 HXrs+++	
 	
 	 'x!r'0y!'<'<2H2HJ J J 10	 'x!r'0y!'<'<2H2HJ J J 10	 HaB/// " %	 	!#KJ    r$   r,   c                   L    e Zd ZdZdZ edd           edd          gZd ZdS )OAM_TLVz
    OAM TLV
    zOAM TLVtyper.   r0   Nc                 >    |d | j                  || j         d          fS rE   rF   rU   s     r#   rW   zOAM_TLV.extract_paddingz   !    $+$+,,//r$   	r%   r&   r'   r(   r    r   r   rY   rW   rT   r$   r#   r[   r[   r   sV          D9VQ''(D)A)ABK0 0 0 0 0r$   r[   c                   L    e Zd ZdZdZ edd           edd          gZd ZdS )OAM_DATA_TLVz
    OAM Data TLV
    zOAM Data TLVr\      r0   Nc                 >    |d | j                  || j         d          fS rE   rF   rU   s     r#   rW   zOAM_DATA_TLV.extract_padding   r^   r$   r_   rT   r$   r#   ra   ra   ~   sV          D9VQ''(D)A)ABK0 0 0 0 0r$   ra   c                        e Zd ZdZdZ edd           e eddd           d	 fg eddd
                      edddddddd           e	 e
ddd          d           gZ fdZd Zd Z xZS )OAM_TEST_TLVz
    OAM test TLV data
    zOAM test TLVr\   r7   r0   Nc                     | dz   S N   rT   ls    r#   r;   zOAM_TEST_TLV.<lambda>   s
    a!e r$   )adjustc                 .    | j         dk    p
| j         dk    S Nr.   rb   pat_typer9   s    r#   r;   zOAM_TEST_TLV.<lambda>   s    ajAo@q r$   c                     | dz   S Nr.   rT   ri   s    r#   r;   zOAM_TEST_TLV.<lambda>   s
    a!e r$   ro   r   zNull signal without CRC-32zNull signal with CRC-32zPRBS 2^-31 - 1 without CRC-32zPRBS 2^-31 - 1 with CRC-32r   r.      rb   r2   r3   crc!Ic                 .    | j         dk    p
| j         dk    S rm   rn   r9   s    r#   r;   zOAM_TEST_TLV.<lambda>   s    ajAo8q r$   c                 j   t          |dd                   dk    st          |dd                   dk    rSt          j        d|dd                   d         }d|z   }|dz
  }|d |         }|||         }||d          }||z   |z   }t          t          |                               |          }|S )Nrb      r.   z!Hr   )ordstructunpackr   re   
do_dissect)	r   rV   r0   crc_end	crc_starts1s2s3r"   s	           r#   r|   zOAM_TEST_TLV.do_dissect   s    q1v;;!s1QqS6{{a//]41Q3003F&jG!I:I:B9W$%B788BR"A,%%0033r$   c                     t          |dd                   dk    st          |dd                   dk    r<|}|d d         }t          j        dt          ||z             dz            }||z   |z   S ||z   S )Nrb   rx   r.   ru   l        )ry   rz   packr   )r   r:   payp1p2p3s         r#   
post_buildzOAM_TEST_TLV.post_build   s|    q1v;;!s1QqS6{{a//BSbSBT5b>>W#=>>B7R<s7Nr$   c                     | j         dk    s| j         dk    r$|d | j        dz
           || j        dz
  d          fS |d | j        dz
           || j        dz
  d          fS )Nr.   rb   rh   )ro   r0   rU   s     r#   rW   zOAM_TEST_TLV.extract_padding   su    =A!!3!3%dkAo%&$+/*:*:(;;;%dkAo%&$+/*:*:(;;;r$   )r%   r&   r'   r(   r    r   r   r   r   r   r   rY   r|   r   rW   r)   r*   s   @r#   re   re      s2         D 		&" HXtOODDD@@ HXtOO<<<	
 	
 		/,2/	  
	
 
	
 
	
 	HUDd+++88	
 	
-K8      < < < < < < <r$   re   c                   b    e Zd ZdZdZ edd           edd           edd          gZd	 Z	d
S )OAM_LTM_TLVz
    OAM LTM TLV data
    zOAM LTM Egress ID TLVr\      r0      	egress_idr   c                 
    d|fS rS   rT   rU   s     r#   rW   zOAM_LTM_TLV.extract_padding   rX   r$   N
r%   r&   r'   r(   r    r   r   r   rY   rW   rT   r$   r#   r   r      sj          #D 		&!1	+q!!K    r$   r   c                   x    e Zd ZdZdZ edd           edd           edd           ed	d          gZd
 Z	dS )OAM_LTR_TLV
    OAM LTR TLV data
    zOAM LTR Egress ID TLVr\   r   r0      last_egress_idr   next_egress_idc                 
    d|fS rS   rT   rU   s     r#   rW   zOAM_LTR_TLV.extract_padding   rX   r$   Nr   rT   r$   r#   r   r      s{          #D 		&!2	"A&&	"A&&K    r$   r   c                   x    e Zd ZdZdZ edd           edd           edd           ed	d
          gZd Z	d
S )OAM_LTR_IG_TLVr   zOAM LTR Ingress TLVr\   rh   r0   r   ingress_actr   ingress_macNc                 
    d|fS rS   rT   rU   s     r#   rW   zOAM_LTR_IG_TLV.extract_padding   rX   r$   
r%   r&   r'   r(   r    r   r   r   rY   rW   rT   r$   r#   r   r      sy          !D 		&!1	-##%%	K    r$   r   c                   x    e Zd ZdZdZ edd           edd           edd           ed	d
          gZd Z	d
S )OAM_LTR_EG_TLVr   zOAM LTR Egress TLVr\      r0   r   
egress_actr   
egress_macNc                 
    d|fS rS   rT   rU   s     r#   rW   zOAM_LTR_EG_TLV.extract_padding  rX   r$   r   rT   r$   r#   r   r     sy           D 		&!1	,""t$$	K    r$   r   c                   b    e Zd ZdZdZ edd           edd           edd          gZd	 Z	d
S )OAM_TEST_ID_TLVz
    OAM Test ID TLV data
    zOAM Test ID TLVr\   $   r0   r7   test_idr   c                 
    d|fS rS   rT   rU   s     r#   rW   zOAM_TEST_ID_TLV.extract_padding!  rX   r$   N)
r%   r&   r'   r(   r    r   r   r
   rY   rW   rT   r$   r#   r   r     sj          D 		&"2AK    r$   r   c                 V   |dd         dk    rd S |dd         dk    rt           S |dd         dk    rt          S |dd         dk    rt          S |dd         dk    rt          S |dd         dk    rt          S |dd         d	k    rt
          S |dd         d
k    rt          S t          S )Nr   r.                             $)ra   r   r   r   r   re   r   r[   )rH   lstcurremains       r#   guess_tlv_typer   %  s    ac{gt	!			!			!			!			!			!			!		r$   c                   L    e Zd ZdZdZ edd           edd          gZd ZdS )PTP_TIMESTAMPz
    PTP timestamp
    zPTP timestampsecondsr   nanosecondsc                 
    d|fS rS   rT   rU   s     r#   rW   zPTP_TIMESTAMP.extract_paddingC  rX   r$   N)r%   r&   r'   r(   r    r
   rY   rW   rT   r$   r#   r   r   :  sV         
 D8Iq))88M1+E+EFK    r$   r   c                       e Zd ZdZd Z edddddddd	d
ddddddd           edddddddd           edddddd           edddddd           edddd d!i          gZd" Z	d#S )$APSz5
    Linear protective switching APS data packet
    req_str   rx   No request (NR)zDo not request (DNR)zReverse request (RR)zExercise (EXER)zWait-to-restore (WTR)
DeprecatedManual switch (MS)zSignal degrade (SD)zSignal fail for working (SF)Forced switch (FS)z Signal fail on protection (SF-P)zLockout of protection (LO))r   r.   rs   rx   rh   r   r   	      r1      r=   	prot_typeAr2   DR)r   rx   rs   r.   req_sigzNull signalzNormal traffic)r   r.   r3   br_sigbr_typer      Tc                 
    d|fS rS   rT   rU   s     r#   rW   zAPS.extract_paddingv  rX   r$   N)
r%   r&   r'   r(   r    r   r	   r   rY   rW   rT   r$   r#   r   r   G  s         D 	)..)/$,-6,:4 		
 	
& 	
	 	
	
 
	
 		qm0@AAs	
 	
 	
 		a]/?@@c	
 	
 	
 	
9afsO44K&KP    r$   r   c                       e Zd ZdZdZ eddddddd	d
d           e edddddi          d fg eddd                     eddddddd           e	dd           e
ddd          gZd ZdS )RAPSz5
    Ring protective switching R-APS data packet
    zR-APSr   r   rx   r   r   zSignal fail(SF)r   Event)r   r   r   r1   r   sub_codeFlushc                     | j         dk    S )Nr   )r   r9   s    r#   r;   zRAPS.<lambda>  s    ah&0 r$   statusr   RBDNFBPRr   @   r7   node_idNr-      c                 
    d|fS rS   rT   rU   s     r#   rW   zRAPS.extract_padding  rX   r$   )r%   r&   r'   r(   r    r   r   r   r	   r   r   rY   rW   rT   r$   r#   r   r   z  s         D 	),), 		
 	
 	 !LQFG3DEE00 HZA&&	
 	
 	
 			
 		
 	D!!FAr""C"KH    r$   r   c                   .
   e Zd ZdZd Zi dddddddd	d
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,Zd-d.d/d0d1d2d3d4d5Zd6d7d8Zd6d9d7d:Zg  e	d;d<d           e
 e	d=dd          d> fg e	d=d<d                     ed?d@edAB           e
 edCd<ddDdEi          dF f edCd<dGdHdIi          dJ f edCd<dGdIdKdLdM          dN f e	dCd<d          dO f edCd<dGddPi          dQ f edCd<ddRdSdEdTdU          dV fg edCd<                     e e
 edWdde          dX f edWdYde          dZ fg edWdYde                    d[            e
 ed\d]          d^ f ed\d
          d_ f ed\d`          da f ed\dY          db f ed\d          dc f ed\dd          de f ed\dD          df f ed\dg          dh f ed\di          dj fg	 ed\d<                     e edkd<          dl            e edmd<          dn            e edod@          dp            e e
 edqd          dr fg edqd<                    ds            e edtd<          du            e edv e            e          dw            e edxd<          dy            e edzd<          d{            e ed|d<          d}            e ed~d<          d            e edd<          d            e edd<          d            e edd<          d            e edd<          d            e edd<          d            e edd@          d            e edd@          d            e edd@          d            e ed e            e          d            e ed e            e          d            e ed e            e          d            e ed e            e          d            e edd@          d            e edd@          d            e edd@          d            e edd@          d            e ed e            e          d            e ed e            e          d            e edg e          d            e edd@          d            edd<          Zd@S )OAMz
    OAM data unit
    r.   zContinuity Check Message (CCM)rb   zLoopback Message (LBM)rs   zLoopback Reply (LBR)rh   zLinktrace Message (LTM)rx   zLinktrace Reply (LTR)r7   z"Generic Notification Message (GNM)r@   zAlarm Indication Signal (AIS)#   zLock Signal (LCK)%   zTest Signal (TST)'   z$Automatic Protection Switching (APS)(   z+Ring-Automatic Protection Switching (R-APS))   z'Maintenance Communication Channel (MCC)+   zLoss Measurement Message (LMM)*   zLoss Measurement Reply (LMR)rA   zOne Way Delay Measurement (1DM)/   zDelay Measurement Message (DMM).   zDelay Measurement Reply (DMR)zExperimental OAM Message (EXM)zExperimental OAM Reply (EXR)zVendor Specific Message (VSM)zVendor Specific Reply (VSR)zClient Signal Fail (CSF)z(One Way Synthetic Loss Measurement (1SL)zSynthetic Loss Message (SLM)zSynthetic Loss Reply (SLR))1   0   3   2   4   5   7   6   zInvalid valuezTrans Int 3.33mszTrans Int 10mszTrans Int 100mszTrans Int 1szTrans Int 10szTrans Int 1minzTrans Int 10min)r   r.   rs   rb   rx   rh   r   r   z1 frame per secondz1 frame per minute)rx   r   z1 frame per 10 seconds)rx   rh   r   melr   versionc                     | j         dv S N)r   rA   r   opcoderL   s    r#   r;   zOAM.<lambda>      18|3K r$   r   Nr2   r3   flagsr   RDIc                     | j         dk    S rq   r   rL   s    r#   r;   zOAM.<lambda>      ah!m r$   r   r   HWonlyc                     | j         dk    S rg   r   rL   s    r#   r;   zOAM.<lambda>  r   r$   FwdYesTerminalMEPr   c                     | j         dk    S Nrx   r   rL   s    r#   r;   zOAM.<lambda>  r   r$   c                     | j         dv S )N)r@   r   r7   r   rL   s    r#   r;   zOAM.<lambda>  s    AH4L r$   	Proactivec                     | j         dv S r   r   rL   s    r#   r;   zOAM.<lambda>  s    ah,6 r$   LOSFDIDCIrr   c                     | j         dk    S )Nr   r   rL   s    r#   r;   zOAM.<lambda>  r<   r$   periodc                     | j         dk    S rq   r   rL   s    r#   r;   zOAM.<lambda>  s    !(a- r$   r   c                     | j         dv S )N)r1   r7   r   rL   s    r#   r;   zOAM.<lambda>   s    !(h"6 r$   c                     | j         dv S )N)r.   r@   r   r   r7   r   rL   s    r#   r;   zOAM.<lambda>%  s    ah"55 r$   
tlv_offsetF   c                     | j         dk    S rq   r   rL   s    r#   r;   zOAM.<lambda>)      A r$   c                     | j         dv S )N)rb   rs   r   r   r   rL   s    r#   r;   zOAM.<lambda>,  s    ah.8 r$      c                     | j         dk    S rg   r   rL   s    r#   r;   zOAM.<lambda>.  r  r$   c                     | j         dk    S r  r   rL   s    r#   r;   zOAM.<lambda>/  s    qx1} r$   c                     | j         dv S )N)r   r   r   rL   s    r#   r;   zOAM.<lambda>0  s    H8L r$      c                     | j         dk    S )Nr   r   rL   s    r#   r;   zOAM.<lambda>1      B r$   c                     | j         dv S )N)rA   r   r   r   r   rL   s    r#   r;   zOAM.<lambda>4  s    ah*:: r$   r1   c                     | j         dk    S r6   r   rL   s    r#   r;   zOAM.<lambda>6  r  r$   
   c                     | j         dk    S )Nr   r   rL   s    r#   r;   zOAM.<lambda>9  r<   r$   seq_numc                     | j         dv S )N)r.   rb   rs   r   r   rL   s    r#   r;   zOAM.<lambda>@  s    ah-.G r$   trans_idc                     | j         dv S N)rh   rx   r   rL   s    r#   r;   zOAM.<lambda>C  s    18v#5 r$   ouic                     | j         dv S )N)r   r   r   r   r   r   rL   s    r#   r;   zOAM.<lambda>E  s    QX9M-M r$   	subopcodec                     | j         dk    S r6   r   rL   s    r#   r;   zOAM.<lambda>I  s    qx2~ r$   c                     | j         dv S )N)r   r   r   r   r   r7   r   rL   s    r#   r;   zOAM.<lambda>L  s    ah":: r$   mep_idc                 Z    | j         dk    p | j         dk    o| j        dk    o
| j        dk    S )Nr.   r     r   r%  r#  rL   s    r#   r;   zOAM.<lambda>P  s5    ah!m GBE1;!#3E r$   meg_idc                     | j         dk    S rq   r   rL   s    r#   r;   zOAM.<lambda>T  s    QX=M r$   
src_mep_idc                     | j         dv S N)r   r   r   r   rL   s    r#   r;   zOAM.<lambda>W  r   r$   
rcv_mep_idc                     | j         dv S r0  r   rL   s    r#   r;   zOAM.<lambda>Z  r   r$   r   c                     | j         dv S r0  r   rL   s    r#   r;   zOAM.<lambda>]  s    ah,.F r$   txfcfc                     | j         dv S )N)r.   r   r   r   r   r   r   rL   s    r#   r;   zOAM.<lambda>`  s    AH8O,O r$   rxfcbc                     | j         dk    S rq   r   rL   s    r#   r;   zOAM.<lambda>b  s    Q r$   rxfcfc                     | j         dv S )N)r   r   r   rL   s    r#   r;   zOAM.<lambda>c  s    X9M r$   txfcbc                     | j         dv S )N)r.   r   r   r   r   r   rL   s    r#   r;   zOAM.<lambda>e  s    AH8K,K r$   r-   c                     | j         dv S )N)r.   r   r   rL   s    r#   r;   zOAM.<lambda>g  s    G8K r$   ttlc                     | j         dv S r"  r   rL   s    r#   r;   zOAM.<lambda>h  s    F8J r$   orig_macc                     | j         dk    S rg   r   rL   s    r#   r;   zOAM.<lambda>i      qx1} r$   targ_macc                     | j         dk    S rg   r   rL   s    r#   r;   zOAM.<lambda>j  rA  r$   	relay_actc                     | j         dk    S r  r   rL   s    r#   r;   zOAM.<lambda>l  s    18q= r$   txtsfc                     | j         dv S N)rA   r   r   r   rL   s    r#   r;   zOAM.<lambda>o      ah,. r$   rxtsfc                     | j         dv S rH  r   rL   s    r#   r;   zOAM.<lambda>s  rI  r$   txtsbc                     | j         dv S N)r   r   r   rL   s    r#   r;   zOAM.<lambda>w      ah(* r$   rxtsbc                     | j         dv S rN  r   rL   s    r#   r;   zOAM.<lambda>{  rO  r$   	expct_durc                 D    | j         dk    o| j        dk    o
| j        dk    S )Nr   r.   r*  r+  rL   s    r#   r;   zOAM.<lambda>  s#    ah"nK)9Kaetm r$   nom_bdwc                     | j         dk    S r6   r   rL   s    r#   r;   zOAM.<lambda>      ah"n r$   curr_bdwc                     | j         dk    S r6   r   rL   s    r#   r;   zOAM.<lambda>  s    qx2~ r$   port_idc                     | j         dk    S r6   r   rL   s    r#   r;   zOAM.<lambda>  rV  r$   apsc                     | j         dk    S )Nr   r   rL   s    r#   r;   zOAM.<lambda>  s    ah"n r$   rapsc                     | j         dk    S )Nr   r   rL   s    r#   r;   zOAM.<lambda>  s    R r$   tlvs)next_cls_cbc                     | j         dv S )N)rb   rs   rh   rx   r   rA   r   r   r   r   r   r   rL   s    r#   r;   zOAM.<lambda>  s    ah"JJ r$   opt_datac                     | j         dv odS )N)r   r   r   r   Fr   rL   s    r#   r;   zOAM.<lambda>  s    ah"22<u r$   end_tlv)r%   r&   r'   r(   r    OPCODES
TIME_FLAGSPERIOD_FLAGSBNM_PERIOD_FLAGSr   r   r   r	   r   r   r   r
   r   r   r   r,   r   r   r   r   r   r   r   rY   rT   r$   r#   r   r     s
         D	+	# 	
! 	
$	
 	
" 	0 	+ 	 	 	2 	9 	5 	, 	* 	-  	-!" 	+#$ -*+)&6*(3  G: !  	 	J $# L $'# r1r 	hy!Q'')K)KLMHY1%%	
 	
r 		(D's333r 	 Jw1.?@@++
 Jw1.BCC++
 J&.&.&3 		 	 ,+ '1a((*L*LMJw1q+.>??66
 !L#(#(#(#(	 	
 
 -,7)T Igq!!W,	
 ,	
rj 	 %Xq!Z@@//
 %Xua9IJJ66	 Xua>>  65	
 	
krJ 	<,,.E.EFIlA..88 <,,.E.EF<++-D-DE<,,.L.LM<,,.F.FGIlB//:: <,,.F.FGIlB//,,( IlA&&+	
 	
Krz 	HY""$G$G	
 	
{r@ 	*a0055	7 	7ArD 	HUD!!#M#M	
 	
ErJ 	)K++-E-EFG	+q))  ;:	
 	
KrX 	Jx##G G	
 	
Yrb 	K%%''5113M3M	
 	
crh 	J|Q'')K)K	
 	
irn 	J|Q'')K)K	
 	
ort 	HY""$F$F	
 	
urz 	HWa  "O"O	
 	
{r@ 	'1--/F/FGGArB 	'1--/M/MNNCrD 	HWa  "K"K	
 	
ErJ 	&!,,.K.KLLKrL 	5!,,.J.JKKMrN 	*d335L5LMMOrP 	*d335L5LMMQrR 	;5500	2 	2SrV 	K-@@..	
 	
Wr^ 	K-@@..	
 	
_rf 	K-@@**	
 	
grn 	K-@@**	
 	
orv 	H[$''KK	
 	
wr~ 	)T224L4LMMr@ 	*d335M5MNNArB 	)T224L4LMMCrD 	Kssuuc**,D,D	
 	
ErJ 	K--/G/G	
 	
KrP 	OFBNCCCJJ	
 	
QrX 	HZ&&<<	
 	
Yrb 		)QcrKKKr$   r   i  )r\   ),r(   scapy.fieldsr   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   scapy.layers.l2r   scapy.packetr   r   binasciir   rz   r   r,   r[   ra   re   r   r   r   r   r   r   r   r   r   r   rT   r$   r#   <module>rm     s   (                                         * " ! ! ! ! ! , , , , , , , ,       
 
 
 
 
 
 
 
- - - - -F - - -`	0 	0 	0 	0 	0f 	0 	0 	0	0 	0 	0 	0 	06 	0 	0 	0>< >< >< >< ><6 >< >< ><B    &   "    &   (    V   $    V   $    f   "  *
 
 
 
 
F 
 
 
0 0 0 0 0& 0 0 0f, , , , ,6 , , ,^k k k k k& k k k\ E3V $ $ $ $ $ $r$   