a
    kÄ#dCº  ã                   @   s  d Z ddlm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l-m.  m/Z/ ddie	j0d< dddddddddœZ1ddiZ2ddiZ3ddiZ4ddiZ5g d¢Z6dgZ7ddd d!d"œZ8g d#¢Z9G 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?d0d1d2d3d4d5d6d7d8d9d:d;d<d=œZ@G d>d?„ d?e?ƒZAG d@dA„ dAe?ƒZBG dBdC„ dCe?ƒZCG dDdE„ dEe?ƒZDG dFdG„ dGe?ƒZEG dHdI„ dIe?ƒZFG dJdK„ dKe?ƒZGG dLdM„ dMe?ƒZHG dNdO„ dOe?ƒZIG dPdQ„ dQe?ƒZJG dRdS„ dSe?ƒZKG dTdU„ dUe?ƒZLG dVdW„ dWe?ƒZMeAeBeCeDeEeFeGeHeIeJeKeLeMd=œZNG dXdY„ dYe'ƒZOdZd[d\œZPG d]d^„ d^e<ƒZQG d_d`„ d`e<ƒZReQeRd\œZSG dadb„ dbe'ƒZTG dcdd„ dde'ƒZUdedfdgdhdidjœZVdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dd€d�œZWG d‚dƒ„ dƒe<ƒZXG d„d…„ d…eƒZYd†d‡dˆd‰dŠd‹dŒœZZG 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`dŒœZaG d™dš„ dše<ƒZbG d›dœ„ dœe<ƒZcG d�dž„ dže<ƒZdG dŸd „ d e<ƒZed¡d¢„ e/ fe@¡D ƒZgG d£d¤„ d¤e<ƒZhG d¥d¦„ d¦e<ƒZiG d§d¨„ d¨e<ƒZjG d©dª„ dªe<ƒZkG d«d¬„ d¬e<ƒZlG d­d®„ d®e<ƒZmG d¯d°„ d°e<ƒZnG d±d²„ d²e<ƒZoG d³d´„ d´e<ƒZpG dµd¶„ d¶e<ƒZqd·d¸d¹dºd»d¼d½d¾œZrG d¿dÀ„ dÀe<ƒZsG dÁdÂ„ dÂe<ƒZtG dÃdÄ„ dÄe<ƒZuG dÅdÆ„ dÆe'ƒZvG dÇdÈ„ dÈe<ƒZwG dÉdÊ„ dÊeuƒZxG dËdÌ„ dÌe<ƒZyG dÍdÎ„ dÎe<ƒZzG 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ƒeseuexeze}e€e‚d¾œZ„eteweye|ee�eƒ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‰eXebecedeeeheiejekelemeneoepeqe†e‡eˆe‰déœZŠe)e%e?dêdë� e)e%e?dêdì� e)e%e?dídë� e)e%e?dídì� e*e%e<dêdêdî� 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/
é    )Úabsolute_importN)Ú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_PORTZTABLEZNORMALZFLOODÚALLZ
CONTROLLERZLOCALÚNONE)iøÿ  iùÿ  iúÿ  iûÿ  iüÿ  iýÿ  iþÿ  éÿÿ  éÿ   l   ÿÿ Ú	NO_BUFFERr)   )Z	PORT_DOWNZNO_STPZNO_RECVZNO_RECV_STPZNO_FLOODZNO_FWDZNO_PACKET_INZ	LINK_DOWNZOFPPS_STP_LISTENZOFPPS_STP_LEARNZOFPPS_STP_FORWARDZOFPPS_STP_BLOCK©r   é   é   é   )Z10MB_HDZ10MB_FDZ100MB_HDZ100MB_FDZ1GB_HDZ1GB_FDZ10GB_FDZCOPPERZFIBERZAUTONEGZPAUSEZ
PAUSE_ASYMc                   @   sŒ   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d„ ZdS )Ú
OFPPhyPortZOFP_PHY_PORTÚport_nor   Úhw_addrÚ0Z	port_nameÚ é   Úconfigé    Z	stp_stateé   Ústateé   ÚcurrZ
advertisedÚ	supportedZpeerc                 C   s   d|fS ©Nó    © ©ÚselfÚsr?   r?   úM/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/contrib/openflow.pyÚextract_paddingm   s    zOFPPhyPort.extract_paddingN)Ú__name__Ú
__module__Ú__qualname__Únamer   Úofp_port_nor   r   r   Úofp_port_configr   Úofp_port_stateÚofp_port_featuresÚfields_descrD   r?   r?   r?   rC   r0   `   s   

÷r0   c                   @   sÊ   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d„ Zdd„ ZdS ) ÚOFPMatchZ	OFP_MATCHÚ
wildcards1Né   ÚDL_VLAN_PCPÚNW_TOSÚnw_dst_maské   Únw_src_maskÚ
wildcards2r:   ©r&   ZDL_VLANZDL_SRCZDL_DSTZDL_TYPEZNW_PROTOZTP_SRCZTP_DSTÚin_portÚdl_srcÚdl_dstÚdl_vlanÚdl_vlan_pcpÚpad1Údl_typeÚnw_tosÚnw_protoÚpad2Únw_srcr3   Únw_dstÚtp_srcÚtp_dstc                 C   s   d|fS r=   r?   r@   r?   r?   rC   rD   Ž   s    zOFPMatch.extract_paddingc           	      C   s˜  d}| j d u rH| jd u r"|d7 }n|d7 }| jd u r>|d7 }qn|d7 }n&t| j ƒ}|ddt|ƒ  7 }||7 }| jd u r–| jdkrŒ|d7 }q¼|d7 }n&t| jƒ}|ddt|ƒ  7 }||7 }| jd u rä| jdkrÚ|d7 }n|d7 }n&t| jƒ}|ddt|ƒ  7 }||7 }| j	d u �r| j
d u �r,|d7 }n|d7 }| jd u �rJ|d7 }n|d7 }| jd u �rh|d7 }n|d7 }| jd u �r†|d7 }n|d7 }| jd u �r¤|d7 }n|d7 }| jd u �rÂ|d7 }n|d7 }| jd u �rà|d7 }n|d7 }| jd u �rþ|d7 }n|d7 }n&t| j	ƒ}|ddt|ƒ  7 }||7 }tjd	 d
 �r^| jd u �rº| jdk�sz| jdk�sz| jd u�sz| jd u�rº|d d… t dd¡ |dd …  }|d d… d |dd …  }| jd u �r^| jd u�sÞ| j
d u�r^|d d… t dd¡ |dd …  }|d d… d |dd …  }|d d… t dd¡ |dd …  }|d d… d |dd …  }d dd„ tt|ƒgd Ž D ƒ¡}||dd …  }|| S )NZ
0000000000Ú1r3   r.   Z111111Ú000000rT   r:   r%   r$   é   ú!Hi   r8   éûÿÿÿéüÿÿÿé   z!Bé   iúÿÿÿr>   c                 s   s"   | ]}t td  |¡dƒƒV  qdS )r4   r.   N)r   ÚintÚjoin)Ú.0Úxr?   r?   rC   Ú	<genexpr>ñ   r>   z&OFPMatch.post_build.<locals>.<genexpr>é   )rO   r_   r\   r#   ÚlenrS   rc   rU   rb   rV   re   rd   r`   r^   rZ   rY   r[   rX   r   ÚcontribsÚstructÚpackro   ÚzipÚiter)	rA   ÚpÚpayZlst_bitsZw1Úm1Úm2Zw2Zinsr?   r?   rC   Ú
post_build’   sŽ    


























ÿÿ$$$"zOFPMatch.post_build)rE   rF   rG   rH   r   r	   r   rI   r   r   r   r   r   r   rM   rD   r~   r?   r?   r?   rC   rN   q   s0   
ÿ


çrN   c                   @   s   e Zd ZdZdd„ ZdS )Ú_ofp_headerz+Dummy OpenFlow Header for some lower layersc                 C   sF   | j d u r>t |ƒt |ƒ }|d d… t d|¡ |dd …  }|| S )Nr.   ri   rs   ©rt   rv   rw   ©rA   rz   r{   Útmp_lenr?   r?   rC   r~   ù   s    
$z_ofp_header.post_buildN©rE   rF   rG   rH   r~   r?   r?   r?   rC   r   ö   s   r   c                   @   s   e Zd ZdZdd„ ZdS )Ú_ofp_header_itemz&Dummy OpenFlow Header for items layersc                 C   s:   | j d u r2t |ƒt |ƒ }t d|¡|dd …  }|| S ©Nri   r.   r€   r�   r?   r?   rC   r~     s    
z_ofp_header_item.post_buildNrƒ   r?   r?   r?   rC   r„      s   r„   c                   @   s   e Zd ZdZdS )Ú_UnknownOpenFlowúUnknown OpenFlow packetN)rE   rF   rG   rH   r?   r?   r?   rC   r†     s   r†   c                   @   s   e Zd ZdZeddd„ƒZdS )ÚOpenFlowzOpenFlow dissectorNc           	      O   sê   |ræt |ƒdkræt|d ƒ}|dkrHddlm} |j|g|¢R i |¤ŽS |dkrÞt|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 nt	dƒ t
S )Nr.   r   rs   )Ú	OpenFlow3r-   é	   r*   r)   r5   é   r‡   )rt   r   Zscapy.contrib.openflow3r‰   Údispatch_hookÚofp_error_clsÚofp_stats_request_clsÚofp_stats_reply_clsÚofpt_clsr   r†   )	ÚclsÚ_pktÚargsÚkargsÚversionr‰   Zof_typeZerr_typeZmp_typer?   r?   rC   rŒ     s2    
zOpenFlow.dispatch_hook)N)rE   rF   rG   rH   ÚclassmethodrŒ   r?   r?   r?   rC   rˆ     s   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_DSTZOFPAT_SET_NW_TOSÚOFPAT_SET_TP_SRCÚOFPAT_SET_TP_DSTÚOFPAT_ENQUEUEÚOFPAT_VENDOR)r   r-   r.   r/   rs   é   rT   é   r:   rŠ   é
   é   r)   c                   @   s:   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   rt   r:   ÚportÚmax_lenr+   N)
rE   rF   rG   rH   r   Úofp_action_typesr   rI   Úofp_max_lenrM   r?   r?   r?   rC   r§   G  s   


ýr§   c                   @   s6   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-   rt   r:   Zvlan_vidr   ÚpadN©	rE   rF   rG   rH   r   r«   r   r   rM   r?   r?   r?   rC   r­   O  s   
ýr­   c                   @   s6   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.   rt   r:   Zvlan_pcpr   r®   N©
rE   rF   rG   rH   r   r«   r   r   r   rM   r?   r?   r?   rC   r°   W  s   
ýr°   c                   @   s.   e Zd ZdZeddeƒeddƒeddƒgZdS )	ÚOFPATStripVLANrš   r¨   r/   rt   r:   r®   r   N)	rE   rF   rG   rH   r   r«   r   r   rM   r?   r?   r?   rC   r²   _  s
   
þr²   c                   @   s8   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¨   rs   rt   r5   Údl_addrr3   r®   r   é0   N©
rE   rF   rG   rH   r   r«   r   r   r   rM   r?   r?   r?   rC   r³   f  s   

ýr³   c                   @   s8   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£   rt   r5   r´   r3   r®   r   rµ   Nr¶   r?   r?   r?   rC   r·   n  s   

ýr·   c                   @   s.   e Zd ZdZeddeƒeddƒeddƒgZdS )	ÚOFPATSetNwSrcr�   r¨   rT   rt   r:   Únw_addrr3   N©	rE   rF   rG   rH   r   r«   r   r   rM   r?   r?   r?   rC   r¸   v  s
   
þr¸   c                   @   s.   e Zd ZdZeddeƒeddƒeddƒgZdS )	ÚOFPATSetNwDstrž   r¨   r¤   rt   r:   r¹   r3   Nrº   r?   r?   r?   rC   r»   }  s
   
þr»   c                   @   s6   e Zd ZdZeddeƒeddƒeddƒeddƒgZ	dS )	ÚOFPATSetNwToSZOFPAT_SET_TP_TOSr¨   r:   rt   r_   r   r®   Nr±   r?   r?   r?   rC   r¼   „  s   
ýr¼   c                   @   s6   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Š   rt   r:   Útp_portr   r®   Nr¯   r?   r?   r?   rC   r½   Œ  s   
ýr½   c                   @   s6   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¥   rt   r:   r¾   r   r®   Nr¯   r?   r?   r?   rC   r¿   ”  s   
ýr¿   c                   @   sB   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¦   rt   r5   r©   r   r®   rµ   Úqueue_idN)rE   rF   rG   rH   r   r«   r   rI   r   r   rM   r?   r?   r?   rC   rÀ   œ  s   


ürÀ   c                   @   s.   e Zd ZdZeddeƒeddƒeddƒgZdS )	ÚOFPATVendorr¢   r¨   r)   rt   r:   Úvendorr   N)	rE   rF   rG   rH   r   r«   r   r   rM   r?   r?   r?   rC   rÂ   ¥  s
   
þrÂ   c                   @   s"   e Zd Zeddd„ƒZdd„ ZdS )ÚOFPATNc                 O   s8   |r4t |ƒdkr4t d|d d… ¡d }t |t¡S tS ©Nr.   ri   r   )rt   rv   ÚunpackÚofp_action_clsÚgetr    ©r‘   r’   r“   r”   Útr?   r?   rC   rŒ   ¼  s    zOFPAT.dispatch_hookc                 C   s   d|fS r=   r?   r@   r?   r?   rC   rD   Ã  s    zOFPAT.extract_padding)N©rE   rF   rG   r–   rŒ   rD   r?   r?   r?   rC   rÄ   »  s   rÄ   Ú
OFPQT_NONEÚOFPQT_MIN_RATE©r   r-   c                   @   s.   e Zd ZdZeddeƒeddƒeddƒgZdS )Ú	OFPQTNonerÌ   r¨   r   rt   r:   r®   N)	rE   rF   rG   rH   r   Úofp_queue_property_typesr   r   rM   r?   r?   r?   rC   rÏ   Î  s
   
þrÏ   c                   @   s@   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-   rt   r5   r®   r   Zratera   rµ   N)
rE   rF   rG   rH   r   rÐ   r   r   r   rM   r?   r?   r?   rC   rÑ   Õ  s   

ürÑ   c                   @   s"   e Zd Zeddd„ƒZdd„ ZdS )ÚOFPQTNc                 O   s8   |r4t |ƒdkr4t d|d d… ¡d }t |t¡S tS rÅ   )rt   rv   rÆ   Úofp_queue_property_clsrÈ   r    rÉ   r?   r?   rC   rŒ   ã  s    zOFPQT.dispatch_hookc                 C   s   d|fS r=   r?   r@   r?   r?   rC   rD   ê  s    zOFPQT.extract_padding)NrË   r?   r?   r?   rC   rÒ   â  s   rÒ   c                	   @   sN   e Zd ZdZeddƒeddƒeddƒedg edd	„ d
�gZ	dd„ Z
dd„ ZdS )ÚOFPPacketQueueZOFP_PACKET_QUEUErÁ   r   rt   Nr®   Ú
propertiesc                 C   s
   | j d S )Nr:   ©rt   ©Úpktr?   r?   rC   Ú<lambda>ô  r>   zOFPPacketQueue.<lambda>©Zlength_fromc                 C   s   d|fS r=   r?   r@   r?   r?   rC   rD   ö  s    zOFPPacketQueue.extract_paddingc                 C   s^   | j g kr|ttƒ ƒ7 }| jd u rVt|ƒt|ƒ }|d d… t d|¡ |dd …  }|| S )Nrs   ri   rT   )rÕ   r   rÏ   rt   rv   rw   r�   r?   r?   rC   r~   ù  s    

$zOFPPacketQueue.post_build)rE   rF   rG   rH   r   r   r   r   rÒ   rM   rD   r~   r?   r?   r?   rC   rÔ   î  s   ÿýrÔ   zOpenFlow 1.0zOpenFlow 1.1zOpenFlow 1.2zOpenFlow 1.3zOpenFlow 1.4)r-   r.   r/   rs   r£   Ú
OFPT_HELLOZ
OFPT_ERRORÚOFPT_ECHO_REQUESTÚOFPT_ECHO_REPLYÚOFPT_VENDORÚOFPT_FEATURES_REQUESTÚOFPT_FEATURES_REPLYÚOFPT_GET_CONFIG_REQUESTÚOFPT_GET_CONFIG_REPLYÚOFPT_SET_CONFIGÚOFPT_PACKET_INÚOFPT_FLOW_REMOVEDÚOFPT_PORT_STATUSÚOFPT_PACKET_OUTÚOFPT_FLOW_MODÚOFPT_PORT_MODZOFPT_STATS_REQUESTZOFPT_STATS_REPLYÚOFPT_BARRIER_REQUESTÚOFPT_BARRIER_REPLYÚOFPT_QUEUE_GET_CONFIG_REQUESTÚOFPT_QUEUE_GET_CONFIG_REPLY)r   r-   r.   r/   rs   r£   rT   r¤   r:   rŠ   r¥   r¦   rP   é   é   é   r5   r‹   é   é   é   é   c                   @   s8   e Zd ZdZeddeƒeddeƒeddƒeddƒgZ	dS )	Ú	OFPTHellorÛ   r•   r-   r¨   r   rt   NÚxid©
rE   rF   rG   rH   r
   Úofp_versionÚofp_typer   r   rM   r?   r?   r?   rC   rõ   %  s   

ýrõ   c                   @   s   e Zd Zdd„ ZdS )ÚOFPacketFieldc                 C   sf   zB|dd… }t  d|¡d }|d |… }||d … }|t|ƒfW S  ty`   dt|ƒf Y S 0 d S )Nr.   rs   ri   r   r4   )rv   rÆ   rˆ   Ú	Exceptionr    )rA   rØ   rB   r‚   ZofloadZremainr?   r?   rC   Úgetfield6  s    zOFPacketField.getfieldN)rE   rF   rG   rü   r?   r?   r?   rC   rú   5  s   rú   Ú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/   rs   r£   c                   @   s\   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 )ÚOFPETHelloFailedrý   r•   r-   r¨   rt   Nrö   r   ÚerrtypeÚerrcodeZOFPHFC_INCOMPATIBLEZOFPHFC_EPERMrÎ   Údatar4   ©rE   rF   rG   rH   r
   rø   rù   r   r   r   Úofp_error_typerú   r    rM   r?   r?   r?   rC   r  I  s   


ÿ
ùr  c                   @   sj   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 )ÚOFPETBadRequestrþ   r•   r-   r¨   rt   Nrö   r   r  r  ZOFPBRC_BAD_VERSIONZOFPBRC_BAD_TYPEZOFPBRC_BAD_STATZOFPBRC_BAD_VENDORZOFPBRC_BAD_SUBTYPEZOFPBRC_EPERMZOFPBRC_BAD_LENZOFPBRC_BUFFER_EMPTYZOFPBRC_BUFFER_UNKNOWN©	r   r-   r.   r/   rs   r£   rT   r¤   r:   r  r4   r  r?   r?   r?   rC   r
  U  s$   


ø	
òr
  c                   @   sj   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 )ÚOFPETBadActionrÿ   r•   r-   r¨   rt   Nrö   r   r  r.   r  ZOFPBAC_BAD_TYPEZOFPBAC_BAD_LENZOFPBAC_BAD_VENDORZOFPBAC_BAD_VENDOR_TYPEZOFPBAC_BAD_OUT_PORTZOFPBAC_BAD_ARGUMENTZOFPBAC_EPERMZOFPBAC_TOO_MANYZOFPBAC_BAD_QUEUEr  r  r4   r  r?   r?   r?   rC   r  h  s$   


ø	
òr  c                   @   sd   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 )ÚOFPETFlowModFailedr   r•   r-   r¨   rt   Nrö   r   r  r/   r  ZOFPFMFC_ALL_TABLES_FULLZOFPFMFC_OVERLAPZOFPFMFC_EPERMZOFPFMFC_BAD_EMERG_TIMEOUTZOFPFMFC_BAD_COMMANDZOFPFMFC_UNSUPPORTEDr  r  r4   r  r?   r?   r?   rC   r  {  s   


û
õr  c                   @   s\   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 )ÚOFPETPortModFailedr  r•   r-   r¨   rt   Nrö   r   r  rs   r  ZOFPPMFC_BAD_PORTZOFPPMFC_BAD_HW_ADDRrÎ   r  r4   r  r?   r?   r?   rC   r  ‹  s   


ÿ
ùr  c                   @   s^   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 )ÚOFPETQueueOpFailedr  r•   r-   r¨   rt   Nrö   r   r  r£   r  ZOFPQOFC_BAD_PORTZOFPQOFC_BAD_QUEUEZOFPQOFC_EPERM©r   r-   r.   r  r4   r  r?   r?   r?   rC   r  —  s   


þ
ør  c                   @   s8   e Zd ZdZeddeƒeddeƒeddƒedd	ƒgZ	dS )
ÚOFPTEchoRequestrÜ   r•   r-   r¨   r.   rt   Nrö   r   r÷   r?   r?   r?   rC   r  ¯  s   

ýr  c                   @   s8   e Zd ZdZeddeƒeddeƒeddƒedd	ƒgZ	dS )
ÚOFPTEchoReplyrÝ   r•   r-   r¨   r/   rt   Nrö   r   r÷   r?   r?   r?   rC   r  ·  s   

ýr  c                   @   s@   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 )Ú
OFPTVendorrÞ   r•   r-   r¨   rs   rt   Nrö   r   rÃ   r÷   r?   r?   r?   rC   r  ¿  s   

ür  c                   @   s8   e Zd ZdZeddeƒeddeƒeddƒedd	ƒgZ	dS )
ÚOFPTFeaturesRequestrß   r•   r-   r¨   r£   rt   Nrö   r   r÷   r?   r?   r?   rC   r  È  s   

ýr  c                 C   s   g | ]}|d kr|‘qS )r¢   r?   )rp   Úvr?   r?   rC   Ú
<listcomp>Ð  s   ÿr  c                   @   s†   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d„ d�gZdS )ÚOFPTFeaturesReplyrà   r•   r-   r¨   rT   rt   Nrö   r   Zdatapath_idZ	n_buffersZn_tablesr®   Zcapabilitiesr7   )Z
FLOW_STATSZTABLE_STATSZ
PORT_STATSZSTPZRESERVEDZIP_REASMZQUEUE_STATSZARP_MATCH_IPÚactionsZportsc                 C   s
   | j d S )Nr7   rÖ   r×   r?   r?   rC   rÙ   è  r>   zOFPTFeaturesReply.<lambda>rÚ   )rE   rF   rG   rH   r
   rø   rù   r   r   r   r   r   r   Úofp_action_types_flagsr   r0   rM   r?   r?   r?   rC   r  Ô  s   

ÿïr  c                   @   s8   e Zd ZdZeddeƒeddeƒeddƒedd	ƒgZ	dS )
ÚOFPTGetConfigRequestrá   r•   r-   r¨   r¤   rt   Nrö   r   r÷   r?   r?   r?   rC   r  ë  s   

ýr  c                   @   sT   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 )ÚOFPTGetConfigReplyrâ   r•   r-   r¨   r:   rt   Nrö   r   ÚflagsÚFRAG_NORMALÚ	FRAG_DROPÚ
FRAG_REASMÚ	FRAG_MASKr,   Úmiss_send_len©rE   rF   rG   rH   r
   rø   rù   r   r   r   rM   r?   r?   r?   rC   r  ó  s   

ýør  c                   @   sT   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 )ÚOFPTSetConfigrã   r•   r-   r¨   rŠ   rt   Nrö   r   r  r  r  r  r   r,   r!  é€   r"  r?   r?   r?   rC   r#     s   

ýør#  c                   @   sv   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 )ÚOFPTPacketInrä   r•   r-   r¨   r¥   rt   Nrö   r   Ú	buffer_idr+   Z	total_lenrX   ÚreasonZOFPR_NO_MATCHZOFPR_ACTIONrÎ   r®   r  )rE   rF   rG   rH   r
   rø   rù   r   r   r   Ú
ofp_bufferr   rI   r   r   r   rM   r?   r?   r?   rC   r%    s   



ÿ
ör%  c                   @   sž   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 )ÚOFPTFlowRemovedrå   r•   r-   r¨   r¦   rt   Nrö   r   ÚmatchÚcookieÚpriorityr'  ZOFPRR_IDLE_TIMEOUTZOFPRR_HARD_TIMEOUTZOFPRR_DELETEr  r]   Úduration_secÚduration_nsecÚidle_timeoutra   Úpacket_countÚ
byte_count)rE   rF   rG   rH   r
   rø   rù   r   r   r   rN   r   r   r   rM   r?   r?   r?   rC   r)    s(   

þðr)  c                   @   s`   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 )ÚOFPTPortStatusræ   r•   r-   r¨   rP   rt   Nrö   r   r'  Z	OFPPR_ADDZOFPPR_DELETEZOFPPR_MODIFYr  r®   é8   Údesc)rE   rF   rG   rH   r
   rø   rù   r   r   r   r   r0   rM   r?   r?   r?   rC   r2  1  s   

þ
ør2  c                   @   sx   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d�edg eedd„ d�eddeƒg	ZdS )ÚOFPTPacketOutrç   r•   r-   r¨   rî   rt   Nrö   r   r&  r+   rX   r(   Úactions_lenÚHr  )ÚfmtZ	length_ofc                 C   s   | j S )N)r6  r×   r?   r?   rC   rÙ   I  r>   zOFPTPacketOut.<lambda>rÚ   r  )rE   rF   rG   rH   r
   rø   rù   r   r   r   r(  r   rI   r   r   rÄ   rÇ   r   r   rM   r?   r?   r?   rC   r5  >  s   



þ
ör5  c                   @   s²   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d„ d �gZdS )!ÚOFPTFlowModrè   r•   r-   r¨   rï   rt   Nrö   r   r*  r+  ÚcmdZ	OFPFC_ADDZOFPFC_MODIFYZOFPFC_MODIFY_STRICTZOFPFC_DELETEZOFPFC_DELETE_STRICT)r   r-   r.   r/   rs   r/  Úhard_timeoutr,  r&  r+   Úout_portr(   r  r5   )ZSEND_FLOW_REMZCHECK_OVERLAPZEMERGr  c                 C   s
   | j d S )NéH   rÖ   r×   r?   r?   rC   rÙ   d  r>   zOFPTFlowMod.<lambda>rÚ   )rE   rF   rG   rH   r
   rø   rù   r   r   r   rN   r   r   r   r(  rI   r   r   rÄ   rÇ   rM   r?   r?   r?   rC   r9  M  s0   

ü

þír9  c                   @   sv   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 )ÚOFPTPortModré   r•   r-   r¨   rð   rt   Nrö   r   r1   r2   r3   r6   r7   ÚmaskZ	advertiser®   )rE   rF   rG   rH   r
   rø   rù   r   r   r   rI   r   r   rJ   rL   rM   r?   r?   r?   rC   r>  g  s   


÷r>  Z
OFPST_DESCZ
OFPST_FLOWZOFPST_AGGREGATEZOFPST_TABLEZ
OFPST_PORTZOFPST_QUEUEZOFPST_VENDOR)r   r-   r.   r/   rs   r£   r)   c                
   @   sN   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 )ÚOFPTStatsRequestDescZOFPST_STATS_REQUEST_DESCr•   r-   r¨   r5   rt   Nrö   r   Ú
stats_typer  ©rE   rF   rG   rH   r
   rø   rù   r   r   r   Úofp_stats_typesr   rM   r?   r?   r?   rC   r@  ƒ  s   


ûr@  c                   @   s€   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 )ÚOFPTStatsReplyDescZOFPST_STATS_REPLY_DESCr•   r-   r¨   r‹   rt   Nrö   r   rA  r  r5   Zmfr_descr4   é   Zhw_descZsw_descZ
serial_numr7   Zdp_desc)rE   rF   rG   rH   r
   rø   rù   r   r   r   rC  r   r   rM   r?   r?   r?   rC   rD  �  s   







örD  c                   @   sv   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 )ÚOFPTStatsRequestFlowZOFPST_STATS_REQUEST_FLOWr•   r-   r¨   r5   rt   Nrö   r   rA  r  r*  Útable_idr'   r®   r<  r(   )rE   rF   rG   rH   r
   rø   rù   r   r   r   rC  r   r   rN   Ú	ofp_tabler   rI   rM   r?   r?   r?   rC   rF  œ  s   




÷rF  c                   @   s¦   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d„ d�gZdd„ Zdd„ ZdS )ÚOFPFlowStatsZOFP_FLOW_STATSÚlengthNrG  r   r]   r*  r-  r.  r,  r/  r;  ra   rµ   r+  r0  r1  r  c                 C   s
   | j d S )NéX   )rJ  r×   r?   r?   rC   rÙ   »  r>   zOFPFlowStats.<lambda>rÚ   c                 C   s:   | j d u r2t|ƒt|ƒ }t d|¡|dd …  }|| S r…   )rJ  rt   rv   rw   r�   r?   r?   rC   r~   ½  s    
zOFPFlowStats.post_buildc                 C   s   d|fS r=   r?   r@   r?   r?   rC   rD   Ã  s    zOFPFlowStats.extract_padding)rE   rF   rG   rH   r   r   r   r   rN   r   r   r   r   rÄ   rÇ   rM   r~   rD   r?   r?   r?   rC   rI  ª  s*   
þórI  c                   @   s`   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d„ d�gZdS )ÚOFPTStatsReplyFlowZOFPST_STATS_REPLY_FLOWr•   r-   r¨   r‹   rt   Nrö   r   rA  r  r5   Z
flow_statsc                 C   s
   | j d S ©NrP   rÖ   r×   r?   r?   rC   rÙ   Ð  r>   zOFPTStatsReplyFlow.<lambda>rÚ   )rE   rF   rG   rH   r
   rø   rù   r   r   r   rC  r   r   rI  rM   r?   r?   r?   rC   rL  Ç  s   


ÿúrL  c                   @   s   e Zd ZdZdZdS )ÚOFPTStatsRequestAggregateZOFPST_STATS_REQUEST_AGGREGATEr.   N)rE   rF   rG   rH   rA  r?   r?   r?   rC   rN  Ó  s   rN  c                   @   sn   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 )ÚOFPTStatsReplyAggregateZOFPST_STATS_REPLY_AGGREGATEr•   r-   r¨   r‹   rt   Nrö   r   rA  r.   r  r5   r0  r1  Z
flow_countr®   )rE   rF   rG   rH   r
   rø   rù   r   r   r   rC  r   r   r   rM   r?   r?   r?   rC   rO  Ø  s   


÷rO  c                
   @   sN   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 )ÚOFPTStatsRequestTableZOFPST_STATS_REQUEST_TABLEr•   r-   r¨   r5   rt   Nrö   r   rA  r/   r  rB  r?   r?   r?   rC   rP  æ  s   


ûrP  c                   @   sŠ   e Zd Zd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                 C   s   d|fS r=   r?   r@   r?   r?   rC   rD   ò  s    zOFPTableStats.extract_paddingZOFP_TABLE_STATSrG  r   r®   rH   r4   r7   rO   r/   rP   rQ   rR   rS   é?   rT   rU   rV   r*   r:   rW   Zmax_entriesÚactive_countZlookup_countZmatched_countN)rE   rF   rG   rD   rH   r   r   r   r   r	   r   r   rM   r?   r?   r?   rC   rQ  ð  s    

ÿ

îrQ  c                   @   s`   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d„ d�gZdS )ÚOFPTStatsReplyTableÚOFPST_STATS_REPLY_TABLEr•   r-   r¨   r‹   rt   Nrö   r   rA  r/   r  r5   Ztable_statsc                 C   s
   | j d S rM  rÖ   r×   r?   r?   rC   rÙ     r>   zOFPTStatsReplyTable.<lambda>rÚ   )rE   rF   rG   rH   r
   rø   rù   r   r   r   rC  r   r   rQ  rM   r?   r?   r?   rC   rT    s   


ÿúrT  c                   @   sb   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 )ÚOFPTStatsRequestPortZOFPST_STATS_REQUEST_PORTr•   r-   r¨   r5   rt   Nrö   r   rA  rs   r  r1   r(   r®   rµ   )rE   rF   rG   rH   r
   rø   rù   r   r   r   rC  r   rI   r   rM   r?   r?   r?   rC   rV    s   




ùrV  c                   @   s�   e Zd Zd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                 C   s   d|fS r=   r?   r@   r?   r?   rC   rD   %  s    zOFPPortStats.extract_paddingZOFP_PORT_STATSr1   r   r®   rµ   Z
rx_packetsÚ
tx_packetsZrx_bytesÚtx_bytesZ
rx_droppedZ
tx_droppedZ	rx_errorsÚ	tx_errorsZrx_frame_errZrx_over_errZ
rx_crc_errZ
collisionsN)
rE   rF   rG   rD   rH   r   rI   r   r   rM   r?   r?   r?   rC   rW  #  s"   

órW  c                   @   s`   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d„ d�gZdS )ÚOFPTStatsReplyPortrU  r•   r-   r¨   r‹   rt   Nrö   r   rA  rs   r  r5   Z
port_statsc                 C   s
   | j d S rM  rÖ   r×   r?   r?   rC   rÙ   B  r>   zOFPTStatsReplyPort.<lambda>rÚ   )rE   rF   rG   rH   r
   rø   rù   r   r   r   rC  r   r   rW  rM   r?   r?   r?   rC   r[  9  s   


ÿúr[  c                   @   sj   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 )ÚOFPTStatsRequestQueueZOFPST_STATS_REQUEST_QUEUEr•   r-   r¨   r5   rt   Nrö   r   rA  r£   r  r1   r(   r®   rÁ   r'   )rE   rF   rG   rH   r
   rø   rù   r   r   r   rC  r   rI   r   r   Ú	ofp_queuerM   r?   r?   r?   rC   r\  E  s   




ør\  c                   @   s‚   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 )ÚOFPTStatsReplyQueueZOFPST_STATS_REPLY_QUEUEr•   r-   r¨   r‹   rt   Nrö   r   rA  r£   r  r5   r1   r(   r®   rÁ   r'   rY  rX  rZ  )rE   rF   rG   rH   r
   rø   rù   r   r   r   rC  r   rI   r   r   r]  r   rM   r?   r?   r?   rC   r^  R  s   




õr^  c                
   @   sV   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 )ÚOFPTStatsRequestVendorZOFPST_STATS_REQUEST_VENDORr•   r-   r¨   r5   rt   Nrö   r   rA  rT   r  rÃ   rB  r?   r?   r?   rC   r_  b  s   


úr_  c                
   @   sV   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 )ÚOFPTStatsReplyVendorZOFPST_STATS_REPLY_VENDORr•   r-   r¨   r‹   rt   Nrö   r   rA  rT   r  r5   rÃ   rB  r?   r?   r?   rC   r`  m  s   


úr`  c                   @   s8   e Zd ZdZeddeƒeddeƒeddƒedd	ƒgZ	dS )
ÚOFPTBarrierRequestrê   r•   r-   r¨   rñ   rt   Nrö   r   r÷   r?   r?   r?   rC   ra  �  s   

ýra  c                   @   s8   e Zd ZdZeddeƒeddeƒeddƒedd	ƒgZ	dS )
ÚOFPTBarrierReplyrë   r•   r-   r¨   rò   rt   Nrö   r   r÷   r?   r?   r?   rC   rb  •  s   

ýrb  c                   @   sJ   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 )ÚOFPTQueueGetConfigRequestrì   r•   r-   r¨   ró   rt   Nrö   r   r©   r®   )rE   rF   rG   rH   r
   rø   rù   r   r   r   rI   r   rM   r?   r?   r?   rC   rc  �  s   


ûrc  c                   @   s^   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d„ d�gZdS )ÚOFPTQueueGetConfigReplyrí   r•   r-   r¨   rô   rt   Nrö   r   r©   r®   rµ   Úqueuesc                 C   s
   | j d S )Nr5   rÖ   r×   r?   r?   rC   rÙ   °  r>   z OFPTQueueGetConfigReply.<lambda>rÚ   )rE   rF   rG   rH   r
   rø   rù   r   r   r   rI   r   r   rÔ   rM   r?   r?   r?   rC   rd  §  s   



ÿúrd  )r   r.   r/   rs   r£   rT   r¤   r:   rŠ   r¥   r¦   rP   rî   rï   rð   rñ   rò   ró   rô   iý  )Údport)Úsportié  )rg  rf  )‹Ú__doc__Ú
__future__r   rv   Zscapy.compatr   r   r   Zscapy.configr   Zscapy.errorr   Zscapy.fieldsr   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Zscapy.layers.l2r   Zscapy.layers.inetr   Zscapy.packetr   r    r!   r"   Zscapy.utilsr#   Zscapy.libs.sixZlibsÚsixru   rI   rH  r]  r(  r¬   rJ   rK   Zofp_port_state_stprL   r0   rN   r   r„   r†   rˆ   r«   r§   r­   r°   r²   r³   r·   r¸   r»   r¼   r½   r¿   rÀ   rÂ   rÇ   rÄ   rÐ   rÏ   rÑ   rÓ   rÒ   rÔ   rø   rù   rõ   rú   r	  r  r
  r  r  r  r  r�   r  r  r  r  Ú
itervaluesr  r  r  r  r#  r%  r)  r2  r5  r9  r>  rC  r@  rD  rF  rI  rL  rN  rO  rP  rQ  rT  rV  rW  r[  r\  r^  r_  r`  rŽ   r�   ra  rb  rc  rd  r�   r?   r?   r?   rC   Ú<module>   sÈ  
\ù	ý 
'ô	ôÿ	ÿüëûû
	ú	

úú
ë