From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 0F507A04DD; Thu, 2 Jan 2020 06:32:51 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id BD1F71BF9A; Thu, 2 Jan 2020 06:32:50 +0100 (CET) Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) by dpdk.org (Postfix) with ESMTP id 35C6E1BF74 for ; Thu, 2 Jan 2020 06:32:48 +0100 (CET) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga002.jf.intel.com ([10.7.209.21]) by fmsmga104.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 01 Jan 2020 21:32:48 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.69,385,1571727600"; d="scan'208";a="231723715" Received: from fmsmsx106.amr.corp.intel.com ([10.18.124.204]) by orsmga002.jf.intel.com with ESMTP; 01 Jan 2020 21:32:47 -0800 Received: from fmsmsx154.amr.corp.intel.com (10.18.116.70) by FMSMSX106.amr.corp.intel.com (10.18.124.204) with Microsoft SMTP Server (TLS) id 14.3.439.0; Wed, 1 Jan 2020 21:32:47 -0800 Received: from shsmsx154.ccr.corp.intel.com (10.239.6.54) by FMSMSX154.amr.corp.intel.com (10.18.116.70) with Microsoft SMTP Server (TLS) id 14.3.439.0; Wed, 1 Jan 2020 21:32:46 -0800 Received: from shsmsx101.ccr.corp.intel.com ([169.254.1.30]) by SHSMSX154.ccr.corp.intel.com ([169.254.7.132]) with mapi id 14.03.0439.000; Thu, 2 Jan 2020 13:32:45 +0800 From: "Tu, Lijuan" To: "He, Zhiwei" , "dts@dpdk.org" CC: "He, Zhiwei" Thread-Topic: [dts] [PATCH V1 1/2] dep/add gtp for the advanced rss feature support gtp packets in CVL Thread-Index: AQHVv9L64uVKYxx6+0eBUwJBZSZCwqfW3G8A Date: Thu, 2 Jan 2020 05:32:44 +0000 Message-ID: <8CE3E05A3F976642AAB0F4675D0AD20E0BBA10AA@SHSMSX101.ccr.corp.intel.com> References: <1577794029-82969-1-git-send-email-zhiwei.he@intel.com> In-Reply-To: <1577794029-82969-1-git-send-email-zhiwei.he@intel.com> Accept-Language: zh-CN, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: dlp-product: dlpe-windows dlp-version: 11.2.0.6 dlp-reaction: no-action x-originating-ip: [10.239.127.40] Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Subject: Re: [dts] [PATCH V1 1/2] dep/add gtp for the advanced rss feature support gtp packets in CVL X-BeenThere: dts@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: test suite reviews and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dts-bounces@dpdk.org Sender: "dts" Applied the series. > -----Original Message----- > From: dts [mailto:dts-bounces@dpdk.org] On Behalf Of zhiwei.he > Sent: Tuesday, December 31, 2019 8:07 PM > To: dts@dpdk.org > Cc: He, Zhiwei > Subject: [dts] [PATCH V1 1/2] dep/add gtp for the advanced rss feature > support gtp packets in CVL >=20 > From: "zhiwei.he" >=20 > Signed-off-by: zhiwei.he > --- > dep/gtp.py | 909 > +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 909 insertions(+) > create mode 100644 dep/gtp.py >=20 > diff --git a/dep/gtp.py b/dep/gtp.py > new file mode 100644 > index 0000000..7d57789 > --- /dev/null > +++ b/dep/gtp.py > @@ -0,0 +1,909 @@ > +#! /usr/bin/env python > + > +# Copyright (C) 2018 Leonardo Monteiro > +# 2017 Alexis Sultan > +# 2017 Alessio Deiana > +# 2014 Guillaume Valadon > +# 2012 ffranz > +## > +# This program is published under a GPLv2 license > + > +# scapy.contrib.description =3D GPRS Tunneling Protocol (GTP) # > +scapy.contrib.status =3D loads > + > +from __future__ import absolute_import > +import struct > + > + > +from scapy.compat import chb, orb > +from scapy.error import warning > +from scapy.fields import BitEnumField, BitField, ByteEnumField, ByteFiel= d, \ > + ConditionalField, FieldLenField, FieldListField, FlagsField, IntFiel= d, \ > + IPField, PacketListField, ShortField, StrFixedLenField, StrLenField,= \ > + XBitField, XByteField, XIntField > +from scapy.layers.inet import IP, UDP > +from scapy.layers.inet6 import IP6Field from scapy.modules.six.moves > +import range from scapy.packet import bind_layers, Packet, Raw from > +scapy.volatile import RandInt, RandIP, RandNum, RandString > + > + > +# GTP Data types > + > +RATType =3D { > + 1: "UTRAN", > + 2: "GETRAN", > + 3: "WLAN", > + 4: "GAN", > + 5: "HSPA" > +} > + > +GTPmessageType =3D {1: "echo_request", > + 2: "echo_response", > + 16: "create_pdp_context_req", > + 17: "create_pdp_context_res", > + 18: "update_pdp_context_req", > + 19: "update_pdp_context_resp", > + 20: "delete_pdp_context_req", > + 21: "delete_pdp_context_res", > + 26: "error_indication", > + 27: "pdu_notification_req", > + 31: "supported_extension_headers_notification", > + 254: "end_marker", > + 255: "g_pdu"} > + > +IEType =3D {1: "Cause", > + 2: "IMSI", > + 3: "RAI", > + 4: "TLLI", > + 5: "P_TMSI", > + 8: "IE_ReorderingRequired", > + 14: "Recovery", > + 15: "SelectionMode", > + 16: "TEIDI", > + 17: "TEICP", > + 19: "TeardownInd", > + 20: "NSAPI", > + 26: "ChargingChrt", > + 27: "TraceReference", > + 28: "TraceType", > + 127: "ChargingId", > + 128: "EndUserAddress", > + 131: "AccessPointName", > + 132: "ProtocolConfigurationOptions", > + 133: "GSNAddress", > + 134: "MSInternationalNumber", > + 135: "QoS", > + 148: "CommonFlags", > + 149: "APNRestriction", > + 151: "RatType", > + 152: "UserLocationInformation", > + 153: "MSTimeZone", > + 154: "IMEI", > + 181: "MSInfoChangeReportingAction", > + 184: "BearerControlMode", > + 191: "EvolvedAllocationRetentionPriority", > + 255: "PrivateExtention"} > + > +CauseValues =3D {0: "Request IMSI", > + 1: "Request IMEI", > + 2: "Request IMSI and IMEI", > + 3: "No identity needed", > + 4: "MS Refuses", > + 5: "MS is not GPRS Responding", > + 128: "Request accepted", > + 129: "New PDP type due to network preference", > + 130: "New PDP type due to single address bearer only", > + 192: "Non-existent", > + 193: "Invalid message format", > + 194: "IMSI not known", > + 195: "MS is GPRS Detached", > + 196: "MS is not GPRS Responding", > + 197: "MS Refuses", > + 198: "Version not supported", > + 199: "No resources available", > + 200: "Service not supported", > + 201: "Mandatory IE incorrect", > + 202: "Mandatory IE missing", > + 203: "Optional IE incorrect", > + 204: "System failure", > + 205: "Roaming restriction", > + 206: "P-TMSI Signature mismatch", > + 207: "GPRS connection suspended", > + 208: "Authentication failure", > + 209: "User authentication failed", > + 210: "Context not found", > + 211: "All dynamic PDP addresses are occupied", > + 212: "No memory is available", > + 213: "Reallocation failure", > + 214: "Unknown mandatory extension header", > + 215: "Semantic error in the TFT operation", > + 216: "Syntactic error in TFT operation", > + 217: "Semantic errors in packet filter(s)", > + 218: "Syntactic errors in packet filter(s)", > + 219: "Missing or unknown APN", > + 220: "Unknown PDP address or PDP type", > + 221: "PDP context without TFT already activated", > + 222: "APN access denied : no subscription", > + 223: "APN Restriction type incompatibility with currently= active PDP > Contexts", # noqa: E501 > + 224: "MS MBMS Capabilities Insufficient", > + 225: "Invalid Correlation : ID", > + 226: "MBMS Bearer Context Superseded", > + 227: "Bearer Control Mode violation", > + 228: "Collision with network initiated request"} > + > +Selection_Mode =3D {11111100: "MS or APN", > + 11111101: "MS", > + 11111110: "NET", > + 11111111: "FutureUse"} > + > +TrueFalse_value =3D {254: "False", > + 255: "True"} > + > +# > +http://www.arib.or.jp/IMT-2000/V720Mar09/5_Appendix/Rel8/29/29281- > 800.p > +df > +ExtensionHeadersTypes =3D { > + 0: "No more extension headers", > + 1: "Reserved", > + 2: "Reserved", > + 64: "UDP Port", > + 192: "PDCP PDU Number", > + 193: "Reserved", > + 194: "Reserved" > +} > + > + > +class TBCDByteField(StrFixedLenField): > + > + def i2h(self, pkt, val): > + return val > + > + def m2i(self, pkt, val): > + ret =3D [] > + for v in val: > + byte =3D orb(v) > + left =3D byte >> 4 > + right =3D byte & 0xf > + if left =3D=3D 0xf: > + ret.append(TBCD_TO_ASCII[right:right + 1]) > + else: > + ret +=3D [TBCD_TO_ASCII[right:right + 1], TBCD_TO_ASCII[= left:left + 1]] > # noqa: E501 > + return b"".join(ret) > + > + def i2m(self, pkt, val): > + val =3D str(val) > + ret_string =3D "" > + for i in range(0, len(val), 2): > + tmp =3D val[i:i + 2] > + if len(tmp) =3D=3D 2: > + ret_string +=3D chr(int(tmp[1] + tmp[0], 16)) > + else: > + ret_string +=3D chr(int("F" + tmp[0], 16)) > + return ret_string > + > + > +TBCD_TO_ASCII =3D b"0123456789*#abc" > + > + > +class GTP_ExtensionHeader(Packet): > + @classmethod > + def dispatch_hook(cls, _pkt=3DNone, *args, **kargs): > + if _pkt is None: > + return GTP_UDPPort_ExtensionHeader > + return cls > + > + > +class GTP_UDPPort_ExtensionHeader(GTP_ExtensionHeader): > + fields_desc =3D [ByteField("length", 0x40), > + ShortField("udp_port", None), > + ByteEnumField("next_ex", 0, ExtensionHeadersTypes), > +] > + > + > +class GTP_PDCP_PDU_ExtensionHeader(GTP_ExtensionHeader): > + fields_desc =3D [ByteField("length", 0x01), > + ShortField("pdcp_pdu", None), > + ByteEnumField("next_ex", 0, ExtensionHeadersTypes), > +] > + > + > +class GTPHeader(Packet): > + # 3GPP TS 29.060 V9.1.0 (2009-12) > + name =3D "GTP-C Header" > + fields_desc =3D [BitField("version", 1, 3), > + BitField("PT", 1, 1), > + BitField("reserved", 0, 1), > + BitField("E", 0, 1), > + BitField("S", 0, 1), > + BitField("PN", 0, 1), > + ByteEnumField("gtp_type", None, GTPmessageType), > + ShortField("length", None), > + IntField("teid", 0), > + ConditionalField(XBitField("seq", 0, 16), lambda pkt:= pkt.E =3D=3D 1 or > pkt.S =3D=3D 1 or pkt.PN =3D=3D 1), # noqa: E501 > + ConditionalField(ByteField("npdu", 0), lambda pkt:pkt= .E =3D=3D 1 or > pkt.S =3D=3D 1 or pkt.PN =3D=3D 1), # noqa: E501 > + ConditionalField(ByteEnumField("next_ex", 0, > +ExtensionHeadersTypes), lambda pkt:pkt.E =3D=3D 1 or pkt.S =3D=3D 1 or p= kt.PN > +=3D=3D 1), ] # noqa: E501 > + > + def post_build(self, p, pay): > + p +=3D pay > + if self.length is None: > + tmp_len =3D len(p) - 8 > + p =3D p[:2] + struct.pack("!H", tmp_len) + p[4:] > + return p > + > + def hashret(self): > + return struct.pack("B", self.version) + self.payload.hashret() > + > + def answers(self, other): > + return (isinstance(other, GTPHeader) and > + self.version =3D=3D other.version and > + self.payload.answers(other.payload)) > + > + @classmethod > + def dispatch_hook(cls, _pkt=3DNone, *args, **kargs): > + if _pkt and len(_pkt) >=3D 1: > + if (orb(_pkt[0]) >> 5) & 0x7 =3D=3D 2: > + from . import gtp_v2 > + return gtp_v2.GTPHeader > + if _pkt and len(_pkt) >=3D 8: > + _gtp_type =3D orb(_pkt[1:2]) > + return GTPforcedTypes.get(_gtp_type, GTPHeader) > + return cls > + > + > +class GTP_U_Header(GTPHeader): > + # 3GPP TS 29.060 V9.1.0 (2009-12) > + name =3D "GTP-U Header" > + # GTP-U protocol is used to transmit T-PDUs between GSN pairs (or > between an SGSN and an RNC in UMTS), # noqa: E501 > + # encapsulated in G-PDUs. A G-PDU is a packet including a GTP-U head= er > and a T-PDU. The Path Protocol # noqa: E501 > + # defines the path and the GTP-U header defines the tunnel. Several > +tunnels may be multiplexed on a single path. # noqa: E501 > + > + > +# Some gtp_types have to be associated with a certain type of header > +GTPforcedTypes =3D { > + 16: GTPHeader, > + 17: GTPHeader, > + 18: GTPHeader, > + 19: GTPHeader, > + 20: GTPHeader, > + 21: GTPHeader, > + 26: GTP_U_Header, > + 27: GTPHeader, > + 254: GTP_U_Header, > + 255: GTP_U_Header > +} > + > + > +class GTPEchoRequest(Packet): > + # 3GPP TS 29.060 V9.1.0 (2009-12) > + name =3D "GTP Echo Request" > + > + def hashret(self): > + return struct.pack("H", self.seq) > + > + > +class IE_Base(Packet): > + > + def extract_padding(self, pkt): > + return "", pkt > + > + > +class IE_Cause(IE_Base): > + name =3D "Cause" > + fields_desc =3D [ByteEnumField("ietype", 1, IEType), > + ByteEnumField("CauseValue", None, CauseValues)] > + > + > +class IE_IMSI(IE_Base): > + name =3D "IMSI - Subscriber identity of the MS" > + fields_desc =3D [ByteEnumField("ietype", 2, IEType), > + TBCDByteField("imsi", str(RandNum(0, > +999999999999999)), 8)] > + > + > +class IE_Routing(IE_Base): > + name =3D "Routing Area Identity" > + fields_desc =3D [ByteEnumField("ietype", 3, IEType), > + TBCDByteField("MCC", "", 2), > + # MNC: if the third digit of MCC is 0xf, > + # then the length of MNC is 1 byte > + TBCDByteField("MNC", "", 1), > + ShortField("LAC", None), > + ByteField("RAC", None)] > + > + > +class IE_ReorderingRequired(IE_Base): > + name =3D "Recovery" > + fields_desc =3D [ByteEnumField("ietype", 8, IEType), > + ByteEnumField("reordering_required", 254, > +TrueFalse_value)] > + > + > +class IE_Recovery(IE_Base): > + name =3D "Recovery" > + fields_desc =3D [ByteEnumField("ietype", 14, IEType), > + ByteField("restart_counter", 24)] > + > + > +class IE_SelectionMode(IE_Base): > + # Indicates the origin of the APN in the message > + name =3D "Selection Mode" > + fields_desc =3D [ByteEnumField("ietype", 15, IEType), > + BitEnumField("SelectionMode", "MS or APN", > + 8, Selection_Mode)] > + > + > +class IE_TEIDI(IE_Base): > + name =3D "Tunnel Endpoint Identifier Data" > + fields_desc =3D [ByteEnumField("ietype", 16, IEType), > + XIntField("TEIDI", RandInt())] > + > + > +class IE_TEICP(IE_Base): > + name =3D "Tunnel Endpoint Identifier Control Plane" > + fields_desc =3D [ByteEnumField("ietype", 17, IEType), > + XIntField("TEICI", RandInt())] > + > + > +class IE_Teardown(IE_Base): > + name =3D "Teardown Indicator" > + fields_desc =3D [ByteEnumField("ietype", 19, IEType), > + ByteEnumField("indicator", "True", TrueFalse_value)] > + > + > +class IE_NSAPI(IE_Base): > + # Identifies a PDP context in a mobility management context specifie= d by > TEICP # noqa: E501 > + name =3D "NSAPI" > + fields_desc =3D [ByteEnumField("ietype", 20, IEType), > + XBitField("sparebits", 0x0000, 4), > + XBitField("NSAPI", RandNum(0, 15), 4)] > + > + > +class IE_ChargingCharacteristics(IE_Base): > + # Way of informing both the SGSN and GGSN of the rules for > + name =3D "Charging Characteristics" > + fields_desc =3D [ByteEnumField("ietype", 26, IEType), > + # producing charging information based on operator co= nfigured > triggers. # noqa: E501 > + # 0000 .... .... .... : spare > + # .... 1... .... .... : normal charging > + # .... .0.. .... .... : prepaid charging > + # .... ..0. .... .... : flat rate charging > + # .... ...0 .... .... : hot billing charging > + # .... .... 0000 0000 : reserved > + XBitField("Ch_ChSpare", None, 4), > + XBitField("normal_charging", None, 1), > + XBitField("prepaid_charging", None, 1), > + XBitField("flat_rate_charging", None, 1), > + XBitField("hot_billing_charging", None, 1), > + XBitField("Ch_ChReserved", 0, 8)] > + > + > +class IE_TraceReference(IE_Base): > + # Identifies a record or a collection of records for a particular tr= ace. > + name =3D "Trace Reference" > + fields_desc =3D [ByteEnumField("ietype", 27, IEType), > + XBitField("Trace_reference", None, 16)] > + > + > +class IE_TraceType(IE_Base): > + # Indicates the type of the trace > + name =3D "Trace Type" > + fields_desc =3D [ByteEnumField("ietype", 28, IEType), > + XBitField("Trace_type", None, 16)] > + > + > +class IE_ChargingId(IE_Base): > + name =3D "Charging ID" > + fields_desc =3D [ByteEnumField("ietype", 127, IEType), > + XIntField("Charging_id", RandInt())] > + > + > +class IE_EndUserAddress(IE_Base): > + # Supply protocol specific information of the external packet > + name =3D "End User Address" > + fields_desc =3D [ByteEnumField("ietype", 128, IEType), > + # data network accessed by the GGPRS subscrib= ers. > + # - Request > + # 1 Type (1byte) > + # 2-3 Length (2bytes) - value 2 > + # 4 Spare + PDP Type Organization > + # 5 PDP Type Number > + # - Response > + # 6-n PDP Address > + ShortField("length", 2), > + BitField("SPARE", 15, 4), > + BitField("PDPTypeOrganization", 1, 4), > + XByteField("PDPTypeNumber", None), > + ConditionalField(IPField("PDPAddress", RandIP()), > + lambda pkt: pkt.length =3D=3D 6 or p= kt.length =3D=3D 22), # noqa: > E501 > + ConditionalField(IP6Field("IPv6_PDPAddress", '::1'), > + lambda pkt: pkt.length =3D=3D 18 or > +pkt.length =3D=3D 22)] # noqa: E501 > + > + > +class APNStrLenField(StrLenField): > + # Inspired by DNSStrField > + def m2i(self, pkt, s): > + ret_s =3D b"" > + tmp_s =3D s > + while tmp_s: > + tmp_len =3D orb(tmp_s[0]) + 1 > + if tmp_len > len(tmp_s): > + warning("APN prematured end of character-string (size=3D= %i, > remaining bytes=3D%i)" % (tmp_len, len(tmp_s))) # noqa: E501 > + ret_s +=3D tmp_s[1:tmp_len] > + tmp_s =3D tmp_s[tmp_len:] > + if len(tmp_s): > + ret_s +=3D b"." > + s =3D ret_s > + return s > + > + def i2m(self, pkt, s): > + s =3D b"".join(chb(len(x)) + x for x in s.split(".")) > + return s > + > + > +class IE_AccessPointName(IE_Base): > + # Sent by SGSN or by GGSN as defined in 3GPP TS 23.060 > + name =3D "Access Point Name" > + fields_desc =3D [ByteEnumField("ietype", 131, IEType), > + ShortField("length", None), > + APNStrLenField("APN", "nternet", length_from=3Dlambda > +x: x.length)] # noqa: E501 > + > + def post_build(self, p, pay): > + if self.length is None: > + tmp_len =3D len(p) - 3 > + p =3D p[:2] + struct.pack("!B", tmp_len) + p[3:] > + return p > + > + > +class IE_ProtocolConfigurationOptions(IE_Base): > + name =3D "Protocol Configuration Options" > + fields_desc =3D [ByteEnumField("ietype", 132, IEType), > + ShortField("length", 4), > + StrLenField("Protocol_Configuration", "", > + length_from=3Dlambda x: x.length)] > + > + > +class IE_GSNAddress(IE_Base): > + name =3D "GSN Address" > + fields_desc =3D [ByteEnumField("ietype", 133, IEType), > + ShortField("length", 4), > + IPField("address", RandIP())] > + > + > +class IE_MSInternationalNumber(IE_Base): > + name =3D "MS International Number" > + fields_desc =3D [ByteEnumField("ietype", 134, IEType), > + ShortField("length", None), > + FlagsField("flags", 0x91, 8, ["Extension", "", "", "I= nternational > Number", "", "", "", "ISDN numbering"]), # noqa: E501 > + TBCDByteField("digits", "33607080910", > +length_from=3Dlambda x: x.length - 1)] # noqa: E501 > + > + > +class QoS_Profile(IE_Base): > + name =3D "QoS profile" > + fields_desc =3D [ByteField("qos_ei", 0), > + ByteField("length", None), > + XBitField("spare", 0x00, 2), > + XBitField("delay_class", 0x000, 3), > + XBitField("reliability_class", 0x000, 3), > + XBitField("peak_troughput", 0x0000, 4), > + BitField("spare", 0, 1), > + XBitField("precedence_class", 0x000, 3), > + XBitField("spare", 0x000, 3), > + XBitField("mean_troughput", 0x00000, 5), > + XBitField("traffic_class", 0x000, 3), > + XBitField("delivery_order", 0x00, 2), > + XBitField("delivery_of_err_sdu", 0x000, 3), > + ByteField("max_sdu_size", None), > + ByteField("max_bitrate_up", None), > + ByteField("max_bitrate_down", None), > + XBitField("redidual_ber", 0x0000, 4), > + XBitField("sdu_err_ratio", 0x0000, 4), > + XBitField("transfer_delay", 0x00000, 5), > + XBitField("traffic_handling_prio", 0x000, 3), > + ByteField("guaranteed_bit_rate_up", None), > + ByteField("guaranteed_bit_rate_down", None)] > + > + > +class IE_QoS(IE_Base): > + name =3D "QoS" > + fields_desc =3D [ByteEnumField("ietype", 135, IEType), > + ShortField("length", None), > + ByteField("allocation_retention_prioiry", 1), > + > + ConditionalField(XBitField("spare", 0x00, 2), > + lambda pkt: pkt.length > 1), > + ConditionalField(XBitField("delay_class", 0x000, 3), > + lambda pkt: pkt.length > 1), > + ConditionalField(XBitField("reliability_class", 0x000= , 3), > + lambda pkt: pkt.length > 1), > + > + ConditionalField(XBitField("peak_troughput", 0x0000, = 4), > + lambda pkt: pkt.length > 2), > + ConditionalField(BitField("spare", 0, 1), > + lambda pkt: pkt.length > 2), > + ConditionalField(XBitField("precedence_class", 0x000,= 3), > + lambda pkt: pkt.length > 2), > + > + ConditionalField(XBitField("spare", 0x000, 3), > + lambda pkt: pkt.length > 3), > + ConditionalField(XBitField("mean_troughput", 0x00000,= 5), > + lambda pkt: pkt.length > 3), > + > + ConditionalField(XBitField("traffic_class", 0x000, 3)= , > + lambda pkt: pkt.length > 4), > + ConditionalField(XBitField("delivery_order", 0x00, 2)= , > + lambda pkt: pkt.length > 4), > + ConditionalField(XBitField("delivery_of_err_sdu", 0x0= 00, 3), > + lambda pkt: pkt.length > 4), > + > + ConditionalField(ByteField("max_sdu_size", None), > + lambda pkt: pkt.length > 5), > + ConditionalField(ByteField("max_bitrate_up", None), > + lambda pkt: pkt.length > 6), > + ConditionalField(ByteField("max_bitrate_down", None), > + lambda pkt: pkt.length > 7), > + > + ConditionalField(XBitField("redidual_ber", 0x0000, 4)= , > + lambda pkt: pkt.length > 8), > + ConditionalField(XBitField("sdu_err_ratio", 0x0000, 4= ), > + lambda pkt: pkt.length > 8), > + ConditionalField(XBitField("transfer_delay", 0x00000,= 6), > + lambda pkt: pkt.length > 9), > + ConditionalField(XBitField("traffic_handling_prio", > + 0x000, > + 2), > + lambda pkt: pkt.length > 9), > + > + ConditionalField(ByteField("guaranteed_bit_rate_up", = None), > + lambda pkt: pkt.length > 10), > + ConditionalField(ByteField("guaranteed_bit_rate_down"= , > + None), > + lambda pkt: pkt.length > 11), > + > + ConditionalField(XBitField("spare", 0x000, 3), > + lambda pkt: pkt.length > 12), > + ConditionalField(BitField("signaling_indication", 0, = 1), > + lambda pkt: pkt.length > 12), > + ConditionalField(XBitField("source_stats_desc", 0x000= 0, 4), > + lambda pkt: pkt.length > 12), > + > + ConditionalField(ByteField("max_bitrate_down_ext", No= ne), > + lambda pkt: pkt.length > 13), > + ConditionalField(ByteField("guaranteed_bitrate_down_e= xt", > + None), > + lambda pkt: pkt.length > 14), > + ConditionalField(ByteField("max_bitrate_up_ext", None= ), > + lambda pkt: pkt.length > 15), > + ConditionalField(ByteField("guaranteed_bitrate_up_ext= ", > + None), > + lambda pkt: pkt.length > 16), > + ConditionalField(ByteField("max_bitrate_down_ext2", N= one), > + lambda pkt: pkt.length > 17), > + ConditionalField(ByteField("guaranteed_bitrate_down_e= xt2", > + None), > + lambda pkt: pkt.length > 18), > + ConditionalField(ByteField("max_bitrate_up_ext2", Non= e), > + lambda pkt: pkt.length > 19), > + ConditionalField(ByteField("guaranteed_bitrate_up_ext= 2", > + None), > + lambda pkt: pkt.length > 20)] > + > + > +class IE_CommonFlags(IE_Base): > + name =3D "Common Flags" > + fields_desc =3D [ByteEnumField("ietype", 148, IEType), > + ShortField("length", None), > + BitField("dual_addr_bearer_fl", 0, 1), > + BitField("upgrade_qos_supported", 0, 1), > + BitField("nrsn", 0, 1), > + BitField("no_qos_nego", 0, 1), > + BitField("mbms_cnting_info", 0, 1), > + BitField("ran_procedure_ready", 0, 1), > + BitField("mbms_service_type", 0, 1), > + BitField("prohibit_payload_compression", 0, 1)] > + > + > +class IE_APNRestriction(IE_Base): > + name =3D "APN Restriction" > + fields_desc =3D [ByteEnumField("ietype", 149, IEType), > + ShortField("length", 1), > + ByteField("restriction_type_value", 0)] > + > + > +class IE_RATType(IE_Base): > + name =3D "Rat Type" > + fields_desc =3D [ByteEnumField("ietype", 151, IEType), > + ShortField("length", 1), > + ByteEnumField("RAT_Type", None, RATType)] > + > + > +class IE_UserLocationInformation(IE_Base): > + name =3D "User Location Information" > + fields_desc =3D [ByteEnumField("ietype", 152, IEType), > + ShortField("length", None), > + ByteField("type", 1), > + # Only type 1 is currently supported > + TBCDByteField("MCC", "", 2), > + # MNC: if the third digit of MCC is 0xf, then the len= gth of MNC is 1 > byte # noqa: E501 > + TBCDByteField("MNC", "", 1), > + ShortField("LAC", None), > + ShortField("SAC", None)] > + > + > +class IE_MSTimeZone(IE_Base): > + name =3D "MS Time Zone" > + fields_desc =3D [ByteEnumField("ietype", 153, IEType), > + ShortField("length", None), > + ByteField("timezone", 0), > + BitField("Spare", 0, 1), > + BitField("Spare", 0, 1), > + BitField("Spare", 0, 1), > + BitField("Spare", 0, 1), > + BitField("Spare", 0, 1), > + BitField("Spare", 0, 1), > + XBitField("daylight_saving_time", 0x00, 2)] > + > + > +class IE_IMEI(IE_Base): > + name =3D "IMEI" > + fields_desc =3D [ByteEnumField("ietype", 154, IEType), > + ShortField("length", None), > + TBCDByteField("IMEI", "", length_from=3Dlambda x: > +x.length)] > + > + > +class IE_MSInfoChangeReportingAction(IE_Base): > + name =3D "MS Info Change Reporting Action" > + fields_desc =3D [ByteEnumField("ietype", 181, IEType), > + ShortField("length", 1), > + ByteField("Action", 0)] > + > + > +class IE_DirectTunnelFlags(IE_Base): > + name =3D "Direct Tunnel Flags" > + fields_desc =3D [ByteEnumField("ietype", 182, IEType), > + ShortField("length", 1), > + BitField("Spare", 0, 1), > + BitField("Spare", 0, 1), > + BitField("Spare", 0, 1), > + BitField("Spare", 0, 1), > + BitField("Spare", 0, 1), > + BitField("EI", 0, 1), > + BitField("GCSI", 0, 1), > + BitField("DTI", 0, 1)] > + > + > +class IE_BearerControlMode(IE_Base): > + name =3D "Bearer Control Mode" > + fields_desc =3D [ByteEnumField("ietype", 184, IEType), > + ShortField("length", 1), > + ByteField("bearer_control_mode", 0)] > + > + > +class IE_EvolvedAllocationRetentionPriority(IE_Base): > + name =3D "Evolved Allocation/Retention Priority" > + fields_desc =3D [ByteEnumField("ietype", 191, IEType), > + ShortField("length", 1), > + BitField("Spare", 0, 1), > + BitField("PCI", 0, 1), > + XBitField("PL", 0x0000, 4), > + BitField("Spare", 0, 1), > + BitField("PVI", 0, 1)] > + > + > +class IE_CharginGatewayAddress(IE_Base): > + name =3D "Chargin Gateway Address" > + fields_desc =3D [ByteEnumField("ietype", 251, IEType), > + ShortField("length", 4), > + ConditionalField(IPField("ipv4_address", "127.0.0.1")= , > + lambda > + pkt: pkt.length =3D=3D 4), > + ConditionalField(IP6Field("ipv6_address", "::1"), lam= bda > + pkt: pkt.length =3D=3D 16)] > + > + > +class IE_PrivateExtension(IE_Base): > + name =3D "Private Extension" > + fields_desc =3D [ByteEnumField("ietype", 255, IEType), > + ShortField("length", 1), > + ByteField("extension identifier", 0), > + StrLenField("extention_value", "", > + length_from=3Dlambda x: x.length)] > + > + > +class IE_ExtensionHeaderList(IE_Base): > + name =3D "Extension Header List" > + fields_desc =3D [ByteEnumField("ietype", 141, IEType), > + FieldLenField("length", None, length_of=3D"extension_= headers"), # > noqa: E501 > + FieldListField("extension_headers", [64, 192], > +ByteField("", 0))] # noqa: E501 > + > + > +class IE_NotImplementedTLV(Packet): > + name =3D "IE not implemented" > + fields_desc =3D [ByteEnumField("ietype", 0, IEType), > + ShortField("length", None), > + StrLenField("data", "", length_from=3Dlambda x: > +x.length)] > + > + def extract_padding(self, pkt): > + return "", pkt > + > + > +ietypecls =3D {1: IE_Cause, > + 2: IE_IMSI, > + 3: IE_Routing, > + 8: IE_ReorderingRequired, > + 14: IE_Recovery, > + 15: IE_SelectionMode, > + 16: IE_TEIDI, > + 17: IE_TEICP, > + 19: IE_Teardown, > + 20: IE_NSAPI, > + 26: IE_ChargingCharacteristics, > + 27: IE_TraceReference, > + 28: IE_TraceType, > + 127: IE_ChargingId, > + 128: IE_EndUserAddress, > + 131: IE_AccessPointName, > + 132: IE_ProtocolConfigurationOptions, > + 133: IE_GSNAddress, > + 134: IE_MSInternationalNumber, > + 135: IE_QoS, > + 141: IE_ExtensionHeaderList, > + 148: IE_CommonFlags, > + 149: IE_APNRestriction, > + 151: IE_RATType, > + 152: IE_UserLocationInformation, > + 153: IE_MSTimeZone, > + 154: IE_IMEI, > + 181: IE_MSInfoChangeReportingAction, > + 182: IE_DirectTunnelFlags, > + 184: IE_BearerControlMode, > + 191: IE_EvolvedAllocationRetentionPriority, > + 251: IE_CharginGatewayAddress, > + 255: IE_PrivateExtension} > + > + > +def IE_Dispatcher(s): > + """Choose the correct Information Element class.""" > + if len(s) < 1: > + return Raw(s) > + # Get the IE type > + ietype =3D orb(s[0]) > + cls =3D ietypecls.get(ietype, Raw) > + > + # if ietype greater than 128 are TLVs > + if cls =3D=3D Raw and ietype & 128 =3D=3D 128: > + cls =3D IE_NotImplementedTLV > + return cls(s) > + > + > +class GTPEchoResponse(Packet): > + # 3GPP TS 29.060 V9.1.0 (2009-12) > + name =3D "GTP Echo Response" > + fields_desc =3D [PacketListField("IE_list", [], IE_Dispatcher)] > + > + def hashret(self): > + return struct.pack("H", self.seq) > + > + def answers(self, other): > + return self.seq =3D=3D other.seq > + > + > +class GTPCreatePDPContextRequest(Packet): > + # 3GPP TS 29.060 V9.1.0 (2009-12) > + name =3D "GTP Create PDP Context Request" > + fields_desc =3D [PacketListField("IE_list", [IE_TEIDI(), IE_NSAPI(), > IE_GSNAddress(), # noqa: E501 > + IE_GSNAddress(), > + IE_NotImplementedTLV(iety= pe=3D135, length=3D15, > data=3DRandString(15))], # noqa: E501 > + IE_Dispatcher)] > + > + def hashret(self): > + return struct.pack("H", self.seq) > + > + > +class GTPCreatePDPContextResponse(Packet): > + # 3GPP TS 29.060 V9.1.0 (2009-12) > + name =3D "GTP Create PDP Context Response" > + fields_desc =3D [PacketListField("IE_list", [], IE_Dispatcher)] > + > + def hashret(self): > + return struct.pack("H", self.seq) > + > + def answers(self, other): > + return self.seq =3D=3D other.seq > + > + > +class GTPUpdatePDPContextRequest(Packet): > + # 3GPP TS 29.060 V9.1.0 (2009-12) > + name =3D "GTP Update PDP Context Request" > + fields_desc =3D [PacketListField("IE_list", [ > + IE_Cause(), > + IE_Recovery(), > + IE_TEIDI(), > + IE_TEICP(), > + IE_ChargingId(), > + IE_ProtocolConfigurationOptions(), > + IE_GSNAddress(), > + IE_GSNAddress(), > + IE_GSNAddress(), > + IE_GSNAddress(), > + IE_QoS(), > + IE_CharginGatewayAddress(), > + IE_CharginGatewayAddress(), > + IE_CommonFlags(), > + IE_APNRestriction(), > + IE_BearerControlMode(), > + IE_MSInfoChangeReportingAction(), > + IE_EvolvedAllocationRetentionPriority(), > + IE_PrivateExtension()], > + IE_Dispatcher)] > + > + def hashret(self): > + return struct.pack("H", self.seq) > + > + > +class GTPUpdatePDPContextResponse(Packet): > + # 3GPP TS 29.060 V9.1.0 (2009-12) > + name =3D "GTP Update PDP Context Response" > + fields_desc =3D [PacketListField("IE_list", None, IE_Dispatcher)] > + > + def hashret(self): > + return struct.pack("H", self.seq) > + > + > +class GTPErrorIndication(Packet): > + # 3GPP TS 29.060 V9.1.0 (2009-12) > + name =3D "GTP Error Indication" > + fields_desc =3D [PacketListField("IE_list", [], IE_Dispatcher)] > + > + > +class GTPDeletePDPContextRequest(Packet): > + # 3GPP TS 29.060 V9.1.0 (2009-12) > + name =3D "GTP Delete PDP Context Request" > + fields_desc =3D [PacketListField("IE_list", [], IE_Dispatcher)] > + > + > +class GTPDeletePDPContextResponse(Packet): > + # 3GPP TS 29.060 V9.1.0 (2009-12) > + name =3D "GTP Delete PDP Context Response" > + fields_desc =3D [PacketListField("IE_list", [], IE_Dispatcher)] > + > + > +class GTPPDUNotificationRequest(Packet): > + # 3GPP TS 29.060 V9.1.0 (2009-12) > + name =3D "GTP PDU Notification Request" > + fields_desc =3D [PacketListField("IE_list", [IE_IMSI(), > + IE_TEICP(TEICI=3DRandInt(= )), > + IE_EndUserAddress(PDPType= Number=3D0x21), # > noqa: E501 > + IE_AccessPointName(), > + IE_GSNAddress(address=3D"= 127.0.0.1"), # noqa: > E501 > + ], IE_Dispatcher)] > + > + > +class GTPSupportedExtensionHeadersNotification(Packet): > + name =3D "GTP Supported Extension Headers Notification" > + fields_desc =3D [PacketListField("IE_list", [IE_ExtensionHeaderList(= ), > + ], IE_Dispatcher)] > + > + > +class GTPmorethan1500(Packet): > + # 3GPP TS 29.060 V9.1.0 (2009-12) > + name =3D "GTP More than 1500" > + fields_desc =3D [ByteEnumField("IE_Cause", "Cause", IEType), > + BitField("IE", 1, 12000), ] > + > + > +# Bind GTP-C > +bind_layers(UDP, GTPHeader, dport=3D2123) bind_layers(UDP, GTPHeader, > +sport=3D2123) bind_layers(GTPHeader, GTPEchoRequest, gtp_type=3D1, S=3D1= ) > +bind_layers(GTPHeader, GTPEchoResponse, gtp_type=3D2, S=3D1) > +bind_layers(GTPHeader, GTPCreatePDPContextRequest, gtp_type=3D16) > +bind_layers(GTPHeader, GTPCreatePDPContextResponse, gtp_type=3D17) > +bind_layers(GTPHeader, GTPUpdatePDPContextRequest, gtp_type=3D18) > +bind_layers(GTPHeader, GTPUpdatePDPContextResponse, gtp_type=3D19) > +bind_layers(GTPHeader, GTPDeletePDPContextRequest, gtp_type=3D20) > +bind_layers(GTPHeader, GTPDeletePDPContextResponse, gtp_type=3D21) > +bind_layers(GTPHeader, GTPPDUNotificationRequest, gtp_type=3D27) > +bind_layers(GTPHeader, GTPSupportedExtensionHeadersNotification, > +gtp_type=3D31, S=3D1) # noqa: E501 bind_layers(GTPHeader, > +GTP_UDPPort_ExtensionHeader, next_ex=3D64, E=3D1) bind_layers(GTPHeader, > +GTP_PDCP_PDU_ExtensionHeader, next_ex=3D192, E=3D1) > + > +# Bind GTP-U > +bind_layers(UDP, GTP_U_Header, dport=3D2152) bind_layers(UDP, > +GTP_U_Header, sport=3D2152) bind_layers(GTP_U_Header, > GTPErrorIndication, > +gtp_type=3D26, S=3D1) bind_layers(GTP_U_Header, IP, gtp_type=3D255) > -- > 1.8.3.1