a
    kÄ#d¦  ã                /   @   sb  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 ddlm Z m!Z! dd	l"m#Z#m$Z$ dd
l%m&Z& ddl'm(Z(m)Z)m*Z*m+Z+m,Z, ddl-m.Z.m/Z/m0Z0m1Z1 ddddddœZ2dddddddddddddd œZ3d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAœ Z4dBdCdDdEdFdGdHdIdJdKdLdMdNdGdFdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdnœ.Z5dodpdqdrdsœZ6dtdudvœZ7dwdxdxdydzd{dxdxd|œZ8G d}d~„ d~eƒZ9d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>e?e>e?e?dŠœ
Z@G d‹dŒ„ dŒe+ƒZAG d�dŽ„ dŽe+ƒZBG d�d�„ d�e+ƒZCG d‘d’„ d’eCƒZDG d“d”„ d”eCƒZEG d•d–„ d–eCƒZFG d—d&„ d&eCƒZGG d˜d™„ d™eCƒZHG dšd›„ d›eCƒZIG dœd�„ d�eCƒZJG dždŸ„ dŸeCƒZKG d d¡„ d¡eCƒZLG d¢d£„ d£eCƒZMG d¤d¥„ d¥eCƒZNG d¦d§„ d§eCƒZOG d¨d©„ d©eCƒZPG dªd«„ d«eCƒZQG d¬d­„ d­eCƒZRG d®d¯„ d¯eƒZSG d°d±„ d±eCƒZTG d²d³„ d³eCƒZUG d´dµ„ dµeCƒZVG d¶d·„ d·eCƒZWG d¸d¹„ d¹eCƒZXG dºd»„ d»eCƒZYG d¼d½„ d½eCƒZZG d¾d¿„ d¿eCƒZ[G dÀdÁ„ dÁeCƒZ\G dÂdÃ„ dÃeCƒZ]G dÄdÅ„ dÅeCƒZ^G dÆdÇ„ dÇeCƒZ_G dÈdÉ„ dÉeCƒZ`G dÊdË„ dËeCƒZaG dÌdÍ„ dÍeCƒZbG dÎdÏ„ dÏeCƒZcG dÐdÑ„ dÑeCƒZdG dÒdÓ„ dÓeCƒZeG dÔdÕ„ dÕeCƒZfG dÖd×„ d×e+ƒZgeDeEeFeGeHeIeJeKeLeMeNeOePeQeReTeUeVeWeYefeZe[e\e]e^e_e`eaebecedeedØœ!ZhdÙdÚ„ 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+ƒZqG dëdì„ dìe+ƒZrG dídî„ dîe+ƒZsG dïdð„ dðe+ƒZte)e!e>dñdò� e)e!e>dñdó� e(e!e>dñdñdô� e(e>eBdõdõdö� e(e>ejd÷dõdö� e(e>ekdødù� e(e>eldúdù� e(e>emdûdù� e(e>endüdù� e(e>epdýdù� e(e>eqdþdù� e(e>erdÿdù� e(e>es�d dõdö� e(e>e<�ddõ�d� e(e>e=�ddõ�d� e)e!e?�ddò� e)e!e?�ddó� e(e!e?�d�ddô� e(e?eo�ddõdö� e(e?eA�ddõ�d�d� e*e?e �ddù� e*e?e#�ddù� e*e?e&�ddù� dS (	  za
GPRS Tunneling Protocol (GTP)

Spec: 3GPP TS 29.060 and 3GPP TS 29.274
Some IEs: 3GPP TS 24.008
é    )Úabsolute_importN)ÚchbÚorbÚbytes_encode)Úconf)Úwarning)ÚBitEnumFieldÚBitFieldÚByteEnumFieldÚ	ByteFieldÚConditionalFieldÚFieldLenFieldÚFieldListFieldÚ
FlagsFieldÚIPFieldÚIntFieldÚPacketListFieldÚ
ShortFieldÚStrFixedLenFieldÚStrLenFieldÚX3BytesFieldÚ	XBitFieldÚ
XByteFieldÚ	XIntField)ÚIPÚUDP)ÚIPv6ÚIP6Field)ÚPPP)Úbind_layersÚbind_bottom_upÚbind_top_downÚPacketÚRaw)ÚRandIntÚRandIPÚRandNumÚ
RandStringZUTRANZGETRANZWLANZGANZHSPA)é   é   é   é   é   Zecho_requestZecho_responseZcreate_pdp_context_reqZcreate_pdp_context_resZupdate_pdp_context_reqZupdate_pdp_context_respZdelete_pdp_context_reqZdelete_pdp_context_resZerror_indicationZpdu_notification_reqZ(supported_extension_headers_notificationZ
end_markerZg_pdu)r(   r)   é   é   é   é   é   é   é   é   é   éþ   éÿ   ÚCauseZIMSIZRAIZTLLIZP_TMSIÚIE_ReorderingRequiredÚRecoveryÚSelectionModeÚTEIDIZTEICPZTeardownIndÚNSAPIZChargingChrtZTraceReferenceZ	TraceTypeZ
ChargingIdZEndUserAddressZAccessPointNameZProtocolConfigurationOptionsZ
GSNAddressZMSInternationalNumberÚQoSZCommonFlagsZAPNRestrictionZRatTypeZUserLocationInformationZ
MSTimeZoneÚIMEIZMSInfoChangeReportingActionZBearerControlModeZ"EvolvedAllocationRetentionPriorityZPrivateExtention) r(   r)   r*   r+   r,   é   é   é   r-   r.   r0   r1   r3   r4   é   é   é€   éƒ   é„   é…   é†   é‡   é”   é•   é—   é˜   é™   éš   éµ   é¸   é¿   r7   zRequest IMSIzRequest IMEIzRequest IMSI and IMEIzNo identity neededz
MS RefuseszMS is not GPRS RespondingzRequest acceptedz&New PDP type due to network preferencez.New PDP type due to single address bearer onlyzNon-existentzInvalid message formatzIMSI not knownzMS is GPRS DetachedzVersion not supportedzNo resources availablezService not supportedzMandatory IE incorrectzMandatory IE missingzOptional IE incorrectzSystem failurezRoaming restrictionzP-TMSI Signature mismatchzGPRS connection suspendedzAuthentication failurezUser authentication failedzContext not foundz&All dynamic PDP addresses are occupiedzNo memory is availablezReallocation failurez"Unknown mandatory extension headerz#Semantic error in the TFT operationz Syntactic error in TFT operationz#Semantic errors in packet filter(s)z$Syntactic errors in packet filter(s)zMissing or unknown APNzUnknown PDP address or PDP typez)PDP context without TFT already activatedz#APN access denied : no subscriptionzGAPN Restriction type incompatibility with currently active PDP Contextsz!MS MBMS Capabilities InsufficientzInvalid Correlation : IDzMBMS Bearer Context SupersededzBearer Control Mode violationz(Collision with network initiated request).r   r(   r)   r*   r+   r,   rE   é�   é‚   éÀ   éÁ   éÂ   éÃ   éÄ   éÅ   éÆ   éÇ   éÈ   éÉ   éÊ   éË   éÌ   éÍ   éÎ   éÏ   éÐ   éÑ   éÒ   éÓ   éÔ   éÕ   éÖ   é×   éØ   éÙ   éÚ   éÛ   éÜ   éÝ   éÞ   éß   éà   éá   éâ   éã   éä   ú	MS or APNZMSZNETZ	FutureUse)i¼Š© i½Š© iÆŠ© iÇŠ© ÚFalseÚTrue)r6   r7   zNo more extension headersÚReservedzUDP PortzPDU Session ContainerzPDCP PDU Number)r   r(   r)   é@   rH   rV   rW   rX   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚTBCDByteFieldc                 C   s   |S ©N© )ÚselfÚpktÚvalr‚   r‚   úH/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/contrib/gtp.pyÚi2hµ   s    zTBCDByteField.i2hc                 C   st   g }|D ]`}t |ƒ}|d? }|d@ }|dkrD| t||d … ¡ q|t||d … t||d … g7 }qd |¡S )Nr+   rB   r(   ó    )r   ÚappendÚTBCD_TO_ASCIIÚjoin)rƒ   r„   r…   ÚretÚvÚbyteÚleftÚrightr‚   r‚   r†   Úm2i¸   s    þzTBCDByteField.m2ic                 C   sˆ   t |tƒst|ƒ}d}tdt|ƒdƒD ]\}|||d … }t|ƒdkrd|tt|d d d… dƒƒ7 }q&|ttd|d d…  dƒƒ7 }q&|S )Nrˆ   r   r)   éÿÿÿÿr-   ó   Fr(   )Ú
isinstanceÚbytesr   ÚrangeÚlenr   Úint)rƒ   r„   r…   Z
ret_stringÚiÚtmpr‚   r‚   r†   Úi2mÇ   s    
 zTBCDByteField.i2mN)Ú__name__Ú
__module__Ú__qualname__r‡   r‘   r›   r‚   r‚   r‚   r†   r€   ³   s   r€   s   0123456789*#abcc                   @   s   e Zd Zeddd„ƒZdS )ÚGTP_ExtensionHeaderNc                 O   s   |d u rt S | S r�   )ÚGTP_UDPPort_ExtensionHeader)ÚclsÚ_pktÚargsÚkargsr‚   r‚   r†   Údispatch_hookØ   s    z!GTP_ExtensionHeader.dispatch_hook)N)rœ   r�   rž   Úclassmethodr¥   r‚   r‚   r‚   r†   rŸ   ×   s   rŸ   c                   @   s*   e Zd ZeddƒeddƒeddeƒgZdS )r    Úlengthr(   Zudp_portNÚnext_exr   ©rœ   r�   rž   r   r   r
   ÚExtensionHeadersTypesÚfields_descr‚   r‚   r‚   r†   r    ß   s   
þr    c                   @   s*   e Zd ZeddƒeddƒeddeƒgZdS )ÚGTP_PDCP_PDU_ExtensionHeaderr§   r(   Zpdcp_pduNr¨   r   r©   r‚   r‚   r‚   r†   r¬   å   s   
þr¬   c                   @   sÊ   e Zd ZdZedddƒedddƒedddƒedddƒed	ddƒed
ddƒeddeƒeddƒeddƒe	e
dddƒdd„ ƒe	eddƒdd„ ƒe	eddeƒdd„ ƒgZdd„ Zdd„ Zdd„ Zeddd„ƒZdS ) Ú	GTPHeaderzGTP-C HeaderÚversionr(   r*   ZPTÚreservedr   ÚEÚSÚPNÚgtp_typeNr§   ZteidÚseqr-   c                 C   s   | j dkp| jdkp| jdkS ©Nr(   ©r°   r±   r²   ©r„   r‚   r‚   r†   Ú<lambda>ù   rˆ   zGTPHeader.<lambda>Znpduc                 C   s   | j dkp| jdkp| jdkS rµ   r¶   r·   r‚   r‚   r†   r¸   ü   rˆ   r¨   c                 C   s   | j dkp| jdkp| jdkS rµ   r¶   r·   r‚   r‚   r†   r¸   ÿ   rˆ   c                 C   sF   ||7 }| j d u rBt|ƒd }|d d… t d|¡ |dd …  }|S )Nr@   r)   ú!Hr+   ©r§   r—   ÚstructÚpack©rƒ   ÚpÚpayÚtmp_lenr‚   r‚   r†   Ú
post_build  s
    
$zGTPHeader.post_buildc                 C   s4   t  d| j¡}| jr&|t  d| j¡7 }|| j ¡  S )NÚBÚH)r»   r¼   r®   r´   ÚpayloadÚhashret)rƒ   Zhshr‚   r‚   r†   rÅ   	  s    zGTPHeader.hashretc                 C   s8   t |tƒo6| j|jko6| j s*| j|jko6| j |j¡S r�   )r”   r­   r®   r´   rÄ   Úanswers©rƒ   Úotherr‚   r‚   r†   rÆ     s    

ÿþýzGTPHeader.answersc                 O   sj   |r:t |ƒdkr:t|d ƒd? d@ dkr:ddlm} |jS |rft |ƒdkrft|dd… ƒ}t |t¡S | S )Nr(   r   r,   é   r)   )Úgtp_v2r@   )r—   r   Ú rÊ   r­   ÚGTPforcedTypesÚget)r¡   r¢   r£   r¤   rÊ   Z	_gtp_typer‚   r‚   r†   r¥     s    zGTPHeader.dispatch_hook)N)rœ   r�   rž   Únamer	   r
   ÚGTPmessageTyper   r   r   r   r   rª   r«   rÁ   rÅ   rÆ   r¦   r¥   r‚   r‚   r‚   r†   r­   ë   s8   







þþ
þñr­   c                   @   s   e Zd ZdZdd„ ZdS )ÚGTP_U_HeaderzGTP-U Headerc                 C   sn   | j dkr$| jdkrtS t | |¡S | jdkrbt|d ƒ}|dkrN|dkrNtS |d@ dkr^tS t	S t | |¡S )	Nr(   rH   r7   r   éE   éN   éð   é`   )
r°   r¨   ÚGTPPDUSessionContainerr­   Úguess_payload_classr³   r   r   r   r   ©rƒ   rÄ   Z	sub_protor‚   r‚   r†   rÖ   (  s    


z GTP_U_Header.guess_payload_classN)rœ   r�   rž   rÎ   rÖ   r‚   r‚   r‚   r†   rÐ   !  s   rÐ   )
r-   r.   r/   r0   r1   r2   r3   r4   r6   r7   c                   @   sü  e Zd ZdZdddddœZeddƒed	d
ddddœƒedd
dƒeedd
dƒdd„ ƒeedd
dƒdd„ ƒedd
dƒeedd
dƒdd„ ƒee	dd
dƒdd„ ƒee	dd
dƒdd„ ƒeedd
dƒdd„ ƒeed d
dƒd!d„ ƒed"d
d#ƒee	d$d
d%ƒd&d„ ƒee	d'd
d(ƒd)d„ ƒee	d*d
d+ƒd,d„ ƒee
d-d
ƒd.d„ ƒee	d/d
d+ƒd0d„ ƒee	d1d
d+ƒd2d„ ƒee	d3d
d+ƒd4d„ ƒee	d5d
d6ƒd7d„ ƒee	d8d
d6ƒd9d„ ƒee	d:d
d;ƒd<d„ ƒee	d=d
d6ƒd>d„ ƒed?d
eƒeed@dAdBd„ dC�dDd„ ƒgZdEdF„ ZdGdH„ ZdIdJ„ ZdS )KrÕ   zGTP PDU Session Container)ÚQMPú2.4.5)r   rÙ   )ÚRQIrÙ   )ÚpaddingrÙ   )ZqmpÚPÚRZextraPaddingÚ	ExtHdrLenNÚtyper   r+   zDL PDU SESSION INFORMATIONzUL PDU SESSION INFORMATION)r   r(   rØ   r(   Ú
dlDelayIndc                 C   s
   | j dkS rµ   ©rß   r·   r‚   r‚   r†   r¸   Z  rˆ   zGTPPDUSessionContainer.<lambda>Ú
ulDelayIndc                 C   s
   | j dkS rµ   rá   r·   r‚   r‚   r†   r¸   \  rˆ   ÚSNPÚN3N9DelayIndc                 C   s
   | j dkS rµ   rá   r·   r‚   r‚   r†   r¸   a  rˆ   ZspareUl1c                 C   s
   | j dkS rµ   rá   r·   r‚   r‚   r†   r¸   c  rˆ   ZspareDl1r)   c                 C   s
   | j dkS ©Nr   rá   r·   r‚   r‚   r†   r¸   f  rˆ   r   c                 C   s
   | j dkS rå   rá   r·   r‚   r‚   r†   r¸   h  rˆ   rÚ   c                 C   s
   | j dkS rå   rá   r·   r‚   r‚   r†   r¸   j  rˆ   ZQFIé   ZPPIr*   c                 C   s   | j dko| jdkS ©Nr   r(   ©rß   r   r·   r‚   r‚   r†   r¸   o  s   
ZspareDl2r,   c                 C   s   | j dko| jdkS rç   rè   r·   r‚   r‚   r†   r¸   r  s   
Z
dlSendTimer   c                 C   s   | j dko| jdkS rç   ©rß   rØ   r·   r‚   r‚   r†   r¸   u  s   
ZdlQFISeqNumc                 C   s   | j dko| jdkS rç   ©rß   rã   r·   r‚   r‚   r†   r¸   x  s   
ZdlSendTimeRptc                 C   s   | j dko| jdkS rµ   ré   r·   r‚   r‚   r†   r¸   |  s   
Z
dlRecvTimec                 C   s   | j dko| jdkS rµ   ré   r·   r‚   r‚   r†   r¸     s   
Z
ulSendTimec                 C   s   | j dko| jdkS rµ   ré   r·   r‚   r‚   r†   r¸   ‚  s   
ZdlDelayRslté    c                 C   s   | j dko| jdkS rµ   )rß   rà   r·   r‚   r‚   r†   r¸   …  s   
ZulDelayRsltc                 C   s   | j dko| jdkS rµ   )rß   râ   r·   r‚   r‚   r†   r¸   ˆ  s   
ZUlQFISeqNumé   c                 C   s   | j dko| jdkS rµ   rê   r·   r‚   r‚   r†   r¸   ‹  s   
ZN3N9DelayRsltc                 C   s   | j dko| jdkS rµ   )rß   rä   r·   r‚   r‚   r†   r¸   Ž  s   
Ú
NextExtHdrrÛ   rˆ   c                 C   s   dS rå   r‚   ©r¾   r‚   r‚   r†   r¸   “  rˆ   ©Zlength_fromc                 C   s
   | j dkS rå   )rí   r·   r‚   r‚   r†   r¸   ”  rˆ   c                 C   sJ   | j dkr>t|d ƒ}|dkr*|dkr*tS |d@ dkr:tS tS t | |¡S )Nr   rÑ   rÒ   rÓ   rÔ   )rí   r   r   r   r   r­   rÖ   r×   r‚   r‚   r†   rÖ   –  s    
z*GTPPDUSessionContainer.guess_payload_classc                 C   sD   | j dkr@t| jƒt|ƒ }| d }|d |… | _||d … S |S )Nr   r+   )rí   r—   ÚoriginalrÛ   )rƒ   Úsr§   Z
pad_lengthr‚   r‚   r†   Úpost_dissect¡  s    

z#GTPPDUSessionContainer.post_dissectc                 C   sn   | j dkr"|dt|ƒ d  7 }n|dt|| ƒ d  7 }| jd u rft dt|ƒd ¡|dd …  }|| S )Nr   ó    r+   ú!Br(   )rí   r—   rÞ   r»   r¼   )rƒ   r¾   r¿   r‚   r‚   r†   rÁ   ª  s    

 z!GTPPDUSessionContainer.post_build)rœ   r�   rž   rÎ   Zdeprecated_fieldsr   r   r	   r   r   r   r
   rª   r   r«   rÖ   rò   rÁ   r‚   r‚   r‚   r†   rÕ   J  sœ   üÿÿ
ÿÿ
ÿÿÿÿÿ
ÿÿÿ
ÿÿÿÿÿÿÿÿ
þÁC	rÕ   c                   @   s   e Zd ZdZdS )ÚGTPEchoRequestzGTP Echo RequestN)rœ   r�   rž   rÎ   r‚   r‚   r‚   r†   rõ   µ  s   rõ   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚIE_Basec                 C   s   d|fS ©NrË   r‚   ©rƒ   r„   r‚   r‚   r†   Úextract_padding»  s    zIE_Base.extract_paddingc                 C   sp   | j d jdkrh| jd u rht|ƒ}t| jtjƒr@|t| jjƒ7 }|d d… t	 
d|d ¡ |dd …  }|| S )Nr(   r§   r¹   r)   r*   )r«   rÎ   r§   r—   r”   rÄ   r   Zpadding_layerÚloadr»   r¼   r½   r‚   r‚   r†   rÁ   ¾  s    
(zIE_Base.post_buildN)rœ   r�   rž   rù   rÁ   r‚   r‚   r‚   r†   rö   º  s   rö   c                   @   s(   e Zd ZdZeddeƒeddeƒgZdS )ÚIE_Causer8   Úietyper(   Z
CauseValueN)rœ   r�   rž   rÎ   r
   ÚIETypeÚCauseValuesr«   r‚   r‚   r‚   r†   rû   È  s   

ÿrû   c                   @   s2   e Zd ZdZeddeƒedeeddƒƒdƒgZ	dS )	ÚIE_IMSIz$IMSI - Subscriber identity of the MSrü   r)   Zimsir   l   ÿŒIú5 r@   N)
rœ   r�   rž   rÎ   r
   rý   r€   Ústrr&   r«   r‚   r‚   r‚   r†   rÿ   Î  s   
ÿrÿ   c                   @   sB   e Zd ZdZeddeƒedddƒedddƒed	d
ƒedd
ƒgZ	d
S )Ú
IE_RoutingzRouting Area Identityrü   r*   ÚMCCrË   r)   ÚMNCr(   ÚLACNZRAC)
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eddeƒeddeƒgZdS )r9   r:   rü   r@   Zreordering_requiredr6   N©rœ   r�   rž   rÎ   r
   rý   ÚTrueFalse_valuer«   r‚   r‚   r‚   r†   r9   ß  s   

ÿc                   @   s&   e Zd ZdZeddeƒeddƒgZdS )ÚIE_Recoveryr:   rü   rA   Zrestart_counterrì   N)rœ   r�   rž   rÎ   r
   rý   r   r«   r‚   r‚   r‚   r†   r  å  s   
ÿr  c                   @   s*   e Zd ZdZeddeƒedddeƒgZdS )ÚIE_SelectionModezSelection Moderü   rB   r;   r{   r@   N)	rœ   r�   rž   rÎ   r
   rý   r   ÚSelection_Moder«   r‚   r‚   r‚   r†   r  ë  s   
ÿÿr  c                   @   s(   e Zd ZdZeddeƒedeƒ ƒgZdS )ÚIE_TEIDIzTunnel Endpoint Identifier Datarü   r-   r<   N©	rœ   r�   rž   rÎ   r
   rý   r   r$   r«   r‚   r‚   r‚   r†   r
  ó  s   

ÿr
  c                   @   s(   e Zd ZdZeddeƒedeƒ ƒgZdS )ÚIE_TEICPz(Tunnel Endpoint Identifier Control Planerü   r.   ÚTEICINr  r‚   r‚   r‚   r†   r  ù  s   

ÿr  c                   @   s(   e Zd ZdZeddeƒeddeƒgZdS )ÚIE_TeardownzTeardown Indicatorrü   r0   Z	indicatorr}   Nr  r‚   r‚   r‚   r†   r  ÿ  s   

ÿr  c                   @   s8   e Zd ZdZeddeƒedddƒededdƒdƒgZdS )	ÚIE_NSAPIr=   rü   r1   Z	sparebitsr   r+   rB   N)	rœ   r�   rž   rÎ   r
   rý   r   r&   r«   r‚   r‚   r‚   r†   r    s
   

þr  c                
   @   sZ   e Zd ZdZeddeƒedddƒedddƒed	ddƒed
ddƒedddƒedddƒgZdS )ÚIE_ChargingCharacteristicszCharging Characteristicsrü   r3   Z
Ch_ChSpareNr+   Znormal_chargingr(   Zprepaid_chargingZflat_rate_chargingZhot_billing_chargingZCh_ChReservedr   r@   ©rœ   r�   rž   rÎ   r
   rý   r   r«   r‚   r‚   r‚   r†   r    s   






ór  c                   @   s(   e Zd ZdZeddeƒedddƒgZdS )ÚIE_TraceReferencezTrace Referencerü   r4   ZTrace_referenceNr-   r  r‚   r‚   r‚   r†   r     s   

ÿr  c                   @   s(   e Zd ZdZeddeƒedddƒgZdS )ÚIE_TraceTypez
Trace Typerü   rC   Z
Trace_typeNr-   r  r‚   r‚   r‚   r†   r  '  s   

ÿr  c                   @   s(   e Zd ZdZeddeƒedeƒ ƒgZdS )ÚIE_ChargingIdzCharging IDrü   rD   ZCharging_idNr  r‚   r‚   r‚   r†   r  .  s   

ÿr  c                
   @   sh   e Zd ZdZeddeƒeddƒedddƒed	d
dƒeddƒe	e
deƒ ƒdd„ ƒe	eddƒdd„ ƒgZdS )ÚIE_EndUserAddresszEnd User Addressrü   rE   r§   r)   ZSPARErB   r+   ZPDPTypeOrganizationr(   ÚPDPTypeNumberNZ
PDPAddressc                 C   s   | j dkp| j dkS )Nræ   é   ©r§   r·   r‚   r‚   r†   r¸   E  rˆ   zIE_EndUserAddress.<lambda>ZIPv6_PDPAddressú::1c                 C   s   | j dkp| j dkS )Nr/   r  r  r·   r‚   r‚   r†   r¸   G  rˆ   )rœ   r�   rž   rÎ   r
   rý   r   r	   r   r   r   r%   r   r«   r‚   r‚   r‚   r†   r  4  s   
	

ÿ
ÿñr  c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚAPNStrLenFieldc                 C   sr   d}|}|rjt |d ƒd }|t|ƒkr<td|t|ƒf ƒ ||d|… 7 }||d … }t|ƒr|d7 }q|}|S )Nrˆ   r   r(   zDAPN prematured end of character-string (size=%i, remaining bytes=%i)ó   .)r   r—   r   )rƒ   r„   rñ   Zret_sZtmp_srÀ   r‚   r‚   r†   r‘   L  s    
zAPNStrLenField.m2ic                 C   s0   t |tƒst|ƒ}d dd„ | d¡D ƒ¡}|S )Nrˆ   c                 s   s   | ]}t t|ƒƒ| V  qd S r�   )r   r—   )Ú.0Úxr‚   r‚   r†   Ú	<genexpr>]  rˆ   z%APNStrLenField.i2m.<locals>.<genexpr>r  )r”   r•   r   r‹   Úsplit)rƒ   r„   rñ   r‚   r‚   r†   r›   Z  s    
zAPNStrLenField.i2mN)rœ   r�   rž   r‘   r›   r‚   r‚   r‚   r†   r  J  s   r  c                   @   s>   e Zd ZdZeddeƒeddƒedddd	„ d
�gZdd„ Z	dS )ÚIE_AccessPointNamezAccess Point Namerü   rF   r§   NZAPNZnternetc                 C   s   | j S r�   r  ©r  r‚   r‚   r†   r¸   f  rˆ   zIE_AccessPointName.<lambda>rï   c                 C   s>   | j d u r:t|ƒd }|d d… t d|¡ |dd …  }|S ©Nr*   r)   rô   rº   r½   r‚   r‚   r†   rÁ   h  s    
$zIE_AccessPointName.post_build)
rœ   r�   rž   rÎ   r
   rý   r   r  r«   rÁ   r‚   r‚   r‚   r†   r   a  s   
þr   c                   @   s6   e Zd ZdZeddeƒeddƒedddd	„ d
�gZdS )ÚIE_ProtocolConfigurationOptionszProtocol Configuration Optionsrü   rG   r§   r+   ZProtocol_ConfigurationrË   c                 C   s   | j S r�   r  r!  r‚   r‚   r†   r¸   t  rˆ   z(IE_ProtocolConfigurationOptions.<lambda>rï   N)	rœ   r�   rž   rÎ   r
   rý   r   r   r«   r‚   r‚   r‚   r†   r#  o  s   
ÿþr#  c                   @   sT   e Zd ZdZeddeƒeddƒeede	ƒ ƒdd„ ƒee
d	d
ƒdd„ ƒgZdd„ ZdS )ÚIE_GSNAddresszGSN Addressrü   rH   r§   NÚipv4_addressc                 C   s
   | j dkS ©Nr+   r  r·   r‚   r‚   r†   r¸   |  rˆ   zIE_GSNAddress.<lambda>Úipv6_addressr  c                 C   s
   | j dkS ©Nr-   r  r·   r‚   r‚   r†   r¸   ~  rˆ   c                 C   s>   | j d u r:t|ƒd }|d d… t d|¡ |dd …  }|S r"  rº   r½   r‚   r‚   r†   rÁ   €  s    
$zIE_GSNAddress.post_build)rœ   r�   rž   rÎ   r
   rý   r   r   r   r%   r   r«   rÁ   r‚   r‚   r‚   r†   r$  w  s   
ÿ
ÿür$  c                   @   sF   e Zd ZdZeddeƒeddƒedddg d	¢ƒed
ddd„ d�gZ	dS )ÚIE_MSInternationalNumberzMS International Numberrü   rI   r§   NÚflagsé‘   r@   )Ú	ExtensionrË   rË   zInternational NumberrË   rË   rË   zISDN numberingÚdigitsZ33607080910c                 C   s
   | j d S rµ   r  r!  r‚   r‚   r†   r¸   Œ  rˆ   z!IE_MSInternationalNumber.<lambda>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eddƒeddƒedddƒeddd	ƒed
dd	ƒedddƒedddƒeddd	ƒeddd	ƒedddƒeddd	ƒedddƒeddd	ƒeddƒeddƒeddƒedddƒedddƒedddƒeddd	ƒeddƒeddƒgZdS )ÚQoS_ProfilezQoS profileZqos_eir   r§   NÚspare1r)   Údelay_classr*   Úreliability_classÚpeak_troughputr+   Úspare2r(   Úprecedence_classÚspare3Úmean_troughputr,   Útraffic_classÚdelivery_orderÚdelivery_of_err_sduÚmax_sdu_sizeÚmax_bitrate_upÚmax_bitrate_downÚredidual_berÚsdu_err_ratioÚtransfer_delayÚtraffic_handling_prioÚguaranteed_bit_rate_upÚguaranteed_bit_rate_down)rœ   r�   rž   rÎ   r   r   r	   r«   r‚   r‚   r‚   r†   r.  �  s0   














ër.  c                %   @   s€  e Zd ZdZeddeƒeddƒeddƒee	dd	d
ƒdd„ ƒee	dd	dƒdd„ ƒee	dd	dƒdd„ ƒee	dd	dƒdd„ ƒee
dd	dƒdd„ ƒee	dd	dƒdd„ ƒee	dd	dƒdd„ ƒee	dd	dƒdd„ ƒee	dd	dƒdd„ ƒee	d d	d
ƒd!d„ ƒee	d"d	dƒ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+d„ ƒee	d,d	dƒd-d„ ƒee	d.d	d/ƒd0d„ ƒee	d1d	d
ƒd2d„ ƒeed3dƒd4d„ ƒeed5dƒd6d„ ƒee	d7d	dƒd8d„ ƒee
d9d	dƒd:d„ ƒee	d;d	dƒd<d„ ƒeed=dƒd>d„ ƒeed?dƒd@d„ ƒeedAdƒdBd„ ƒeedCdƒdDd„ ƒeedEdƒdFd„ ƒeedGdƒdHd„ ƒeedIdƒdJd„ ƒeedKdƒdLd„ ƒg"ZdS )MÚIE_QoSr>   rü   rJ   r§   NZallocation_retention_prioiryr(   r/  r   r)   c                 C   s   | j o| j dkS rµ   r  rî   r‚   r‚   r†   r¸   ±  rˆ   zIE_QoS.<lambda>r0  r*   c                 C   s   | j o| j dkS rµ   r  rî   r‚   r‚   r†   r¸   ³  rˆ   r1  c                 C   s   | j o| j dkS rµ   r  rî   r‚   r‚   r†   r¸   µ  rˆ   r2  r+   c                 C   s   | j o| j dkS ©Nr)   r  rî   r‚   r‚   r†   r¸   ¸  rˆ   r3  c                 C   s   | j o| j dkS rD  r  rî   r‚   r‚   r†   r¸   º  rˆ   r4  c                 C   s   | j o| j dkS rD  r  rî   r‚   r‚   r†   r¸   ¼  rˆ   r5  c                 C   s   | j o| j dkS ©Nr*   r  rî   r‚   r‚   r†   r¸   ¿  rˆ   r6  r,   c                 C   s   | j o| j dkS rE  r  rî   r‚   r‚   r†   r¸   Á  rˆ   r7  c                 C   s   | j o| j dkS r&  r  rî   r‚   r‚   r†   r¸   Ä  rˆ   r8  c                 C   s   | j o| j dkS r&  r  rî   r‚   r‚   r†   r¸   Æ  rˆ   r9  c                 C   s   | j o| j dkS r&  r  rî   r‚   r‚   r†   r¸   È  rˆ   r:  c                 C   s   | j o| j dkS )Nr,   r  rî   r‚   r‚   r†   r¸   Ë  rˆ   r;  c                 C   s   | j o| j dkS )Nræ   r  rî   r‚   r‚   r†   r¸   Í  rˆ   r<  c                 C   s   | j o| j dkS )NrÉ   r  rî   r‚   r‚   r†   r¸   Ï  rˆ   r=  c                 C   s   | j o| j dkS ©Nr@   r  rî   r‚   r‚   r†   r¸   Ò  rˆ   r>  c                 C   s   | j o| j dkS rF  r  rî   r‚   r‚   r†   r¸   Ô  rˆ   r?  ræ   c                 C   s   | j o| j dkS ©Né	   r  rî   r‚   r‚   r†   r¸   Ö  rˆ   r@  c                 C   s   | j o| j dkS rG  r  rî   r‚   r‚   r†   r¸   Ú  rˆ   rA  c                 C   s   | j o| j dkS )Né
   r  rî   r‚   r‚   r†   r¸   Ý  rˆ   rB  c                 C   s   | j o| j dkS )Né   r  rî   r‚   r‚   r†   r¸   à  rˆ   Zspare4c                 C   s   | j o| j dkS ©Né   r  rî   r‚   r‚   r†   r¸   ã  rˆ   Zsignaling_indicationc                 C   s   | j o| j dkS rK  r  rî   r‚   r‚   r†   r¸   å  rˆ   Zsource_stats_descc                 C   s   | j o| j dkS rK  r  rî   r‚   r‚   r†   r¸   ç  rˆ   Zmax_bitrate_down_extc                 C   s   | j o| j dkS )Né   r  rî   r‚   r‚   r†   r¸   ê  rˆ   Zguaranteed_bitrate_down_extc                 C   s   | j o| j dkS )NrA   r  rî   r‚   r‚   r†   r¸   í  rˆ   Zmax_bitrate_up_extc                 C   s   | j o| j dkS )NrB   r  rî   r‚   r‚   r†   r¸   ï  rˆ   Zguaranteed_bitrate_up_extc                 C   s   | j o| j dkS r(  r  rî   r‚   r‚   r†   r¸   ò  rˆ   Zmax_bitrate_down_ext2c                 C   s   | j o| j dkS )Nr.   r  rî   r‚   r‚   r†   r¸   ô  rˆ   Zguaranteed_bitrate_down_ext2c                 C   s   | j o| j dkS )Nr/   r  rî   r‚   r‚   r†   r¸   ÷  rˆ   Zmax_bitrate_up_ext2c                 C   s   | j o| j dkS )Nr0   r  rî   r‚   r‚   r†   r¸   ù  rˆ   Zguaranteed_bitrate_up_ext2c                 C   s   | j o| j dkS )Nr1   r  rî   r‚   r‚   r†   r¸   ü  rˆ   )rœ   r�   rž   rÎ   r
   rý   r   r   r   r   r	   r«   r‚   r‚   r‚   r†   rC  ª  sÞ   
ÿÿÿÿÿÿÿÿÿÿÿ
ÿ
ÿ
ÿÿÿÿþý
ÿÿþÿÿÿ
ÿÿþ
ÿÿþ
ÿÿþ
ÿÿþ²rC  c                   @   sv   e Zd ZdZeddeƒeddƒedddƒed	ddƒed
ddƒedddƒedddƒedddƒedddƒedddƒg
ZdS )ÚIE_CommonFlagszCommon Flagsrü   rK   r§   NZdual_addr_bearer_flr   r(   Zupgrade_qos_supportedZnrsnZno_qos_negoZmbms_cnting_infoZran_procedure_readyZmbms_service_typeZprohibit_payload_compression©	rœ   r�   rž   rÎ   r
   rý   r   r	   r«   r‚   r‚   r‚   r†   rN  ÿ  s   








÷rN  c                   @   s.   e Zd ZdZeddeƒeddƒeddƒgZdS )	ÚIE_APNRestrictionzAPN Restrictionrü   rL   r§   r(   Zrestriction_type_valuer   N©	rœ   r�   rž   rÎ   r
   rý   r   r   r«   r‚   r‚   r‚   r†   rP    s
   
þrP  c                   @   s0   e Zd ZdZeddeƒeddƒeddeƒgZdS )Ú
IE_RATTypezRat Typerü   rM   r§   r(   ZRAT_TypeN)	rœ   r�   rž   rÎ   r
   rý   r   ÚRATTyper«   r‚   r‚   r‚   r†   rR    s
   

þrR  c                	   @   sR   e Zd ZdZeddeƒeddƒeddƒedd	d
ƒedd	dƒeddƒeddƒgZ	dS )ÚIE_UserLocationInformationzUser Location Informationrü   rN   r§   Nrß   r(   r  rË   r)   r  r  ZSAC)
rœ   r�   rž   rÎ   r
   rý   r   r   r€   r«   r‚   r‚   r‚   r†   rT    s   


ørT  c                   @   sB   e Zd ZdZeddeƒeddƒeddƒeddd	ƒe	d
ddƒgZ
dS )ÚIE_MSTimeZonezMS Time Zonerü   rO   r§   NÚtimezoner   Úspareræ   Zdaylight_saving_timer)   )rœ   r�   rž   rÎ   r
   rý   r   r   r	   r   r«   r‚   r‚   r‚   r†   rU  (  s   


ürU  c                   @   s6   e Zd ZdZeddeƒeddƒedddd„ d	�gZdS )
ÚIE_IMEIr?   rü   rP   r§   NrË   c                 C   s   | j S r�   r  r!  r‚   r‚   r†   r¸   5  rˆ   zIE_IMEI.<lambda>rï   )	rœ   r�   rž   rÎ   r
   rý   r   r€   r«   r‚   r‚   r‚   r†   rX  1  s
   
þrX  c                   @   s.   e Zd ZdZeddeƒeddƒeddƒgZdS )	ÚIE_MSInfoChangeReportingActionzMS Info Change Reporting Actionrü   rQ   r§   r(   ÚActionr   NrQ  r‚   r‚   r‚   r†   rY  8  s
   
þrY  c                	   @   sN   e Zd ZdZeddeƒeddƒedddƒed	ddƒed
ddƒedddƒgZdS )ÚIE_DirectTunnelFlagszDirect Tunnel Flagsrü   é¶   r§   r(   rW  r   r,   ZEIZGCSIZDTINrO  r‚   r‚   r‚   r†   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 )	ÚIE_BearerControlModezBearer Control Moderü   rR   r§   r(   Zbearer_control_moder   NrQ  r‚   r‚   r‚   r†   r]  J  s
   
þr]  c                
   @   sX   e Zd ZdZeddeƒeddƒedddƒedddƒed	dd
ƒedddƒedddƒgZ	dS )Ú%IE_EvolvedAllocationRetentionPriorityz%Evolved Allocation/Retention Priorityrü   rS   r§   r(   r/  r   ZPCIZPLr+   r3  ZPVIN)
rœ   r�   rž   rÎ   r
   rý   r   r	   r   r«   r‚   r‚   r‚   r†   r^  Q  s   





úr^  c                   @   sJ   e Zd ZdZeddeƒeddƒeeddƒdd	„ ƒee	d
dƒdd	„ ƒgZ
dS )ÚIE_CharginGatewayAddresszChargin Gateway Addressrü   éû   r§   r+   r%  ú	127.0.0.1c                 C   s
   | j dkS r&  r  r·   r‚   r‚   r†   r¸   b  s    z!IE_CharginGatewayAddress.<lambda>r'  r  c                 C   s
   | j dkS r(  r  r·   r‚   r‚   r†   r¸   d  s    N)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eddeƒeddƒeddƒedd	d
d„ d�gZ	dS )ÚIE_PrivateExtensionzPrivate Extensionrü   r7   r§   r(   Zextension_identifierr   Zextention_valuerË   c                 C   s   | j S r�   r  r!  r‚   r‚   r†   r¸   n  rˆ   zIE_PrivateExtension.<lambda>rï   N)
rœ   r�   rž   rÎ   r
   rý   r   r   r   r«   r‚   r‚   r‚   r†   rb  h  s   
ÿýrb  c                   @   s>   e Zd ZdZeddeƒedddd�eddd	ged
dƒƒgZ	dS )ÚIE_ExtensionHeaderListzExtension Header Listrü   é�   r§   NZextension_headers)Z	length_ofr   rV   rË   r   )
rœ   r�   rž   rÎ   r
   rý   r   r   r   r«   r‚   r‚   r‚   r†   rc  q  s
   
þrc  c                   @   s>   e Zd ZdZeddeƒeddƒedddd	„ d
�gZdd„ Z	dS )ÚIE_NotImplementedTLVzIE not implementedrü   r   r§   NÚdatarË   c                 C   s   | j S r�   r  r!  r‚   r‚   r†   r¸   |  rˆ   zIE_NotImplementedTLV.<lambda>rï   c                 C   s   d|fS r÷   r‚   rø   r‚   r‚   r†   rù   ~  s    z$IE_NotImplementedTLV.extract_padding)
rœ   r�   rž   rÎ   r
   rý   r   r   r«   rù   r‚   r‚   r‚   r†   re  x  s   
þre  )!r(   r)   r*   r@   rA   rB   r-   r.   r0   r1   r3   r4   rC   rD   rE   rF   rG   rH   rI   rJ   rd  rK   rL   rM   rN   rO   rP   rQ   r\  rR   rS   r`  r7   c                 C   sL   t | ƒdk rt| ƒS t| d ƒ}t |t¡}|tkrD|d@ dkrDt}|| ƒS )z-Choose the correct Information Element class.r(   r   rE   )r—   r#   r   Ú	ietypeclsrÍ   re  )rñ   rü   r¡   r‚   r‚   r†   ÚIE_Dispatcher¥  s    rh  c                   @   s&   e Zd ZdZedg eƒgZdd„ ZdS )ÚGTPEchoResponsezGTP Echo ResponseÚIE_listc                 C   s
   t |tƒS r�   )r”   rõ   rÇ   r‚   r‚   r†   rÆ   ¸  s    zGTPEchoResponse.answersN©rœ   r�   rž   rÎ   r   rh  r«   rÆ   r‚   r‚   r‚   r†   ri  ³  s   ri  c                   @   sN   e Zd ZdZedeƒ eƒ edeƒ d�edeƒ d�e	dde
dƒd�geƒgZdS )	ÚGTPCreatePDPContextRequestzGTP Create PDP Context Requestrj  r+   )r§   r%  rJ   rB   )rü   r§   rf  N)rœ   r�   rž   rÎ   r   r
  r  r$  r%   re  r'   rh  r«   r‚   r‚   r‚   r†   rl  ¼  s   þýrl  c                   @   s&   e Zd ZdZedg eƒgZdd„ ZdS )ÚGTPCreatePDPContextResponsezGTP Create PDP Context Responserj  c                 C   s
   t |tƒS r�   )r”   rl  rÇ   r‚   r‚   r†   rÆ   Ê  s    z#GTPCreatePDPContextResponse.answersNrk  r‚   r‚   r‚   r†   rm  Å  s   rm  c                   @   sj   e Zd ZdZedeƒ eƒ eƒ eƒ e	ƒ e
ƒ eƒ eƒ eƒ eƒ eƒ eƒ eƒ eƒ eƒ eƒ eƒ eƒ eƒ geƒgZdS )ÚGTPUpdatePDPContextRequestzGTP Update PDP Context Requestrj  N)rœ   r�   rž   rÎ   r   rû   r  r
  r  r  r#  r$  rC  r_  rN  rP  r]  rY  r^  rb  rh  r«   r‚   r‚   r‚   r†   rn  Î  s0   íìrn  c                   @   s&   e Zd ZdZeddeƒgZdd„ ZdS )ÚGTPUpdatePDPContextResponsezGTP Update PDP Context Responserj  Nc                 C   s
   t |tƒS r�   )r”   rn  rÇ   r‚   r‚   r†   rÆ   í  s    z#GTPUpdatePDPContextResponse.answersrk  r‚   r‚   r‚   r†   ro  è  s   ro  c                   @   s   e Zd ZdZedg eƒgZdS )ÚGTPErrorIndicationzGTP Error Indicationrj  N©rœ   r�   rž   rÎ   r   rh  r«   r‚   r‚   r‚   r†   rp  ñ  s   rp  c                   @   s   e Zd ZdZedg eƒgZdS )ÚGTPDeletePDPContextRequestzGTP Delete PDP Context Requestrj  Nrq  r‚   r‚   r‚   r†   rr  ÷  s   rr  c                   @   s   e Zd ZdZedg eƒgZdS )ÚGTPDeletePDPContextResponsezGTP Delete PDP Context Responserj  Nrq  r‚   r‚   r‚   r†   rs  ý  s   rs  c                	   @   s@   e Zd ZdZedeƒ eeƒ d�edd�e	ƒ e
dd�geƒgZdS )	ÚGTPPDUNotificationRequestzGTP PDU Notification Requestrj  )r  é!   )r  ra  )r%  N)rœ   r�   rž   rÎ   r   rÿ   r  r$   r  r   r$  rh  r«   r‚   r‚   r‚   r†   rt    s   
üûrt  c                   @   s"   e Zd ZdZedeƒ geƒgZdS )Ú(GTPSupportedExtensionHeadersNotificationz,GTP Supported Extension Headers Notificationrj  N)rœ   r�   rž   rÎ   r   rc  rh  r«   r‚   r‚   r‚   r†   rv    s   
ÿrv  c                   @   s(   e Zd ZdZeddeƒedddƒgZdS )ÚGTPmorethan1500zGTP More than 1500rû   r8   ZIEr(   ià.  N)rœ   r�   rž   rÎ   r
   rý   r	   r«   r‚   r‚   r‚   r†   rw    s   

ÿrw  iK  )Údport)Úsport)rx  ry  r(   )r³   r±   r)   r-   )r³   r.   r/   r0   r1   r2   r4   r5   r   )r¨   r°   rV   ih  r3   r7   rH   )r³   r°   r¨   )uÚ__doc__Ú
__future__r   r»   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   Zscapy.layers.inetr   r   Zscapy.layers.inet6r   r   Zscapy.layers.pppr   Zscapy.packetr   r    r!   r"   r#   Zscapy.volatiler$   r%   r&   r'   rS  rÏ   rý   rþ   r	  r  rª   r€   rŠ   rŸ   r    r¬   r­   rÐ   rÌ   rÕ   rõ   rö   rû   rÿ   r  r9   r  r  r
  r  r  r  r  r  r  r  r  r  r   r#  r$  r)  r.  rC  rN  rP  rR  rT  rU  rX  rY  r[  r]  r^  r_  rb  rc  re  rg  rh  ri  rl  rm  rn  ro  rp  rr  rs  rt  rv  rw  r‚   r‚   r‚   r†   Ú<module>   s   Pûôá!Ó/ýÿø!6ökU		
à#				
ÿ