
    h                        d Z ddlZddlmZmZm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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# dd	l$m%Z%m&Z&m'Z'm(Z( dd
l)m*Z* ddiej+        d<   dddddddddZ,ddiZ-ddiZ.ddiZ/ddiZ0g dZ1dgZ2dddd d!Z3g d"Z4 G d# d$e%          Z5 G d% d&e%          Z6 G d' d(e%          Z7 G d) d*e%          Z8 G d+ d,e&          Z9 G d- d.e7          Z:d/d0d1d2d3d4d5d6d7d8d9d:d;d<Z; G d= d>e:          Z< G d? d@e:          Z= G dA dBe:          Z> G dC dDe:          Z? G dE dFe:          Z@ G dG dHe:          ZA G dI dJe:          ZB G dK dLe:          ZC G dM dNe:          ZD G dO dPe:          ZE G dQ dRe:          ZF G dS dTe:          ZG G dU dVe:          ZHe<e=e>e?e@eAeBeCeDeEeFeGeHd<ZI G dW dXe%          ZJdYdZd[ZK G d\ d]e7          ZL G d^ d_e7          ZMeLeMd[ZN G d` dae%          ZO G db dce%          ZPdddedfdgdhdiZQi ddjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddZR G d de7          ZS G d de          ZTdddddddZU G d de7          ZV G d de7          ZW G d de7          ZX G d de7          ZY G d de7          ZZ G d de7          Z[eVeWeXeYeZe[dZ\ G d de7          Z] G d de7          Z^ G d de7          Z_ G d de7          Z`d e;a                                D             Zb G d de7          Zc G d de7          Zd G d de7          Ze G d de7          Zf G d de7          Zg G d de7          Zh G d de7          Zi G d de7          Zj G d de7          Zk G dÄ de7          Zldddddddd̜Zm G d̈́ de7          Zn G dτ de7          Zo G dф de7          Zp G dӄ de%          Zq G dՄ de7          Zr G dׄ dep          Zs G dل de7          Zt G dۄ de7          Zu G d݄ de%          Zv G d߄ de7          Zw G d de7          Zx G d de%          Zy G d de7          Zz G d de7          Z{ G d de7          Z| G d de7          Z} G d de7          Z~enepeseuexe{e}d̜Zeoereteweze|e~d̜Z G d de7          Z G d de7          Z G d de7          Z G d de7          Zi deSdme]doe^dqe_dse`duecdweddyeed{efd}egdehdeidejdekdeldedeeedZ e'e#e:d            e'e#e:d            e'e#e:d            e'e#e:d            e(e#e7dd           dS )z
OpenFlow v1.0.1

OpenFlow is an open standard used in SDN deployments.
Specifications can be retrieved from https://www.opennetworking.org/
    N)chborbraw)conf)warning)BitEnumFieldBitFieldByteEnumField	ByteFieldFieldLenField
FlagsFieldIntEnumFieldIntFieldIPField	LongFieldMACFieldPacketFieldPacketListFieldShortEnumField
ShortFieldStrFixedLenFieldX3BytesField	XBitField
XByteField	XIntFieldXShortField)Ether)TCP)PacketRawbind_bottom_upbind_top_down)binreprprereq_autocompleteTOPENFLOWIN_PORTTABLENORMALFLOODALL
CONTROLLERLOCALNONE)i  i  i  i  i  i  i       l    	NO_BUFFERr.   )	PORT_DOWNNO_STPNO_RECVNO_RECV_STPNO_FLOODNO_FWDNO_PACKET_IN	LINK_DOWNOFPPS_STP_LISTENOFPPS_STP_LEARNOFPPS_STP_FORWARDOFPPS_STP_BLOCKr            )10MB_HD10MB_FD100MB_HD100MB_FD1GB_HD1GB_FD10GB_FDCOPPERFIBERAUTONEGPAUSE
PAUSE_ASYMc                      e Zd ZdZ edde           edd           eddd           ed	dd
e	           e
ddde           eddde           eddd
e           eddd
e           eddd
e           eddd
e          g
Zd ZdS )
OFPPhyPortOFP_PHY_PORTport_nor   hw_addr0	port_name    config    	stp_state   state   curr
advertised	supportedpeerc                 
    d|fS N     selfss     Z/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/contrib/openflow.pyextract_paddingzOFPPhyPort.extract_paddingk       Avrb   N)__name__
__module____qualname__namer   ofp_port_nor   r   r   ofp_port_configr   ofp_port_stateofp_port_featuresfields_descrh   rc   rb   rg   rN   rN   ^   s        D!>)Q<<8Is++##KR88:h2??<QNCC:gq!^<<:fa->??:lAr3DEE:k1b2CDD:fa->??	AK    rb   rN   c                      e Zd ZdZ edddddg           eddd           ed	dd           ed
ddg d           edde           edd           edd           e	dd           e
dd           edd           e	dd           e
dd           e
dd           edd           edd           edd           e	dd           e	dd          gZd Zd ZdS )OFPMatch	OFP_MATCH
wildcards1N   DL_VLAN_PCPNW_TOSnw_dst_mask   nw_src_mask
wildcards2r[   r&   DL_VLANDL_SRCDL_DSTDL_TYPENW_PROTOTP_SRCTP_DSTin_portdl_srcdl_dstdl_vlandl_vlan_pcppad1dl_typenw_tosnw_protopad2nw_srcrR   nw_dsttp_srctp_dstc                 
    d|fS ra   rc   rd   s     rg   rh   zOFPMatch.extract_padding   ri   rb   c                 d   d}| j         %| j        |dz  }n|dz  }| j        |dz  }n7|dz  }n1t          | j                   }|ddt	          |          z
  z  z  }||z  }| j        | j        dk    r|dz  }n7|dz  }n1t          | j                  }|ddt	          |          z
  z  z  }||z  }| j        | j        dk    r|dz  }n7|dz  }n1t          | j                  }|ddt	          |          z
  z  z  }||z  }| j	        | j
        |dz  }n|dz  }| j        |dz  }n|dz  }| j        |dz  }n|dz  }| j        |dz  }n|dz  }| j        |dz  }n|dz  }| j        |dz  }n|dz  }| j        |dz  }n|dz  }| j        |dz  }n7|dz  }n1t          | j	                  }|ddt	          |          z
  z  z  }||z  }t$          j        d	         d
         r	| j        g| j        dk    s| j        dk    s| j        | j        C|d d         t)          j        dd          z   |dd          z   }|d d         dz   |dd          z   }| j        | j        | j
        |d d         t)          j        dd          z   |dd          z   }|d d         dz   |dd          z   }|d d         t)          j        dd          z   |dd          z   }|d d         dz   |dd          z   }d                    d t/          t1          |          gdz   D                       }||dd          z   }||z   S )N
00000000001rR   r?   111111000000r{   r[   r%   r$      !Hi   rY      z!B   irb   c              3   v   K   | ]4}t          t          d                     |          d                    V  5dS )rT   r?   N)r   intjoin).0xs     rg   	<genexpr>z&OFPMatch.post_build.<locals>.<genexpr>   s>      SS1s3rwwqzz1--..SSSSSSrb      )rv   r   r   r#   lenrz   r   r|   r   r}   r   r   r   r   r   r   r   r   r   contribsstructpackr   zipiter)	re   ppaylst_bitsw1m1m2w2inss	            rg   
post_buildzOFPMatch.post_build   s    ?"{"CC'CC))Bq3r77{++HNH #{c!!H$ G#)**Bq3r77{++HNH#{c!!H$G#)**Bq3r77{++HNH ?"{"CC{"CC}$CC|#CC{"CC{"CC|#CC|#CC))Bq3r77{++HNH
 =$%:; 	C|#;#%%););1T[5L#2#T6!:!::QrssVCA'}s2Xbcc]BH}$;*dk.E#2#T6!:!::QrssVCA'}s2Xbcc]BH#2#T4!8!881RSS6AA'}s2Xbcc]BHhhSSd8nn=MPQ=Q8RSSSSS!ABB%K3wrb   )rj   rk   rl   rm   r   r	   r   rn   r   r   r   r   r   r   rr   rh   r   rc   rb   rg   rt   rt   o   s       D:lD"}7?7A B B8M4338M433:lD! 6@ 6@ 6@ A A ">)T;??8Hd++8Hd++:i..9]D11:fd++:i..9Xt,,9Z..;vt,,78S))78S)):h--:h--3/K6  a a a a arb   rt   c                       e Zd ZdZd ZdS )_ofp_headerz+Dummy OpenFlow Header for some lower layersc                     | j         Jt          |          t          |          z   }|d d         t          j        d|          z   |dd          z   }||z   S )Nr?   r   r   r   r   r   re   r   r   tmp_lens       rg   r   z_ofp_header.post_build   sT    8!ffs3xx'G"1"D'222QqrrU:A3wrb   Nrj   rk   rl   rm   r   rc   rb   rg   r   r      s(        8D    rb   r   c                       e Zd ZdZd ZdS )_ofp_header_itemz&Dummy OpenFlow Header for items layersc                     | j         ?t          |          t          |          z   }t          j        d|          |dd          z   }||z   S Nr   r?   r   r   s       rg   r   z_ofp_header_item.post_build  sG    8!ffs3xx'GD'**QqrrU2A3wrb   Nr   rc   rb   rg   r   r      s(        3D    rb   r   c                       e Zd ZdZdS )_UnknownOpenFlowUnknown OpenFlow packetN)rj   rk   rl   rm   rc   rb   rg   r   r     s        $DDDrb   r   c                   *    e Zd ZdZedd            ZdS )OpenFlowzOpenFlow dissectorNc                 .   |rt          |          dk    rt          |d                   }|dk    rddlm}  |j        |g|R i |S |dk    rt          |d                   }|dk    r*t          |d                   }|dk    rd}t
          |         S |d	k    r*t          |d                   }|dk    rd}t          |         S |d
k    r*t          |d                   }|dk    rd}t          |         S t          |         S t          d           t          S )Nr?   r   r   )	OpenFlow3r>   	   r/   r.   rU      r   )r   r   scapy.contrib.openflow3r   dispatch_hookofp_error_clsofp_stats_request_clsofp_stats_reply_clsofpt_clsr   r   )	cls_pktargskargsversionr   of_typeerr_typemp_types	            rg   r   zOpenFlow.dispatch_hook  s2    	3CIINN$q'llG$======.y.tDdDDDeDDDD
 d1g,,a<<"47||H3#((22]]!$q'llG#~~"'099]]!$q'llG#~~"'.w77#G,,1222rb   N)rj   rk   rl   rm   classmethodr   rc   rb   rg   r   r     s7        D         [        rb   r   OFPAT_OUTPUTOFPAT_SET_VLAN_VIDOFPAT_SET_VLAN_PCPOFPAT_STRIP_VLANOFPAT_SET_DL_SRCOFPAT_SET_DL_DSTOFPAT_SET_NW_SRCOFPAT_SET_NW_DSTOFPAT_SET_NW_TOSOFPAT_SET_TP_SRCOFPAT_SET_TP_DSTOFPAT_ENQUEUEOFPAT_VENDOR)r   r>   r?   r@   r      r{      r[   r   
      r.   c                   t    e Zd ZdZ edde           edd           edde           edde          gZ	d	S )
OFPATOutputr   typer   r   r[   portmax_lenr0   N)
rj   rk   rl   rm   r   ofp_action_typesr   rn   ofp_max_lenrr   rc   rb   rg   r   r   E  s^        D!>&!-=>>:eQ''!>&![99!>)[+FFHKKKrb   r   c                   p    e Zd ZdZ edde           edd           edd           edd          gZd	S )
OFPATSetVLANVIDr   r   r>   r   r[   vlan_vidr   padN	rj   rk   rl   rm   r   r   r   r   rr   rc   rb   rg   r   r   M  sY        D!>&!-=>>:eQ'':j!,,;ua((*KKKrb   r   c                   p    e Zd ZdZ edde           edd           edd           edd          gZ	d	S )
OFPATSetVLANPCPr   r   r?   r   r[   vlan_pcpr   r   N
rj   rk   rl   rm   r   r   r   r   r   rr   rc   rb   rg   r   r   U  sY        D!>&!-=>>:eQ''9Z++<q))+KKKrb   r   c                   Z    e Zd ZdZ edde           edd           edd          gZdS )	OFPATStripVLANr   r   r@   r   r[   r   r   N)	rj   rk   rl   rm   r   r   r   r   rr   rc   rb   rg   r   r   ]  sJ        D!>&!-=>>:eQ''9UA&&(KKKrb   r   c                   r    e Zd ZdZ edde           edd           edd           edd	d
          gZ	dS )OFPATSetDlSrcr   r   r   r   rU   dl_addrrR   r   r   0   N
rj   rk   rl   rm   r   r   r   r   r   rr   rc   rb   rg   r   r   d  [        D!>&!-=>>:eR((8Is++9UAr**,KKKrb   r   c                   r    e Zd ZdZ edde           edd           edd           edd	d
          gZ	dS )OFPATSetDlDstr   r   r   r   rU   r   rR   r   r   r   Nr  rc   rb   rg   r  r  l  r  rb   r  c                   Z    e Zd ZdZ edde           edd           edd          gZdS )	OFPATSetNwSrcr   r   r{   r   r[   nw_addrrR   N	rj   rk   rl   rm   r   r   r   r   rr   rc   rb   rg   r  r  t  J        D!>&!-=>>:eQ''79c**,KKKrb   r  c                   Z    e Zd ZdZ edde           edd           edd          gZdS )	OFPATSetNwDstr   r   r   r   r[   r  rR   Nr  rc   rb   rg   r  r  {  r	  rb   r  c                   p    e Zd ZdZ edde           edd           edd           edd          gZ	dS )	OFPATSetNwToSOFPAT_SET_TP_TOSr   r[   r   r   r   r   Nr   rc   rb   rg   r  r    sY        D!>&!-=>>:eQ''9Xq))<q))+KKKrb   r  c                   p    e Zd ZdZ edde           edd           edd           edd          gZd	S )
OFPATSetTpSrcr   r   r   r   r[   tp_portr   r   Nr   rc   rb   rg   r  r    sY        D!>&!-=>>:eQ'':i++;ua((*KKKrb   r  c                   p    e Zd ZdZ edde           edd           edd           edd          gZd	S )
OFPATSetTpDstr   r   r   r   r[   r  r   r   Nr   rc   rb   rg   r  r    sY        D!>&".>??:eQ'':i++;ua((*KKKrb   r  c                       e Zd ZdZ edde           edd           edde           eddd	           e	d
d          gZ
dS )OFPATEnqueuer   r   r   r   rU   r   r   r   r   queue_idN)rj   rk   rl   rm   r   r   r   rn   r   r   rr   rc   rb   rg   r  r    sl        D!>&".>??:eR((!>&![999UAr**8J**	,KKKrb   r  c                   Z    e Zd ZdZ edde           edd           edd          gZdS )	OFPATVendorr   r   r.   r   r[   vendorr   N)	rj   rk   rl   rm   r   r   r   r   rr   rc   rb   rg   r  r    sJ        D!>&%1ABB:eQ''8Ha((*KKKrb   r  c                   ,    e Zd Zedd            Zd ZdS )OFPATNc                     |rVt          |          dk    rCt          j        d|d d                   d         }t                              |t
                    S t
          S Nr?   r   r   )r   r   unpackofp_action_clsgetr    r   r   r   r   ts        rg   r   zOFPAT.dispatch_hook  sQ     	.CIINNdD!H--a0A!%%a---
rb   c                 
    d|fS ra   rc   rd   s     rg   rh   zOFPAT.extract_padding  ri   rb   r   rj   rk   rl   r   r   rh   rc   rb   rg   r  r    A           [    rb   r  
OFPQT_NONEOFPQT_MIN_RATEr   r>   c                   Z    e Zd ZdZ edde           edd           edd          gZdS )	OFPQTNoner&  r   r   r   r[   r   N)	rj   rk   rl   rm   r   ofp_queue_property_typesr   r   rr   rc   rb   rg   r*  r*    sJ        D!>&!-EFF:eQ''9UA&&(KKKrb   r*  c            	           e Zd ZdZ edde           edd           edd           edd           ed	dd
          gZ	dS )OFPQTMinRater'  r   r>   r   rU   r   r   rater   r   N)
rj   rk   rl   rm   r   r+  r   r   r   rr   rc   rb   rg   r-  r-    sj        D!>&!-EFF:eR((9UA&&:fa((9VQ++	-KKKrb   r-  c                   ,    e Zd Zedd            Zd ZdS )OFPQTNc                     |rVt          |          dk    rCt          j        d|d d                   d         }t                              |t
                    S t
          S r  )r   r   r  ofp_queue_property_clsr   r    r!  s        rg   r   zOFPQT.dispatch_hook  sQ     	6CIINNdD!H--a0A)--a555
rb   c                 
    d|fS ra   rc   rd   s     rg   rh   zOFPQT.extract_padding  ri   rb   r   r$  rc   rb   rg   r0  r0    r%  rb   r0  c            	           e Zd ZdZ edd           edd           edd           edg ed 	          gZ	d
 Z
d ZdS )OFPPacketQueueOFP_PACKET_QUEUEr  r   r   Nr   
propertiesc                     | j         dz
  S )Nr[   r   pkts    rg   <lambda>zOFPPacketQueue.<lambda>  s    #'A+ rb   length_fromc                 
    d|fS ra   rc   rd   s     rg   rh   zOFPPacketQueue.extract_padding  ri   rb   c                     | j         g k    r|t          t                                z  }| j        Jt          |          t          |          z   }|d d         t	          j        d|          z   |dd          z   }||z   S )Nr   r   r{   )r7  r   r*  r   r   r   r   s       rg   r   zOFPPacketQueue.post_build  sw    ?b  Y[[!!!A8!ffs3xx'G"1"D'222QqrrU:A3wrb   )rj   rk   rl   rm   r   r   r   r   r0  rr   rh   r   rc   rb   rg   r5  r5    s        D8J**:eT**;ua(("?<U/E/EG G GHK      rb   r5  zOpenFlow 1.0zOpenFlow 1.1zOpenFlow 1.2zOpenFlow 1.3zOpenFlow 1.4)r>   r?   r@   r   r   
OFPT_HELLOr>   
OFPT_ERRORr?   OFPT_ECHO_REQUESTr@   OFPT_ECHO_REPLYr   OFPT_VENDORr   OFPT_FEATURES_REQUESTr{   OFPT_FEATURES_REPLYr   OFPT_GET_CONFIG_REQUESTr[   OFPT_GET_CONFIG_REPLYr   OFPT_SET_CONFIGr   OFPT_PACKET_INr   OFPT_FLOW_REMOVEDrw   OFPT_PORT_STATUS   OFPT_PACKET_OUT   OFPT_FLOW_MOD   OFPT_PORT_MODrU   OFPT_STATS_REQUESTOFPT_STATS_REPLYOFPT_BARRIER_REQUESTOFPT_BARRIER_REPLYOFPT_QUEUE_GET_CONFIG_REQUESTOFPT_QUEUE_GET_CONFIG_REPLY)r               c                   r    e Zd ZdZ edde           edde           edd           edd          gZ	dS )		OFPTHellorA  r   r>   r   r   r   Nxid
rj   rk   rl   rm   r
   ofp_versionofp_typer   r   rr   rc   rb   rg   r_  r_  #  sZ        D =D+>> =H55:eT**8E1%%'KKKrb   r_  c                       e Zd Zd ZdS )OFPacketFieldc                     	 |dd         }t          j        d|          d         }|d |         }||d          }|t          |          fS # t          $ r dt	          |          fcY S w xY w)Nr?   r   r   r   rT   )r   r  r   	Exceptionr    )re   r;  rf   r   ofloadremains         rg   getfieldzOFPacketField.getfield4  s    	!fGmD'2215Gxx[Fwxx[F8F++++ 	 	 	s1vv:	s   A	A A*)A*N)rj   rk   rl   rj  rc   rb   rg   re  re  3  s#            rb   re  OFPET_HELLO_FAILEDOFPET_BAD_REQUESTOFPET_BAD_ACTIONOFPET_FLOW_MOD_FAILEDOFPET_PORT_MOD_FAILEDOFPET_QUEUE_OP_FAILEDr   r>   r?   r@   r   r   c                       e Zd ZdZ edde           edde           edd           edd           e	d	de
           e	d
dddd           edde          gZdS )OFPETHelloFailedrk  r   r>   r   r   Nr`  r   errtypeerrcodeOFPHFC_INCOMPATIBLEOFPHFC_EPERMr(  datarT   rj   rk   rl   rm   r
   rb  rc  r   r   r   ofp_error_typere  r    rr   rc   rb   rg   rs  rs  G  s        D =D+>> =H55:eT**8E1%%!>)Q??!>)Q4I4B1D 1D E E =S113KKKrb   rs  c                       e Zd ZdZ edde           edde           edd           edd           e	d	de
           e	d
ddddddddddd	           edde          gZdS )OFPETBadRequestrl  r   r>   r   r   Nr`  r   rt  ru  OFPBRC_BAD_VERSIONOFPBRC_BAD_TYPEOFPBRC_BAD_STATOFPBRC_BAD_VENDOROFPBRC_BAD_SUBTYPEOFPBRC_EPERMOFPBRC_BAD_LENOFPBRC_BUFFER_EMPTYOFPBRC_BUFFER_UNKNOWN	r   r>   r?   r@   r   r   r{   r   r[   rx  rT   ry  rc   rb   rg   r|  r|  S  s        D =D+>> =H55:eT**8E1%%!>)Q??!>)Q4H4E4E4G4H4B4D4I4K1M 1M N N !=S113KKKrb   r|  c                       e Zd ZdZ edde           edde           edd           edd           e	d	d
e
           e	dddddddddddd	           edde          gZdS )OFPETBadActionrm  r   r>   r   r   Nr`  r   rt  r?   ru  OFPBAC_BAD_TYPEOFPBAC_BAD_LENOFPBAC_BAD_VENDOROFPBAC_BAD_VENDOR_TYPEOFPBAC_BAD_OUT_PORTOFPBAC_BAD_ARGUMENTOFPBAC_EPERMOFPBAC_TOO_MANYOFPBAC_BAD_QUEUEr  rx  rT   ry  rc   rb   rg   r  r  f  s        D =D+>> =H55:eT**8E1%%!>)Q??!>)Q4E4D4G4L4I4I4B4E4F1H 1H I I !=S113KKKrb   r  c                       e Zd ZdZ edde           edde           edd           edd           e	d	d
e
           e	ddddddddd           edde          gZdS )OFPETFlowModFailedrn  r   r>   r   r   Nr`  r   rt  r@   ru  OFPFMFC_ALL_TABLES_FULLOFPFMFC_OVERLAPOFPFMFC_EPERMOFPFMFC_BAD_EMERG_TIMEOUTOFPFMFC_BAD_COMMANDOFPFMFC_UNSUPPORTEDrq  rx  rT   ry  rc   rb   rg   r  r  y  s        "D =D+>> =H55:eT**8E1%%!>)Q??!>)Q4M4E4C4O4I4I1K 1K L L !=S113KKKrb   r  c                       e Zd ZdZ edde           edde           edd           edd           e	d	d
e
           e	ddddd           edde          gZdS )OFPETPortModFailedro  r   r>   r   r   Nr`  r   rt  r   ru  OFPPMFC_BAD_PORTOFPPMFC_BAD_HW_ADDRr(  rx  rT   ry  rc   rb   rg   r  r    s        "D =D+>> =H55:eT**8E1%%!>)Q??!>)Q4F4I1K 1K L L =S113KKKrb   r  c                       e Zd ZdZ edde           edde           edd           edd           e	d	d
e
           e	dddddd           edde          gZdS )OFPETQueueOpFailedrp  r   r>   r   r   Nr`  r   rt  r   ru  OFPQOFC_BAD_PORTOFPQOFC_BAD_QUEUEOFPQOFC_EPERMr   r>   r?   rx  rT   ry  rc   rb   rg   r  r    s        "D =D+>> =H55:eT**8E1%%!>)Q??!>)Q4F4G4C1E 1E F F !=S113KKKrb   r  c                   r    e Zd ZdZ edde           edde           edd           edd	          gZ	dS )
OFPTEchoRequestrC  r   r>   r   r?   r   Nr`  r   ra  rc   rb   rg   r  r    sZ        D =D+>> =H55:eT**8E1%%'KKKrb   r  c                   r    e Zd ZdZ edde           edde           edd           edd	          gZ	dS )
OFPTEchoReplyrD  r   r>   r   r@   r   Nr`  r   ra  rc   rb   rg   r  r    sZ        D =D+>> =H55:eT**8E1%%'KKKrb   r  c                       e Zd ZdZ edde           edde           edd           edd	           ed
d	          gZ	dS )
OFPTVendorrE  r   r>   r   r   r   Nr`  r   r  ra  rc   rb   rg   r  r    si        D =D+>> =H55:eT**8E1%%8Ha((	*KKKrb   r  c                   r    e Zd ZdZ edde           edde           edd           edd	          gZ	dS )
OFPTFeaturesRequestrF  r   r>   r   r   r   Nr`  r   ra  rc   rb   rg   r  r    sZ        "D =D+>> =H55:eT**8E1%%'KKKrb   r  c                     g | ]
}|d k    |S )r   rc   )r   vs     rg   
<listcomp>r    s,     2 2 2.00 000rb   c                       e Zd ZdZ edde           edde           edd           edd	           e	d
d	           edd	           e
dd           edd	           edd	dg d           edd	de           edg ed           gZdS )OFPTFeaturesReplyrG  r   r>   r   r{   r   Nr`  r   datapath_id	n_buffersn_tablesr   capabilitiesrW   )
FLOW_STATSTABLE_STATS
PORT_STATSSTPRESERVEDIP_REASMQUEUE_STATSARP_MATCH_IPactionsportsc                     | j         dz
  S )NrW   r9  r:  s    rg   r<  zOFPTFeaturesReply.<lambda>      #'B, rb   r=  )rj   rk   rl   rm   r
   rb  rc  r   r   r   r   r   r   ofp_action_types_flagsr   rN   rr   rc   rb   rg   r  r    s         D =D+>> =H55:eT**8E1%%9]A..8K++9Z++<q)):na 6F 6F 6F G G :iB0FGG"?7B
/F/FH H H#IKKKrb   r  c                   r    e Zd ZdZ edde           edde           edd           edd	          gZ	dS )
OFPTGetConfigRequestrH  r   r>   r   r   r   Nr`  r   ra  rc   rb   rg   r  r    sZ        $D =D+>> =H55:eT**8E1%%'KKKrb   r  c                       e Zd ZdZ edde           edde           edd           edd	           e	d
d	ddddd           edd	          gZ
dS )OFPTGetConfigReplyrI  r   r>   r   r[   r   Nr`  r   flagsFRAG_NORMAL	FRAG_DROP
FRAG_REASM	FRAG_MASKr=   miss_send_lenrj   rk   rl   rm   r
   rb  rc  r   r   r   rr   rc   rb   rg   r  r    s        "D =D+>> =H55:eT**8E1%%!>'1-2=2>2=/? /? @ @ :oq113KKKrb   r  c                       e Zd ZdZ edde           edde           edd           edd	           e	d
d	ddddd           edd          gZ
dS )OFPTSetConfigrJ  r   r>   r   r   r   Nr`  r   r  r  r  r  r  r=   r     r  rc   rb   rg   r  r    s        D =D+>> =H55:eT**8E1%%!>'1-2=2>2=/? /? @ @ :os335KKKrb   r  c                      e Zd ZdZ edde           edde           edd           edd	           e	d
de
           edd	           edd	e           edd	ddd           edd	           edde          g
ZdS )OFPTPacketInrK  r   r>   r   r   r   Nr`  r   	buffer_idr0   	total_lenr   reasonOFPR_NO_MATCHOFPR_ACTIONr(  r   rx  )rj   rk   rl   rm   r
   rb  rc  r   r   r   
ofp_bufferr   rn   r   r   r   rr   rc   rb   rg   r  r    s        D =D+>> =X66:eT**8E1%%<[*EE:k1--!>)Q<< =1/2?/A /A B B:eQ'';vtU33
5KKKrb   r  c                      e Zd ZdZ edde           edde           edd           edd	           e	d
 e
            e
           edd	           edd	           edd	dddd           edd	           edd	           edd	           edd	           edd	           edd	           edd	          gZdS )OFPTFlowRemovedrL  r   r>   r   r   r   Nr`  r   matchcookiepriorityr  OFPRR_IDLE_TIMEOUTOFPRR_HARD_TIMEOUTOFPRR_DELETEr  r   duration_secduration_nsecidle_timeoutr   packet_count
byte_count)rj   rk   rl   rm   r
   rb  rc  r   r   r   rt   r   r   r   rr   rc   rb   rg   r  r    s$       D =D+>> =X66:eT**8E1%%;w

H==9Xq)):j!,, =12F2F2@/B /B C C :fa((8NA..8OQ//:na00;vq))9^Q//9\1--!/KKKrb   r  c                       e Zd ZdZ edde           edde           edd           edd	           ed
d	dddd           e	dd	d           e
d e            e          gZdS )OFPTPortStatusrM  r   r>   r   rw   r   Nr`  r   r  	OFPPR_ADDOFPPR_DELETEOFPPR_MODIFYr  r   8   desc)rj   rk   rl   rm   r
   rb  rc  r   r   r   r   rN   rr   rc   rb   rg   r  r  /  s        D =D+>> =X66:eT**8E1%% =1+2@2@/B /B C C 9UAr**;vzz||Z@@BKKKrb   r  c                       e Zd ZdZ edde           edde           edd           edd	           e	d
de
           edde           edddd           edg eed            edde          g	ZdS )OFPTPacketOutrO  r   r>   r   rN  r   Nr`  r   r  r0   r   r-   actions_lenHr  )fmt	length_ofc                     | j         S r   )r  r:  s    rg   r<  zOFPTPacketOut.<lambda>G  s    #/ rb   r=  rx  )rj   rk   rl   rm   r
   rb  rc  r   r   r   r  r   rn   r   r   r  r  r   r   rr   rc   rb   rg   r  r  <  s        D =D+>> =X66:eT**8E1%%<[*EE!>)V[AA =#SSS"?9b%#1/I/IK K K ;vtU33
5KKKrb   r  c                      e Zd ZdZ edde           edde           edd           edd	           e	d
 e
            e
           edd	           edd	dddddd           edd	           edd	           edd	           edde           edde           edd	dg d           edg eed           gZdS ) OFPTFlowModrQ  r   r>   r   rP  r   Nr`  r   r  r  cmd	OFPFC_ADDOFPFC_MODIFYOFPFC_MODIFY_STRICTOFPFC_DELETEOFPFC_DELETE_STRICT)r   r>   r?   r@   r   r  hard_timeoutr  r  r0   out_portr-   r  rU   )SEND_FLOW_REMCHECK_OVERLAPEMERGr  c                     | j         dz
  S )NH   r9  r:  s    rg   r<  zOFPTFlowMod.<lambda>b  r  rb   r=  )rj   rk   rl   rm   r
   rb  rc  r   r   r   rt   r   r   r   r  rn   r   r   r  r  rr   rc   rb   rg   r  r  K  sM       D =D+>> =X66:eT**8E1%%;w

H==9Xq))!>%0>0E0>0E	-G -G H H
 :na00:na00:j!,,<[*EE!>*fkBB:gq" /8 /8 /8 9 9 #?9b%#1/F/FH H H'IKKKrb   r  c                      e Zd ZdZ edde           edde           edd           edd	           e	d
d	e
           edd           edd	de           edd	de           edd	de           edd	          g
ZdS )OFPTPortModrS  r   r>   r   rR  r   Nr`  r   rP   rQ   rR   rV   rW   mask	advertiser   )rj   rk   rl   rm   r
   rb  rc  r   r   r   rn   r   r   ro   rq   rr   rc   rb   rg   r  r  e  s        D =D+>> =X66:eT**8E1%%!>)Q<<8Is++:h2??:fa_==:k1b2CDD8E1%%	'KKKrb   r  
OFPST_DESC
OFPST_FLOWOFPST_AGGREGATEOFPST_TABLE
OFPST_PORTOFPST_QUEUEOFPST_VENDOR)r   r>   r?   r@   r   r   r.   c                       e Zd ZdZ edde           edde           edd           edd	           e	d
d	e
           edd	dg           gZdS )OFPTStatsRequestDescOFPST_STATS_REQUEST_DESCr   r>   r   rU   r   Nr`  r   
stats_typer  rj   rk   rl   rm   r
   rb  rc  r   r   r   ofp_stats_typesr   rr   rc   rb   rg   r  r    s~        %D =D+>> =X66:eT**8E1%%!>,?CC:gq"b113KKKrb   r  c                      e Zd ZdZ edde           edde           edd           edd	           e	d
d	e
           edd	dg            eddd           eddd           eddd           eddd           eddd          gZdS )OFPTStatsReplyDescOFPST_STATS_REPLY_DESCr   r>   r   r   r   Nr`  r   r  r  rU   mfr_descrT      hw_descsw_desc
serial_numrW   dp_desc)rj   rk   rl   rm   r
   rb  rc  r   r   r   r  r   r   rr   rc   rb   rg   r  r    s        #D =D+>> =X66:eT**8E1%%!>,?CC:gq"b11##JC88##Ir377##Ir377##L"b99##Ir377
9KKKrb   r  c                      e Zd ZdZ edde           edde           edd           edd	           e	d
de
           edd	dg            ed e            e           edde           edd	           e	dde          g
ZdS )OFPTStatsRequestFlowOFPST_STATS_REQUEST_FLOWr   r>   r   rU   r   Nr`  r   r  r  r  table_idr*   r   r  r-   )rj   rk   rl   rm   r
   rb  rc  r   r   r   r  r   r   rt   	ofp_tabler   rn   rr   rc   rb   rg   r  r    s        %D =D+>> =X66:eT**8E1%%!>,?CC:gq"b11;w

H== =UI>>9UA&&!>*fkBB	DKKKrb   r  c                   t   e Zd ZdZ edd           edd           edd           ed e            e           e	dd           e	d	d           ed
d           edd           edd           e
ddd           edd           edd           edd           edg eed           gZd Zd ZdS )OFPFlowStatsOFP_FLOW_STATSlengthNr  r   r   r  r  r  r  r  r  r   r   r  r  r  r  c                     | j         dz
  S )NX   )r$  r:  s    rg   r<  zOFPFlowStats.<lambda>  s    #*r/ rb   r=  c                     | j         ?t          |          t          |          z   }t          j        d|          |dd          z   }||z   S r   )r$  r   r   r   r   s       rg   r   zOFPFlowStats.post_build  sG    ;!ffs3xx'GD'**QqrrU2A3wrb   c                 
    d|fS ra   rc   rd   s     rg   rh   zOFPFlowStats.extract_padding  ri   rb   )rj   rk   rl   rm   r   r   r   r   rt   r   r   r   r   r  r  rr   r   rh   rc   rb   rg   r"  r"    s2       D:h--9Z++:fa((;w

H==8NA..8OQ//:j!,,:na00:na009VQ++9Xq))9^Q//9\1--"?9b%#1/I/IK K KLK"      rb   r"  c                       e Zd ZdZ edde           edde           edd           edd	           e	d
de
           edd	dg            edg ed           gZdS )OFPTStatsReplyFlowOFPST_STATS_REPLY_FLOWr   r>   r   r   r   Nr`  r   r  r  rU   
flow_statsc                     | j         dz
  S Nrw   r9  r:  s    rg   r<  zOFPTStatsReplyFlow.<lambda>  r  rb   r=  )rj   rk   rl   rm   r
   rb  rc  r   r   r   r  r   r   r"  rr   rc   rb   rg   r*  r*    s        #D =D+>> =X66:eT**8E1%%!>,?CC:gq"b11"?<\/F/FH H HIKKKrb   r*  c                       e Zd ZdZdZdS )OFPTStatsRequestAggregateOFPST_STATS_REQUEST_AGGREGATEr?   N)rj   rk   rl   rm   r  rc   rb   rg   r0  r0    s        *DJJJrb   r0  c                       e Zd ZdZ edde           edde           edd           edd	           e	d
de
           edd	dg            edd	           edd	           edd	           edd	          g
ZdS )OFPTStatsReplyAggregateOFPST_STATS_REPLY_AGGREGATEr   r>   r   r   r   Nr`  r   r  r?   r  rU   r  r  
flow_countr   )rj   rk   rl   rm   r
   rb  rc  r   r   r   r  r   r   r   rr   rc   rb   rg   r3  r3    s        (D =D+>> =X66:eT**8E1%%!>,?CC:gq"b119^Q//9\1--8L!,,9UA&&	(KKKrb   r3  c                       e Zd ZdZ edde           edde           edd           edd	           e	d
de
           edd	dg           gZdS )OFPTStatsRequestTableOFPST_STATS_REQUEST_TABLEr   r>   r   rU   r   Nr`  r   r  r@   r  r  rc   rb   rg   r7  r7    s~        &D =D+>> =X66:eT**8E1%%!>,?CC:gq"b113KKKrb   r7  c                   $   e Zd Zd ZdZ edd           edd           eddd           ed	d
dddg           e	ddd           e	ddd           edddg d           e
dd           e
dd           edd           edd          gZdS )OFPTableStatsc                 
    d|fS ra   rc   rd   s     rg   rh   zOFPTableStats.extract_padding  ri   rb   OFP_TABLE_STATSr  r   r   rm   rT   rW   rv   r@   rw   rx   ry   rz   ?   r{   r|   r}   r/   r[   r~   max_entriesactive_countlookup_countmatched_countN)rj   rk   rl   rh   rm   r   r   r   r   r	   r   r   rr   rc   rb   rg   r:  r:    s          D9Z++<q))##FB33:lE28@8B C C8M2q118M2q11:lD! 6@ 6@ 6@ A A 8M1--8NA..9^Q//9_a00%2KKKrb   r:  c                       e Zd ZdZ edde           edde           edd           edd	           e	d
de
           edd	dg            edg ed           gZdS )OFPTStatsReplyTableOFPST_STATS_REPLY_TABLEr   r>   r   r   r   Nr`  r   r  r@   r  rU   table_statsc                     | j         dz
  S r.  r9  r:  s    rg   r<  zOFPTStatsReplyTable.<lambda>  r  rb   r=  )rj   rk   rl   rm   r
   rb  rc  r   r   r   r  r   r   r:  rr   rc   rb   rg   rC  rC  	  s        $D =D+>> =X66:eT**8E1%%!>,?CC:gq"b11"?="m/F/FH H HIKKKrb   rC  c                       e Zd ZdZ edde           edde           edd           edd	           e	d
de
           edd	dg            e	dde           edd	d          gZdS )OFPTStatsRequestPortOFPST_STATS_REQUEST_PORTr   r>   r   rU   r   Nr`  r   r  r   r  rP   r-   r   r   )rj   rk   rl   rm   r
   rb  rc  r   r   r   r  r   rn   r   rr   rc   rb   rg   rH  rH    s        %D =D+>> =X66:eT**8E1%%!>,?CC:gq"b11!>)V[AA9UAr**,KKKrb   rH  c                   T   e Zd Zd ZdZ edde           eddd           edd           edd           ed	d           ed
d           edd           edd           edd           edd           edd           edd           edd           edd          gZ	dS )OFPPortStatsc                 
    d|fS ra   rc   rd   s     rg   rh   zOFPPortStats.extract_padding#  ri   rb   OFP_PORT_STATSrP   r   r   r   
rx_packets
tx_packetsrx_bytestx_bytes
rx_dropped
tx_dropped	rx_errors	tx_errorsrx_frame_errrx_over_err
rx_crc_err
collisionsN)
rj   rk   rl   rh   rm   r   rn   r   r   rr   rc   rb   rg   rK  rK  !  s          D!>)Q<<9UAr**9\1--9\1--9Z++9Z++9\1--9\1--9[!,,9[!,,9^Q//9]A..9\1--9\1--/KKKrb   rK  c                       e Zd ZdZ edde           edde           edd           edd	           e	d
de
           edd	dg            edg ed           gZdS )OFPTStatsReplyPortrD  r   r>   r   r   r   Nr`  r   r  r   r  rU   
port_statsc                     | j         dz
  S r.  r9  r:  s    rg   r<  zOFPTStatsReplyPort.<lambda>@  r  rb   r=  )rj   rk   rl   rm   r
   rb  rc  r   r   r   r  r   r   rK  rr   rc   rb   rg   r[  r[  7  s        $D =D+>> =X66:eT**8E1%%!>,?CC:gq"b11"?<\/F/FH H HIKKKrb   r[  c                       e Zd ZdZ edde           edde           edd           edd	           e	d
de
           edd	dg            e	dde           edd	           edde          g	ZdS )OFPTStatsRequestQueueOFPST_STATS_REQUEST_QUEUEr   r>   r   rU   r   Nr`  r   r  r   r  rP   r-   r   r  r*   )rj   rk   rl   rm   r
   rb  rc  r   r   r   r  r   rn   r   r   	ofp_queuerr   rc   rb   rg   r_  r_  C  s        &D =D+>> =X66:eT**8E1%%!>,?CC:gq"b11!>)V[AA;ua((<
E9==?KKKrb   r_  c                   ,   e Zd ZdZ edde           edde           edd           edd	           e	d
de
           edd	dg            e	dde           edd	           edde           edd	           edd	           edd	          gZdS )OFPTStatsReplyQueueOFPST_STATS_REPLY_QUEUEr   r>   r   r   r   Nr`  r   r  r   r  rU   rP   r-   r   r  r*   rQ  rO  rU  )rj   rk   rl   rm   r
   rb  rc  r   r   r   r  r   rn   r   r   ra  r   rr   rc   rb   rg   rc  rc  P  s        $D =D+>> =X66:eT**8E1%%!>,?CC:gq"b11!>)V[AA;ua((<
E9==9Z++9\1--9[!,,.KKKrb   rc  c                       e Zd ZdZ edde           edde           edd           edd	           e	d
de
           edd	dg            edd	          gZdS )OFPTStatsRequestVendorOFPST_STATS_REQUEST_VENDORr   r>   r   rU   r   Nr`  r   r  r{   r  r  r  rc   rb   rg   rf  rf  `  s        'D =D+>> =X66:eT**8E1%%!>,?CC:gq"b118Ha((*KKKrb   rf  c                       e Zd ZdZ edde           edde           edd           edd	           e	d
de
           edd	dg            edd	          gZdS )OFPTStatsReplyVendorOFPST_STATS_REPLY_VENDORr   r>   r   r   r   Nr`  r   r  r{   r  rU   r  r  rc   rb   rg   ri  ri  k  s        %D =D+>> =X66:eT**8E1%%!>,?CC:gq"b118Ha((*KKKrb   ri  c                   r    e Zd ZdZ edde           edde           edd           edd	          gZ	dS )
OFPTBarrierRequestrV  r   r>   r   rZ  r   Nr`  r   ra  rc   rb   rg   rl  rl    sZ        !D =D+>> =X66:eT**8E1%%'KKKrb   rl  c                   r    e Zd ZdZ edde           edde           edd           edd	          gZ	dS )
OFPTBarrierReplyrW  r   r>   r   r[  r   Nr`  r   ra  rc   rb   rg   rn  rn    sZ        D =D+>> =X66:eT**8E1%%'KKKrb   rn  c            	           e Zd ZdZ edde           edde           edd           edd	           e	d
d	e
           edd	          gZdS )OFPTQueueGetConfigRequestrX  r   r>   r   r\  r   Nr`  r   r   r   )rj   rk   rl   rm   r
   rb  rc  r   r   r   rn   r   rr   rc   rb   rg   rp  rp    sz        *D =D+>> =X66:eT**8E1%%!>&![99;ua((*KKKrb   rp  c                       e Zd ZdZ edde           edde           edd           edd	           e	d
d	e
           edd	d           edg ed           gZdS )OFPTQueueGetConfigReplyrY  r   r>   r   r]  r   Nr`  r   r   r   r   queuesc                     | j         dz
  S )NrU   r9  r:  s    rg   r<  z OFPTQueueGetConfigReply.<lambda>  r  rb   r=  )rj   rk   rl   rm   r
   rb  rc  r   r   r   rn   r   r   r5  rr   rc   rb   rg   rr  rr    s        (D =D+>> =X66:eT**8E1%%!>&![999UAr**"?8R/F/FH H HIKKKrb   rr  rZ  r[  )r\  r]  i  )dport)sporti  )rv  ru  )__doc__r   scapy.compatr   r   r   scapy.configr   scapy.errorr   scapy.fieldsr   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   scapy.layers.l2r   scapy.layers.inetr   scapy.packetr   r    r!   r"   scapy.utilsr#   r   rn   r   ra  r  r   ro   rp   ofp_port_state_stprq   rN   rt   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r  r  r  r  r+  r*  r-  r2  r0  r5  rb  rc  r_  re  rz  rs  r|  r  r  r  r  r   r  r  r  r  valuesr  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r"  r*  r0  r3  r7  r:  rC  rH  rK  r[  r_  rc  rf  ri  r   r   rl  rn  rp  rr  r   rc   rb   rg   <module>r     s     ' & & & & & & & & &             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  d  d  d ! ! ! ! ! ! ! ! ! ! ! ! C C C C C C C C C C C C      
 3D9j  !#  5M		+&
{## # # +*,*, , 
# # #        "B B B B Bv B B BJ    &       v   % % % % %s % % %$  $  $  $  $ { $  $  $ N &++)))))))*')+ + H H H H H( H H H* * * * *h * * *+ + + + +h + + +( ( ( ( (X ( ( (, , , , ,H , , ,, , , , ,H , , ,, , , , ,H , , ,, , , , ,H , , ,+ + + + +H + + +* * * * *H * * ** * * * *H * * *, , , , ,8 , , ,* * * * *( * * * !$$#""""""#"$& &	 	 	 	 	F 	 	 	  ,/1 1 ( ( ( ( ( ( ( (- - - - -; - - - ')+ + 	 	 	 	 	F 	 	 	    V   2 $####	% %/A| /|/"/  / }	/
 &/ $/ (/ &/  /  / #/ "/ !/ / /  $!/" #&$/-+/ / /0' ' ' ' ' ' ' ' 	 	 	 	 	K 	 	 	 *(',,,. .	3 	3 	3 	3 	3{ 	3 	3 	33 3 3 3 3k 3 3 3&3 3 3 3 3[ 3 3 3&3 3 3 3 3 3 3 3 	3 	3 	3 	3 	3 	3 	3 	3
3 
3 
3 
3 
3 
3 
3 
3 %#"&&&( (' ' ' ' 'k ' ' '' ' ' ' 'K ' ' '* * * * * * * *' ' ' ' '+ ' ' '2 2%5%<%<%>%> 2 2 2 I I I I I I I I.' ' ' ' '; ' ' '
3 
3 
3 
3 
3 
3 
3 
3
5 
5 
5 
5 
5K 
5 
5 
55 5 5 5 5; 5 5 5/ / / / /k / / /*
B 
B 
B 
B 
B[ 
B 
B 
B5 5 5 5 5K 5 5 5I I I I I+ I I I4' ' ' ' '+ ' ' '& #"'#"#(* *3 3 3 3 3; 3 3 39 9 9 9 9 9 9 9D D D D D; D D D    6   :	I 	I 	I 	I 	I 	I 	I 	I     4   
( ( ( ( (k ( ( (3 3 3 3 3K 3 3 32 2 2 2 2F 2 2 26	I 	I 	I 	I 	I+ 	I 	I 	I	, 	, 	, 	, 	,; 	, 	, 	,/ / / / /6 / / /,	I 	I 	I 	I 	I 	I 	I 	I
? 
? 
? 
? 
?K 
? 
? 
?. . . . .+ . . . * * * * *[ * * ** * * * *; * * * 105101 68 8  -,1-,-24 4 ' ' ' ' ' ' ' '' ' ' ' '{ ' ' '* * * * * * * *	I 	I 	I 	I 	Ik 	I 	I 	I)Ay )) }) z	)
 ")  ) #) !) }) ) ) ) ) ) )$ "%)&  ')( *'+) ) )0 sHD ) ) ) ) sHD ) ) ) ) sHD ) ) ) ) sHD ) ) ) ) c;d$ 7 7 7 7 7 7rb   