a
    kÄ#dE ã                .   @   s  d Z ddlmZ ddlZddlZddlZddlmZ ddlm	Z	m
Z
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!m"Z"m#Z# ddl$m%Z% ddl&m'Z' dd	l(m)Z)m*Z* dd
l+m,Z,m-Z- ddl.m/Z/ ddl0m1  m2Z2 G dd„ de*ƒZ3e3ƒ Z4dZ5dZ6dZ7dZ8dZ9dZ:dd„ Z;G dd„ deƒZ<G dd„ deƒZ=dd„ Z>dd„ Z?G dd„ de	ƒZ@G d d!„ d!e	ƒZAG d"d#„ d#e@ƒZBG d$d%„ d%eAƒZCG d&d'„ d'eƒZDG d(d)„ d)eEƒZFe)jGfd*d+„ZHd,d-d.d/d0d1d2œZId3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d3d_œ-ZJd3d`dad3dbdcdddedfdgdhdidjdkdldmdVdndodpdqdrdsdtd3duœZKdvdwdxdydzd{œZLG d|d}„ d}e	ƒZMd~d„ ZNG d€d�„ d�e	ƒZOG d‚dy„ dyeOeMƒZPd3dƒd„d…œZQd3d†d‡dˆd‰dŠd‹dŒd�dŽd�d�d‘d’d“d”d•d–d—œZRd˜d™dšd›dœd™dšd�œZSdždŸ„ ZTi ZUd d¡„ ZVG d¢d£„ d£eWƒZXG d¤d¥„ d¥eXe
ƒZYG d¦d§„ d§e2 ZeYe	¡ƒZ[G d¨d™„ d™e[ƒZ\G d©d˜„ d˜e[ƒZ]d3dªd«d¬œZ^d­d®d¯d°œZ_G d±d²„ d²e	ƒZ`G d³d´„ d´eƒZaG dµdš„ dše[ƒZbd¶d·iZcG d¸d›„ d›e[ƒZdG d¹dœ„ dœe[ƒZeG dºd»„ d»e	ƒZfG d¼d½„ d½eƒZgG d¾d¿„ d¿e	ƒZhG dÀdv„ dveOƒZid3dÁ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áœ!Zjdâ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äœZkG dådæ„ dæeƒZlG dçdè„ dèe	ƒZmdédêdëdìdíœZnG dîdï„ dïeƒZoG dðdñ„ dñe	ƒZpG dòdó„ dóe	ƒZqG dôdõ„ dõe	ƒZrG död÷„ d÷e	ƒZsG dødù„ dùe	ƒZtG dúdû„ dûe	ƒZuG düdý„ dýe	ƒZvdþdÿ�d �d�d�d�d�d�d�d�d�d	�d
�dœZwG �d�d„ �de	ƒZxG �d�d„ �de	ƒZyG �d�d„ �de	ƒZz�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d �d!�d"œZ{�d#�d$�d%�d&�d'�d(�d)�d*�d+œZ|�d,�d-�d�d.�d/�d0�d1�d2�d3œZ}�d4�d5�d6œZ~�d,�d-�d7�d.�d/�d0�d8�d9œZ�d:�d7iZ€�d,�d-�d.�d;�d1�d<�d=�d2�d>�d?œ	Z�i Z‚�d@d«�dA�dB�dC�dD�dE�dF�dG�dH�dI�dJ�dKœZƒ�dL�d@�dMœZ„�dN�dO�dP�dQ�dR�dS�dT�dU�dV�dWœ	Z…�dX�dYiZ†�dX�dZiZ‡�d[�d\�d]œZˆ�d,�d-�d^�d<�d_�d2�d`�d>�daœZ‰i ZŠe}e�eeƒe|e~e‚e€e„e…e†e‡�dbœZ‹G �dc�dd„ �dde	ƒZŒG �de�df„ �dfe	ƒZ�G �dg�dh„ �dhe	ƒZŽG �di�dj„ �dje	ƒZ�G �dk�dl„ �dle	ƒZ�G �dm�dn„ �dne	ƒZ‘G �do�dp„ �dpe	ƒZ’G �dq�dr„ �dre	ƒZ“G �ds�dt„ �dte	ƒZ”G �du�dv„ �dve	ƒZ•eŒ�dweŽ�dxe��dye��dze��d{e‘�d|e’�d}e•�d~e“�de”�d€i
Z–G �d��d‚„ �d‚eƒZ—G �dƒ�d„„ �d„e	ƒZ˜�d…�d†„ Z™G �d‡�dˆ„ �dˆeƒZšG �d‰�dŠ„ �dŠe	ƒZ›G �d‹�dŒ„ �dŒeƒZœG �d��dŽ„ �dŽe	ƒZ�G �d��d�„ �d�eƒZžG �d‘�d’„ �d’e	ƒZŸG �d“�d”„ �d”e	ƒZ G �d•�d–„ �d–eƒZ¡G �d—�d˜„ �d˜e	ƒZ¢G �d™�dš„ �dše	ƒZ£G �d›�dœ„ �dœe	ƒZ¤dèdñdõd÷dùdûdý�d�d�d�d’�d˜�dŽ�dš�d„�d�œZ¥G �dž�dŸ„ �dŸeƒZ¦G �d �d¡„ �d¡e	ƒZ§G �d¢dw„ dweOƒZ¨�d£�d¤�d¥�d¦�d§�d¨�d©�dªœZ©i �d«�d¬�d­�d®�d¯œd3�d°�d±�d²�d³�d´�dµ�d¶�d+œd3�d·�d¸�d¹�dº�d»�d¼�d½�d¾�d¿�dÀ�dÁ�dÂœi �dÃ�dÄ�dÅ�dÆ�d¯œ�dÃ�dÇ�dÈ�dÉ�dÊ�dË�dÌ�dÍ�dÎ�dÏœ	d3�dÐ�dMœ�d+œZªG �dÑdx„ dxeOƒZ«�dÒ�dÓ�dÔœZ¬�dÕ�dÖ�d×d…œZ­�dØ�dÙ�dMœZ®�dÚa¯�dÚa°�dÛ�dÜ„ Z±G �dÝ�dÞ„ �dÞe	ƒZ²G �dß�dà„ �dàeƒZ³G �dá�dâ„ �dâe²ƒZ´G �dã�dä„ �däe²ƒZµG �då�dæ„ �dæeƒZ¶G �dç�dè„ �dèe	ƒZ·�dé�dê�dëd3�dìœZ¸G �dídz„ dzeOƒZ¹ee%eO�dî�dï� ee%eO�dî�dð� eeMei�dñ�dÚiƒ eeMe¨�dñdiƒ eeMe«�dñdiƒ eeMeP�dñ�d:iƒ eeMe¹�dñ�dòiƒ e/ º�dóe4j»¡ dS (ô  z 
BGP (Border Gateway Protocol).
é    )Úabsolute_importN)Ú	pton_ntop)ÚPacketÚPacket_metaclassÚbind_layers)ÚFieldÚBitFieldÚBitEnumFieldÚ	XBitFieldÚ	ByteFieldÚByteEnumFieldÚ
ShortFieldÚShortEnumFieldÚIntFieldÚIntEnumFieldÚ	LongFieldÚIEEEFloatFieldÚStrFieldÚStrLenFieldÚStrFixedLenFieldÚFieldLenFieldÚFieldListFieldÚPacketFieldÚPacketListFieldÚIPFieldÚ
FlagsFieldÚConditionalFieldÚMultiEnumField)ÚTCP)ÚIP6Field)ÚconfÚ	ConfClass)ÚorbÚchb)Úlog_runtimec                   @   s   e Zd ZdZdZdS )ÚBGPConfz#
    BGP module configuration.
    TN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úuse_2_bytes_asn© r+   r+   úH/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/contrib/bgp.pyr%   '   s   r%   i   é   s   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿé   é   é   c                 C   s   | d d S )zl
    Helper function that returns the numbers of bytes necessary to store the
    given number of bits.
    é   é   r+   )Zlength_in_bitsr+   r+   r,   Ú_bits_to_bytes_lenR   s    r3   c                   @   sX   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ ZdS )ÚBGPFieldIPv4z
    IPv4 Field (CIDR)
    c                 C   s   |d d S ©z(Get the IP field mask length (in bytes).r1   r2   r+   ©ÚselfÚmaskr+   r+   r,   Ú
mask2iplen`   s    zBGPFieldIPv4.mask2iplenc                 C   s   t  d|¡\}}t|ƒ|fS )z'x.x.x.x/y to "internal" representation.ú/©ÚreÚsplitÚint©r7   ÚpktÚhÚipr8   r+   r+   r,   Úh2id   s    zBGPFieldIPv4.h2ic                 C   s   |\}}|d t |ƒ S )zH"Internal" representation to "human" representation
        (x.x.x.x/y).r:   ©Ústr©r7   r@   Úir8   rB   r+   r+   r,   Úi2hi   s    zBGPFieldIPv4.i2hc                 C   s   |   ||¡S ©N©rH   ©r7   r@   rG   r+   r+   r,   Úi2repro   s    zBGPFieldIPv4.i2reprc                 C   s   |\}}|   |¡d S ©Né   ©r9   )r7   r@   rG   r8   Ú_r+   r+   r,   Úi2lenr   s    zBGPFieldIPv4.i2lenc                 C   s0   |\}}t  |¡}t d|¡|d|  |¡…  S )zJ"Internal" (IP as bytes, mask as int) to "machine"
        representation.ú>BN)ÚsocketÚ	inet_atonÚstructÚpackr9   rF   r+   r+   r,   Úi2mv   s    
zBGPFieldIPv4.i2mc                 C   s   ||   ||¡ S rI   ©rW   ©r7   r@   ÚsÚvalr+   r+   r,   Úaddfield}   s    zBGPFieldIPv4.addfieldc                 C   s6   |   t|d ƒ¡d }||d … |  ||d |… ¡fS ©Nr   rN   ©r9   r"   Úm2i©r7   r@   rZ   Úlengthr+   r+   r,   Úgetfield€   s    zBGPFieldIPv4.getfieldc                    sB   t ˆ d ƒ}|  |¡‰d ‡ ‡fdd„tdƒD ƒ¡}|t |¡fS )Nr   ó    c                 3   s.   | ]&}|ˆk r"ˆ |d  |d … ndV  qdS ©rN   r/   ó    Nr+   ©Ú.0rG   ©ÚmZmask2iplen_resr+   r,   Ú	<genexpr>‡   rc   z#BGPFieldIPv4.m2i.<locals>.<genexpr>é   )r"   r9   ÚjoinÚrangerS   Ú	inet_ntoa)r7   r@   ri   r8   rB   r+   rh   r,   r_   „   s    
zBGPFieldIPv4.m2iN©r&   r'   r(   r)   r9   rC   rH   rL   rQ   rW   r\   rb   r_   r+   r+   r+   r,   r4   [   s   r4   c                   @   sX   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ ZdS )ÚBGPFieldIPv6zIPv6 Field (CIDR)c                 C   s   |d d S r5   r+   r6   r+   r+   r,   r9   Ž   s    zBGPFieldIPv6.mask2iplenc                 C   s   t  d|¡\}}t|ƒ|fS )z%x.x.x.x/y to internal representation.r:   r;   r?   r+   r+   r,   rC   ’   s    zBGPFieldIPv6.h2ic                 C   s   |\}}|d t |ƒ S )z4"Internal" representation to "human" representation.r:   rD   rF   r+   r+   r,   rH   —   s    zBGPFieldIPv6.i2hc                 C   s   |   ||¡S rI   rJ   rK   r+   r+   r,   rL   œ   s    zBGPFieldIPv6.i2reprc                 C   s   |\}}|   |¡d S rM   rO   rF   r+   r+   r,   rQ   Ÿ   s    zBGPFieldIPv6.i2lenc                 C   s4   |\}}t  tj|¡}t d|¡|d|  |¡…  S )zB"Internal" (IP as bytes, mask as int) to "machine" representation.rR   N)r   Ú	inet_ptonrS   ÚAF_INET6rU   rV   r9   rF   r+   r+   r,   rW   £   s    zBGPFieldIPv6.i2mc                 C   s   ||   ||¡ S rI   rX   rY   r+   r+   r,   r\   ©   s    zBGPFieldIPv6.addfieldc                 C   s6   |   t|d ƒ¡d }||d … |  ||d |… ¡fS r]   r^   r`   r+   r+   r,   rb   ¬   s    zBGPFieldIPv6.getfieldc                    s>   t ˆ d ƒ‰d ‡ ‡‡fdd„tdƒD ƒ¡}ˆt tj|¡fS )Nr   rc   c                 3   s4   | ],}|ˆ  ˆ¡k r(ˆ |d  |d … ndV  qdS rd   rO   rf   ©ri   r8   r7   r+   r,   rj   ²   rc   z#BGPFieldIPv6.m2i.<locals>.<genexpr>r.   )r"   rl   rm   r   Ú	inet_ntoprS   rr   )r7   r@   ri   rB   r+   rs   r,   r_   °   s     zBGPFieldIPv6.m2iNro   r+   r+   r+   r,   rp   ‹   s   rp   c                 C   s   | t @ t kS )zN
    Used in BGPPathAttr to check if the extended-length flag is
    set.
    )Ú_BGP_PA_EXTENDED_LENGTH)Úflagsr+   r+   r,   Úhas_extended_length¶   s    rw   c                 C   s"  d}|d t | ƒk r†|d7 }t| | ƒ}||kr4dS |d d }|d| 7 }|t | ƒkr\dS |d rt| |d  ƒd|d ? @ rdS qd}|d t | ƒk �rt| | ƒ}|dkrÀt | ƒdkrÀdS ||krÌdS |d d }|d| 7 }|t | ƒkrôdS |d rŠt| |d  ƒd|d ? @ rŠdS qŠdS )	a@  
    Detect IPv4/IPv6 prefixes conform to BGP Additional Path but NOT conform
    to standard BGP..

    This is an adapted version of wireshark's detect_add_path_prefix46
    https://github.com/wireshark/wireshark/blob/ed9e958a2ed506220fdab320738f1f96a3c2ffbb/epan/dissectors/packet-bgp.c#L2905
    Kudos to them !
    r   rk   Fr1   r2   rN   éÿ   T)Úlenr"   )rZ   Úmax_bit_lengthrG   Ú
prefix_lenZaddr_lenr+   r+   r,   Údetect_add_path_prefix46¿   s8    
r|   c                   @   s(   e Zd ZdZdZeddƒgZdd„ ZdS )ÚBGPNLRI_IPv4z+
    Packet handling IPv4 NLRI fields.
    z	IPv4 NLRIÚprefixú	0.0.0.0/0c                 C   s   t jS rI   ©r    Zpadding_layer©r7   Úpayloadr+   r+   r,   Údefault_payload_classï   s    z"BGPNLRI_IPv4.default_payload_classN)r&   r'   r(   r)   Únamer4   Úfields_descrƒ   r+   r+   r+   r,   r}   è   s   r}   c                   @   s(   e Zd ZdZdZeddƒgZdd„ ZdS )ÚBGPNLRI_IPv6z+
    Packet handling IPv6 NLRI fields.
    z	IPv6 NLRIr~   ú::/0c                 C   s   t jS rI   r€   r�   r+   r+   r,   rƒ   ú   s    z"BGPNLRI_IPv6.default_payload_classN)r&   r'   r(   r)   r„   rp   r…   rƒ   r+   r+   r+   r,   r†   ó   s   r†   c                   @   s(   e Zd ZdZdZeddƒeddƒgZdS )ÚBGPNLRI_IPv4_APzC
    Packet handling IPv4 NLRI fields WITH BGP ADDITIONAL PATH
    zIPv4 NLRI (Additional Path)Únlri_path_idr   r~   r   N)r&   r'   r(   r)   r„   r   r4   r…   r+   r+   r+   r,   rˆ   þ   s
   ÿrˆ   c                   @   s(   e Zd ZdZdZeddƒeddƒgZdS )ÚBGPNLRI_IPv6_APzC
    Packet handling IPv6 NLRI fields WITH BGP ADDITIONAL PATH
    zIPv6 NLRI (Additional Path)r‰   r   r~   r‡   N)r&   r'   r(   r)   r„   r   rp   r…   r+   r+   r+   r,   rŠ     s
   ÿrŠ   c                       s4   e Zd ZdZg d¢Z‡ fdd„Z‡ fdd„Z‡  ZS )ÚBGPNLRIPacketListFieldz/
    PacketListField handling NLRI fields.
    )rz   Ú	cls_groupÚ	no_lengthc                    sP   t t| ƒj||tfi |¤Ž dttgfdttgfdœ| \| _| _	d|v| _
d S )Né    é€   )ÚIPv4ÚIPv6Úlength_from)Úsuperr‹   Ú__init__r   r}   rˆ   r†   rŠ   rz   rŒ   r�   )r7   r„   ÚdefaultZip_modeÚkwargs©Ú	__class__r+   r,   r”     s    
ÿÿ

þýzBGPNLRIPacketListField.__init__c                    s”   | j r6| t¡‰ˆdkr |g fS ˆdkr6‡fdd„| _| jrN|d |  |¡… n|}| jt|| jƒ ‰ ‡ fdd„| _tt	| ƒ 
||¡}| j r�d | _|S )Nr   éÿÿÿÿc                    s   ˆ S rI   r+   )r@   )Úindexr+   r,   Ú<lambda>(  rc   z1BGPNLRIPacketListField.getfield.<locals>.<lambda>c                     s   ˆ S rI   r+   )Úargs)Úclsr+   r,   r›   .  rc   )r�   ÚfindÚ_BGP_HEADER_MARKERr’   rŒ   r|   rz   Znext_cls_cbr“   r‹   rb   )r7   r@   rZ   ÚremainÚresr—   )r�   rš   r,   rb   "  s    

ÿzBGPNLRIPacketListField.getfield)r&   r'   r(   r)   Ú	__slots__r”   rb   Ú__classcell__r+   r+   r—   r,   r‹     s   
r‹   c                   @   s   e Zd ZdZdd„ ZdS )Ú_BGPInvalidDataExceptionz]
    Raised when it is not possible to instantiate a BGP packet with the given
    data.
    c                 C   s   t  | d| ¡ d S )Nz.Impossible to build packet from the given data)Ú	Exceptionr”   )r7   Údetailsr+   r+   r,   r”   ;  s    þz!_BGPInvalidDataException.__init__N)r&   r'   r(   r)   r”   r+   r+   r+   r,   r¤   5  s   r¤   c                 C   s   t ƒ  | |¡S )zJ
    Returns class named "name" if it exists, fallback_cls otherwise.
    )ÚglobalsÚget)r„   Zfallback_clsr+   r+   r,   Ú_get_clsB  s    r©   ÚNONEÚOPENÚUPDATEÚNOTIFICATIONÚ	KEEPALIVEúROUTE-REFRESH)r   rN   r/   r0   rk   é   ÚReservedzIP (IP version 4)zIP6 (IP version 6)ZNSAPzHDLC (8-bit multidrop)zBBN 1822z=802 (includes all 802 media plus Ethernet "canonical format")zE.163zE.164 (SMDS, Frame Relay, ATM)zF.69 (Telex)zX.121 (X.25, Frame Relay)ZIPXZ	Appletalkz	Decnet IVzBanyan Vinesz!E.164 with NSAP format subaddresszDNS (Domain Name System)zDistinguished Namez	AS NumberzXTP over IP version 4zXTP over IP version 6zXTP native mode XTPz"Fibre Channel World-Wide Port Namez"Fibre Channel World-Wide Node NameZGWIDzAFI for L2VPN informationz#MPLS-TP Section Endpoint IdentifierzMPLS-TP LSP Endpoint Identifierz&MPLS-TP Pseudowire Endpoint Identifierz"MT IP: Multi-Topology IP version 4z$MT IPv6: Multi-Topology IP version 6zEIGRP Common Service FamilyzEIGRP IPv4 Service FamilyzEIGRP IPv6 Service Familyz$LISP Canonical Address Format (LCAF)zBGP-LSz
48-bit MACz
64-bit MACZOUIzMAC/24zMAC/40zIPv6/64zRBridge Port IDzTRILL Nickname)-r   rN   r/   r0   rk   r°   é   r1   r2   é	   é
   é   é   é   é   é   r.   é   é   r-   é   é   é   é   é   é   é   é   é   é   é   i @  i@  i@  i@  i@  i@  i@  i@  i@  i	@  i
@  i@  i@  iÿÿ  zBNetwork Layer Reachability Information used for unicast forwardingzDNetwork Layer Reachability Information used for multicast forwardingz>Network Layer Reachability Information (NLRI) with MPLS Labelsz	MCAST-VPNzeNetwork Layer Reachability Information used for Dynamic Placement of        Multi-Segment PseudowireszEncapsulation SAFIz
MCAST-VPLSzTunnel SAFIz"Virtual Private LAN Service (VPLS)zBGP MDT SAFIzBGP 4over6 SAFIzBGP 6over4 SAFIz&Layer-1 VPN auto-discovery informationz	BGP EVPNsz
BGP-LS-VPNzMPLS-labeled VPN addressz9Multicast for BGP/MPLS IP Virtual Private Networks (VPNs)zRoute Target constraintz.IPv4 dissemination of flow specification rulesz/VPNv4 dissemination of flow specification ruleszVPN auto-discovery)r   rN   r/   r0   rk   r°   r²   r1   r2   é@   éA   éB   éC   éD   éE   éF   éG   éH   r�   é�   é„   é…   é†   éŒ   rx   ÚBGPOpenÚ	BGPUpdateÚBGPNotificationÚBGPKeepAliveÚBGPRouteRefresh)rN   r/   r0   rk   r°   c                   @   sR   e Zd ZdZdZedddƒeddƒedd	eƒgZ	e
dd
d„ƒZdd„ Zdd„ ZdS )Ú	BGPHeaderzA
    The header of any BGP message.
    References: RFC 4271
    ÚHEADERÚmarkerl	   ÿÿÿÿÿÿÿÿÿ r�   ry   NÚtyperk   c                 O   s   t |ƒS ©z=
        Returns the right class for the given data.
        ©Ú_bgp_dispatcher©r�   Z_pktrœ   Zkargsr+   r+   r,   Údispatch_hookÊ  s    zBGPHeader.dispatch_hookc                 C   sN   | j d u rFt |ƒ}|r"|t |ƒ }|d d… t d|¡ |dd …  }|| S )Nr.   ú!Hr»   )ry   rU   rV   ©r7   ÚpÚpayra   r+   r+   r,   Ú
post_buildÒ  s    
$zBGPHeader.post_buildc                 C   s   t t | jtj¡tjƒS rI   )r©   Ú_bgp_cls_by_typer¨   rÝ   r    Ú	raw_layerr�   r+   r+   r,   Úguess_payload_classÚ  s    zBGPHeader.guess_payload_class)N)r&   r'   r(   r)   r„   r
   r   r   Ú_bgp_message_typesr…   Úclassmethodrâ   rç   rê   r+   r+   r+   r,   rÚ   ¹  s   ý
ù
rÚ   c                 C   sb   t j}| du rtdt jƒ}nBt| ƒtkr^| dd… tkr^t| d ƒ}|dkrVtdƒ}ntdƒ}|S )z:
    Returns the right class for a given BGP message.
    NrÚ   r.   r»   rk   rØ   )r    ré   r©   ry   Ú_BGP_HEADER_SIZErŸ   r"   )r‚   r�   Zmessage_typer+   r+   r,   rà   Þ  s    ÿ
rà   c                   @   s:   e Zd ZdZdZdZdZdZdZe	ddd	„ƒZ
d
d„ ZdS )ÚBGPz5
    Every BGP message inherits from this class.
    rN   r/   r0   rk   r°   Nc                 O   s   t |ƒS rÞ   rß   rá   r+   r+   r,   râ     s    zBGP.dispatch_hookc                 C   s(   d }t |ƒdkr$|d d… tkr$t}|S )Nr¹   r.   )ry   rŸ   rÚ   )r7   rå   r�   r+   r+   r,   rê     s    zBGP.guess_payload_class)N)r&   r'   r(   r)   Z	OPEN_TYPEZUPDATE_TYPEZNOTIFICATION_TYPEZKEEPALIVE_TYPEZROUTEREFRESH_TYPErì   râ   rê   r+   r+   r+   r,   rî   ÷  s   rî   c                   @   s   e Zd ZdZdZdS )rØ   z
    KEEPALIVE message.
    r®   N©r&   r'   r(   r)   r„   r+   r+   r+   r,   rØ     s   zAuthentication (deprecated)ZCapabilities©r   rN   r/   ú"Multiprotocol Extensions for BGP-4z"Route Refresh Capability for BGP-4ú#Outbound Route Filtering Capabilityz+Multiple routes to a destination capabilityzExtended Next Hop EncodingzBGP-Extended MessageúGraceful Restart Capabilityú(Support for 4-octet AS number capabilityzDeprecated (2003-03-06)z4Support for Dynamic Capability (capability specific)zMultisession BGP CapabilityzADD-PATH Capabilityz!Enhanced Route Refresh Capabilityz-Long-Lived Graceful Restart (LLGR) CapabilityzFQDN Capabilityz*Route Refresh Capability for BGP-4 (Cisco)z+Outbound Route Filtering Capability (Cisco))r   rN   r/   r0   rk   r°   r²   rÇ   rÈ   rÉ   rÊ   rË   rÌ   rÍ   rÎ   éI   r�   é‚   ÚBGPCapMultiprotocolÚBGPCapGenericÚ	BGPCapORFÚBGPCapGracefulRestartÚBGPCapFourBytesASN)rN   r/   r0   rÇ   rÈ   rÍ   rö   c                 C   s   || |j < |S rI   )r&   )Úregistryr�   r+   r+   r,   Ú_register_clsV  s    
rý   c                 C   sJ   t d }| du rt d }n,t| ƒ}|tkrFt| d ƒ}tt |d¡ƒ}|S )z=
    Returns the right class for a given BGP capability.
    rø   Nr   )Ú_capabilities_registryry   Ú_BGP_CAPABILITY_MIN_SIZEr"   r©   Ú_capabilities_objectsr¨   )r‚   r�   ra   Úcoder+   r+   r,   Ú_bgp_capability_dispatcher^  s    
r  c                       s   e Zd Z‡ fdd„Z‡  ZS )Ú_BGPCap_metaclassc                    s$   t t| ƒ | |||¡}tt|ƒ |S rI   )r“   r  Ú__new__rý   rþ   )r�   ÚclsnameÚbasesÚattrsZnewclassr—   r+   r,   r  s  s
    
ÿ
z_BGPCap_metaclass.__new__)r&   r'   r(   r  r£   r+   r+   r—   r,   r  r  s   r  c                   @   s   e Zd ZdS )Ú_BGPCapability_metaclassN)r&   r'   r(   r+   r+   r+   r,   r  z  s   r  c                   @   s.   e Zd ZdZed	dd„ƒZdd„ Zdd„ ZdS )
ÚBGPCapabilityz!
    Generic BGP capability.
    Nc                 O   s   t |ƒS rÞ   )r  rá   r+   r+   r,   râ   ƒ  s    zBGPCapability.dispatch_hookc                 C   s8   t |ƒ}|tk r4d |¡d }|d t¡7 }t|ƒ‚|S )zK
        Check that the payload is long enough (at least 2 bytes).
        z ({}z is < _BGP_CAPABILITY_MIN_SIZE z({})).)ry   rÿ   Úformatr¤   )r7   rZ   ra   Úerrr+   r+   r,   Úpre_dissect‹  s    zBGPCapability.pre_dissectc                 C   sB   d}| j d u r:t|ƒd }|d d… t|ƒ |dd …  }|| S ©Nr   r/   rN   )ra   ry   r#   rä   r+   r+   r,   rç   –  s
    
 zBGPCapability.post_build)N)r&   r'   r(   r)   rì   râ   r  rç   r+   r+   r+   r,   r	  ~  s
   r	  c                   @   sF   e Zd ZdZdZdZeddeƒedddd	d
�e	d	ddd„ dd�gZ
dS )rø   zH
    This class provides an implementation of a generic capability.
    zBGP CapabilityTr  r   ra   NÚBZcap_data)ÚfmtÚ	length_ofÚ c                 C   s   | j S rI   ©ra   ©rå   r+   r+   r,   r›   «  rc   zBGPCapGeneric.<lambda>rx   )r’   Ú
max_length)r&   r'   r(   r)   r„   Úmatch_subclassr   Ú_capabilitiesr   r   r…   r+   r+   r+   r,   rø      s   
ÿýc                   @   sJ   e Zd ZdZdZdZeddeƒeddƒe	dd	e
ƒed
d	ƒedd	eƒgZdS )r÷   zm
    This class provides an implementation of the Multiprotocol
    capability.
    References: RFC 4760
    rñ   Tr  rN   ra   rk   Úafir   ÚreservedÚsafiN)r&   r'   r(   r)   r„   r  r   r  r   r   Úaddress_family_identifiersÚsubsequent_afisr…   r+   r+   r+   r,   r÷   ³  s   


ûúAddress Prefix ORFúCP-ORF)r   rÇ   rÈ   ZreceiveÚsendzreceive + send)rN   r/   r0   c                
   @   sl   e Zd ZdZG dd„ deƒZdZeddeƒe	ddƒe
ddeƒed	d
ddd�edg edd„ d�gZdd„ Zd
S )ÚBGPCapORFBlockzo
    The "ORFBlock" is made of <AFI, rsvd, SAFI, Number of ORFs, and
    <ORF Type, Send/Receive> entries.
    c                   @   s,   e Zd ZdZdZeddeƒeddeƒgZdS )zBGPCapORFBlock.ORFTuplezC
        Packet handling <ORF Types, Send/Receive> tuples.
        zORF TypeÚorf_typer   Zsend_receiveN)	r&   r'   r(   r)   r„   r   Ú
_orf_typesÚsend_receive_valuesr…   r+   r+   r+   r,   ÚORFTupleÝ  s
   

þr#  zORF Capability Entryr  r   r  r  Ú
orf_numberNÚentriesú!B)Zcount_ofr  c                 C   s   | j S rI   )r$  r  r+   r+   r,   r›   ø  rc   zBGPCapORFBlock.<lambda>)Z
count_fromc                 C   sD   d }| j d u r<t| jƒ}|d d… t d|¡ |dd …  }|| S )Nrk   r&  r°   )r$  ry   r%  rU   rV   )r7   rå   ræ   Úcountr+   r+   r,   rç   ü  s
    

$zBGPCapORFBlock.post_build)r&   r'   r(   r)   r   r#  r„   r   r  r   r   r  r   r   r…   rç   r+   r+   r+   r,   r  ×  s(   

üüör  c                   @   s   e Zd ZdZdd„ ZdS )ÚBGPCapORFBlockPacketListFieldz+
    Handles lists of BGPCapORFBlocks.
    c           
      C   sŒ   g }d }| j d ur|   |¡}|}|d ur4|d |… }|r„t|d ƒ}|d }|d d| … }|d| d … }|  ||¡}	| |	¡ q4||fS )Nrk   r/   r°   ©r’   r"   r_   Úappend)
r7   r@   rZ   Úlstra   r    r$  Zentries_lengthÚcurrentÚpacketr+   r+   r,   rb   	  s    

z&BGPCapORFBlockPacketListField.getfieldN©r&   r'   r(   r)   rb   r+   r+   r+   r,   r(    s   r(  c                   @   s@   e Zd ZdZdZdZeddeƒeddƒe	dg e
d	d
„ d�gZdS )rù   zx
    This class provides an implementation of the Outbound Route Filtering
    capability.
    References: RFC 5291
    rò   Tr  r0   ra   NZorfc                 C   s   | j S rI   r  r  r+   r+   r,   r›   0  rc   zBGPCapORF.<lambda>©r’   )r&   r'   r(   r)   r„   r  r   r  r   r(  r  r…   r+   r+   r+   r,   rù      s   
üýr�   z,Forwarding state preserved (0x80: F bit set)c                   @   s\   e Zd ZdZG dd„ deƒZdZdZedde	ƒe
dd	ƒed
ddƒedddƒedg eƒgZd	S )rú   zp
    This class provides an implementation of the Graceful Restart
    capability.
    References: RFC 4724
    c                   @   s6   e Zd ZdZdZeddeƒeddeƒedde	ƒgZ
dS )zBGPCapGracefulRestart.GRTuplez+Tuple <AFI, SAFI, Flags for address family>z%<AFI, SAFI, Flags for address family>r  r   r  rv   N)r&   r'   r(   r)   r„   r   r  r   r  Úgr_address_family_flagsr…   r+   r+   r+   r,   ÚGRTupleE  s   


þr1  ró   Tr  rÇ   ra   NZrestart_flagsr   rk   Zrestart_timer¶   r%  )r&   r'   r(   r)   r   r1  r„   r  r   r  r   r   r   r…   r+   r+   r+   r,   rú   >  s   



üc                   @   s6   e Zd ZdZdZdZeddeƒeddƒe	dd	ƒgZ
d
S )rû   zq
    This class provides an implementation of the 4-octet AS number
    capability.
    References: RFC 4893
    rô   Tr  rÈ   ra   rk   Úasnr   N)r&   r'   r(   r)   r„   r  r   r  r   r   r…   r+   r+   r+   r,   rû   Z  s   
þc                   @   s(   e Zd ZdZdZeddƒeddƒgZdS )ÚBGPAuthenticationInformationz¢
    Provides an implementation of the Authentication Information optional
    parameter, which is now obsolete.
    References: RFC 1771, RFC 1654, RFC 4271
    zBGP Authentication DataZauthentication_coder   Úauthentication_dataN)r&   r'   r(   r)   r„   r   r   r…   r+   r+   r+   r,   r3  l  s
   ÿr3  c                   @   s   e Zd ZdZdd„ ZdS )ÚBGPOptParamPacketListFieldzJ
    PacketListField handling the optional parameters (OPEN message).
    c           
      C   s–   g }d}| j d ur|   |¡}|}|d urB|d |… ||d …  }}|rŠt|d ƒ}|d d| … }|d| d … }|  ||¡}	| |	¡ qB|| |fS )Nr   rN   r/   r)  )
r7   r@   rZ   r+  ra   r    ÚretZ	param_lenr,  r-  r+   r+   r,   rb   ƒ  s    

z#BGPOptParamPacketListField.getfieldNr.  r+   r+   r+   r,   r5  ~  s   r5  c                   @   sZ   e Zd ZdZdZeddeƒeddƒee	dde
ƒdd	„ ƒee	d
deƒdd	„ ƒgZdd„ ZdS )ÚBGPOptParamzc
    Provides an implementation the OPEN message optional parameters.
    References: RFC 4271
    zOptional parameterÚ
param_typer/   Úparam_lengthNÚparam_valuec                 C   s
   | j dkS ©Nr/   ©r8  r  r+   r+   r,   r›   §  rc   zBGPOptParam.<lambda>r4  c                 C   s
   | j dkS rM   r<  r  r+   r+   r,   r›   ±  rc   c                 C   sŒ   d }|}| j d u r„| jd u r,| jd u r,d}nt|ƒd }|d d… t|ƒ }| jdkr`| jd ust| jdkr„| jd ur„||dd …  }|| S r  )r9  r:  r4  ry   r#   r8  )r7   rå   ræ   ra   r-  r+   r+   r,   rç   µ  s     
ÿÿÿzBGPOptParam.post_build)r&   r'   r(   r)   r„   r   Úoptional_parameter_codesr   r   r   r	  r3  r…   rç   r+   r+   r+   r,   r7  —  s,   
ýú
ýúór7  c                   @   s`   e Zd ZdZdZeddƒeddƒeddƒedd	ƒed
dddd�e	dg e
dd„ d�gZdd„ ZdS )rÕ   zb
    OPEN messages are exchanged in order to open a new BGP session.
    References: RFC 4271
    r«   Úversionrk   Zmy_asr   Z	hold_timeZbgp_idú0.0.0.0Úopt_param_lenNZ
opt_paramsr&  ©r  r  c                 C   s   | j S rI   )r@  r  r+   r+   r,   r›   à  rc   zBGPOpen.<lambda>r/  c                 C   sB   | j d u r:t|ƒd }|d d… t d|¡ |dd …  }|| S )Nr´   r³   r&  )r@  ry   rU   rV   rä   r+   r+   r,   rç   ä  s    
$zBGPOpen.post_build)r&   r'   r(   r)   r„   r   r   r   r   r5  r7  r…   rç   r+   r+   r+   r,   rÕ   Ê  s(   üüõÚORIGINZAS_PATHÚNEXT_HOPÚMULTI_EXIT_DISCÚ
LOCAL_PREFÚATOMIC_AGGREGATEÚ
AGGREGATORZ	COMMUNITYÚORIGINATOR_IDÚCLUSTER_LISTzDPA (deprecated)z#ADVERTISER  (Historic) (deprecated)z.RCID_PATH / CLUSTER_ID (Historic) (deprecated)ÚMP_REACH_NLRIÚMP_UNREACH_NLRIzEXTENDED COMMUNITIESÚAS4_PATHZAS4_AGGREGATORz*SAFI Specific Attribute (SSA) (deprecated)z Connector Attribute (deprecated)zAS_PATHLIMIT (deprecated)ZPMSI_TUNNELzTunnel Encapsulation AttributezTraffic Engineeringú(IPv6 Address Specific Extended CommunityZAIGPzPE Distinguisher Labelsz3BGP Entropy Label Capability Attribute (deprecated)zBGP-LS AttributezBGP Prefix-SIDZATTR_SETzReserved for development)!r   rN   r/   r0   rk   r°   r²   r1   r2   r³   r´   rµ   r¶   r·   r¸   r¹   r.   rº   r»   r-   r¼   r½   r¾   r¿   rÀ   rÁ   rÂ   rÃ   rÄ   rÅ   é(   r�   rx   rÇ   éÀ   )rN   r/   r0   rk   r°   r²   r1   r2   r³   r´   rµ   r¶   r·   r¸   r¹   r.   rº   r»   r-   r¼   r½   r¾   r¿   rÀ   rÁ   rÂ   rÃ   rÄ   rÅ   rN  r�   c                   @   s   e Zd ZdZdd„ ZdS )ÚBGPPathAttrPacketListFieldzH
    PacketListField handling the path attributes (UPDATE message).
    c                 C   sì   g }d}| j d ur|   |¡}d}|}|d urF|d |… ||d …  }}|ràt|d ƒ}d}t|ƒrœt d|dd… ¡d }|d d| … }	|d| d … }n,t|d ƒ}|d d| … }	|d| d … }|  ||	¡}
| |
¡ qF|| |fS )Nr   r  rã   r/   rk   r0   )r’   r"   rw   rU   Úunpackr_   r*  )r7   r@   rZ   r+  ra   r6  r    rv   Úattr_lenr,  r-  r+   r+   r,   rb   F  s*    

z#BGPPathAttrPacketListField.getfieldNr.  r+   r+   r+   r,   rP  A  s   rP  c                   @   s*   e Zd ZdZdZeddddddœƒgZd	S )
ÚBGPPAOriginzN
    Packet handling the ORIGIN attribute value.
    References: RFC 4271
    rB  Úoriginr   ZIGPZEGPZ
INCOMPLETErð   N)r&   r'   r(   r)   r„   r   r…   r+   r+   r+   r,   rS  j  s   ÿrS  ÚAS_SETÚAS_SEQUENCEZAS_CONFED_SEQUENCEZAS_CONFED_SET)rN   r/   r0   rk   c                   @   s   e Zd ZdZdd„ ZdS )ÚASPathSegmentPacketListFieldz4
    PacketListField handling AS_PATH segments.
    c                 C   s�   g }|}|rˆt |d ƒ}tjrH|d d|d  … }|d|d  d … }n(|d d|d  … }|d|d  d … }|  ||¡}| |¡ q||fS )NrN   r/   rk   )r"   Úbgp_module_confr*   r_   r*  )r7   r@   rZ   r+  r    Úsegment_lengthr,  r-  r+   r+   r,   rb   Š  s    z%ASPathSegmentPacketListField.getfieldNr.  r+   r+   r+   r,   rW  …  s   rW  c                   @   s6   e Zd ZdZdZG dd„ deƒZdZedg eƒgZ	dS )ÚBGPPAASPathz~
    Packet handling the AS_PATH attribute value (2 bytes ASNs, for old
    speakers).
    References: RFC 4271, RFC 5065
    i [  c                   @   s>   e Zd ZdZeddeƒeddƒedg eddƒƒgZ	d	d
„ Z
dS )zBGPPAASPath.ASPathSegmentzT
        Provides an implementation for AS_PATH segments with 2 bytes ASNs.
        Úsegment_typer/   rY  NÚsegment_valuer2  r   c                 C   s@   | j }|d u r8t| jƒ}|d d… t|ƒ |dd …  }|| S ©NrN   r/   ©rY  ry   r\  r#   ©r7   rå   ræ   Zsegment_lenr+   r+   r,   rç   ´  s
    
 z$BGPPAASPath.ASPathSegment.post_build)r&   r'   r(   r)   r   Úas_path_segment_typesr   r   r   r…   rç   r+   r+   r+   r,   ÚASPathSegment©  s   
ýra  zAS_PATH (RFC 4271)ÚsegmentsN)
r&   r'   r(   r)   ZAS_TRANSr   ra  r„   rW  r…   r+   r+   r+   r,   rZ     s   
ÿrZ  c                   @   s2   e Zd ZdZG dd„ deƒZdZedg eƒgZdS )ÚBGPPAAS4BytesPathz•
    Packet handling the AS_PATH attribute value (4 bytes ASNs, for new
    speakers -> ASNs are encoded as IntFields).
    References: RFC 4893
    c                   @   s>   e Zd ZdZeddeƒeddƒedg eddƒƒgZ	d	d
„ Z
dS )zBGPPAAS4BytesPath.ASPathSegmentzT
        Provides an implementation for AS_PATH segments with 4 bytes ASNs.
        r[  r/   rY  Nr\  r2  r   c                 C   s@   | j }|d u r8t| jƒ}|d d… t|ƒ |dd …  }|| S r]  r^  r_  r+   r+   r,   rç   Ñ  s
    
 z*BGPPAAS4BytesPath.ASPathSegment.post_build)r&   r'   r(   r)   r   r`  r   r   r   r…   rç   r+   r+   r+   r,   ra  È  s   
þra  zAS_PATH (RFC 4893)rb  N)	r&   r'   r(   r)   r   ra  r„   rW  r…   r+   r+   r+   r,   rc  Á  s
   
ÿrc  c                   @   s    e Zd ZdZdZeddƒgZdS )ÚBGPPANextHopzP
    Packet handling the NEXT_HOP attribute value.
    References: RFC 4271
    rC  Znext_hopr?  N©r&   r'   r(   r)   r„   r   r…   r+   r+   r+   r,   rd  â  s   rd  c                   @   s    e Zd ZdZdZeddƒgZdS )ÚBGPPAMultiExitDisczW
    Packet handling the MULTI_EXIT_DISC attribute value.
    References: RFC 4271
    rD  Zmedr   N©r&   r'   r(   r)   r„   r   r…   r+   r+   r+   r,   rf  ð  s   rf  c                   @   s    e Zd ZdZdZeddƒgZdS )ÚBGPPALocalPrefzR
    Packet handling the LOCAL_PREF attribute value.
    References: RFC 4271
    rE  Z
local_prefr   Nrg  r+   r+   r+   r,   rh  þ  s   rh  c                   @   s   e Zd ZdZdZdS )ÚBGPPAAtomicAggregatezX
    Packet handling the ATOMIC_AGGREGATE attribute value.
    References: RFC 4271
    rF  Nrï   r+   r+   r+   r,   ri    s   ri  c                   @   s(   e Zd ZdZdZeddƒeddƒgZdS )ÚBGPPAAggregatorzR
    Packet handling the AGGREGATOR attribute value.
    References: RFC 4271
    rG  Úaggregator_asnr   Úspeaker_addressr?  N)r&   r'   r(   r)   r„   r   r   r…   r+   r+   r+   r,   rj    s
   ÿrj  Z	NO_EXPORTZNO_ADVERTISEZNO_EXPORT_SUBCONFEDZNOPEERzplanned-shutz
ACCEPT-OWNZROUTE_FILTER_TRANSLATED_v4ZROUTE_FILTER_v4ZROUTE_FILTER_TRANSLATED_v6ZROUTE_FILTER_v6Z
LLGR_STALEZNO_LLGRzaccept-own-nexthop)l   ÿ l   ÿ l   ÿ l   ÿ l     þ l    þ l    þ l    þ l    þ l    þ l    þ l    þ l    þ c                   @   s"   e Zd ZdZdZeddeƒgZdS )ÚBGPPACommunityzS
    Packet handling the COMMUNITIES attribute value.
    References: RFC 1997
    ZCOMMUNITIESZ	communityr   N)r&   r'   r(   r)   r„   r   Úwell_known_communitiesr…   r+   r+   r+   r,   rm  :  s   rm  c                   @   s    e Zd ZdZdZeddƒgZdS )ÚBGPPAOriginatorIDzU
    Packet handling the ORIGINATOR_ID attribute value.
    References: RFC 4456
    rH  Zoriginator_idr?  Nre  r+   r+   r+   r,   ro  H  s   ro  c                   @   s(   e Zd ZdZdZedg eddƒƒgZdS )ÚBGPPAClusterListzT
    Packet handling the CLUSTER_LIST attribute value.
    References: RFC 4456
    rI  Zcluster_listZ
cluster_idr   N)r&   r'   r(   r)   r„   r   r   r…   r+   r+   r+   r,   rp  V  s   ÿrp  z3Transitive Two-Octet AS-Specific Extended Communityz3Transitive IPv4-Address-Specific Extended Communityz4Transitive Four-Octet AS-Specific Extended Communityz$Transitive Opaque Extended CommunityzQoS MarkingzCoS CapabilityZEVPNZ
Unassignedz(Flow spec redirect/mirror to IP next-hopz7Non-Transitive Two-Octet AS-Specific Extended Communityz7Non-Transitive IPv4-Address-Specific Extended Communityz8Non-Transitive Four-Octet AS-Specific Extended Communityz(Non-Transitive Opaque Extended Communityz6Generic Transitive Experimental Use Extended Communityz=Generic Transitive Experimental Use Extended Community Part 2z=Generic Transitive Experimental Use Extended Community Part 3)r   rN   r/   r0   rk   r°   r²   r1   r2   rÇ   rÈ   rÉ   rÊ   rË   r�   rÐ   rö   zMAC Mobilityz	ESI LabelzES-Import Route Targetz$EVPN Router"s MAC Extended CommunityzLayer 2 Extended CommunityzE-TREE Extended CommunityzDF Election Extended CommunityzI-SID Extended Community)r   rN   r/   r0   rk   r°   r²   r1   zRoute TargetzRoute OriginzOSPF Domain IdentifierzBGP Data Collectionz	Source ASzL2VPN IdentifierzCisco VPN-Distinguisher)r/   r0   rk   r°   r2   r³   r´   r.   z!Link Bandwidth Extended Communityz-Virtual-Network Identifier Extended Community)rk   r�   ÚGenericzCisco VPN Identifier)r/   r0   rk   r°   r2   r³   r.   rk   zOSPF Route IDzVRF Route ImportzFlow-spec Redirect to IPv4z"Inter-Area P2MP Segmented Next-Hop)	r/   r0   r°   r1   r´   rµ   r¶   r.   r»   zCost Communityz"Extranet Source Extended Communityz&Extranet Separation Extended CommunityzOSPF Route Typez&Additional PMSI Tunnel Attribute FlagszColor Extended Communityz Encapsulation Extended CommunityzDefault Gatewayz)Point-to-Point-to-Multipoint (PPMP) LabelzRoute-Target RecordzConsistent Hash Sort Order)rN   r0   rk   r°   r²   r1   rµ   r¶   r·   r¸   r-   r¼   zBGP Origin Validation State)r   rN   zOSPF Route Type (deprecated)zOSPF Router ID (deprecated)z#OSPF Domain Identifier (deprecated)zFlow spec traffic-ratezFlow spec traffic-actionz"Flow spec redirect AS-2byte formatzFlow spec traffic-remarkingzLayer2 Info Extended CommunityzE-Tree Info)	r   rN   r°   r²   r1   r2   r³   r´   rµ   r2   zFlow spec redirect IPv4 formatz"Flow spec redirect AS-4byte formatzTerminal ActionZSample)é/   é.   z$OSPFv3 Route Attributes (DEPRECATED)zFlow-spec Redirect to IPv6zUUID-based Route Target)r/   r0   rk   rµ   r¶   r.   rº   r»   )r   rN   r/   r0   r²   rÇ   rÈ   rÉ   rÊ   r�   rÐ   rö   c                   @   s(   e Zd ZdZdZeddƒeddƒgZdS )ÚBGPPAExtCommTwoOctetASSpecificzt
    Packet handling the Two-Octet AS Specific Extended Community attribute
    value.
    References: RFC 4360
    z(Two-Octet AS Specific Extended CommunityÚglobal_administratorr   Úlocal_administratorN©r&   r'   r(   r)   r„   r   r   r…   r+   r+   r+   r,   rt    s   ÿrt  c                   @   s(   e Zd ZdZdZeddƒeddƒgZdS )ÚBGPPAExtCommFourOctetASSpecificzu
    Packet handling the Four-Octet AS Specific Extended Community
    attribute value.
    References: RFC 5668
    z)Four-Octet AS Specific Extended Communityru  r   rv  N©r&   r'   r(   r)   r„   r   r   r…   r+   r+   r+   r,   rx  !  s   ÿrx  c                   @   s(   e Zd ZdZdZeddƒeddƒgZdS )ÚBGPPAExtCommIPv4AddressSpecificzt
    Packet handling the IPv4 Address Specific Extended Community attribute
    value.
    References: RFC 4360
    z(IPv4 Address Specific Extended Communityru  r   rv  Nry  r+   r+   r+   r,   rz  -  s   ÿrz  c                   @   s$   e Zd ZdZdZedddd�gZdS )ÚBGPPAExtCommOpaqueza
    Packet handling the Opaque Extended Community attribute value.
    References: RFC 4360
    zOpaque Extended CommunityÚvaluer  r²   r  N)r&   r'   r(   r)   r„   r   r…   r+   r+   r+   r,   r{  9  s   r{  c                   @   s(   e Zd ZdZdZeddƒeddƒgZdS )ÚBGPPAExtCommTrafficRatezd
    Packet handling the (FlowSpec) "traffic-rate" extended community.
    References: RFC 5575
    z(FlowSpec traffic-rate extended communityÚidr   ZrateN)r&   r'   r(   r)   r„   r   r   r…   r+   r+   r+   r,   r}  G  s
   þr}  c                   @   s6   e Zd ZdZdZedddƒedddƒedddƒgZd	S )
ÚBGPPAExtCommTrafficActionzf
    Packet handling the (FlowSpec) "traffic-action" extended community.
    References: RFC 5575
    z*FlowSpec traffic-action extended communityr  r   rs  ÚsamplerN   Zterminal_actionN)r&   r'   r(   r)   r„   r   r…   r+   r+   r+   r,   r  T  s   


ýr  c                   @   s(   e Zd ZdZdZeddƒeddƒgZdS )ÚBGPPAExtCommRedirectAS2Bytezx
    Packet handling the (FlowSpec) "redirect AS-2byte" extended community
    (RFC 7674).
    References: RFC 7674
    z-FlowSpec redirect AS-2byte extended communityr2  r   r|  Nrw  r+   r+   r+   r,   r�  b  s
   þr�  c                   @   s(   e Zd ZdZdZeddƒeddƒgZdS )ÚBGPPAExtCommRedirectIPv4zu
    Packet handling the (FlowSpec) "redirect IPv4" extended community.
    (RFC 7674).
    References: RFC 7674
    z)FlowSpec redirect IPv4 extended communityÚip_addrr   r|  Nry  r+   r+   r+   r,   r‚  p  s
   þr‚  c                   @   s(   e Zd ZdZdZeddƒeddƒgZdS )ÚBGPPAExtCommRedirectAS4Bytezy
    Packet handling the (FlowSpec) "redirect AS-4byte" extended community.
    (RFC 7674).
    References: RFC 7674
    z-FlowSpec redirect AS-4byte extended communityr2  r   r|  Nry  r+   r+   r+   r,   r„  ~  s
   þr„  c                   @   s$   e Zd ZdZdZedddeƒgZdS )ÚBGPPAExtCommTrafficMarkingzg
    Packet handling the (FlowSpec) "traffic-marking" extended community.
    References: RFC 5575
    z+FlowSpec traffic-marking extended communityZdscpé0   N)r&   r'   r(   r)   r„   r	   Ú_ext_comm_traffic_action_fieldsr…   r+   r+   r+   r,   r…  Œ  s   ÿr…  ©r   r   )rN   r   )r/   r   )r0   r   )r�   r²   )r�   r1   )r�   r2   )r�   r³   )rÐ   r2   )rö   r2   c                   @   s(   e Zd ZdZdgZd	dd„Zdd„ ZdS )
Ú_ExtCommValuePacketFieldzB
    PacketField handling Extended Communities "value parts".
    Ú	type_fromrˆ  c                 C   s   t  | |||¡ || _d S rI   )r   r”   rŠ  )r7   r„   r•   r�   rŠ  r+   r+   r,   r”   ­  s    z!_ExtCommValuePacketField.__init__c                 C   s  d }|   |¡\}}|dks"|dkr,t|ƒ}nÜ|dks<|dkrFt|ƒ}nÂ|dksV|dkr`t|ƒ}n¨|dksp|dkrzt|ƒ}nŽ|d	krÊ|d
kr”t|ƒ}n4|dkr¦t|ƒ}n"|dkr¸t|ƒ}n|dkrÈt|ƒ}n>|dkrä|dkrât	|ƒ}n$|dkrþ|dkrüt
|ƒ}n
t |¡}|S )Nr   rÇ   rN   rÈ   r/   rÉ   r0   rÊ   r�   r²   r1   r2   r³   rÐ   rö   )rŠ  rt  rz  rx  r{  r}  r  r�  r…  r‚  r„  r    ré   )r7   r@   ri   r6  Ú	type_highÚtype_lowr+   r+   r,   r_   ±  s6    










z_ExtCommValuePacketField.m2iN)rˆ  )r&   r'   r(   r)   r¢   r”   r_   r+   r+   r+   r,   r‰  ¦  s   
r‰  c                   @   s(   e Zd ZdZdZeddƒeddƒgZdS )ÚBGPPAIPv6AddressSpecificExtCommzô
    Provides an implementation of the IPv6 Address Specific Extended
    Community attribute. This attribute is not defined using the existing
    BGP Extended Community attribute (see the RFC 5701 excerpt below).
    References: RFC 5701
    rM  ru  ú::rv  r   N)r&   r'   r(   r)   r„   r   r   r…   r+   r+   r+   r,   r�  à  s   ÿr�  c                 C   s   t  | i ¡S )zÀ
    Returns a ByteEnumField with the right sub-types dict for a given community.  # noqa: E501
    http://www.iana.org/assignments/bgp-extended-communities/bgp-extended-communities.xhtml
    )Ú_ext_comm_subtypes_classesr¨   )r‹  r+   r+   r,   Ú_get_ext_comm_subtypeí  s    r�  c                   @   s(   e Zd ZdZdgZddd„Zdd„ ZdS )	Ú_TypeLowFieldzG
    Field used to retrieve "dynamically" the right sub-type dict.
    Ú	enum_fromNc                 C   s   t j| ||d� || _d S )N©r„   r•   )r   r”   r’  )r7   r„   r•   r’  r+   r+   r,   r”   ý  s    z_TypeLowField.__init__c                 C   s   |   |¡}| ||¡S rI   )r’  r¨   )r7   r@   rG   Úenumr+   r+   r,   rL     s    
z_TypeLowField.i2repr)N)r&   r'   r(   r)   r¢   r”   rL   r+   r+   r+   r,   r‘  ö  s   
r‘  c                   @   sL   e Zd ZdZdZeddeƒedddd„ d	�ed
de	dd„ d�gZ
dd„ ZdS )ÚBGPPAExtCommunityzd
    Provides an implementation of the Extended Communities attribute.
    References: RFC 4360
    ZEXTENDED_COMMUNITYr‹  r   rŒ  Nc                 C   s
   t | jƒS rI   )r�  r‹  ©Úxr+   r+   r,   r›     rc   zBGPPAExtCommunity.<lambda>)r’  r|  c                 C   s   | j | jfS rI   )r‹  rŒ  r–  r+   r+   r,   r›     rc   )rŠ  c                 C   sb   | j d u r|d d… }| jd u rZ| j d urZt | j jd¡\}}t|ƒt|ƒ |dd …  }|| S )Nr/   rˆ  )r|  rŒ  Ú_ext_high_low_dictr¨   r˜   r#   )r7   rå   ræ   ÚhighÚlowr+   r+   r,   rç     s    
zBGPPAExtCommunity.post_build)r&   r'   r(   r)   r„   r   Ú_ext_comm_typesr‘  r‰  r   r…   rç   r+   r+   r+   r,   r•    s    
ýüùr•  c                   @   s   e Zd ZdZdd„ ZdS )Ú_ExtCommsPacketListFieldzB
    PacketListField handling a list of extended communities.
    c                 C   sT   g }t |ƒ}|d |… }|rL|d d… }|dd … }|  ||¡}| |¡ q||fS )Nr2   )ry   r_   r*  )r7   r@   rZ   r+  ra   r    r,  r-  r+   r+   r,   rb   *  s    z!_ExtCommsPacketListField.getfieldNr.  r+   r+   r+   r,   rœ  %  s   rœ  c                   @   s"   e Zd ZdZdZedg eƒgZdS )ÚBGPPAExtCommsz<
    Packet handling the multiple extended communities.
    ZEXTENDED_COMMUNITIESZextended_communitiesN)r&   r'   r(   r)   r„   rœ  r•  r…   r+   r+   r+   r,   r�  8  s   ýÿr�  c                   @   s   e Zd ZdZdd„ ZdS )ÚMPReachNLRIPacketListFieldzµ
    PacketListField handling the AFI specific part (except for the length of
    Next Hop Network Address field, which is not AFI specific) of the
    MP_REACH_NLRI attribute.
    c           	      C   sx   g }|}|j dkrp|jdkrp|rpt|d ƒ}|d d }|d |d … }||d d … }|  ||¡}| |¡ q||fS )Nr/   rN   r   r1   r2   )r  r  r"   r_   r*  )	r7   r@   rZ   r+  r    r8   Zlength_in_bytesr,  r~   r+   r+   r,   rb   N  s    

z#MPReachNLRIPacketListField.getfieldNr.  r+   r+   r+   r,   rž  G  s   rž  c                   @   s–   e Zd ZdZdZeddeƒeddeƒe	ddƒe
eddƒd	d
„ ƒe
eddƒdd
„ ƒe
eddƒdd
„ ƒe
eddƒdd
„ ƒe	ddƒedg eƒg	Zdd„ ZdS )ÚBGPPAMPReachNLRIzk
    Packet handling the MP_REACH_NLRI attribute value, for non IPv6
    AFI.
    References: RFC 4760
    rJ  r  r   r  Únh_addr_lenZ
nh_v4_addrr?  c                 C   s   | j dko| jdkS )NrN   rk   ©r  r   r–  r+   r+   r,   r›   n  rc   zBGPPAMPReachNLRI.<lambda>Z
nh_v6_addrrŽ  c                 C   s   | j dko| jdkS )Nr/   r.   r¡  r–  r+   r+   r,   r›   p  rc   Znh_v6_globalc                 C   s   | j dko| jdkS ©Nr/   rŽ   r¡  r–  r+   r+   r,   r›   r  rc   Znh_v6_link_localc                 C   s   | j dko| jdkS r¢  r¡  r–  r+   r+   r,   r›   t  rc   r  Únlric                 C   s   | j d u r|d d… }|| S ©Nr0   )r£  ©r7   rå   ræ   r+   r+   r,   rç   x  s    
zBGPPAMPReachNLRI.post_buildN)r&   r'   r(   r)   r„   r   r  r   r  r   r   r   r   rž  r†   r…   rç   r+   r+   r+   r,   rŸ  a  s*   


ÿ
ÿ
ÿ
ÿ
órŸ  c                   @   s"   e Zd ZdZdZedg dƒgZdS )ÚBGPPAMPUnreachNLRI_IPv6zL
    Packet handling the MP_UNREACH_NLRI attribute value, for IPv6 AFI.
    zMP_UNREACH_NLRI (IPv6 NLRI)Úwithdrawn_routesr‘   N)r&   r'   r(   r)   r„   r‹   r…   r+   r+   r+   r,   r¦  ƒ  s   r¦  c                   @   s   e Zd ZdZdd„ ZdS )ÚMPUnreachNLRIPacketFieldzZ
    PacketField handling the AFI specific part of the MP_UNREACH_NLRI
    attribute.
    c                 C   s&   d }|j dkrt|ƒ}n
t |¡}|S r;  )r  r¦  r    ré   ©r7   r@   ri   r6  r+   r+   r,   r_   ’  s
    


zMPUnreachNLRIPacketField.m2iN©r&   r'   r(   r)   r_   r+   r+   r+   r,   r¨  Œ  s   r¨  c                   @   s>   e Zd ZdZdZeddeƒeddeƒe	dde
ƒgZdd	„ ZdS )
ÚBGPPAMPUnreachNLRIzm
    Packet handling the MP_UNREACH_NLRI attribute value, for non IPv6
    AFI.
    References: RFC 4760
    rK  r  r   r  Úafi_safi_specificNc                 C   s   | j d u r|d d… }|| S r¤  )r¬  r¥  r+   r+   r,   rç   ©  s    
zBGPPAMPUnreachNLRI.post_build)r&   r'   r(   r)   r„   r   r  r   r  r¨  r   r…   rç   r+   r+   r+   r,   r«  �  s   


þr«  c                   @   sH   e Zd ZdZdZedddddœƒedd	ƒed
g eddƒƒgZ	dd„ Z
d	S )ÚBGPPAAS4Pathze
    Provides an implementation of the AS4_PATH attribute "value part".
    References: RFC 4893
    rL  r[  r/   rU  rV  ©rN   r/   rY  Nr\  r2  r   c                 C   s<   | j d u r4t| jƒ}|d d… t|ƒ |dd …  }|| S r]  r^  r_  r+   r+   r,   rç   Å  s    

 zBGPPAAS4Path.post_build)r&   r'   r(   r)   r„   r   r   r   r   r…   rç   r+   r+   r+   r,   r­  ´  s   ýù
r­  c                   @   s(   e Zd ZdZdZeddƒeddƒgZdS )ÚBGPPAAS4Aggregatorzo
    Provides an implementation of the AS4_AGGREGATOR attribute
    "value part".
    References: RFC 4893
    zAS4_AGGREGATOR rk  r   rl  r?  N)r&   r'   r(   r)   r„   r   r   r…   r+   r+   r+   r,   r¯  Ñ  s
   ÿr¯  )rN   r/   r0   rk   r°   r²   r1   r2   r³   r´   r¸   r¹   r.   rº   rÁ   c                   @   s   e Zd ZdZdd„ ZdS )Ú_PathAttrPacketFieldz:
    PacketField handling path attribute value parts.
    c                 C   s”   d }|j }|dks|dkr&t |¡}nj|dkr6|dksV|dkrF|dksV|dkrb|dkrbt |¡}n.|d	krztjszt|ƒ}ntt |tj¡ƒ|ƒ}|S )
Nr   rx   rÆ   é'   é)   é   rÐ   éþ   r/   )	Ú	type_coder    ré   rX  r*   rc  r©   Ú_path_attr_objectsr¨   )r7   r@   ri   r6  rµ  r+   r+   r,   r_   õ  s,    ÿÿþþ
ÿÿz_PathAttrPacketField.m2iNrª  r+   r+   r+   r,   r°  ð  s   r°  c                   @   sh   e Zd ZdZd Zedddg d¢ƒeddeƒee	dd	ƒd
d„ ƒee
dd	ƒdd„ ƒedd	eƒgZdd„ Zd	S )ÚBGPPathAttrzU
    Provides an implementation of the path attributes.
    References: RFC 4271
    Ú
type_flagsr�   r2   )ZNA0ZNA1ZNA2ZNA3zExtended-LengthZPartialZ
TransitiveÚOptionalrµ  r   Zattr_ext_lenNc                 C   s   | j d uot| j ƒS rI   ©r¸  rw   r–  r+   r+   r,   r›   !  s   
zBGPPathAttr.<lambda>rR  c                 C   s   | j d uot| j ƒ S rI   rº  r–  r+   r+   r,   r›   &  s   
ÿÚ	attributec                 C   sF  d }d }d }d}| j d u r@| jtv r2t | j¡}nd}t|ƒ}n
t| j ƒ}|d u r`|d d… }nt d|¡|d  }| jd u r¬| jd u rŽd}n|r t	|ƒd }nt	|ƒd }|d u rØ|rÊ||dd…  }qþ||d  }n&|rî|t d	|¡ }n|t d|¡ }|�r"| jd u�r>||dd …  }n| jd u�r>||dd …  }|| S )
NFr�   r/   r&  rN   r   rk   r0   rã   )
r¸  rµ  Úattributes_flagsr¨   rw   rU   rV   rR  r»  ry   )r7   rå   ræ   Zflags_valuera   r-  Zextended_lengthr+   r+   r,   rç   ,  s@    





zBGPPathAttr.post_build)r&   r'   r(   r)   r„   r   r   Úpath_attributesr   r   r   r°  r   r…   rç   r+   r+   r+   r,   r·    s   

þþ
êr·  c                	   @   sj   e Zd ZdZdZeddddd�edg dd	d
„ d�eddddd�edg edd
„ d�edg dƒgZ	dd„ Z
dS )rÖ   zR
    UPDATE messages allow peers to exchange routes.
    References: RFC 4271
    r¬   Úwithdrawn_routes_lenNr§  rã   rA  r�   c                 C   s   | j S rI   )r¾  r  r+   r+   r,   r›   |  rc   zBGPUpdate.<lambda>r/  Úpath_attr_lenÚ	path_attrc                 C   s   | j S rI   )r¿  r  r+   r+   r,   r›   ˆ  rc   r£  c                 C   s    dd„ }d}| j d u rLtt|| jƒƒ}|d d… t d|¡ |dd …  }n| j }| jd u r˜tt|| jƒƒ}|d d| … t d|¡ |d| d …  }|| S )Nc                 S   s   t | ƒS rI   )ry   r  r+   r+   r,   r›   Ž  rc   z&BGPUpdate.post_build.<locals>.<lambda>r  r   rã   r/   rk   )r¾  ÚsumÚmapr§  rU   rV   r¿  rÀ  )r7   rå   ræ   Z
subpacklenr-  Zwlra   r+   r+   r,   rç   �  s    
&
,zBGPUpdate.post_build)r&   r'   r(   r)   r„   r   r‹   rP  r·  r…   rç   r+   r+   r+   r,   rÖ   j  s:   üüüü
çzMessage Header ErrorzOPEN Message ErrorzUPDATE Message ErrorzHold Timer ExpiredzFinite State Machine ErrorZCeasezROUTE-REFRESH Message Error)rN   r/   r0   rk   r°   r²   r1   Z
UnspecificzConnection Not SynchronizedzBad Message LengthzBad Message Type)r   rN   r/   r0   zUnsupported Version NumberzBad Peer ASzBad BGP IdentifierzUnsupported Optional Parameterz.Authentication Failure - Deprecated (RFC 4271)zUnacceptable Hold TimezUnsupported CapabilityzMalformed Attribute Listz!Unrecognized Well-known AttributezMissing Well-known AttributezAttribute Flags ErrorzAttribute Length ErrorzInvalid ORIGIN Attributez'AS Routing Loop - Deprecated (RFC 4271)zInvalid NEXT_HOP AttributezOptional Attribute ErrorzInvalid Network FieldzMalformed AS_PATH)r   rN   r/   r0   rk   r°   r²   r1   r2   r³   r´   rµ   zUnspecified Errorz,Receive Unexpected Message in OpenSent Statez/Receive Unexpected Message in OpenConfirm Statez/Receive Unexpected Message in Established Statez"Maximum Number of Prefixes ReachedzAdministrative ShutdownzPeer De-configuredzAdministrative ResetzConnection RejectedzOther Configuration ChangezConnection Collision ResolutionzOut of Resources)	r   rN   r/   r0   rk   r°   r²   r1   r2   zInvalid Message Lengthc                   @   s@   e Zd ZdZdZeddeƒeddedd„ dd	�e	d
dd�gZ
dS )r×   zK
    NOTIFICATION messages end a BGP session.
    References: RFC 4271
    r­   Ú
error_coder   Zerror_subcodec                 C   s   | j S rI   )rÃ  r  r+   r+   r,   r›   	  rc   zBGPNotification.<lambda>r  )Z
depends_onr  ÚdataNr“  )r&   r'   r(   r)   r„   r   Ú_error_codesr   Ú_error_subcodesr   r…   r+   r+   r+   r,   r×   ÿ  s   
û
÷Z	IMMEDIATEZDEFERr®  ZADDZREMOVEz
REMOVE-ALLZPERMITZDENYrN   c                 C   s   | a |adS )zM
    Helper function that sets the afi / safi values
    of ORP entries.
    N)Ú_orf_entry_afiÚ_orf_entry_safi©r  r  r+   r+   r,   Ú_update_orf_afi_safi.	  s    	rÊ  c                       sZ   e Zd ZdZddgZdZedddeƒeddd	eƒe	d
ddƒe
ddƒgZ‡ fdd„Z‡  ZS )ÚBGPORFEntryzN
    Provides an implementation of an ORF entry.
    References: RFC 5291
    r  r  z	ORF entryÚactionr   r/   ÚmatchrN   r  r°   r|  r  c                    s6   |  dd¡| _|  dd¡| _tt| ƒj|i |¤Ž d S )Nr  rN   r  )Úpopr  r  r“   rË  r”   )r7   rœ   r–   r—   r+   r,   r”   I	  s    zBGPORFEntry.__init__)r&   r'   r(   r)   r¢   r„   r	   Ú_orf_actionsÚ
_orf_matchr   r   r…   r”   r£   r+   r+   r—   r,   rË  ;	  s   
ürË  c                   @   s   e Zd ZdZdd„ ZdS )Ú_ORFNLRIPacketFieldz,
    PacketField handling the ORF NLRI.
    c                 C   s:   d }|j dkrt|ƒ}n|j dkr,t|ƒ}n
t |¡}|S r]  )r  r}   r†   r    ré   r©  r+   r+   r,   r_   T	  s    




z_ORFNLRIPacketField.m2iNrª  r+   r+   r+   r,   rÑ  O	  s   rÑ  c                
   @   s\   e Zd ZdZdZedddeƒedddeƒeddd	ƒe	d
dƒe
ddƒe
ddƒeddeƒgZdS )ÚBGPORFAddressPrefixzJ
    Provides an implementation of the Address Prefix ORF (RFC 5292).
    r  rÌ  r   r/   rÍ  rN   r  r°   ÚsequenceÚmin_lenÚmax_lenr~   r  N)r&   r'   r(   r)   r„   r	   rÏ  rÐ  r   r   r   rÑ  r   r…   r+   r+   r+   r,   rÒ  e	  s   

ùrÒ  c                   @   st   e Zd ZdZdZedddeƒed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ƒg
ZdS )ÚBGPORFCoveringPrefixz>
    Provides an implementation of the CP-ORF (RFC 7543).
    r  rÌ  r   r/   rÍ  rN   r  r°   rÓ  rÔ  rÕ  ÚrtZ	import_rtÚ
route_typeZ	host_addrN)r&   r'   r(   r)   r„   r	   rÏ  rÐ  r   r   r   r   r   r   r…   r+   r+   r+   r,   rÖ  u	  s   

örÖ  c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚBGPORFEntryPacketListFieldz3
    PacketListField handling the ORF entries.
    c                 C   sv   d }t |jtƒr"|jj}|jj}nd}d}|jdks>|jdkrNt|||d�}n$|jdkrht|||d�}n
t 	|¡}|S )NrN   rÇ   r�   rÉ  rÈ   )
Ú
isinstanceÚ
underlayerrÙ   r  r  r   rÒ  rÖ  r    ré   )r7   r@   ri   r6  r  r  r+   r+   r,   r_   �	  s    


zBGPORFEntryPacketListField.m2ic                 C   s  g }d}d}| j d ur |   |¡}|}|dkr4|g fS |d urV|d |… ||d …  }}|�r|}|jdkst|jdkrŽtt|d ƒƒ}d| }nR|jdkrà|jdkr¨d	}n8|jd
kr¸d}n(|jdkràt|d ƒ}	|	d
krÜd}nd}|d |… }
||d … }|  ||
¡}| |¡ qV|| |fS )Nr   rc   rÇ   r�   r²   r2   rÈ   rN   rÃ   r/   r±  rÁ   r¾   rÅ   r¿   )r’   r   r3   r"   r  r_   r*  )r7   r@   rZ   r+  ra   r6  r    Úorf_lenr{   rØ  r,  r-  r+   r+   r,   rb   £	  s@    


ÿ




z#BGPORFEntryPacketListField.getfieldN)r&   r'   r(   r)   r_   rb   r+   r+   r+   r,   rÙ  ˆ	  s   rÙ  c                	   @   sL   e Zd ZdZdZeddeƒeddeƒedddd	d
�e	dg e
dd„ d�gZdS )ÚBGPORFz`
    Provides an implementation of ORFs carried in the RR message.
    References: RFC 5291
    ZORFZwhen_to_refreshr   r   rÜ  Nr%  rã   rA  c                 C   s   | j S rI   )rÜ  r  r+   r+   r,   r›   ï	  rc   zBGPORF.<lambda>r/  )r&   r'   r(   r)   r„   r   Ú_orf_when_to_refreshr!  r   rÙ  r   r…   r+   r+   r+   r,   rÝ  à	  s   

üürÝ  zRoute-RefreshZBoRRZEoRR)r   rN   r/   rx   c                   @   sJ   e Zd ZdZdZeddeƒeddeƒedde	ƒe
edd	eƒd
d„ ƒgZdS )rÙ   ze
    Provides an implementation of the ROUTE-REFRESH message.
    References: RFC 2918, RFC 7313
    r¯   r  rN   Úsubtyper   r  Zorf_datar  c                 C   s   | j r| j jpddkS )NrÀ   r¿   )rÛ  ry   r  r+   r+   r,   r›   
  s    zBGPRouteRefresh.<lambda>N)r&   r'   r(   r)   r„   r   r  r   Úrr_message_subtypesr  r   r   rÝ  r…   r+   r+   r+   r,   rÙ   þ	  s   



þüé³   )Údport)ZsportrÝ   r°   z[bgp.py] use_2_bytes_asn: %s)¼r)   Ú
__future__r   rU   r<   rS   Zscapyr   Zscapy.packetr   r   r   Zscapy.fieldsr   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Zscapy.layers.inetr   Zscapy.layers.inet6r   Zscapy.configr    r!   Zscapy.compatr"   r#   Zscapy.errorr$   Zscapy.libs.sixZlibsÚsixr%   rX  ZBGP_MAXIMUM_MESSAGE_SIZErí   rŸ   ru   rÿ   Z_BGP_PATH_ATTRIBUTE_MIN_SIZEr3   r4   rp   rw   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  Úwith_metaclassr	  rø   r÷   r!  r"  r  r(  rù   r0  rú   rû   r3  r5  r7  rÕ   r½  r¼  rP  rS  r`  rW  rZ  rc  rd  rf  rh  ri  rj  rn  rm  ro  rp  r›  Z_ext_comm_evpn_subtypesZ/_ext_comm_trans_two_octets_as_specific_subtypesZ3_ext_comm_non_trans_two_octets_as_specific_subtypesZ0_ext_comm_trans_four_octets_as_specific_subtypesZ4_ext_comm_non_trans_four_octets_as_specific_subtypesZ+_ext_comm_trans_ipv4_addr_specific_subtypesZ/_ext_comm_non_trans_ipv4_addr_specific_subtypesZ_ext_comm_trans_opaque_subtypesZ#_ext_comm_non_trans_opaque_subtypesZ)_ext_comm_generic_transitive_exp_subtypesZ/_ext_comm_generic_transitive_exp_part2_subtypesZ/_ext_comm_generic_transitive_exp_part3_subtypesr‡  Z(_ext_comm_trans_ipv6_addr_specific_typesZ,_ext_comm_non_trans_ipv6_addr_specific_typesr�  rt  rx  rz  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à  rÙ   Úwarningr*   r+   r+   r+   r,   Ú<module>   s8  d			0+	)

#úÓ2æ û%!ýíù"ýý-ÿ3.Ý(á#)ù!!óì÷øþùÿ÷ôþ÷ÿÿþøôö:	"	ñ^;ùü
øôü
÷þ¹NþýþXüÿ