summaryrefslogtreecommitdiffstats
path: root/scripts/external_libs/scapy-python3-0.18/scapy/contrib/gtp.py
diff options
context:
space:
mode:
authorimarom <imarom@cisco.com>2016-03-21 16:03:47 +0200
committerimarom <imarom@cisco.com>2016-03-21 16:03:47 +0200
commitb89efa188810bf95a9d245e69e2961b5721c3b0f (patch)
tree454273ac6c4ae972ebb8a2c86b893296970b4fa9 /scripts/external_libs/scapy-python3-0.18/scapy/contrib/gtp.py
parentf72c6df9d2e9998ae1f3529d729ab7930b35785a (diff)
scapy python 2/3
Diffstat (limited to 'scripts/external_libs/scapy-python3-0.18/scapy/contrib/gtp.py')
-rw-r--r--scripts/external_libs/scapy-python3-0.18/scapy/contrib/gtp.py546
1 files changed, 0 insertions, 546 deletions
diff --git a/scripts/external_libs/scapy-python3-0.18/scapy/contrib/gtp.py b/scripts/external_libs/scapy-python3-0.18/scapy/contrib/gtp.py
deleted file mode 100644
index 008a0200..00000000
--- a/scripts/external_libs/scapy-python3-0.18/scapy/contrib/gtp.py
+++ /dev/null
@@ -1,546 +0,0 @@
-#! /usr/bin/env python
-
-## Copyright (C) 2014 Guillaume Valadon <guillaume.valadon@ssi.gouv.fr>
-## 2014 Alexis Sultan <alexis.sultan@sfr.com>
-## 2012 ffranz <ffranz@iniqua.com>
-##
-## This program is published under a GPLv2 license
-
-# scapy.contrib.description = GTP
-# scapy.contrib.status = loads
-
-import time
-import logging
-
-from scapy.packet import *
-from scapy.fields import *
-from scapy.layers.inet import IP, UDP
-
-# GTP Data types
-
-GTPmessageType = { 1: "echo_request",
- 2: "echo_response",
- 16: "create_pdp_context_req",
- 17: "create_pdp_context_res",
- 20: "delete_pdp_context_req",
- 21: "delete_pdp_context_res",
- 26: "error_indication",
- 27: "pdu_notification_req",
- 255: "gtp_u_header" }
-
-IEType = { 1: "Cause",
- 2: "IMSI",
- 3: "RAI",
- 4: "TLLI",
- 5: "P_TMSI",
- 14: "Recovery",
- 15: "SelectionMode",
- 16: "TEIDI",
- 17: "TEICP",
- 19: "TeardownInd",
- 20: "NSAPI",
- 26: "ChargingChrt",
- 27: "TraceReference",
- 28: "TraceType",
- 128: "EndUserAddress",
- 131: "AccessPointName",
- 132: "ProtocolConfigurationOptions",
- 133: "GSNAddress",
- 134: "MSInternationalNumber",
- 135: "QoS",
- 148: "CommonFlags",
- 151: "RatType",
- 152: "UserLocationInformation",
- 153: "MSTimeZone",
- 154: "IMEI" }
-
-CauseValues = { 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",
- 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 = { 11111100: "MS or APN",
- 11111101: "MS",
- 11111110: "NET",
- 11111111: "FutureUse" }
-
-TeardownInd_value = { 254: "False",
- 255: "True" }
-
-class TBCDByteField(StrFixedLenField):
-
- def i2h(self, pkt, val):
- ret = []
- for i in range(len(val)):
- byte = ord(val[i])
- left = byte >> 4
- right = byte & 0xF
- if left == 0xF:
- ret += [ "%d" % right ]
- else:
- ret += [ "%d" % right, "%d" % left ]
- return "".join(ret)
-
- def i2repr(self, pkt, x):
- return repr(self.i2h(pkt,x))
-
- def i2m(self, pkt, val):
- ret_string = ""
- for i in range(0, len(val), 2):
- tmp = val[i:i+2]
- if len(tmp) == 2:
- ret_string += chr(int(tmp[1] + tmp[0], 16))
- else:
- ret_string += chr(int("F" + tmp[0], 16))
- return ret_string
-
-class GTPHeader(Packet):
- # 3GPP TS 29.060 V9.1.0 (2009-12)
- name = "GTP Header"
- fields_desc=[ BitField("version", 1, 3),
- BitField("PT", 1, 1),
- BitField("reserved", 0, 1),
- BitField("E", 0, 1),
- BitField("S", 1, 1),
- BitField("PN", 0, 1),
- ByteEnumField("gtp_type", None, GTPmessageType),
- ShortField("length", None),
- IntField("teid", 0) ]
-
- def post_build(self, p, pay):
- p += pay
- if self.length is None:
- l = len(p)-8
- p = p[:2] + struct.pack("!H", l)+ 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 == other.version and
- self.payload.answers(other.payload))
-
-class GTPEchoRequest(Packet):
- # 3GPP TS 29.060 V9.1.0 (2009-12)
- name = "GTP Echo Request"
- fields_desc = [ XBitField("seq", 0, 16),
- ByteField("npdu", 0),
- ByteField("next_ex", 0),]
-
- def hashret(self):
- return struct.pack("H", self.seq)
-
-class IE_Cause(Packet):
- name = "Cause"
- fields_desc = [ ByteEnumField("ietype", 1, IEType),
- BitField("Response", None, 1),
- BitField("Rejection", None, 1),
- BitEnumField("CauseValue", None, 6, CauseValues) ]
- def extract_padding(self, pkt):
- return "",pkt
-
-class IE_IMSI(Packet):
- name = "IMSI - Subscriber identity of the MS"
- fields_desc = [ ByteEnumField("ietype", 2, IEType),
- TBCDByteField("imsi", str(RandNum(0, 999999999999999)), 8) ]
- def extract_padding(self, pkt):
- return "",pkt
-
-class IE_Routing(Packet):
- name = "Routing Area Identity"
- fields_desc = [ 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) ]
- def extract_padding(self, pkt):
- return "",pkt
-
-class IE_Recovery(Packet):
- name = "Recovery"
- fields_desc = [ ByteEnumField("ietype", 14, IEType),
- ByteField("res-counter", 24) ]
- def extract_padding(self, pkt):
- return "",pkt
-
-class IE_SelectionMode(Packet):
- # Indicates the origin of the APN in the message
- name = "Selection Mode"
- fields_desc = [ ByteEnumField("ietype", 15, IEType),
- BitEnumField("SelectionMode", "MS or APN", 8, Selection_Mode) ]
- def extract_padding(self, pkt):
- return "",pkt
-
-class IE_TEIDI(Packet):
- name = "Tunnel Endpoint Identifier Data"
- fields_desc = [ ByteEnumField("ietype", 16, IEType),
- XIntField("TEIDI", RandInt()) ]
- def extract_padding(self, pkt):
- return "",pkt
-
-class IE_TEICP(Packet):
- name = "Tunnel Endpoint Identifier Control Plane"
- fields_desc = [ ByteEnumField("ietype", 17, IEType),
- XIntField("TEICI", RandInt())]
- def extract_padding(self, pkt):
- return "",pkt
-
-class IE_Teardown(Packet):
- name = "Teardown Indicator"
- fields_desc = [ ByteEnumField("ietype", 19, IEType),
- ByteEnumField("indicator", "True", TeardownInd_value) ]
- def extract_padding(self, pkt):
- return "",pkt
-
-class IE_NSAPI(Packet):
- # Identifies a PDP context in a mobility management context specified by TEICP
- name = "NSAPI"
- fields_desc = [ ByteEnumField("ietype", 20, IEType),
- XBitField("sparebits", 0x0000, 4),
- XBitField("NSAPI", RandNum(0, 15), 4) ]
- def extract_padding(self, pkt):
- return "",pkt
-
-class IE_ChargingCharacteristics(Packet):
- # Way of informing both the SGSN and GGSN of the rules for
- name = "Charging Characteristics"
- fields_desc = [ ByteEnumField("ietype", 26, IEType),
- # producing charging information based on operator configured triggers.
- # 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) ]
- def extract_padding(self, pkt):
- return "",pkt
-
-class IE_TraceReference(Packet):
- # Identifies a record or a collection of records for a particular trace.
- name = "Trace Reference"
- fields_desc = [ ByteEnumField("ietype", 27, IEType),
- XBitField("Trace_reference", None, 16) ]
- def extract_padding(self, pkt):
- return "",pkt
-
-class IE_TraceType(Packet):
- # Indicates the type of the trace
- name = "Trace Type"
- fields_desc = [ ByteEnumField("ietype", 28, IEType),
- XBitField("Trace_type", None, 16) ]
- def extract_padding(self, pkt):
- return "",pkt
-
-class IE_EndUserAddress(Packet):
- # Supply protocol specific information of the external packet
- name = "End User Addresss"
- fields_desc = [ ByteEnumField("ietype", 128, IEType),
- # data network accessed by the GGPRS subscribers.
- # - Request
- # 1 Type (1byte)
- # 2-3 Length (2bytes) - value 2
- # 4 Spare + PDP Type Organization
- # 5 PDP Type Number
- # - Response
- # 6-n PDP Address
- BitField("EndUserAddressLength", 2, 16),
- BitField("EndUserAddress", 1111, 4),
- BitField("PDPTypeOrganization", 1, 4),
- XByteField("PDPTypeNumber", None) ]
- def extract_padding(self, pkt):
- return "",pkt
-
-class APNStrLenField(StrLenField):
- # Inspired by DNSStrField
- def m2i(self, pkt, s):
- ret_s = ""
- tmp_s = s
- while tmp_s:
- tmp_len = struct.unpack("!B", tmp_s[0])[0] + 1
- if tmp_len > len(tmp_s):
- warning("APN prematured end of character-string (size=%i, remaining bytes=%i)" % (tmp_len, len(tmp_s)))
- ret_s += tmp_s[1:tmp_len]
- tmp_s = tmp_s[tmp_len:]
- if len(tmp_s) :
- ret_s += "."
- s = ret_s
- return s
- def i2m(self, pkt, s):
- s = "".join(map(lambda x: chr(len(x))+x, s.split(".")))
- return s
-
-
-class IE_AccessPointName(Packet):
- # Sent by SGSN or by GGSN as defined in 3GPP TS 23.060
- name = "Access Point Name"
- fields_desc = [ ByteEnumField("ietype", 131, IEType),
- ShortField("length", None),
- APNStrLenField("APN", "nternet", length_from=lambda x: x.length) ]
- def extract_padding(self, pkt):
- return "",pkt
- def post_build(self, p, pay):
- if self.length is None:
- l = len(p)-3
- p = p[:2] + struct.pack("!B", l)+ p[3:]
- return p
-
-class IE_ProtocolConfigurationOptions(Packet):
- name = "Protocol Configuration Options"
- fields_desc = [ ByteEnumField("ietype", 132, IEType),
- ShortField("length", 4),
- StrLenField("Protocol Configuration", "", length_from=lambda x: x.length) ]
- def extract_padding(self, pkt):
- return "",pkt
-
-class IE_GSNAddress(Packet):
- name = "GSN Address"
- fields_desc = [ ByteEnumField("ietype", 133, IEType),
- ShortField("length", 4),
- IPField("address", RandIP()) ]
- def extract_padding(self, pkt):
- return "",pkt
-
-class IE_MSInternationalNumber(Packet):
- name = "MS International Number"
- fields_desc = [ ByteEnumField("ietype", 134, IEType),
- ShortField("length", None),
- FlagsField("flags", 0x91, 8, ["Extension","","","International Number","","","","ISDN numbering"]),
- TBCDByteField("digits", "33607080910", length_from=lambda x: x.length-1) ]
- def extract_padding(self, pkt):
- return "",pkt
-
-class IE_UserLocationInformation(Packet):
- name = "User Location Information"
- fields_desc = [ 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 length of MNC is 1 byte
- TBCDByteField("MNC", "", 1),
- ShortField("LAC", None),
- ShortField("SAC", None) ]
- def extract_padding(self, pkt):
- return "",pkt
-
-class IE_IMEI(Packet):
- name = "IMEI"
- fields_desc = [ ByteEnumField("ietype", 154, IEType),
- ShortField("length", None),
- TBCDByteField("IMEI", "", length_from=lambda x: x.length) ]
- def extract_padding(self, pkt):
- return "",pkt
-
-class IE_NotImplementedTLV(Packet):
- name = "IE not implemented"
- fields_desc = [ ByteEnumField("ietype", 0, IEType),
- ShortField("length", None),
- StrLenField("data", "", length_from=lambda x: x.length) ]
- def extract_padding(self, pkt):
- return "",pkt
-
-ietypecls = { 1: IE_Cause, 2: IE_IMSI, 3: IE_Routing, 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,
- 128: IE_EndUserAddress, 131: IE_AccessPointName, 132: IE_ProtocolConfigurationOptions,
- 133: IE_GSNAddress, 134: IE_MSInternationalNumber, 152: IE_UserLocationInformation, 154: IE_IMEI }
-
-def IE_Dispatcher(s):
- """Choose the correct Information Element class."""
-
- if len(s) < 1:
- return Raw(s)
-
- # Get the IE type
- ietype = ord(s[0])
- cls = ietypecls.get(ietype, Raw)
-
- # if ietype greater than 128 are TLVs
- if cls == Raw and ietype & 128 == 128:
- cls = IE_NotImplementedTLV
-
- return cls(s)
-
-class GTPEchoResponse(Packet):
- # 3GPP TS 29.060 V9.1.0 (2009-12)
- name = "GTP Echo Response"
- fields_desc = [ XBitField("seq", 0, 16),
- ByteField("npdu", 0),
- ByteField("next_ex", 0),
- PacketListField("IE_list", [], IE_Dispatcher) ]
-
- def hashret(self):
- return struct.pack("H", self.seq)
-
- def answers(self, other):
- return self.seq == other.seq
-
-
-class GTPCreatePDPContextRequest(Packet):
- # 3GPP TS 29.060 V9.1.0 (2009-12)
- name = "GTP Create PDP Context Request"
- fields_desc = [ ShortField("seq", RandShort()),
- ByteField("npdu", 0),
- ByteField("next_ex", 0),
- PacketListField("IE_list", [ IE_TEIDI(), IE_NSAPI(), IE_GSNAddress(),
- IE_GSNAddress(),
- IE_NotImplementedTLV(ietype=135, length=15,data=RandString(15)) ],
- IE_Dispatcher) ]
- def hashret(self):
- return struct.pack("H", self.seq)
-
-class GTPCreatePDPContextResponse(Packet):
- # 3GPP TS 29.060 V9.1.0 (2009-12)
- name = "GTP Create PDP Context Response"
- fields_desc = [ ShortField("seq", RandShort()),
- ByteField("npdu", 0),
- ByteField("next_ex", 0),
- PacketListField("IE_list", [], IE_Dispatcher) ]
-
- def hashret(self):
- return struct.pack("H", self.seq)
-
- def answers(self, other):
- return self.seq == other.seq
-
-class GTPErrorIndication(Packet):
- # 3GPP TS 29.060 V9.1.0 (2009-12)
- name = "GTP Error Indication"
- fields_desc = [ XBitField("seq", 0, 16),
- ByteField("npdu", 0),
- ByteField("next_ex",0),
- PacketListField("IE_list", [], IE_Dispatcher) ]
-
-class GTPDeletePDPContextRequest(Packet):
- # 3GPP TS 29.060 V9.1.0 (2009-12)
- name = "GTP Delete PDP Context Request"
- fields_desc = [ XBitField("seq", 0, 16),
- ByteField("npdu", 0),
- ByteField("next_ex", 0),
- PacketListField("IE_list", [], IE_Dispatcher) ]
-
-class GTPDeletePDPContextResponse(Packet):
- # 3GPP TS 29.060 V9.1.0 (2009-12)
- name = "GTP Delete PDP Context Response"
- fields_desc = [ XBitField("seq", 0, 16),
- ByteField("npdu", 0),
- ByteField("next_ex",0),
- PacketListField("IE_list", [], IE_Dispatcher) ]
-
-class GTPPDUNotificationRequest(Packet):
- # 3GPP TS 29.060 V9.1.0 (2009-12)
- name = "GTP PDU Notification Request"
- fields_desc = [ XBitField("seq", 0, 16),
- ByteField("npdu", 0),
- ByteField("next_ex", 0),
- PacketListField("IE_list", [ IE_IMSI(),
- IE_TEICP(TEICI=RandInt()),
- IE_EndUserAddress(PDPTypeNumber=0x21),
- IE_AccessPointName(),
- IE_GSNAddress(address="127.0.0.1"),
- ], IE_Dispatcher) ]
-
-class GTP_U_Header(Packet):
- # 3GPP TS 29.060 V9.1.0 (2009-12)
- name = "GTP-U Header"
- # GTP-U protocol is used to transmit T-PDUs between GSN pairs (or between an SGSN and an RNC in UMTS),
- # encapsulated in G-PDUs. A G-PDU is a packet including a GTP-U header and a T-PDU. The Path Protocol
- # defines the path and the GTP-U header defines the tunnel. Several tunnels may be multiplexed on a single path.
- fields_desc = [ 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),
- BitField("length", None, 16),
- XBitField("TEID", 0, 32),
- ConditionalField(XBitField("seq", 0, 16), lambda pkt:pkt.E==1 or pkt.S==1 or pkt.PN==1),
- ConditionalField(ByteField("npdu", 0), lambda pkt:pkt.E==1 or pkt.S==1 or pkt.PN==1),
- ConditionalField(ByteField("next_ex", 0), lambda pkt:pkt.E==1 or pkt.S==1 or pkt.PN==1),
- ]
-
- def post_build(self, p, pay):
- p += pay
- if self.length is None:
- l = len(p)-8
- p = p[:2] + struct.pack("!H", l)+ p[4:]
- return p
-
-class GTPmorethan1500(Packet):
- # 3GPP TS 29.060 V9.1.0 (2009-12)
- name = "GTP More than 1500"
- fields_desc = [ ByteEnumField("IE_Cause", "Cause", IEType),
- BitField("IE", 1, 12000),]
-
-# Bind GTP-C
-bind_layers(UDP, GTPHeader, dport = 2123)
-bind_layers(UDP, GTPHeader, sport = 2123)
-bind_layers(GTPHeader, GTPEchoRequest, gtp_type = 1)
-bind_layers(GTPHeader, GTPEchoResponse, gtp_type = 2)
-bind_layers(GTPHeader, GTPCreatePDPContextRequest, gtp_type = 16)
-bind_layers(GTPHeader, GTPCreatePDPContextResponse, gtp_type = 17)
-bind_layers(GTPHeader, GTPDeletePDPContextRequest, gtp_type = 20)
-bind_layers(GTPHeader, GTPDeletePDPContextResponse, gtp_type = 21)
-bind_layers(GTPHeader, GTPPDUNotificationRequest, gtp_type = 27)
-
-# Bind GTP-U
-bind_layers(UDP, GTP_U_Header, dport = 2152)
-bind_layers(UDP, GTP_U_Header, sport = 2152)
-bind_layers(GTP_U_Header, IP, gtp_type = 255)
-
-if __name__ == "__main__":
- from scapy.all import *
- interact(mydict=globals(), mybanner="GTPv1 add-on")
-