diff --git a/scapy/contrib/gtp.py b/scapy/contrib/gtp.py index fcd359852ae616a91e05dac9ef6892482edb6e89..64529be29602bc05421836f51656f16a7b552a15 100644 --- a/scapy/contrib/gtp.py +++ b/scapy/contrib/gtp.py @@ -353,7 +353,7 @@ class GTP_U_Header(Packet): BitField("E", 0,1), BitField("S", 0, 1), BitField("PN", 0, 1), - ByteEnumField("type", None, GTPmessageType), + 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), @@ -363,25 +363,14 @@ class GTP_U_Header(Packet): def post_build(self, p, pay): p += pay - warning("Packet length: " + str(len(p)-8)) if self.length is None: l = len(p)-8 - p = p[:1] + struct.pack("!i",l)+ p[4:] - if self.type is None: - if isinstance(self.payload, IP): - t = 255 - else: - warning("GTP-U Header: Not PDU detected.") - t = 255 - p = p[:1] + struct.pack("!B",t) + p[3:] + 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" - # 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 = [ ByteEnumField("IE_Cause", "Cause", IEType), BitField("IE", 1, 12000),] @@ -395,7 +384,7 @@ bind_layers(GTPHeader, GTPDeletePDPContextRequest, gtp_type = 20) bind_layers(GTPHeader, GTPDeletePDPContextResponse, gtp_type = 21) # Bind GTP-U bind_layers(UDP, GTP_U_Header) -bind_layers(GTP_U_Header, IP) +bind_layers(GTP_U_Header, IP, gtp_type = 255) if __name__ == "__main__": interact(mydict=globals(), mybanner="Test GTPv1 add-on v0.1")