Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/82694/?format=api
http://patches.dpdk.org/api/patches/82694/?format=api", "web_url": "http://patches.dpdk.org/project/dts/patch/1603921655-27071-3-git-send-email-lihongx.ma@intel.com/", "project": { "id": 3, "url": "http://patches.dpdk.org/api/projects/3/?format=api", "name": "DTS", "link_name": "dts", "list_id": "dts.dpdk.org", "list_email": "dts@dpdk.org", "web_url": "", "scm_url": "git://dpdk.org/tools/dts", "webscm_url": "http://git.dpdk.org/tools/dts/", "list_archive_url": "https://inbox.dpdk.org/dts", "list_archive_url_format": "https://inbox.dpdk.org/dts/{}", "commit_url_format": "" }, "msgid": "<1603921655-27071-3-git-send-email-lihongx.ma@intel.com>", "list_archive_url": "https://inbox.dpdk.org/dts/1603921655-27071-3-git-send-email-lihongx.ma@intel.com", "date": "2020-10-28T21:47:34", "name": "[V1,2/3] dep: remove local scapy module gtp", "commit_ref": null, "pull_url": null, "state": "accepted", "archived": false, "hash": "77b1f76ef8ede114c70dbb4cc0c75932d7565b8d", "submitter": { "id": 1641, "url": "http://patches.dpdk.org/api/people/1641/?format=api", "name": "Ma, LihongX", "email": "lihongx.ma@intel.com" }, "delegate": null, "mbox": "http://patches.dpdk.org/project/dts/patch/1603921655-27071-3-git-send-email-lihongx.ma@intel.com/mbox/", "series": [ { "id": 13441, "url": "http://patches.dpdk.org/api/series/13441/?format=api", "web_url": "http://patches.dpdk.org/project/dts/list/?series=13441", "date": "2020-10-28T21:47:32", "name": "use scapy gtp instead of local gtp", "version": 1, "mbox": "http://patches.dpdk.org/series/13441/mbox/" } ], "comments": "http://patches.dpdk.org/api/patches/82694/comments/", "check": "pending", "checks": "http://patches.dpdk.org/api/patches/82694/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<dts-bounces@dpdk.org>", "X-Original-To": "patchwork@inbox.dpdk.org", "Delivered-To": "patchwork@inbox.dpdk.org", "Received": [ "from dpdk.org (dpdk.org [92.243.14.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 28C05A04B5;\n\tThu, 29 Oct 2020 06:22:27 +0100 (CET)", "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 1DDD272E3;\n\tThu, 29 Oct 2020 06:22:26 +0100 (CET)", "from mga04.intel.com (mga04.intel.com [192.55.52.120])\n by dpdk.org (Postfix) with ESMTP id 2CD6D72E7\n for <dts@dpdk.org>; Thu, 29 Oct 2020 06:22:22 +0100 (CET)", "from fmsmga004.fm.intel.com ([10.253.24.48])\n by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 28 Oct 2020 22:22:21 -0700", "from dpdk-lihong-ub1604.sh.intel.com ([10.67.118.174])\n by fmsmga004.fm.intel.com with ESMTP; 28 Oct 2020 22:22:20 -0700" ], "IronPort-SDR": [ "\n nSr6hjAZhrfgTepcroALWLdicWi5UpYg0dE9EzwHkABBaLuX5arzqO1fatWwA0VWjP2sWW6fqg\n FkyyADvnzu+Q==", "\n llz6SGuvazhLNAsxmPRoNNI0HuRfXJQzbIlLBFh06ecVe/AgoJGPIHnrrudiFrzEE1kfVhOHRb\n iA9HAL89YNFg==" ], "X-IronPort-AV": [ "E=McAfee;i=\"6000,8403,9788\"; a=\"165791744\"", "E=Sophos;i=\"5.77,429,1596524400\"; d=\"scan'208\";a=\"165791744\"", "E=Sophos;i=\"5.77,429,1596524400\"; d=\"scan'208\";a=\"351290890\"" ], "X-Amp-Result": "SKIPPED(no attachment in message)", "X-Amp-File-Uploaded": "False", "X-ExtLoop1": "1", "From": "LihongX Ma <lihongx.ma@intel.com>", "To": "dts@dpdk.org", "Cc": "LihongX Ma <lihongx.ma@intel.com>", "Date": "Thu, 29 Oct 2020 05:47:34 +0800", "Message-Id": "<1603921655-27071-3-git-send-email-lihongx.ma@intel.com>", "X-Mailer": "git-send-email 2.7.4", "In-Reply-To": "<1603921655-27071-1-git-send-email-lihongx.ma@intel.com>", "References": "<1603921655-27071-1-git-send-email-lihongx.ma@intel.com>", "Subject": "[dts] [PATCH V1 2/3] dep: remove local scapy module gtp", "X-BeenThere": "dts@dpdk.org", "X-Mailman-Version": "2.1.15", "Precedence": "list", "List-Id": "test suite reviews and discussions <dts.dpdk.org>", "List-Unsubscribe": "<https://mails.dpdk.org/options/dts>,\n <mailto:dts-request@dpdk.org?subject=unsubscribe>", "List-Archive": "<http://mails.dpdk.org/archives/dts/>", "List-Post": "<mailto:dts@dpdk.org>", "List-Help": "<mailto:dts-request@dpdk.org?subject=help>", "List-Subscribe": "<https://mails.dpdk.org/listinfo/dts>,\n <mailto:dts-request@dpdk.org?subject=subscribe>", "Errors-To": "dts-bounces@dpdk.org", "Sender": "\"dts\" <dts-bounces@dpdk.org>" }, "content": "use scapy module gtp instead of local gtp module\n\nSigned-off-by: LihongX Ma <lihongx.ma@intel.com>\n---\n dep/scapy_modules/gtp.py | 944 -----------------------------------------------\n 1 file changed, 944 deletions(-)\n delete mode 100644 dep/scapy_modules/gtp.py", "diff": "diff --git a/dep/scapy_modules/gtp.py b/dep/scapy_modules/gtp.py\ndeleted file mode 100644\nindex df101c6..0000000\n--- a/dep/scapy_modules/gtp.py\n+++ /dev/null\n@@ -1,944 +0,0 @@\n-#! /usr/bin/env python\n-\n-# Copyright (C) 2018 Leonardo Monteiro <decastromonteiro@gmail.com>\n-# 2017 Alexis Sultan <alexis.sultan@sfr.com>\n-# 2017 Alessio Deiana <adeiana@gmail.com>\n-# 2014 Guillaume Valadon <guillaume.valadon@ssi.gouv.fr>\n-# 2012 ffranz <ffranz@iniqua.com>\n-##\n-# This program is published under a GPLv2 license\n-\n-# scapy.contrib.description = GPRS Tunneling Protocol (GTP)\n-# scapy.contrib.status = loads\n-\n-from __future__ import absolute_import\n-import struct\n-\n-\n-from scapy.compat import chb, orb\n-from scapy.error import warning\n-from scapy.fields import BitEnumField, BitField, ByteEnumField, ByteField, \\\n- ConditionalField, FieldLenField, FieldListField, FlagsField, IntField, \\\n- IPField, PacketListField, ShortField, StrFixedLenField, StrLenField, \\\n- XBitField, XByteField, XIntField\n-from scapy.layers.inet import IP, UDP\n-from scapy.layers.inet6 import IPv6, IP6Field\n-from scapy.layers.ppp import PPP\n-from scapy.modules.six.moves import range\n-from scapy.packet import bind_layers, bind_bottom_up, bind_top_down, \\\n- Packet, Raw\n-from scapy.volatile import RandInt, RandIP, RandNum, RandString\n-\n-\n-# GTP Data types\n-\n-RATType = {\n- 1: \"UTRAN\",\n- 2: \"GETRAN\",\n- 3: \"WLAN\",\n- 4: \"GAN\",\n- 5: \"HSPA\"\n-}\n-\n-GTPmessageType = {1: \"echo_request\",\n- 2: \"echo_response\",\n- 16: \"create_pdp_context_req\",\n- 17: \"create_pdp_context_res\",\n- 18: \"update_pdp_context_req\",\n- 19: \"update_pdp_context_resp\",\n- 20: \"delete_pdp_context_req\",\n- 21: \"delete_pdp_context_res\",\n- 26: \"error_indication\",\n- 27: \"pdu_notification_req\",\n- 31: \"supported_extension_headers_notification\",\n- 254: \"end_marker\",\n- 255: \"g_pdu\"}\n-\n-IEType = {1: \"Cause\",\n- 2: \"IMSI\",\n- 3: \"RAI\",\n- 4: \"TLLI\",\n- 5: \"P_TMSI\",\n- 8: \"IE_ReorderingRequired\",\n- 14: \"Recovery\",\n- 15: \"SelectionMode\",\n- 16: \"TEIDI\",\n- 17: \"TEICP\",\n- 19: \"TeardownInd\",\n- 20: \"NSAPI\",\n- 26: \"ChargingChrt\",\n- 27: \"TraceReference\",\n- 28: \"TraceType\",\n- 127: \"ChargingId\",\n- 128: \"EndUserAddress\",\n- 131: \"AccessPointName\",\n- 132: \"ProtocolConfigurationOptions\",\n- 133: \"GSNAddress\",\n- 134: \"MSInternationalNumber\",\n- 135: \"QoS\",\n- 148: \"CommonFlags\",\n- 149: \"APNRestriction\",\n- 151: \"RatType\",\n- 152: \"UserLocationInformation\",\n- 153: \"MSTimeZone\",\n- 154: \"IMEI\",\n- 181: \"MSInfoChangeReportingAction\",\n- 184: \"BearerControlMode\",\n- 191: \"EvolvedAllocationRetentionPriority\",\n- 255: \"PrivateExtention\"}\n-\n-CauseValues = {0: \"Request IMSI\",\n- 1: \"Request IMEI\",\n- 2: \"Request IMSI and IMEI\",\n- 3: \"No identity needed\",\n- 4: \"MS Refuses\",\n- 5: \"MS is not GPRS Responding\",\n- 128: \"Request accepted\",\n- 129: \"New PDP type due to network preference\",\n- 130: \"New PDP type due to single address bearer only\",\n- 192: \"Non-existent\",\n- 193: \"Invalid message format\",\n- 194: \"IMSI not known\",\n- 195: \"MS is GPRS Detached\",\n- 196: \"MS is not GPRS Responding\",\n- 197: \"MS Refuses\",\n- 198: \"Version not supported\",\n- 199: \"No resources available\",\n- 200: \"Service not supported\",\n- 201: \"Mandatory IE incorrect\",\n- 202: \"Mandatory IE missing\",\n- 203: \"Optional IE incorrect\",\n- 204: \"System failure\",\n- 205: \"Roaming restriction\",\n- 206: \"P-TMSI Signature mismatch\",\n- 207: \"GPRS connection suspended\",\n- 208: \"Authentication failure\",\n- 209: \"User authentication failed\",\n- 210: \"Context not found\",\n- 211: \"All dynamic PDP addresses are occupied\",\n- 212: \"No memory is available\",\n- 213: \"Reallocation failure\",\n- 214: \"Unknown mandatory extension header\",\n- 215: \"Semantic error in the TFT operation\",\n- 216: \"Syntactic error in TFT operation\",\n- 217: \"Semantic errors in packet filter(s)\",\n- 218: \"Syntactic errors in packet filter(s)\",\n- 219: \"Missing or unknown APN\",\n- 220: \"Unknown PDP address or PDP type\",\n- 221: \"PDP context without TFT already activated\",\n- 222: \"APN access denied : no subscription\",\n- 223: \"APN Restriction type incompatibility with currently active PDP Contexts\", # noqa: E501\n- 224: \"MS MBMS Capabilities Insufficient\",\n- 225: \"Invalid Correlation : ID\",\n- 226: \"MBMS Bearer Context Superseded\",\n- 227: \"Bearer Control Mode violation\",\n- 228: \"Collision with network initiated request\"}\n-\n-Selection_Mode = {11111100: \"MS or APN\",\n- 11111101: \"MS\",\n- 11111110: \"NET\",\n- 11111111: \"FutureUse\"}\n-\n-TrueFalse_value = {254: \"False\",\n- 255: \"True\"}\n-\n-# http://www.arib.or.jp/IMT-2000/V720Mar09/5_Appendix/Rel8/29/29281-800.pdf\n-ExtensionHeadersTypes = {\n- 0: \"No more extension headers\",\n- 1: \"Reserved\",\n- 2: \"Reserved\",\n- 64: \"UDP Port\",\n- 133: \"PDU Session Container\",\n- 192: \"PDCP PDU Number\",\n- 193: \"Reserved\",\n- 194: \"Reserved\"\n-}\n-\n-\n-class TBCDByteField(StrFixedLenField):\n-\n- def i2h(self, pkt, val):\n- return val\n-\n- def m2i(self, pkt, val):\n- ret = []\n- for v in val:\n- byte = orb(v)\n- left = byte >> 4\n- right = byte & 0xf\n- if left == 0xf:\n- ret.append(TBCD_TO_ASCII[right:right + 1])\n- else:\n- ret += [TBCD_TO_ASCII[right:right + 1], TBCD_TO_ASCII[left:left + 1]] # noqa: E501\n- return b\"\".join(ret)\n-\n- def i2m(self, pkt, val):\n- val = str(val)\n- ret_string = \"\"\n- for i in range(0, len(val), 2):\n- tmp = val[i:i + 2]\n- if len(tmp) == 2:\n- ret_string += chr(int(tmp[1] + tmp[0], 16))\n- else:\n- ret_string += chr(int(\"F\" + tmp[0], 16))\n- return ret_string\n-\n-\n-TBCD_TO_ASCII = b\"0123456789*#abc\"\n-\n-\n-class GTP_ExtensionHeader(Packet):\n- @classmethod\n- def dispatch_hook(cls, _pkt=None, *args, **kargs):\n- if _pkt is None:\n- return GTP_UDPPort_ExtensionHeader\n- return cls\n-\n-\n-class GTP_UDPPort_ExtensionHeader(GTP_ExtensionHeader):\n- fields_desc = [ByteField(\"length\", 0x40),\n- ShortField(\"udp_port\", None),\n- ByteEnumField(\"next_ex\", 0, ExtensionHeadersTypes), ]\n-\n-\n-class GTP_PDUSession_ExtensionHeader(GTP_ExtensionHeader):\n- fields_desc = [ByteField(\"length\", 0x02),\n- BitField(\"pdu_type\", 0, 4),\n- BitField(\"spare0\", 0, 4),\n- BitField(\"ppp\", 0, 1),\n- BitField(\"rqi\", 0, 1),\n- BitField(\"qos_flow\", 0, 6),\n- BitField(\"ppi\", 0, 3),\n- BitField(\"spare1\", 0, 5),\n- BitField(\"reserved\", 0, 24),\n- ByteEnumField(\"next_ex\", 0, ExtensionHeadersTypes), ]\n-\n-\n-class GTP_PDCP_PDU_ExtensionHeader(GTP_ExtensionHeader):\n- fields_desc = [ByteField(\"length\", 0x01),\n- ShortField(\"pdcp_pdu\", None),\n- ByteEnumField(\"next_ex\", 0, ExtensionHeadersTypes), ]\n-\n-\n-class GTPHeader(Packet):\n- # 3GPP TS 29.060 V9.1.0 (2009-12)\n- name = \"GTP-C Header\"\n- fields_desc = [BitField(\"version\", 1, 3),\n- BitField(\"PT\", 1, 1),\n- BitField(\"reserved\", 0, 1),\n- BitField(\"E\", 0, 1),\n- BitField(\"S\", 0, 1),\n- BitField(\"PN\", 0, 1),\n- ByteEnumField(\"gtp_type\", None, GTPmessageType),\n- ShortField(\"length\", None),\n- IntField(\"teid\", 0),\n- ConditionalField(XBitField(\"seq\", 0, 16), lambda pkt:pkt.E == 1 or pkt.S == 1 or pkt.PN == 1), # noqa: E501\n- ConditionalField(ByteField(\"npdu\", 0), lambda pkt:pkt.E == 1 or pkt.S == 1 or pkt.PN == 1), # noqa: E501\n- ConditionalField(ByteEnumField(\"next_ex\", 0, ExtensionHeadersTypes), lambda pkt:pkt.E == 1 or pkt.S == 1 or pkt.PN == 1), ] # noqa: E501\n-\n- def post_build(self, p, pay):\n- p += pay\n- if self.length is None:\n- tmp_len = len(p) - 8\n- p = p[:2] + struct.pack(\"!H\", tmp_len) + p[4:]\n- return p\n-\n- def hashret(self):\n- return struct.pack(\"B\", self.version) + self.payload.hashret()\n-\n- def answers(self, other):\n- return (isinstance(other, GTPHeader) and\n- self.version == other.version and\n- self.payload.answers(other.payload))\n-\n- @classmethod\n- def dispatch_hook(cls, _pkt=None, *args, **kargs):\n- if _pkt and len(_pkt) >= 1:\n- if (orb(_pkt[0]) >> 5) & 0x7 == 2:\n- from . import gtp_v2\n- return gtp_v2.GTPHeader\n- if _pkt and len(_pkt) >= 8:\n- _gtp_type = orb(_pkt[1:2])\n- return GTPforcedTypes.get(_gtp_type, GTPHeader)\n- return cls\n-\n-\n-class GTP_U_Header(GTPHeader):\n- # 3GPP TS 29.060 V9.1.0 (2009-12)\n- name = \"GTP-U Header\"\n- # GTP-U protocol is used to transmit T-PDUs between GSN pairs (or between an SGSN and an RNC in UMTS), # noqa: E501\n- # encapsulated in G-PDUs. A G-PDU is a packet including a GTP-U header and a T-PDU. The Path Protocol # noqa: E501\n- # defines the path and the GTP-U header defines the tunnel. Several tunnels may be multiplexed on a single path. # noqa: E501\n-\n- def guess_payload_class(self, payload):\n- # Snooped from Wireshark\n- # https://github.com/boundary/wireshark/blob/07eade8124fd1d5386161591b52e177ee6ea849f/epan/dissectors/packet-gtp.c#L8195 # noqa: E501\n- if self.gtp_type == 255:\n- sub_proto = orb(payload[0])\n- if sub_proto >= 0x45 and sub_proto <= 0x4e:\n- return IP\n- elif (sub_proto & 0xf0) == 0x60:\n- return IPv6\n- else:\n- return PPP\n- return GTPHeader.guess_payload_class(self, payload)\n-\n-\n-# Some gtp_types have to be associated with a certain type of header\n-GTPforcedTypes = {\n- 16: GTPHeader,\n- 17: GTPHeader,\n- 18: GTPHeader,\n- 19: GTPHeader,\n- 20: GTPHeader,\n- 21: GTPHeader,\n- 26: GTP_U_Header,\n- 27: GTPHeader,\n- 254: GTP_U_Header,\n- 255: GTP_U_Header\n-}\n-\n-\n-class GTPEchoRequest(Packet):\n- # 3GPP TS 29.060 V9.1.0 (2009-12)\n- name = \"GTP Echo Request\"\n-\n- def hashret(self):\n- return struct.pack(\"H\", self.seq)\n-\n-\n-class IE_Base(Packet):\n-\n- def extract_padding(self, pkt):\n- return \"\", pkt\n-\n-\n-class IE_Cause(IE_Base):\n- name = \"Cause\"\n- fields_desc = [ByteEnumField(\"ietype\", 1, IEType),\n- ByteEnumField(\"CauseValue\", None, CauseValues)]\n-\n-\n-class IE_IMSI(IE_Base):\n- name = \"IMSI - Subscriber identity of the MS\"\n- fields_desc = [ByteEnumField(\"ietype\", 2, IEType),\n- TBCDByteField(\"imsi\", str(RandNum(0, 999999999999999)), 8)]\n-\n-\n-class IE_Routing(IE_Base):\n- name = \"Routing Area Identity\"\n- fields_desc = [ByteEnumField(\"ietype\", 3, IEType),\n- TBCDByteField(\"MCC\", \"\", 2),\n- # MNC: if the third digit of MCC is 0xf,\n- # then the length of MNC is 1 byte\n- TBCDByteField(\"MNC\", \"\", 1),\n- ShortField(\"LAC\", None),\n- ByteField(\"RAC\", None)]\n-\n-\n-class IE_ReorderingRequired(IE_Base):\n- name = \"Recovery\"\n- fields_desc = [ByteEnumField(\"ietype\", 8, IEType),\n- ByteEnumField(\"reordering_required\", 254, TrueFalse_value)]\n-\n-\n-class IE_Recovery(IE_Base):\n- name = \"Recovery\"\n- fields_desc = [ByteEnumField(\"ietype\", 14, IEType),\n- ByteField(\"restart_counter\", 24)]\n-\n-\n-class IE_SelectionMode(IE_Base):\n- # Indicates the origin of the APN in the message\n- name = \"Selection Mode\"\n- fields_desc = [ByteEnumField(\"ietype\", 15, IEType),\n- BitEnumField(\"SelectionMode\", \"MS or APN\",\n- 8, Selection_Mode)]\n-\n-\n-class IE_TEIDI(IE_Base):\n- name = \"Tunnel Endpoint Identifier Data\"\n- fields_desc = [ByteEnumField(\"ietype\", 16, IEType),\n- XIntField(\"TEIDI\", RandInt())]\n-\n-\n-class IE_TEICP(IE_Base):\n- name = \"Tunnel Endpoint Identifier Control Plane\"\n- fields_desc = [ByteEnumField(\"ietype\", 17, IEType),\n- XIntField(\"TEICI\", RandInt())]\n-\n-\n-class IE_Teardown(IE_Base):\n- name = \"Teardown Indicator\"\n- fields_desc = [ByteEnumField(\"ietype\", 19, IEType),\n- ByteEnumField(\"indicator\", \"True\", TrueFalse_value)]\n-\n-\n-class IE_NSAPI(IE_Base):\n- # Identifies a PDP context in a mobility management context specified by TEICP # noqa: E501\n- name = \"NSAPI\"\n- fields_desc = [ByteEnumField(\"ietype\", 20, IEType),\n- XBitField(\"sparebits\", 0x0000, 4),\n- XBitField(\"NSAPI\", RandNum(0, 15), 4)]\n-\n-\n-class IE_ChargingCharacteristics(IE_Base):\n- # Way of informing both the SGSN and GGSN of the rules for\n- name = \"Charging Characteristics\"\n- fields_desc = [ByteEnumField(\"ietype\", 26, IEType),\n- # producing charging information based on operator configured triggers. # noqa: E501\n- # 0000 .... .... .... : spare\n- # .... 1... .... .... : normal charging\n- # .... .0.. .... .... : prepaid charging\n- # .... ..0. .... .... : flat rate charging\n- # .... ...0 .... .... : hot billing charging\n- # .... .... 0000 0000 : reserved\n- XBitField(\"Ch_ChSpare\", None, 4),\n- XBitField(\"normal_charging\", None, 1),\n- XBitField(\"prepaid_charging\", None, 1),\n- XBitField(\"flat_rate_charging\", None, 1),\n- XBitField(\"hot_billing_charging\", None, 1),\n- XBitField(\"Ch_ChReserved\", 0, 8)]\n-\n-\n-class IE_TraceReference(IE_Base):\n- # Identifies a record or a collection of records for a particular trace.\n- name = \"Trace Reference\"\n- fields_desc = [ByteEnumField(\"ietype\", 27, IEType),\n- XBitField(\"Trace_reference\", None, 16)]\n-\n-\n-class IE_TraceType(IE_Base):\n- # Indicates the type of the trace\n- name = \"Trace Type\"\n- fields_desc = [ByteEnumField(\"ietype\", 28, IEType),\n- XBitField(\"Trace_type\", None, 16)]\n-\n-\n-class IE_ChargingId(IE_Base):\n- name = \"Charging ID\"\n- fields_desc = [ByteEnumField(\"ietype\", 127, IEType),\n- XIntField(\"Charging_id\", RandInt())]\n-\n-\n-class IE_EndUserAddress(IE_Base):\n- # Supply protocol specific information of the external packet\n- name = \"End User Address\"\n- fields_desc = [ByteEnumField(\"ietype\", 128, IEType),\n- # data network accessed by the GGPRS subscribers.\n- # - Request\n- # 1 Type (1byte)\n- # 2-3 Length (2bytes) - value 2\n- # 4 Spare + PDP Type Organization\n- # 5 PDP Type Number\n- # - Response\n- # 6-n PDP Address\n- ShortField(\"length\", 2),\n- BitField(\"SPARE\", 15, 4),\n- BitField(\"PDPTypeOrganization\", 1, 4),\n- XByteField(\"PDPTypeNumber\", None),\n- ConditionalField(IPField(\"PDPAddress\", RandIP()),\n- lambda pkt: pkt.length == 6 or pkt.length == 22), # noqa: E501\n- ConditionalField(IP6Field(\"IPv6_PDPAddress\", '::1'),\n- lambda pkt: pkt.length == 18 or pkt.length == 22)] # noqa: E501\n-\n-\n-class APNStrLenField(StrLenField):\n- # Inspired by DNSStrField\n- def m2i(self, pkt, s):\n- ret_s = b\"\"\n- tmp_s = s\n- while tmp_s:\n- tmp_len = orb(tmp_s[0]) + 1\n- if tmp_len > len(tmp_s):\n- warning(\"APN prematured end of character-string (size=%i, remaining bytes=%i)\" % (tmp_len, len(tmp_s))) # noqa: E501\n- ret_s += tmp_s[1:tmp_len]\n- tmp_s = tmp_s[tmp_len:]\n- if len(tmp_s):\n- ret_s += b\".\"\n- s = ret_s\n- return s\n-\n- def i2m(self, pkt, s):\n- s = b\"\".join(chb(len(x)) + x for x in s.split(\".\"))\n- return s\n-\n-\n-class IE_AccessPointName(IE_Base):\n- # Sent by SGSN or by GGSN as defined in 3GPP TS 23.060\n- name = \"Access Point Name\"\n- fields_desc = [ByteEnumField(\"ietype\", 131, IEType),\n- ShortField(\"length\", None),\n- APNStrLenField(\"APN\", \"nternet\", length_from=lambda x: x.length)] # noqa: E501\n-\n- def post_build(self, p, pay):\n- if self.length is None:\n- tmp_len = len(p) - 3\n- p = p[:2] + struct.pack(\"!B\", tmp_len) + p[3:]\n- return p\n-\n-\n-class IE_ProtocolConfigurationOptions(IE_Base):\n- name = \"Protocol Configuration Options\"\n- fields_desc = [ByteEnumField(\"ietype\", 132, IEType),\n- ShortField(\"length\", 4),\n- StrLenField(\"Protocol_Configuration\", \"\",\n- length_from=lambda x: x.length)]\n-\n-\n-class IE_GSNAddress(IE_Base):\n- name = \"GSN Address\"\n- fields_desc = [ByteEnumField(\"ietype\", 133, IEType),\n- ShortField(\"length\", 4),\n- IPField(\"address\", RandIP())]\n-\n-\n-class IE_MSInternationalNumber(IE_Base):\n- name = \"MS International Number\"\n- fields_desc = [ByteEnumField(\"ietype\", 134, IEType),\n- ShortField(\"length\", None),\n- FlagsField(\"flags\", 0x91, 8, [\"Extension\", \"\", \"\", \"International Number\", \"\", \"\", \"\", \"ISDN numbering\"]), # noqa: E501\n- TBCDByteField(\"digits\", \"33607080910\", length_from=lambda x: x.length - 1)] # noqa: E501\n-\n-\n-class QoS_Profile(IE_Base):\n- name = \"QoS profile\"\n- fields_desc = [ByteField(\"qos_ei\", 0),\n- ByteField(\"length\", None),\n- XBitField(\"spare\", 0x00, 2),\n- XBitField(\"delay_class\", 0x000, 3),\n- XBitField(\"reliability_class\", 0x000, 3),\n- XBitField(\"peak_troughput\", 0x0000, 4),\n- BitField(\"spare\", 0, 1),\n- XBitField(\"precedence_class\", 0x000, 3),\n- XBitField(\"spare\", 0x000, 3),\n- XBitField(\"mean_troughput\", 0x00000, 5),\n- XBitField(\"traffic_class\", 0x000, 3),\n- XBitField(\"delivery_order\", 0x00, 2),\n- XBitField(\"delivery_of_err_sdu\", 0x000, 3),\n- ByteField(\"max_sdu_size\", None),\n- ByteField(\"max_bitrate_up\", None),\n- ByteField(\"max_bitrate_down\", None),\n- XBitField(\"redidual_ber\", 0x0000, 4),\n- XBitField(\"sdu_err_ratio\", 0x0000, 4),\n- XBitField(\"transfer_delay\", 0x00000, 5),\n- XBitField(\"traffic_handling_prio\", 0x000, 3),\n- ByteField(\"guaranteed_bit_rate_up\", None),\n- ByteField(\"guaranteed_bit_rate_down\", None)]\n-\n-\n-class IE_QoS(IE_Base):\n- name = \"QoS\"\n- fields_desc = [ByteEnumField(\"ietype\", 135, IEType),\n- ShortField(\"length\", None),\n- ByteField(\"allocation_retention_prioiry\", 1),\n-\n- ConditionalField(XBitField(\"spare\", 0x00, 2),\n- lambda pkt: pkt.length > 1),\n- ConditionalField(XBitField(\"delay_class\", 0x000, 3),\n- lambda pkt: pkt.length > 1),\n- ConditionalField(XBitField(\"reliability_class\", 0x000, 3),\n- lambda pkt: pkt.length > 1),\n-\n- ConditionalField(XBitField(\"peak_troughput\", 0x0000, 4),\n- lambda pkt: pkt.length > 2),\n- ConditionalField(BitField(\"spare\", 0, 1),\n- lambda pkt: pkt.length > 2),\n- ConditionalField(XBitField(\"precedence_class\", 0x000, 3),\n- lambda pkt: pkt.length > 2),\n-\n- ConditionalField(XBitField(\"spare\", 0x000, 3),\n- lambda pkt: pkt.length > 3),\n- ConditionalField(XBitField(\"mean_troughput\", 0x00000, 5),\n- lambda pkt: pkt.length > 3),\n-\n- ConditionalField(XBitField(\"traffic_class\", 0x000, 3),\n- lambda pkt: pkt.length > 4),\n- ConditionalField(XBitField(\"delivery_order\", 0x00, 2),\n- lambda pkt: pkt.length > 4),\n- ConditionalField(XBitField(\"delivery_of_err_sdu\", 0x000, 3),\n- lambda pkt: pkt.length > 4),\n-\n- ConditionalField(ByteField(\"max_sdu_size\", None),\n- lambda pkt: pkt.length > 5),\n- ConditionalField(ByteField(\"max_bitrate_up\", None),\n- lambda pkt: pkt.length > 6),\n- ConditionalField(ByteField(\"max_bitrate_down\", None),\n- lambda pkt: pkt.length > 7),\n-\n- ConditionalField(XBitField(\"redidual_ber\", 0x0000, 4),\n- lambda pkt: pkt.length > 8),\n- ConditionalField(XBitField(\"sdu_err_ratio\", 0x0000, 4),\n- lambda pkt: pkt.length > 8),\n- ConditionalField(XBitField(\"transfer_delay\", 0x00000, 6),\n- lambda pkt: pkt.length > 9),\n- ConditionalField(XBitField(\"traffic_handling_prio\",\n- 0x000,\n- 2),\n- lambda pkt: pkt.length > 9),\n-\n- ConditionalField(ByteField(\"guaranteed_bit_rate_up\", None),\n- lambda pkt: pkt.length > 10),\n- ConditionalField(ByteField(\"guaranteed_bit_rate_down\",\n- None),\n- lambda pkt: pkt.length > 11),\n-\n- ConditionalField(XBitField(\"spare\", 0x000, 3),\n- lambda pkt: pkt.length > 12),\n- ConditionalField(BitField(\"signaling_indication\", 0, 1),\n- lambda pkt: pkt.length > 12),\n- ConditionalField(XBitField(\"source_stats_desc\", 0x0000, 4),\n- lambda pkt: pkt.length > 12),\n-\n- ConditionalField(ByteField(\"max_bitrate_down_ext\", None),\n- lambda pkt: pkt.length > 13),\n- ConditionalField(ByteField(\"guaranteed_bitrate_down_ext\",\n- None),\n- lambda pkt: pkt.length > 14),\n- ConditionalField(ByteField(\"max_bitrate_up_ext\", None),\n- lambda pkt: pkt.length > 15),\n- ConditionalField(ByteField(\"guaranteed_bitrate_up_ext\",\n- None),\n- lambda pkt: pkt.length > 16),\n- ConditionalField(ByteField(\"max_bitrate_down_ext2\", None),\n- lambda pkt: pkt.length > 17),\n- ConditionalField(ByteField(\"guaranteed_bitrate_down_ext2\",\n- None),\n- lambda pkt: pkt.length > 18),\n- ConditionalField(ByteField(\"max_bitrate_up_ext2\", None),\n- lambda pkt: pkt.length > 19),\n- ConditionalField(ByteField(\"guaranteed_bitrate_up_ext2\",\n- None),\n- lambda pkt: pkt.length > 20)]\n-\n-\n-class IE_CommonFlags(IE_Base):\n- name = \"Common Flags\"\n- fields_desc = [ByteEnumField(\"ietype\", 148, IEType),\n- ShortField(\"length\", None),\n- BitField(\"dual_addr_bearer_fl\", 0, 1),\n- BitField(\"upgrade_qos_supported\", 0, 1),\n- BitField(\"nrsn\", 0, 1),\n- BitField(\"no_qos_nego\", 0, 1),\n- BitField(\"mbms_cnting_info\", 0, 1),\n- BitField(\"ran_procedure_ready\", 0, 1),\n- BitField(\"mbms_service_type\", 0, 1),\n- BitField(\"prohibit_payload_compression\", 0, 1)]\n-\n-\n-class IE_APNRestriction(IE_Base):\n- name = \"APN Restriction\"\n- fields_desc = [ByteEnumField(\"ietype\", 149, IEType),\n- ShortField(\"length\", 1),\n- ByteField(\"restriction_type_value\", 0)]\n-\n-\n-class IE_RATType(IE_Base):\n- name = \"Rat Type\"\n- fields_desc = [ByteEnumField(\"ietype\", 151, IEType),\n- ShortField(\"length\", 1),\n- ByteEnumField(\"RAT_Type\", None, RATType)]\n-\n-\n-class IE_UserLocationInformation(IE_Base):\n- name = \"User Location Information\"\n- fields_desc = [ByteEnumField(\"ietype\", 152, IEType),\n- ShortField(\"length\", None),\n- ByteField(\"type\", 1),\n- # Only type 1 is currently supported\n- TBCDByteField(\"MCC\", \"\", 2),\n- # MNC: if the third digit of MCC is 0xf, then the length of MNC is 1 byte # noqa: E501\n- TBCDByteField(\"MNC\", \"\", 1),\n- ShortField(\"LAC\", None),\n- ShortField(\"SAC\", None)]\n-\n-\n-class IE_MSTimeZone(IE_Base):\n- name = \"MS Time Zone\"\n- fields_desc = [ByteEnumField(\"ietype\", 153, IEType),\n- ShortField(\"length\", None),\n- ByteField(\"timezone\", 0),\n- BitField(\"Spare\", 0, 1),\n- BitField(\"Spare\", 0, 1),\n- BitField(\"Spare\", 0, 1),\n- BitField(\"Spare\", 0, 1),\n- BitField(\"Spare\", 0, 1),\n- BitField(\"Spare\", 0, 1),\n- XBitField(\"daylight_saving_time\", 0x00, 2)]\n-\n-\n-class IE_IMEI(IE_Base):\n- name = \"IMEI\"\n- fields_desc = [ByteEnumField(\"ietype\", 154, IEType),\n- ShortField(\"length\", None),\n- TBCDByteField(\"IMEI\", \"\", length_from=lambda x: x.length)]\n-\n-\n-class IE_MSInfoChangeReportingAction(IE_Base):\n- name = \"MS Info Change Reporting Action\"\n- fields_desc = [ByteEnumField(\"ietype\", 181, IEType),\n- ShortField(\"length\", 1),\n- ByteField(\"Action\", 0)]\n-\n-\n-class IE_DirectTunnelFlags(IE_Base):\n- name = \"Direct Tunnel Flags\"\n- fields_desc = [ByteEnumField(\"ietype\", 182, IEType),\n- ShortField(\"length\", 1),\n- BitField(\"Spare\", 0, 1),\n- BitField(\"Spare\", 0, 1),\n- BitField(\"Spare\", 0, 1),\n- BitField(\"Spare\", 0, 1),\n- BitField(\"Spare\", 0, 1),\n- BitField(\"EI\", 0, 1),\n- BitField(\"GCSI\", 0, 1),\n- BitField(\"DTI\", 0, 1)]\n-\n-\n-class IE_BearerControlMode(IE_Base):\n- name = \"Bearer Control Mode\"\n- fields_desc = [ByteEnumField(\"ietype\", 184, IEType),\n- ShortField(\"length\", 1),\n- ByteField(\"bearer_control_mode\", 0)]\n-\n-\n-class IE_EvolvedAllocationRetentionPriority(IE_Base):\n- name = \"Evolved Allocation/Retention Priority\"\n- fields_desc = [ByteEnumField(\"ietype\", 191, IEType),\n- ShortField(\"length\", 1),\n- BitField(\"Spare\", 0, 1),\n- BitField(\"PCI\", 0, 1),\n- XBitField(\"PL\", 0x0000, 4),\n- BitField(\"Spare\", 0, 1),\n- BitField(\"PVI\", 0, 1)]\n-\n-\n-class IE_CharginGatewayAddress(IE_Base):\n- name = \"Chargin Gateway Address\"\n- fields_desc = [ByteEnumField(\"ietype\", 251, IEType),\n- ShortField(\"length\", 4),\n- ConditionalField(IPField(\"ipv4_address\", \"127.0.0.1\"),\n- lambda\n- pkt: pkt.length == 4),\n- ConditionalField(IP6Field(\"ipv6_address\", \"::1\"), lambda\n- pkt: pkt.length == 16)]\n-\n-\n-class IE_PrivateExtension(IE_Base):\n- name = \"Private Extension\"\n- fields_desc = [ByteEnumField(\"ietype\", 255, IEType),\n- ShortField(\"length\", 1),\n- ByteField(\"extension identifier\", 0),\n- StrLenField(\"extention_value\", \"\",\n- length_from=lambda x: x.length)]\n-\n-\n-class IE_ExtensionHeaderList(IE_Base):\n- name = \"Extension Header List\"\n- fields_desc = [ByteEnumField(\"ietype\", 141, IEType),\n- FieldLenField(\"length\", None, length_of=\"extension_headers\"), # noqa: E501\n- #FieldListField(\"extension_headers\", [64, 192], ByteField(\"\", 0))] # noqa: E501\n- FieldListField(\"extension_headers\", [64, 133, 192], ByteField(\"\", 0))] # noqa: E501\n-\n-\n-class IE_NotImplementedTLV(Packet):\n- name = \"IE not implemented\"\n- fields_desc = [ByteEnumField(\"ietype\", 0, IEType),\n- ShortField(\"length\", None),\n- StrLenField(\"data\", \"\", length_from=lambda x: x.length)]\n-\n- def extract_padding(self, pkt):\n- return \"\", pkt\n-\n-\n-ietypecls = {1: IE_Cause,\n- 2: IE_IMSI,\n- 3: IE_Routing,\n- 8: IE_ReorderingRequired,\n- 14: IE_Recovery,\n- 15: IE_SelectionMode,\n- 16: IE_TEIDI,\n- 17: IE_TEICP,\n- 19: IE_Teardown,\n- 20: IE_NSAPI,\n- 26: IE_ChargingCharacteristics,\n- 27: IE_TraceReference,\n- 28: IE_TraceType,\n- 127: IE_ChargingId,\n- 128: IE_EndUserAddress,\n- 131: IE_AccessPointName,\n- 132: IE_ProtocolConfigurationOptions,\n- 133: IE_GSNAddress,\n- 134: IE_MSInternationalNumber,\n- 135: IE_QoS,\n- 141: IE_ExtensionHeaderList,\n- 148: IE_CommonFlags,\n- 149: IE_APNRestriction,\n- 151: IE_RATType,\n- 152: IE_UserLocationInformation,\n- 153: IE_MSTimeZone,\n- 154: IE_IMEI,\n- 181: IE_MSInfoChangeReportingAction,\n- 182: IE_DirectTunnelFlags,\n- 184: IE_BearerControlMode,\n- 191: IE_EvolvedAllocationRetentionPriority,\n- 251: IE_CharginGatewayAddress,\n- 255: IE_PrivateExtension}\n-\n-\n-def IE_Dispatcher(s):\n- \"\"\"Choose the correct Information Element class.\"\"\"\n- if len(s) < 1:\n- return Raw(s)\n- # Get the IE type\n- ietype = orb(s[0])\n- cls = ietypecls.get(ietype, Raw)\n-\n- # if ietype greater than 128 are TLVs\n- if cls == Raw and ietype & 128 == 128:\n- cls = IE_NotImplementedTLV\n- return cls(s)\n-\n-\n-class GTPEchoResponse(Packet):\n- # 3GPP TS 29.060 V9.1.0 (2009-12)\n- name = \"GTP Echo Response\"\n- fields_desc = [PacketListField(\"IE_list\", [], IE_Dispatcher)]\n-\n- def hashret(self):\n- return struct.pack(\"H\", self.seq)\n-\n- def answers(self, other):\n- return self.seq == other.seq\n-\n-\n-class GTPCreatePDPContextRequest(Packet):\n- # 3GPP TS 29.060 V9.1.0 (2009-12)\n- name = \"GTP Create PDP Context Request\"\n- fields_desc = [PacketListField(\"IE_list\", [IE_TEIDI(), IE_NSAPI(), IE_GSNAddress(), # noqa: E501\n- IE_GSNAddress(),\n- IE_NotImplementedTLV(ietype=135, length=15, data=RandString(15))], # noqa: E501\n- IE_Dispatcher)]\n-\n- def hashret(self):\n- return struct.pack(\"H\", self.seq)\n-\n-\n-class GTPCreatePDPContextResponse(Packet):\n- # 3GPP TS 29.060 V9.1.0 (2009-12)\n- name = \"GTP Create PDP Context Response\"\n- fields_desc = [PacketListField(\"IE_list\", [], IE_Dispatcher)]\n-\n- def hashret(self):\n- return struct.pack(\"H\", self.seq)\n-\n- def answers(self, other):\n- return self.seq == other.seq\n-\n-\n-class GTPUpdatePDPContextRequest(Packet):\n- # 3GPP TS 29.060 V9.1.0 (2009-12)\n- name = \"GTP Update PDP Context Request\"\n- fields_desc = [PacketListField(\"IE_list\", [\n- IE_Cause(),\n- IE_Recovery(),\n- IE_TEIDI(),\n- IE_TEICP(),\n- IE_ChargingId(),\n- IE_ProtocolConfigurationOptions(),\n- IE_GSNAddress(),\n- IE_GSNAddress(),\n- IE_GSNAddress(),\n- IE_GSNAddress(),\n- IE_QoS(),\n- IE_CharginGatewayAddress(),\n- IE_CharginGatewayAddress(),\n- IE_CommonFlags(),\n- IE_APNRestriction(),\n- IE_BearerControlMode(),\n- IE_MSInfoChangeReportingAction(),\n- IE_EvolvedAllocationRetentionPriority(),\n- IE_PrivateExtension()],\n- IE_Dispatcher)]\n-\n- def hashret(self):\n- return struct.pack(\"H\", self.seq)\n-\n-\n-class GTPUpdatePDPContextResponse(Packet):\n- # 3GPP TS 29.060 V9.1.0 (2009-12)\n- name = \"GTP Update PDP Context Response\"\n- fields_desc = [PacketListField(\"IE_list\", None, IE_Dispatcher)]\n-\n- def hashret(self):\n- return struct.pack(\"H\", self.seq)\n-\n-\n-class GTPErrorIndication(Packet):\n- # 3GPP TS 29.060 V9.1.0 (2009-12)\n- name = \"GTP Error Indication\"\n- fields_desc = [PacketListField(\"IE_list\", [], IE_Dispatcher)]\n-\n-\n-class GTPDeletePDPContextRequest(Packet):\n- # 3GPP TS 29.060 V9.1.0 (2009-12)\n- name = \"GTP Delete PDP Context Request\"\n- fields_desc = [PacketListField(\"IE_list\", [], IE_Dispatcher)]\n-\n-\n-class GTPDeletePDPContextResponse(Packet):\n- # 3GPP TS 29.060 V9.1.0 (2009-12)\n- name = \"GTP Delete PDP Context Response\"\n- fields_desc = [PacketListField(\"IE_list\", [], IE_Dispatcher)]\n-\n-\n-class GTPPDUNotificationRequest(Packet):\n- # 3GPP TS 29.060 V9.1.0 (2009-12)\n- name = \"GTP PDU Notification Request\"\n- fields_desc = [PacketListField(\"IE_list\", [IE_IMSI(),\n- IE_TEICP(TEICI=RandInt()),\n- IE_EndUserAddress(PDPTypeNumber=0x21), # noqa: E501\n- IE_AccessPointName(),\n- IE_GSNAddress(address=\"127.0.0.1\"), # noqa: E501\n- ], IE_Dispatcher)]\n-\n-\n-class GTPSupportedExtensionHeadersNotification(Packet):\n- name = \"GTP Supported Extension Headers Notification\"\n- fields_desc = [PacketListField(\"IE_list\", [IE_ExtensionHeaderList(),\n- ], IE_Dispatcher)]\n-\n-\n-class GTPmorethan1500(Packet):\n- # 3GPP TS 29.060 V9.1.0 (2009-12)\n- name = \"GTP More than 1500\"\n- fields_desc = [ByteEnumField(\"IE_Cause\", \"Cause\", IEType),\n- BitField(\"IE\", 1, 12000), ]\n-\n-\n-# Bind GTP-C\n-bind_bottom_up(UDP, GTPHeader, dport=2123)\n-bind_bottom_up(UDP, GTPHeader, sport=2123)\n-bind_layers(UDP, GTPHeader, dport=2123, sport=2123)\n-bind_layers(GTPHeader, GTPEchoRequest, gtp_type=1, S=1)\n-bind_layers(GTPHeader, GTPEchoResponse, gtp_type=2, S=1)\n-bind_layers(GTPHeader, GTPCreatePDPContextRequest, gtp_type=16)\n-bind_layers(GTPHeader, GTPCreatePDPContextResponse, gtp_type=17)\n-bind_layers(GTPHeader, GTPUpdatePDPContextRequest, gtp_type=18)\n-bind_layers(GTPHeader, GTPUpdatePDPContextResponse, gtp_type=19)\n-bind_layers(GTPHeader, GTPDeletePDPContextRequest, gtp_type=20)\n-bind_layers(GTPHeader, GTPDeletePDPContextResponse, gtp_type=21)\n-bind_layers(GTPHeader, GTPPDUNotificationRequest, gtp_type=27)\n-bind_layers(GTPHeader, GTPSupportedExtensionHeadersNotification, gtp_type=31, S=1) # noqa: E501\n-bind_layers(GTPHeader, GTP_UDPPort_ExtensionHeader, next_ex=64, E=1)\n-bind_layers(GTPHeader, GTP_PDUSession_ExtensionHeader, next_ex=133, E=1)\n-bind_layers(GTPHeader, GTP_PDCP_PDU_ExtensionHeader, next_ex=192, E=1)\n-\n-# Bind GTP-U\n-bind_bottom_up(UDP, GTP_U_Header, dport=2152)\n-bind_bottom_up(UDP, GTP_U_Header, sport=2152)\n-bind_layers(UDP, GTP_U_Header, dport=2152, sport=2152)\n-bind_layers(GTP_U_Header, GTPErrorIndication, gtp_type=26, S=1)\n-bind_top_down(GTP_U_Header, IP, gtp_type=255)\n-bind_top_down(GTP_U_Header, IPv6, gtp_type=255)\n-bind_top_down(GTP_U_Header, PPP, gtp_type=255)\n", "prefixes": [ "V1", "2/3" ] }{ "id": 82694, "url": "