U v`@sdZddlmZddlmZddlZddlZddlmZddlm Z dZ dZ d Z d Z d ZdZdZd Zd Zd Zd Zd ZdZdZdZdZdZdZdZdZdZdZd Z d Z!dZ"dZ#dZ$dZ%dZ&dZ'dZ(dZ)dZ*d Z+dZ,dZ-dZ.dZ/dZ0dZ1dZ2d Z3d Z4d Z5d Z6dZ7dZ8d Z9dZ:dZ;d Zd Z?d Z@dZAdZBd ZCd ZDd ZEd ZFd ZGdZHdZIdZJdZKdZLdZMd ZNd ZOd ZPd ZQd ZRdZSGdddejTZUGdddejTZVGdddejTZWGd d!d!eWZXGd"d#d#ejTZYGd$d%d%ejTZZd&Z[d'Z\d(Z]d)Z^d*Z_d+Z`d,Zad-Zbd.Zcd/d0Zdd1d2Zed3d4Zfd5d6Zgd7d8Zhd9d:Zid;d<Zjd=d>Zkd?d@ZldAdBZmdCdDZndEdFZodGdHZpdIdJZqdKdLZrdMdNZsdOdPZtdQdRZudSdTZvdS)UzBorder Gateway Protocol.)print_function)absolute_importN)dpkt) compat_ord llllF c@seZdZdZddddeffZddZGdd d ejZ Gd d d ejZ Gd d d ejZ GdddejZ GdddejZ dS)BGPzBorder Gateway Protocol. BGP is an inter-AS routing protocol. See more about the BGP on https://en.wikipedia.org/wiki/Border_Gateway_Protocol Attributes: __hdr__: Header fields of BGP. #TODO )markerZ16su ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ)lenHrtypeBcCstj|||jd|j|j|_|jtkrF||j|_|_ n~|jt krf| |j|_|_ n^|jt kr||j|_|_n>|jtkr||j|_|_n|jtkr||j|_|_dSN)rPacketunpackdatar __hdr_len__rOPENOpenopenUPDATEUpdateupdate NOTIFICATION Notification notification KEEPALIVE Keepalive keepalive ROUTE_REFRESH RouteRefresh route_refreshselfbufr2`/private/var/folders/0j/yyfkg7712236ncpm167bvylc27vst9/T/pip-unpacked-wheel-y9gppv54/dpkt/bgp.pyrs     z BGP.unpackc@sBeZdZdZdgiZddZddZddZGd d d ej Z d S) zBGP.Open))vrr asnrr)Zholdtimerr) identifierIr) param_lenrr parameterscCshtj||g}|j}|dkrX||j}|jt|d|_|t|8}||q||_|_dSNr) rrrr9 Parameterrrappendr:)r0r1l_plenparamr2r2r3rs   zBGP.Open.unpackcCs|jttt|jSr)rsummaprr:r0r2r2r3__len__szBGP.Open.__len__cCs(dtt|j}t||_||SN)joinrBbytesr:rr9pack_hdr)r0paramsr2r2r3 __bytes__s zBGP.Open.__bytes__c@s<eZdZdZddZGdddejZGdddejZdS) zBGP.Open.ParameterrrrrrrcCsbtj|||jd|j|_|jtkr@||j|_|_n|jt kr^| |j|_|_ dSr) rrrrrrAUTHENTICATIONAuthenticationZauthentication CAPABILITY Capability capabilityr/r2r2r3rs   zBGP.Open.Parameter.unpackc@seZdZdZdS)z!BGP.Open.Parameter.Authentication)coderrN__name__ __module__ __qualname____hdr__r2r2r2r3rPsrPc@seZdZdZddZdS)zBGP.Open.Parameter.Capability)rTrNcCs$tj|||jd|j|_dSrrrrrrr/r2r2r3rsz$BGP.Open.Parameter.Capability.unpackNrWrXrYrZrr2r2r2r3rRsrRN) rWrXrYrZrrrrPrRr2r2r2r3r<s r<N) rWrXrYrZ__hdr_defaults__rrDrKrrr<r2r2r2r3r!s r!c@sBeZdZgggdZddZddZddZGdd d ejZ d S) z BGP.Update) withdrawn attributes announcedcCsL||_td|jddd}|jdd|_g}|dkrrt|j}|jt|d|_|t|8}||q4||_td|jddd}|jdd|_g}|dkr||j}|jt|d|_|t|8}||q||_g}|jrBt|jddkrt |j}n t|j}|jt|d|_||q||_ dS)N>Hrrr) rstructr RouteIPV4rr=r^ Attributer_ExtendedRouteIPV4r`)r0r1wlenr>router?attrr2r2r3rs6         zBGP.Update.unpackcCs8dttt|jdttt|jttt|jSNr)rArBrr^r_r`rCr2r2r3rD szBGP.Update.__len__cCsftdttt|jdtt|jtdttt|jdtt|jdtt|j S)NrarF) rbpackrArBrr^rGrHr_r`rCr2r2r3rKszBGP.Update.__bytes__c@sheZdZdZeddZejddZeddZejddZedd Zejd d Zed d Z e jd d Z ddZ ddZ ddZ Gddde jZGddde jZGddde jZGddde jZGddde jZGddde jZGd d!d!e jZGd"d#d#e jZGd$d%d%e jZGd&d'd'e jZGd(d)d)e jZGd*d+d+e jZd,S)-zBGP.Update.Attribute))flagsrrrMcCs|jd?d@S)Nr rrkrCr2r2r3optionalszBGP.Update.Attribute.optionalcCs|jd@|d@d>B|_dS)Nirr rl)r0or2r2r3rmscCs|jd?d@S)Nr rrlrCr2r2r3 transitive#szBGP.Update.Attribute.transitivecCs|jd@|d@d>B|_dS)Nirr rl)r0tr2r2r3ro'scCs|jd?d@S)Nr rrlrCr2r2r3partial+szBGP.Update.Attribute.partialcCs|jd@|d@d>B|_dS)Nirr rl)r0pr2r2r3rq/scCs|jd?d@S)Nr rrlrCr2r2r3extended_length3sz$BGP.Update.Attribute.extended_lengthcCs|jd@|d@d>B|_dS)Nirr rl)r0er2r2r3rs7scCstj|||jrBtd|jddd|_|jdd|_n,td|jddd|_|jdd|_|jd|j|_|jtkr| |j|_|_ nv|jt kr| |j|_|_ nT|jtkr||j|_|_n2|jtkr ||j|_|_n|jtkr,||j|_|_n|jtkrN||j|_|_n|jtkrp||j|_|_n|jtkr||j|_|_n|jt kr|!|j|_|_"nd|jt#kr|$|j|_|_%nB|jt&kr|'|j|_|_(n |jt)kr|*|j|_|_+dS)Nrarrrr),rrrrsrbrrrORIGINOriginoriginAS_PATHASPathas_pathNEXT_HOPNextHopnext_hopMULTI_EXIT_DISC MultiExitDiscmulti_exit_disc LOCAL_PREF LocalPref local_prefATOMIC_AGGREGATEAtomicAggregateZatomic_aggregate AGGREGATOR AggregatorZ aggregator COMMUNITIES Communities communities ORIGINATOR_ID OriginatorID originator_id CLUSTER_LIST ClusterList cluster_list MP_REACH_NLRI MPReachNLRI mp_reach_nlriMP_UNREACH_NLRI MPUnreachNLRIZmp_unreach_nlrir/r2r2r3r;s>            zBGP.Update.Attribute.unpackcCs$|jr d}nd}|j|t|jS)Nrr)rsrrr)r0Zattr_lenr2r2r3rD`szBGP.Update.Attribute.__len__cCs:|jrtd|j}ntd|j}||t|jS)Nrar)rsrbrjrrIrHr)r0Z attr_len_strr2r2r3rKgszBGP.Update.Attribute.__bytes__c@seZdZddeffZdS)zBGP.Update.Attribute.OriginrrN)rWrXrY ORIGIN_IGPrZr2r2r2r3rvnsrvc@sPeZdZdgiZddZddZddZGdd d ejZ Gd d d ejZ d S) zBGP.Update.Attribute.ASPathsegmentscCsl||_g}t|jdk}|jr\|r0||j}n ||j}|jt|d|_||q||_|_dS)Nr )rrASPathSegment4 ASPathSegmentr=r)r0r1r>Zas4segr2r2r3rxs  z"BGP.Update.Attribute.ASPath.unpackcCsttt|jSrrArBrrrCr2r2r3rDsz#BGP.Update.Attribute.ASPath.__len__cCsdtt|jSrErGrBrHrrCr2r2r3rKsz%BGP.Update.Attribute.ASPath.__bytes__c@s(eZdZdZddZddZddZdS) z)BGP.Update.Attribute.ASPath.ASPathSegmentrLcCsftj||g}t|jD]8}td|jddd}|jdd|_||q||_|_dS)Nrarr) rrrrangerrbrr=pathr0r1r>iASr2r2r3rs z0BGP.Update.Attribute.ASPath.ASPathSegment.unpackcCs|jdt|jSrirrrrCr2r2r3rDsz1BGP.Update.Attribute.ASPath.ASPathSegment.__len__cCs,d}|jD]}|td|7}q ||S)NrFrarrbrjrIr0Zas_strrr2r2r3rKs z3BGP.Update.Attribute.ASPath.ASPathSegment.__bytes__NrWrXrYrZrrDrKr2r2r2r3rs rc@s(eZdZdZddZddZddZdS) z*BGP.Update.Attribute.ASPath.ASPathSegment4rLcCsntj||g}t|jD]F}t|jdkrtd|jddd}|jdd|_||q||_dS)Nr >Ir) rrrrrrrbr=rrr2r2r3rs z1BGP.Update.Attribute.ASPath.ASPathSegment4.unpackcCs|jdt|jSNr rrCr2r2r3rDsz2BGP.Update.Attribute.ASPath.ASPathSegment4.__len__cCs,d}|jD]}|td|7}q ||SNrFrrrr2r2r3rKs z4BGP.Update.Attribute.ASPath.ASPathSegment4.__bytes__Nrr2r2r2r3rs rN) rWrXrYr]rrDrKrrrrr2r2r2r3ryss ryc@seZdZdZdS)zBGP.Update.Attribute.NextHop)ipr8rNrVr2r2r2r3r|sr|c@seZdZdZdS)z"BGP.Update.Attribute.MultiExitDisc)valuer8rNrVr2r2r2r3rsrc@seZdZdZdS)zBGP.Update.Attribute.LocalPrefrNrVr2r2r2r3rsrc@s$eZdZddZddZddZdS)z$BGP.Update.Attribute.AtomicAggregatecCsdSrr2r/r2r2r3rsz+BGP.Update.Attribute.AtomicAggregate.unpackcCsdSr;r2rCr2r2r3rDsz,BGP.Update.Attribute.AtomicAggregate.__len__cCsdSrEr2rCr2r2r3rKsz.BGP.Update.Attribute.AtomicAggregate.__bytes__NrWrXrYrrDrKr2r2r2r3rsrc@seZdZdZdS)zBGP.Update.Attribute.Aggregator)r5rNrVr2r2r2r3rsrc@sPeZdZdgiZddZddZddZGdd d ejZ Gd d d ejZ d S) z BGP.Update.Attribute.CommunitieslistcCs||_g}|jrtd|jddd}d|kr>dksXnd|krTdkrnnn||jdd}n||jdd}|jt|d|_||q ||_|_dS)Nrr rill)rrbrReservedCommunity Communityrr=r)r0r1r>valZcommr2r2r3rs. z'BGP.Update.Attribute.Communities.unpackcCsttt|jSrrrCr2r2r3rDsz(BGP.Update.Attribute.Communities.__len__cCsdtt|jSrErrCr2r2r3rKsz*BGP.Update.Attribute.Communities.__bytes__c@seZdZdZdS)z*BGP.Update.Attribute.Communities.Community)r5)rrrNrVr2r2r2r3rsrc@seZdZdZdS)z2BGP.Update.Attribute.Communities.ReservedCommunityrNrVr2r2r2r3rsrN) rWrXrYr]rrDrKrrrrr2r2r2r3rs rc@seZdZdZdS)z!BGP.Update.Attribute.OriginatorIDrNrVr2r2r2r3rsrc@s,eZdZdgiZddZddZddZdS) z BGP.Update.Attribute.ClusterListrcCsV||_g}|jrFtd|jddd}|jdd|_||q ||_|_dS)Nrr r)rrbrr=r)r0r1r>idr2r2r3rs z'BGP.Update.Attribute.ClusterList.unpackcCsdt|jSr)rrrCr2r2r3rDsz(BGP.Update.Attribute.ClusterList.__len__cCs$d}|jD]}|td|7}q |Sr)rrbrj)r0Z cluster_strrr2r2r3rKs z*BGP.Update.Attribute.ClusterList.__bytes__N)rWrXrYr]rrDrKr2r2r2r3rs  rc@sJeZdZddefddeffZddZddZd d ZGd d d e j Z d S)z BGP.Update.Attribute.MPReachNLRIafirsafirc Cstj||d}|jtkr d}g}td|jddd}|jdd|_|jd||_|dkr|jd|}|||j|d|_||8}q^||_ g}td|jddd}|jdd|_t |D].}| |j}|jt |d|_||q||_ |jtkrt} n(|jtkr.t} n|jtkr@t} nt} g}|jr|| |j} |jt | d|_|| qH||_|_dS)Nr rrr)rrrrAFI_IPV6rbrr}r= next_hopsrSNPArsnpasAFI_IPV4rc RouteIPV6 AFI_L2VPN RouteEVPN RouteGenericr`) r0r1Zhop_lenr>nlenZhopZ num_snpasrsnpaRoutergr2r2r3r sF          z'BGP.Update.Attribute.MPReachNLRI.unpackcCs>|jdttt|jdttt|jttt|jS)Nr)rrArBrrrr`rCr2r2r3rDNsz(BGP.Update.Attribute.MPReachNLRI.__len__cCsh|tdttt|jdtt|jtdt|j dtt|j dtt|j S)NrrF) rIrbrjrArBrrrGrHrr`rCr2r2r3rKTsz*BGP.Update.Attribute.MPReachNLRI.__bytes__c@seZdZdZddZdS)z%BGP.Update.Attribute.MPReachNLRI.SNPArNcCs,tj|||jd|jdd|_dS)Nrrr[r/r2r2r3rasz,BGP.Update.Attribute.MPReachNLRI.SNPA.unpackNr\r2r2r2r3r\srN) rWrXrYr SAFI_UNICASTrZrrDrKrrrr2r2r2r3rs.rc@s8eZdZddefddeffZddZddZd d Zd S) z"BGP.Update.Attribute.MPUnreachNLRIrrrrcCstj|||jtkrt}n$|jtkr.t}n|jtkr>t }nt }g}|j rv||j }|j t |d|_ | |qF||_ |_dSr)rrrrrrcrrrrrrrr=r^)r0r1rr>rgr2r2r3rks     z)BGP.Update.Attribute.MPUnreachNLRI.unpackcCs|jttt|jSr)rrArBrrrCr2r2r3rDsz*BGP.Update.Attribute.MPUnreachNLRI.__len__cCs|dtt|jSrE)rIrGrBrHrrCr2r2r3rKsz,BGP.Update.Attribute.MPUnreachNLRI.__bytes__N) rWrXrYrrrZrrDrKr2r2r2r3res rN)rWrXrYrZpropertyrmsetterrorqrsrrDrKrrrvryr|rrrrrrrrrr2r2r2r3rds@        %I #KrdN) rWrXrYr]rrDrKrrrdr2r2r2r3r$s$r$c@seZdZdZddZdS)zBGP.Notification)rT)subcoderrcCstj|||j|_dSr)rrrrerrorr/r2r2r3rszBGP.Notification.unpackNr\r2r2r2r3r'sr'c@s$eZdZddZddZddZdS)z BGP.KeepalivecCsdSrr2r/r2r2r3rszBGP.Keepalive.unpackcCsdSr;r2rCr2r2r3rDszBGP.Keepalive.__len__cCsdSrEr2rCr2r2r3rKszBGP.Keepalive.__bytes__Nrr2r2r2r3r*sr*c@s"eZdZddefdddeffZdS)zBGP.RouteRefreshrr)rsvdrrrrN)rWrXrYrrrZr2r2r2r3r-sr-N)rWrXrY__doc__r rZrrrr!r$r'r*r-r2r2r2r3rs =*  rc@seZdZdZddZdS)rrcCs2tj|||jd|jdd|_|_dSNr r rrrrrprefixr/r2r2r3rszRouteGeneric.unpackNr\r2r2r2r3rsrc@s0eZdZdZddZddZddZdd Zd S) rcrcCsJtj|||jd|jdd}|dt|d7}||_|_dS)Nr r r rr0r1tmpr2r2r3rszRouteIPV4.unpackcCs&dt|j|jf}d|jj|fS)Nz%s/%d%s(%s))socket inet_ntoarr __class__rWr0Zcidrr2r2r3__repr__szRouteIPV4.__repr__cCs|j|jddSrrrrCr2r2r3rDszRouteIPV4.__len__cCs ||jd|jddSrrIrrrCr2r2r3rKszRouteIPV4.__bytes__N)rWrXrYrZrrrDrKr2r2r2r3rcs rcc@seZdZdZddZdS)re))path_idr8rrNcCs*dt|j|j|jf}d|jj|fS)Nz%s/%d PathId %dr)rrrrrrrWrr2r2r3rszExtendedRouteIPV4.__repr__N)rWrXrYrZrr2r2r2r3resrec@s(eZdZdZddZddZddZdS) rrcCsJtj|||jd|jdd}|dt|d7}||_|_dS)Nr r rrrrr2r2r3rszRouteIPV6.unpackcCs|j|jddSrrrCr2r2r3rDszRouteIPV6.__len__cCs ||jd|jddSrrrCr2r2r3rKszRouteIPV6.__bytes__Nrr2r2r2r3rsrc@s(eZdZdZddZddZddZdS) rrLcCstj|||jd|j|_}|j|jd|_|dd|_|dd}|jdkrt|dd|_|dd}|jdkr|dd|_ |dd}|jdkrt |d|_ |j dkr|dd |_ |d d}nd|_ |dd}|jdkrdt |d|_ |j d kr*|dd |_|d d}n:|j d krR|dd |_|d d}nd|_|dd}|jdkr|dd|_|dd}|jt|kr|j|dd7_dS)Nr rrr rr0rr  r )rr)rrrrr route_datardresieth_idrmac_address_length mac_addressip_address_length ip_addressmpls_label_stackr/r2r2r3rsB              zRouteEVPN.unpackcCs |j|jSrrrCr2r2r3rDszRouteEVPN.__len__cCs||jSr)rIrrCr2r2r3rKszRouteEVPN.__bytes__Nrr2r2r2r3rs-rssccH@@ @@d@  T  syyb@@@d,,$@@@,   `ws--Zn}s``I@@@d $FsooX@@@d 3F(0̪) sXXA@@@d F s^_H@@@d #F s{{d@@@d ?F40̪)cCsttttkstttttks(tttttkst|jtksNt|jdks^t|j}|jtkstt|j j d}|jst|jrt|jrt|jst|jt kst|jdkst|j!}|j"t#kstt|j$dkstt|j dkst|j d} | jdks(ttt%} | jdks@t| jt&ksPt| j'jdksbt| j'j(dksttt| j'j)d kst| j'j)d} | jt*kst| jdkst| j+}|j,t-kst|jdkst|j.dkst| j'j)dj+}|j,t/ks t|jdksttt0} | jdks2t| jtksBtt| j j dksXt| j j d}|jt kstt|jdkst|j!}|j"t1kst|j2t3kst|j d}|jdkst|jdkst|j4dkst|j5dkst|j6dkst|j7dksttt8} | jdks,t| jtkst|j7d$ksNttt=} | jd%ksft| jtksvtt| j j dkst| j j d}|jt kst|jd&kst|j!}|j"t1kst|j2t3kst|j d}|jd kst|jd'kst|j4dkst|j6dks(t|j;d"ks8t|j}|jd(ks`t|jtksptt|j j dkst|j j d}|jt kst|jd)kst|j!}|j"t1kst|j2t3kst|j d}|jdkst|jd*kst|j4dkst|j5dks"t|j;d"ks2t|jt|jd ksNt|jj dks`t|jjd }|jt!ks|t|jrt|jst|jrt|jrt|jd kst|jd kst|j"j dkst|jjd}|jt#kst|jst|jrt|jrt|jr*t|jdks:t|jd ksJtt t j t|j$dksht|jjd }|jt%kst|jst|jrt|jrt|jrt|jdkst|jd kstt t j t|j&dkstdS)NsYY0@@@ @d  "    rrrrrz5.5.5.5z 192.168.1.5r rr ir z 10.0.14.1rrdr z 10.0.34.4z 10.0.15.1)'rrHrrrr#r%r^r`rrrAF_INETrr_rurmrorqrsrkrwrrxrzrrrr{r}r~rrrrrrrr)rrr`rrr2r2r3test_bgp_add_path_6_1_as_pathZs                                      rcCsddlm}|d}tj|}t|jtjjjs6tdD]R}t ||dksPtt ||dt ||dksntt ||dt ||dks:tq:dS)Nr unhexlifyZ00010100)rmrorqrsr) binasciirrr$rd isinstancerrvrgetattrsetattr)rr1rrhr2r2r3test_attribute_accessorss    r"cCsVddlm}|d}tjjj|}|jdks2tt|dksBtt ||ksRtdS)NrrZ041234r r) rrrr$rdrrrrrH)rr1rr2r2r3 test_snpas r#cCsHddlm}|d}tjj|}t|jdks4tt ||ksDtdS)NrrZ0000000001041234r) rrrr$rdrrrrrH)rr1mpr2r2r3test_mpreachnlris  r%cCsddlm}|d}t|}|jdks,t|jdks:t|jdksHtt||ksXt|d}t||}t |dsztt |j tjst|j jdkst|j jdkst|j jdkstt|||kstdS) NrrZ112233r"3Z&11111111111111111111111111111111001603r() rrrr'rUrrrrHhasattrrr)rZbuf_notificationr( buf_bgp_hdrrr2r2r3test_notifications&   r*cCs.td}t|dkstt|dks*tdS)NrrF)rr*rrrH)r+r2r2r3test_keepalives r,cCs\ddlm}|d}t|}|jdks*t|jdks8tt||ksHtt|dksXtdS)Nrr0811r r+r)rrrrrrrH)rr1Z routegenericr2r2r3test_routegenerics r.cCslddlm}|d}t|}|jdks*t|jdks8tt|dksHtt||ksXtt|dkshtdS)Nrrr-r szRouteIPV4(17.0.0.0/8)r)rrrcrrrreprrH)rr1Z routeipv4r2r2r3test_routeipv4+s r0cCs\ddlm}|d}t|}|jdks*t|jdks8tt||ksHtt|dksXtdS)Nrr0822r s"r)rrrcrrrrH)rr1Z routeipv6r2r2r3test_routeipv6<s r2cCsddlm}|d}t|}|jdks*t|jdks8t|j|dksJtt|dksZtt||ksjtt|t|ks~tdS)NrrZ000000012005050505rrZ05050505z&ExtendedRouteIPV4(5.5.5.5/32 PathId 1)) rrrerrrrr/rH)rr1Zextendedrouteipv4r2r2r3test_extendedrouteipv4Ls r3cCsddlm}|d}t|}|jdks*t|jdks8t|j|dksJt|j|dks\t|jdksjt|j dksxt|j dkst|j dkst|j |dkstt ||kstt|t|kstdS) Nrr8021a1111111111111111222222222222222222223333333300006666rZ22222222222222222222Z33333333Z6666)rrrrrrrrrrrrrrH)rr1Z routeevpnr2r2r3test_routeevpn^s  r6cCsddlm}|d}t|}|jdks,t|jdks:t|jdksHtt||ksXt|d}t||}t |dsztt |j tjst|j jdkst|j jdkst|j jdkstt|||kstdS) NrrZ11112233ir&rZ&11111111111111111111111111111111001705r.) rrrr-rrrrrHr(rr)rZbuf_route_refreshr.r)rr2r2r3test_route_refreshs&   r7cCsddlm}|d}|d}|d}|d}td}t|tft|tft|t fd|t ff}|D]\}}} | |d |}t j j|} | j|kst| jd kstt| jd kst| jd} t| | stt| |kstt| t|ks^tq^td } |D]\}}} | |d |} | dtt| }|| }t j |}t|jt j jjs\t|jj}t|d ksvtt|d| stqdS) Nrrr-r1r4Z0833rairZBBB)rrrbStructrrcrrrrrrjrr$rdrrrrrrrrHr)rZ buf_routeipv4Z buf_routeipv6Z buf_routeevpnZbuf_routegenericrZroutesZafi_idr1clsZmpurgZ attribute_hdrZbuf_mpunreachnlriZbuf_attribute_hdrrr2r2r3test_mpunreachnlrisN     r<cCsddlm}|d}tdj}|t||d}}|||}t|}t|jdks^t |jd}t |t svt t ||kst dS)Nrrr-rar) rrrbr:rjrrr$r^rrrcrH)rZbuf_ipv4Z packed_lengthrfr?r1r%rgr2r2r3test_update_withdrawns     r=cCsddlm}|d}t|}t|jdks0t|jd}t|tjjsLtt|j tjjj sbtt ||ksrtt|t|kstdS)NrrZ44111122223333333303010111r) rrrr!rr:rrr<rrPrH)rr1Zbgp_open parameterr2r2r3test_parameterss   r?cCsddlm}|d}tjj|}t|jdks4t|jd}t |tjjjj sTtt|dksdtt ||ksttt|dkstt ||kstdS)NrrZ00002222rr ) rrrr$rdrrrrrrrH)rr1rZ communityr2r2r3test_reservedcommunities s  r@)wr __future__rrrbrrcompatrr r#r&r)r,rurxr{r~rrrrrrrrrZ ORIGIN_EGPZ INCOMPLETErrZAS_CONFED_SEQUENCEZ AS_CONFED_SETZ NO_EXPORTZ NO_ADVERTISEZNO_EXPORT_SUBCONFEDZNO_PEERrrrrZSAFI_MULTICASTZSAFI_UNICAST_MULTICASTrrOrQrrZMESSAGE_HEADER_ERRORZOPEN_MESSAGE_ERRORZUPDATE_MESSAGE_ERRORZHOLD_TIMER_EXPIREDZ FSM_ERRORZCEASEZCONNECTION_NOT_SYNCHRONIZEDZBAD_MESSAGE_LENGTHZBAD_MESSAGE_TYPEZUNSUPPORTED_VERSION_NUMBERZ BAD_PEER_ASZBAD_BGP_IDENTIFIERZUNSUPPORTED_OPTIONAL_PARAMETERZAUTHENTICATION_FAILUREZUNACCEPTABLE_HOLD_TIMEZUNSUPPORTED_CAPABILITYZMALFORMED_ATTRIBUTE_LISTZUNRECOGNIZED_ATTRIBUTEZMISSING_ATTRIBUTEZATTRIBUTE_FLAGS_ERRORZATTRIBUTE_LENGTH_ERRORZINVALID_ORIGIN_ATTRIBUTEZAS_ROUTING_LOOPZINVALID_NEXT_HOP_ATTRIBUTEZOPTIONAL_ATTRIBUTE_ERRORZINVALID_NETWORK_FIELDZMALFORMED_AS_PATHZMAX_NUMBER_OF_PREFIXES_REACHEDZADMINISTRATIVE_SHUTDOWNZPEER_DECONFIGUREDZADMINISTRATIVE_RESETZCONNECTION_REJECTEDZOTHER_CONFIGURATION_CHANGEZCONNECTION_COLLISION_RESOLUTIONZOUT_OF_RESOURCESrrrrcrerrrrrrrrrrrrrrrr"r#r%r*r,r.r0r2r3r6r7r<r=r?r@r2r2r2r3s    $  :  1Pf -L