mirror of
https://github.com/zeek/zeek.git
synced 2025-10-06 16:48:19 +00:00
Add GPRS Tunnelling Protocol (GTPv1) decapsulation.
This currently supports automatic decapsulation of GTP-U packets on UDP port 2152. The GTPv1 headers for such tunnels can be inspected by handling the "gtpv1_g_pdu_packet" event, which has a parameter of type "gtpv1_hdr". Analyzer and test cases are derived from submissions by Carsten Langer. Addresses #690.
This commit is contained in:
parent
2915e04db4
commit
9edbf3e53c
52 changed files with 670 additions and 2 deletions
|
@ -88,7 +88,10 @@ redef dpd_config += { [ANALYZER_AYIYA] = [$ports = ayiya_ports] };
|
||||||
const teredo_ports = { 3544/udp };
|
const teredo_ports = { 3544/udp };
|
||||||
redef dpd_config += { [ANALYZER_TEREDO] = [$ports = teredo_ports] };
|
redef dpd_config += { [ANALYZER_TEREDO] = [$ports = teredo_ports] };
|
||||||
|
|
||||||
redef likely_server_ports += { ayiya_ports, teredo_ports };
|
const gtpv1u_ports = { 2152/udp };
|
||||||
|
redef dpd_config += { [ANALYZER_GTPV1] = [$ports = gtpv1u_ports] };
|
||||||
|
|
||||||
|
redef likely_server_ports += { ayiya_ports, teredo_ports, gtpv1u_ports };
|
||||||
|
|
||||||
event bro_init() &priority=5
|
event bro_init() &priority=5
|
||||||
{
|
{
|
||||||
|
|
|
@ -1450,6 +1450,44 @@ type teredo_hdr: record {
|
||||||
hdr: pkt_hdr; ##< IPv6 and transport protocol headers.
|
hdr: pkt_hdr; ##< IPv6 and transport protocol headers.
|
||||||
};
|
};
|
||||||
|
|
||||||
|
## A GTPv1 (GPRS Tunneling Protocol) header.
|
||||||
|
type gtpv1_hdr: record {
|
||||||
|
## The 3-bit version field, which for GTPv1 should be 1.
|
||||||
|
version: count;
|
||||||
|
## Protocol Type value differentiates GTP (value 1) from GTP' (value 0).
|
||||||
|
pt_flag: bool;
|
||||||
|
## Reserved field, should be 0.
|
||||||
|
rsv: bool;
|
||||||
|
## Extension Header flag. When 0, the *next_type* field may or may not
|
||||||
|
## be present, but shouldn't be meaningful. When 1, *next_type* is
|
||||||
|
## present and meaningful.
|
||||||
|
e_flag: bool;
|
||||||
|
## Sequence Number flag. When 0, the *seq* field may or may not
|
||||||
|
## be present, but shouldn't be meaningful. When 1, *seq* is
|
||||||
|
## present and meaningful.
|
||||||
|
s_flag: bool;
|
||||||
|
## N-PDU flag. When 0, the *n_pdu* field may or may not
|
||||||
|
## be present, but shouldn't be meaningful. When 1, *n_pdu* is
|
||||||
|
## present and meaningful.
|
||||||
|
pn_flag: bool;
|
||||||
|
## Message Type. A value of 255 indicates user-plane data is encapsulated.
|
||||||
|
msg_type: count;
|
||||||
|
## Length of the GTP packet payload (the rest of the packet following the
|
||||||
|
## mandatory 8-byte GTP header).
|
||||||
|
length: count;
|
||||||
|
## Tunnel Endpoint Identifier. Unambiguously identifies a tunnel endpoint
|
||||||
|
## in receiving GTP-U or GTP-C protocol entity.
|
||||||
|
teid: count;
|
||||||
|
## Sequence Number. Set if any *e_flag*, *s_flag*, or *pn_flag* field is
|
||||||
|
## set.
|
||||||
|
seq: count &optional;
|
||||||
|
## N-PDU Number. Set if any *e_flag*, *s_flag*, or *pn_flag* field is set.
|
||||||
|
n_pdu: count &optional;
|
||||||
|
## Next Extension Header Type. Set if any *e_flag*, *s_flag*, or *pn_flag*
|
||||||
|
## field is set.
|
||||||
|
next_type: count &optional;
|
||||||
|
};
|
||||||
|
|
||||||
## Definition of "secondary filters". A secondary filter is a BPF filter given as
|
## Definition of "secondary filters". A secondary filter is a BPF filter given as
|
||||||
## index in this table. For each such filter, the corresponding event is raised for
|
## index in this table. For each such filter, the corresponding event is raised for
|
||||||
## all matching packets.
|
## all matching packets.
|
||||||
|
@ -2776,6 +2814,9 @@ export {
|
||||||
## Toggle whether to do IPv6-in-Teredo decapsulation.
|
## Toggle whether to do IPv6-in-Teredo decapsulation.
|
||||||
const enable_teredo = T &redef;
|
const enable_teredo = T &redef;
|
||||||
|
|
||||||
|
## Toggle whether to do GTPv1 decapsulation.
|
||||||
|
const enable_gtpv1 = T &redef;
|
||||||
|
|
||||||
## With this option set, the Teredo analysis will first check to see if
|
## With this option set, the Teredo analysis will first check to see if
|
||||||
## other protocol analyzers have confirmed that they think they're
|
## other protocol analyzers have confirmed that they think they're
|
||||||
## parsing the right protocol and only continue with Teredo tunnel
|
## parsing the right protocol and only continue with Teredo tunnel
|
||||||
|
@ -2792,6 +2833,15 @@ export {
|
||||||
## :bro:see:`Tunnel::yielding_teredo_decapsulation`.
|
## :bro:see:`Tunnel::yielding_teredo_decapsulation`.
|
||||||
const delay_teredo_confirmation = T &redef;
|
const delay_teredo_confirmation = T &redef;
|
||||||
|
|
||||||
|
## With this set, the GTP analyzer waits until the most-recent upflow
|
||||||
|
## and downflow packets are a valid GTPv1 encapsulation before
|
||||||
|
## issuing :bro:see:`protocol_confirmation`. If it's false, the
|
||||||
|
## first occurence of a packet with valid GTPv1 encapsulation causes
|
||||||
|
## confirmation. Since the same inner connection can be carried
|
||||||
|
## differing outer upflow/downflow connections, setting to false
|
||||||
|
## may work better.
|
||||||
|
const delay_gtp_confirmation = F &redef;
|
||||||
|
|
||||||
## How often to cleanup internal state for inactive IP tunnels.
|
## How often to cleanup internal state for inactive IP tunnels.
|
||||||
const ip_tunnel_timeout = 24hrs &redef;
|
const ip_tunnel_timeout = 24hrs &redef;
|
||||||
} # end export
|
} # end export
|
||||||
|
|
|
@ -40,6 +40,7 @@
|
||||||
#include "Syslog-binpac.h"
|
#include "Syslog-binpac.h"
|
||||||
#include "Teredo.h"
|
#include "Teredo.h"
|
||||||
#include "ConnSizeAnalyzer.h"
|
#include "ConnSizeAnalyzer.h"
|
||||||
|
#include "GTPv1.h"
|
||||||
|
|
||||||
// Keep same order here as in AnalyzerTag definition!
|
// Keep same order here as in AnalyzerTag definition!
|
||||||
const Analyzer::Config Analyzer::analyzer_configs[] = {
|
const Analyzer::Config Analyzer::analyzer_configs[] = {
|
||||||
|
@ -139,6 +140,9 @@ const Analyzer::Config Analyzer::analyzer_configs[] = {
|
||||||
{ AnalyzerTag::Teredo, "TEREDO",
|
{ AnalyzerTag::Teredo, "TEREDO",
|
||||||
Teredo_Analyzer::InstantiateAnalyzer,
|
Teredo_Analyzer::InstantiateAnalyzer,
|
||||||
Teredo_Analyzer::Available, 0, false },
|
Teredo_Analyzer::Available, 0, false },
|
||||||
|
{ AnalyzerTag::GTPv1, "GTPV1",
|
||||||
|
GTPv1_Analyzer::InstantiateAnalyzer,
|
||||||
|
GTPv1_Analyzer::Available, 0, false },
|
||||||
|
|
||||||
{ AnalyzerTag::File, "FILE", File_Analyzer::InstantiateAnalyzer,
|
{ AnalyzerTag::File, "FILE", File_Analyzer::InstantiateAnalyzer,
|
||||||
File_Analyzer::Available, 0, false },
|
File_Analyzer::Available, 0, false },
|
||||||
|
|
|
@ -37,6 +37,7 @@ namespace AnalyzerTag {
|
||||||
AYIYA,
|
AYIYA,
|
||||||
SOCKS,
|
SOCKS,
|
||||||
Teredo,
|
Teredo,
|
||||||
|
GTPv1,
|
||||||
|
|
||||||
// Other
|
// Other
|
||||||
File, Backdoor, InterConn, SteppingStone, TCPStats,
|
File, Backdoor, InterConn, SteppingStone, TCPStats,
|
||||||
|
|
|
@ -203,6 +203,8 @@ binpac_target(dns.pac
|
||||||
dns-protocol.pac dns-analyzer.pac)
|
dns-protocol.pac dns-analyzer.pac)
|
||||||
binpac_target(dns_tcp.pac
|
binpac_target(dns_tcp.pac
|
||||||
dns.pac)
|
dns.pac)
|
||||||
|
binpac_target(gtpv1.pac
|
||||||
|
gtpv1-protocol.pac gtpv1-analyzer.pac)
|
||||||
binpac_target(http.pac
|
binpac_target(http.pac
|
||||||
http-protocol.pac http-analyzer.pac)
|
http-protocol.pac http-analyzer.pac)
|
||||||
binpac_target(ncp.pac)
|
binpac_target(ncp.pac)
|
||||||
|
@ -330,6 +332,7 @@ set(bro_SRCS
|
||||||
Frame.cc
|
Frame.cc
|
||||||
Func.cc
|
Func.cc
|
||||||
Gnutella.cc
|
Gnutella.cc
|
||||||
|
GTPv1.cc
|
||||||
HTTP.cc
|
HTTP.cc
|
||||||
HTTP-binpac.cc
|
HTTP-binpac.cc
|
||||||
Hash.cc
|
Hash.cc
|
||||||
|
|
24
src/GTPv1.cc
Normal file
24
src/GTPv1.cc
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
#include "GTPv1.h"
|
||||||
|
|
||||||
|
GTPv1_Analyzer::GTPv1_Analyzer(Connection* conn)
|
||||||
|
: Analyzer(AnalyzerTag::GTPv1, conn)
|
||||||
|
{
|
||||||
|
interp = new binpac::GTPv1::GTPv1_Conn(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
GTPv1_Analyzer::~GTPv1_Analyzer()
|
||||||
|
{
|
||||||
|
delete interp;
|
||||||
|
}
|
||||||
|
|
||||||
|
void GTPv1_Analyzer::Done()
|
||||||
|
{
|
||||||
|
Analyzer::Done();
|
||||||
|
Event(udp_session_done);
|
||||||
|
}
|
||||||
|
|
||||||
|
void GTPv1_Analyzer::DeliverPacket(int len, const u_char* data, bool orig, int seq, const IP_Hdr* ip, int caplen)
|
||||||
|
{
|
||||||
|
Analyzer::DeliverPacket(len, data, orig, seq, ip, caplen);
|
||||||
|
interp->NewData(orig, data, data + len);
|
||||||
|
}
|
29
src/GTPv1.h
Normal file
29
src/GTPv1.h
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
#ifndef GTPv1_h
|
||||||
|
#define GTPv1_h
|
||||||
|
|
||||||
|
#include "gtpv1_pac.h"
|
||||||
|
|
||||||
|
class GTPv1_Analyzer : public Analyzer {
|
||||||
|
public:
|
||||||
|
GTPv1_Analyzer(Connection* conn);
|
||||||
|
virtual ~GTPv1_Analyzer();
|
||||||
|
|
||||||
|
virtual void Done();
|
||||||
|
virtual void DeliverPacket(int len, const u_char* data, bool orig,
|
||||||
|
int seq, const IP_Hdr* ip, int caplen);
|
||||||
|
|
||||||
|
static Analyzer* InstantiateAnalyzer(Connection* conn)
|
||||||
|
{ return new GTPv1_Analyzer(conn); }
|
||||||
|
|
||||||
|
static bool Available()
|
||||||
|
{ return BifConst::Tunnel::enable_gtpv1 &&
|
||||||
|
BifConst::Tunnel::max_depth > 0; }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
friend class AnalyzerTimer;
|
||||||
|
void ExpireTimer(double t);
|
||||||
|
|
||||||
|
binpac::GTPv1::GTPv1_Conn* interp;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
|
@ -5,6 +5,7 @@
|
||||||
#include "Var.h"
|
#include "Var.h"
|
||||||
#include "NetVar.h"
|
#include "NetVar.h"
|
||||||
|
|
||||||
|
RecordType* gtpv1_hdr_type;
|
||||||
RecordType* conn_id;
|
RecordType* conn_id;
|
||||||
RecordType* endpoint;
|
RecordType* endpoint;
|
||||||
RecordType* endpoint_stats;
|
RecordType* endpoint_stats;
|
||||||
|
@ -308,6 +309,7 @@ void init_net_var()
|
||||||
#include "input.bif.netvar_init"
|
#include "input.bif.netvar_init"
|
||||||
#include "reporter.bif.netvar_init"
|
#include "reporter.bif.netvar_init"
|
||||||
|
|
||||||
|
gtpv1_hdr_type = internal_type("gtpv1_hdr")->AsRecordType();
|
||||||
conn_id = internal_type("conn_id")->AsRecordType();
|
conn_id = internal_type("conn_id")->AsRecordType();
|
||||||
endpoint = internal_type("endpoint")->AsRecordType();
|
endpoint = internal_type("endpoint")->AsRecordType();
|
||||||
endpoint_stats = internal_type("endpoint_stats")->AsRecordType();
|
endpoint_stats = internal_type("endpoint_stats")->AsRecordType();
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
#include "EventRegistry.h"
|
#include "EventRegistry.h"
|
||||||
#include "Stats.h"
|
#include "Stats.h"
|
||||||
|
|
||||||
|
extern RecordType* gtpv1_hdr_type;
|
||||||
extern RecordType* conn_id;
|
extern RecordType* conn_id;
|
||||||
extern RecordType* endpoint;
|
extern RecordType* endpoint;
|
||||||
extern RecordType* endpoint_stats;
|
extern RecordType* endpoint_stats;
|
||||||
|
|
|
@ -15,8 +15,10 @@ const Tunnel::max_depth: count;
|
||||||
const Tunnel::enable_ip: bool;
|
const Tunnel::enable_ip: bool;
|
||||||
const Tunnel::enable_ayiya: bool;
|
const Tunnel::enable_ayiya: bool;
|
||||||
const Tunnel::enable_teredo: bool;
|
const Tunnel::enable_teredo: bool;
|
||||||
|
const Tunnel::enable_gtpv1: bool;
|
||||||
const Tunnel::yielding_teredo_decapsulation: bool;
|
const Tunnel::yielding_teredo_decapsulation: bool;
|
||||||
const Tunnel::delay_teredo_confirmation: bool;
|
const Tunnel::delay_teredo_confirmation: bool;
|
||||||
|
const Tunnel::delay_gtp_confirmation: bool;
|
||||||
const Tunnel::ip_tunnel_timeout: interval;
|
const Tunnel::ip_tunnel_timeout: interval;
|
||||||
|
|
||||||
const Threading::heartbeat_interval: interval;
|
const Threading::heartbeat_interval: interval;
|
||||||
|
|
|
@ -577,6 +577,19 @@ event teredo_origin_indication%(outer: connection, inner: teredo_hdr%);
|
||||||
## it may become particularly expensive for real-time analysis.
|
## it may become particularly expensive for real-time analysis.
|
||||||
event teredo_bubble%(outer: connection, inner: teredo_hdr%);
|
event teredo_bubble%(outer: connection, inner: teredo_hdr%);
|
||||||
|
|
||||||
|
## Generated for GTPv1 G-PDU packets. That is, packets with a UDP payload
|
||||||
|
## that includes a GTP header followed by an IPv4 or IPv6 packet.
|
||||||
|
##
|
||||||
|
## outer: The GTP outer tunnel connection.
|
||||||
|
##
|
||||||
|
## inner_gtp: The GTP header.
|
||||||
|
##
|
||||||
|
## inner_ip: The inner IP and transport layer packet headers.
|
||||||
|
##
|
||||||
|
## .. note:: Since this event may be raised on a per-packet basis, handling
|
||||||
|
## it may become particularly expensive for real-time analysis.
|
||||||
|
event gtpv1_g_pdu_packet%(outer: connection, inner_gtp: gtpv1_hdr, inner_ip: pkt_hdr%);
|
||||||
|
|
||||||
## Generated for every packet that has a non-empty transport-layer payload.
|
## Generated for every packet that has a non-empty transport-layer payload.
|
||||||
## This is a very low-level and expensive event that should be avoided when
|
## This is a very low-level and expensive event that should be avoided when
|
||||||
## at all possible. It's usually infeasible to handle when processing even
|
## at all possible. It's usually infeasible to handle when processing even
|
||||||
|
@ -858,7 +871,7 @@ event udp_contents%(u: connection, is_orig: bool, contents: string%);
|
||||||
## Generated when a UDP session for a supported protocol has finished. Some of
|
## Generated when a UDP session for a supported protocol has finished. Some of
|
||||||
## Bro's application-layer UDP analyzers flag the end of a session by raising
|
## Bro's application-layer UDP analyzers flag the end of a session by raising
|
||||||
## this event. Currently, the analyzers for DNS, NTP, Netbios, Syslog, AYIYA,
|
## this event. Currently, the analyzers for DNS, NTP, Netbios, Syslog, AYIYA,
|
||||||
## and Teredo support this.
|
## Teredo, and GTPv1 support this.
|
||||||
##
|
##
|
||||||
## u: The connection record for the corresponding UDP flow.
|
## u: The connection record for the corresponding UDP flow.
|
||||||
##
|
##
|
||||||
|
|
161
src/gtpv1-analyzer.pac
Normal file
161
src/gtpv1-analyzer.pac
Normal file
|
@ -0,0 +1,161 @@
|
||||||
|
|
||||||
|
connection GTPv1_Conn(bro_analyzer: BroAnalyzer)
|
||||||
|
{
|
||||||
|
upflow = GTPv1_Flow(true);
|
||||||
|
downflow = GTPv1_Flow(false);
|
||||||
|
|
||||||
|
%member{
|
||||||
|
bool valid_orig;
|
||||||
|
bool valid_resp;
|
||||||
|
%}
|
||||||
|
|
||||||
|
%init{
|
||||||
|
valid_orig = valid_resp = false;
|
||||||
|
%}
|
||||||
|
|
||||||
|
function valid(orig: bool): bool
|
||||||
|
%{
|
||||||
|
return orig ? valid_orig : valid_resp;
|
||||||
|
%}
|
||||||
|
|
||||||
|
function set_valid(orig: bool, val: bool): void
|
||||||
|
%{
|
||||||
|
if ( orig )
|
||||||
|
valid_orig = val;
|
||||||
|
else
|
||||||
|
valid_resp = val;
|
||||||
|
%}
|
||||||
|
}
|
||||||
|
|
||||||
|
%code{
|
||||||
|
inline void violate(const char* r, const BroAnalyzer& a, const bytestring& p)
|
||||||
|
{
|
||||||
|
a->ProtocolViolation(r, (const char*) p.data(), p.length());
|
||||||
|
}
|
||||||
|
%}
|
||||||
|
|
||||||
|
flow GTPv1_Flow(is_orig: bool)
|
||||||
|
{
|
||||||
|
datagram = GTPv1_Header withcontext(connection, this);
|
||||||
|
|
||||||
|
function process_gtpv1(pdu: GTPv1_Header): bool
|
||||||
|
%{
|
||||||
|
BroAnalyzer a = connection()->bro_analyzer();
|
||||||
|
Connection *c = a->Conn();
|
||||||
|
const EncapsulationStack* e = c->GetEncapsulation();
|
||||||
|
|
||||||
|
connection()->set_valid(is_orig(), false);
|
||||||
|
|
||||||
|
if ( e && e->Depth() >= BifConst::Tunnel::max_depth )
|
||||||
|
{
|
||||||
|
reporter->Weird(c, "tunnel_depth");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( e && e->LastType() == BifEnum::Tunnel::GTPv1 )
|
||||||
|
{
|
||||||
|
// GTP is never tunneled in GTP so, this must be a regular packet
|
||||||
|
violate("GTP-in-GTP", a, ${pdu.packet});
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ${pdu.version} != 1 )
|
||||||
|
{
|
||||||
|
// Only know of GTPv1 with Version == 1
|
||||||
|
violate("GTPv1 bad Version", a, ${pdu.packet});
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! ${pdu.pt_flag} )
|
||||||
|
{
|
||||||
|
// Not interested in GTP'
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ${pdu.e_flag} )
|
||||||
|
{
|
||||||
|
// TODO: can't currently parse past extension headers
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ${pdu.msg_type} != 0xff )
|
||||||
|
{
|
||||||
|
// Only interested in decapsulating user plane data beyond here.
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ${pdu.packet}.length() < (int)sizeof(struct ip) )
|
||||||
|
{
|
||||||
|
violate("Truncated GTPv1", a, ${pdu.packet});
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const struct ip* ip = (const struct ip*) ${pdu.packet}.data();
|
||||||
|
|
||||||
|
if ( ip->ip_v != 4 && ip->ip_v != 6 )
|
||||||
|
{
|
||||||
|
violate("non-IP packet in GTPv1", a, ${pdu.packet});
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
IP_Hdr* inner = 0;
|
||||||
|
int result = sessions->ParseIPPacket(${pdu.packet}.length(),
|
||||||
|
${pdu.packet}.data(), ip->ip_v == 6 ? IPPROTO_IPV6 : IPPROTO_IPV4,
|
||||||
|
inner);
|
||||||
|
|
||||||
|
if ( result == 0 )
|
||||||
|
{
|
||||||
|
connection()->set_valid(is_orig(), true);
|
||||||
|
|
||||||
|
if ( (! BifConst::Tunnel::delay_gtp_confirmation) ||
|
||||||
|
(connection()->valid(true) && connection()->valid(false)) )
|
||||||
|
a->ProtocolConfirmation();
|
||||||
|
}
|
||||||
|
|
||||||
|
else if ( result < 0 )
|
||||||
|
violate("Truncated GTPv1", a, ${pdu.packet});
|
||||||
|
|
||||||
|
else
|
||||||
|
violate("GTPv1 payload length", a, ${pdu.packet});
|
||||||
|
|
||||||
|
if ( result != 0 )
|
||||||
|
{
|
||||||
|
delete inner;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ::gtpv1_g_pdu_packet )
|
||||||
|
{
|
||||||
|
RecordVal* rv = new RecordVal(gtpv1_hdr_type);
|
||||||
|
|
||||||
|
rv->Assign(0, new Val(${pdu.version}, TYPE_COUNT));
|
||||||
|
rv->Assign(1, new Val(${pdu.pt_flag}, TYPE_BOOL));
|
||||||
|
rv->Assign(2, new Val(${pdu.rsv}, TYPE_BOOL));
|
||||||
|
rv->Assign(3, new Val(${pdu.e_flag}, TYPE_BOOL));
|
||||||
|
rv->Assign(4, new Val(${pdu.s_flag}, TYPE_BOOL));
|
||||||
|
rv->Assign(5, new Val(${pdu.pn_flag}, TYPE_BOOL));
|
||||||
|
rv->Assign(6, new Val(${pdu.msg_type}, TYPE_COUNT));
|
||||||
|
rv->Assign(7, new Val(ntohs(${pdu.length}), TYPE_COUNT));
|
||||||
|
rv->Assign(8, new Val(ntohl(${pdu.teid}), TYPE_COUNT));
|
||||||
|
|
||||||
|
if ( ${pdu.has_opt} )
|
||||||
|
{
|
||||||
|
rv->Assign(9, new Val(ntohs(${pdu.opt_hdr.seq}), TYPE_COUNT));
|
||||||
|
rv->Assign(10, new Val(${pdu.opt_hdr.n_pdu}, TYPE_COUNT));
|
||||||
|
rv->Assign(11, new Val(${pdu.opt_hdr.next_type}, TYPE_COUNT));
|
||||||
|
}
|
||||||
|
|
||||||
|
BifEvent::generate_gtpv1_g_pdu_packet(a, c, rv,
|
||||||
|
inner->BuildPktHdrVal());
|
||||||
|
}
|
||||||
|
|
||||||
|
EncapsulatingConn ec(c, BifEnum::Tunnel::GTPv1);
|
||||||
|
|
||||||
|
sessions->DoNextInnerPacket(network_time(), 0, inner, e, ec);
|
||||||
|
|
||||||
|
return (result == 0) ? true : false;
|
||||||
|
%}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
refine typeattr GTPv1_Header += &let { proc_gtpv1 = $context.flow.process_gtpv1(this); };
|
27
src/gtpv1-protocol.pac
Normal file
27
src/gtpv1-protocol.pac
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
|
||||||
|
type GTPv1_Header = record {
|
||||||
|
flags: uint8;
|
||||||
|
msg_type: uint8;
|
||||||
|
length: uint16;
|
||||||
|
teid: uint32;
|
||||||
|
opt: case has_opt of {
|
||||||
|
true -> opt_hdr: GTPv1_Opt_Header;
|
||||||
|
false -> no_opt: empty;
|
||||||
|
} &requires(has_opt);
|
||||||
|
packet: bytestring &restofdata;
|
||||||
|
|
||||||
|
} &let {
|
||||||
|
version: uint8 = (flags & 0xE0) >> 5;
|
||||||
|
pt_flag: bool = flags & 0x10;
|
||||||
|
rsv: bool = flags & 0x08;
|
||||||
|
e_flag: bool = flags & 0x04;
|
||||||
|
s_flag: bool = flags & 0x02;
|
||||||
|
pn_flag: bool = flags & 0x01;
|
||||||
|
has_opt: bool = flags & 0x07;
|
||||||
|
} &byteorder = littleendian;
|
||||||
|
|
||||||
|
type GTPv1_Opt_Header = record {
|
||||||
|
seq: uint16;
|
||||||
|
n_pdu: uint8;
|
||||||
|
next_type: uint8;
|
||||||
|
}
|
10
src/gtpv1.pac
Normal file
10
src/gtpv1.pac
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
%include binpac.pac
|
||||||
|
%include bro.pac
|
||||||
|
|
||||||
|
analyzer GTPv1 withcontext {
|
||||||
|
connection: GTPv1_Conn;
|
||||||
|
flow: GTPv1_Flow;
|
||||||
|
};
|
||||||
|
|
||||||
|
%include gtpv1-protocol.pac
|
||||||
|
%include gtpv1-analyzer.pac
|
|
@ -177,6 +177,7 @@ enum Type %{
|
||||||
AYIYA,
|
AYIYA,
|
||||||
TEREDO,
|
TEREDO,
|
||||||
SOCKS,
|
SOCKS,
|
||||||
|
GTPv1,
|
||||||
%}
|
%}
|
||||||
|
|
||||||
type EncapsulatingConn: record;
|
type EncapsulatingConn: record;
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
#separator \x09
|
||||||
|
#set_separator ,
|
||||||
|
#empty_field (empty)
|
||||||
|
#unset_field -
|
||||||
|
#path conn
|
||||||
|
#open 2012-10-19-17-03-55
|
||||||
|
#fields ts uid id.orig_h id.orig_p id.resp_h id.resp_p proto service duration orig_bytes resp_bytes conn_state local_orig missed_bytes history orig_pkts orig_ip_bytes resp_pkts resp_ip_bytes tunnel_parents
|
||||||
|
#types time string addr port addr port enum string interval count count string bool count string count count count count table[string]
|
||||||
|
1333458850.321642 arKYeMETxOg 10.131.17.170 51803 173.199.115.168 80 tcp http 0.257902 1138 63424 S3 - 0 ShADadf 29 2310 49 65396 UWkUyAuUGXf,k6kgXLOoSKl
|
||||||
|
1333458850.325787 k6kgXLOoSKl 207.233.125.40 2152 167.55.105.244 2152 udp gtpv1 0.251127 65788 0 S0 - 0 D 49 67160 0 0 (empty)
|
||||||
|
1333458850.321642 UWkUyAuUGXf 167.55.105.244 5906 207.233.125.40 2152 udp gtpv1 0.257902 2542 0 S0 - 0 D 29 3354 0 0 (empty)
|
||||||
|
#close 2012-10-19-17-03-55
|
|
@ -0,0 +1,11 @@
|
||||||
|
#separator \x09
|
||||||
|
#set_separator ,
|
||||||
|
#empty_field (empty)
|
||||||
|
#unset_field -
|
||||||
|
#path http
|
||||||
|
#open 2012-10-19-17-03-55
|
||||||
|
#fields ts uid id.orig_h id.orig_p id.resp_h id.resp_p trans_depth method host uri referrer user_agent request_body_len response_body_len status_code status_msg info_code info_msg filename tags username password proxied mime_type md5 extraction_file
|
||||||
|
#types time string addr port addr port count string string string string string count count count string count string string table[enum] string string table[string] string string file
|
||||||
|
1333458850.340368 arKYeMETxOg 10.131.17.170 51803 173.199.115.168 80 1 GET cdn.epicgameads.com /ads/flash/728x90_nx8com.swf?clickTAG=http://www.epicgameads.com/ads/bannerclickPage.php?id=e3ubwU6IF&pd=1&adid=0&icpc=1&axid=0&uctt=1&channel=4&cac=1&t=728x90&cb=1333458879 http://www.epicgameads.com/ads/banneriframe.php?id=e3ubwU6IF&t=728x90&channel=4&cb=1333458905296 Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0) 0 31461 200 OK - - - (empty) - - - application/x-shockwave-flash - -
|
||||||
|
1333458850.399501 arKYeMETxOg 10.131.17.170 51803 173.199.115.168 80 2 GET cdn.epicgameads.com /ads/flash/728x90_nx8com.swf?clickTAG=http://www.epicgameads.com/ads/bannerclickPage.php?id=e3ubwU6IF&pd=1&adid=0&icpc=1&axid=0&uctt=1&channel=0&cac=1&t=728x90&cb=1333458881 http://www.epicgameads.com/ads/banneriframe.php?id=e3ubwU6IF&t=728x90&cb=1333458920207 Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0) 0 31461 200 OK - - - (empty) - - - application/x-shockwave-flash - -
|
||||||
|
#close 2012-10-19-17-03-55
|
|
@ -0,0 +1,13 @@
|
||||||
|
#separator \x09
|
||||||
|
#set_separator ,
|
||||||
|
#empty_field (empty)
|
||||||
|
#unset_field -
|
||||||
|
#path tunnel
|
||||||
|
#open 2012-10-19-17-03-55
|
||||||
|
#fields ts uid id.orig_h id.orig_p id.resp_h id.resp_p tunnel_type action
|
||||||
|
#types time string addr port addr port enum enum
|
||||||
|
1333458850.321642 UWkUyAuUGXf 167.55.105.244 5906 207.233.125.40 2152 Tunnel::GTPv1 Tunnel::DISCOVER
|
||||||
|
1333458850.325787 k6kgXLOoSKl 207.233.125.40 2152 167.55.105.244 2152 Tunnel::GTPv1 Tunnel::DISCOVER
|
||||||
|
1333458850.579544 k6kgXLOoSKl 207.233.125.40 2152 167.55.105.244 2152 Tunnel::GTPv1 Tunnel::CLOSE
|
||||||
|
1333458850.579544 UWkUyAuUGXf 167.55.105.244 5906 207.233.125.40 2152 Tunnel::GTPv1 Tunnel::CLOSE
|
||||||
|
#close 2012-10-19-17-03-55
|
10
testing/btest/Baseline/core.tunnels.gtp.false_gtp/conn.log
Normal file
10
testing/btest/Baseline/core.tunnels.gtp.false_gtp/conn.log
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
#separator \x09
|
||||||
|
#set_separator ,
|
||||||
|
#empty_field (empty)
|
||||||
|
#unset_field -
|
||||||
|
#path conn
|
||||||
|
#open 2012-10-19-17-07-44
|
||||||
|
#fields ts uid id.orig_h id.orig_p id.resp_h id.resp_p proto service duration orig_bytes resp_bytes conn_state local_orig missed_bytes history orig_pkts orig_ip_bytes resp_pkts resp_ip_bytes tunnel_parents
|
||||||
|
#types time string addr port addr port enum string interval count count string bool count string count count count count table[string]
|
||||||
|
1333458871.219794 UWkUyAuUGXf 10.131.24.6 2152 195.178.38.3 53 udp dns - - - S0 - 0 D 1 64 0 0 (empty)
|
||||||
|
#close 2012-10-19-17-07-44
|
10
testing/btest/Baseline/core.tunnels.gtp.false_gtp/dns.log
Normal file
10
testing/btest/Baseline/core.tunnels.gtp.false_gtp/dns.log
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
#separator \x09
|
||||||
|
#set_separator ,
|
||||||
|
#empty_field (empty)
|
||||||
|
#unset_field -
|
||||||
|
#path dns
|
||||||
|
#open 2012-10-19-17-07-44
|
||||||
|
#fields ts uid id.orig_h id.orig_p id.resp_h id.resp_p proto trans_id query qclass qclass_name qtype qtype_name rcode rcode_name AA TC RD RA Z answers TTLs rejected
|
||||||
|
#types time string addr port addr port enum count string count string count string count string bool bool bool bool count vector[string] vector[interval] bool
|
||||||
|
1333458871.219794 UWkUyAuUGXf 10.131.24.6 2152 195.178.38.3 53 udp 27595 abcd.efg.hijklm.nm 1 C_INTERNET 1 A - - F F T F 0 - - F
|
||||||
|
#close 2012-10-19-17-07-44
|
12
testing/btest/Baseline/core.tunnels.gtp.inner_ipv6/conn.log
Normal file
12
testing/btest/Baseline/core.tunnels.gtp.inner_ipv6/conn.log
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
#separator \x09
|
||||||
|
#set_separator ,
|
||||||
|
#empty_field (empty)
|
||||||
|
#unset_field -
|
||||||
|
#path conn
|
||||||
|
#open 2012-10-19-17-21-27
|
||||||
|
#fields ts uid id.orig_h id.orig_p id.resp_h id.resp_p proto service duration orig_bytes resp_bytes conn_state local_orig missed_bytes history orig_pkts orig_ip_bytes resp_pkts resp_ip_bytes tunnel_parents
|
||||||
|
#types time string addr port addr port enum string interval count count string bool count string count count count count table[string]
|
||||||
|
1333458851.770000 arKYeMETxOg fe80::224c:4fff:fe43:414c 1234 ff02::1:3 5355 udp dns - - - S0 - 0 D 1 80 0 0 UWkUyAuUGXf
|
||||||
|
1333458851.770000 UWkUyAuUGXf 118.92.124.41 2152 118.92.124.72 2152 udp gtpv1 0.199236 152 0 S0 - 0 D 2 208 0 0 (empty)
|
||||||
|
1333458851.969236 k6kgXLOoSKl fe80::224c:4fff:fe43:414c 133 ff02::2 134 icmp - - - - OTH - 0 - 1 56 0 0 UWkUyAuUGXf
|
||||||
|
#close 2012-10-19-17-21-27
|
|
@ -0,0 +1,11 @@
|
||||||
|
#separator \x09
|
||||||
|
#set_separator ,
|
||||||
|
#empty_field (empty)
|
||||||
|
#unset_field -
|
||||||
|
#path tunnel
|
||||||
|
#open 2012-10-19-17-21-27
|
||||||
|
#fields ts uid id.orig_h id.orig_p id.resp_h id.resp_p tunnel_type action
|
||||||
|
#types time string addr port addr port enum enum
|
||||||
|
1333458851.770000 UWkUyAuUGXf 118.92.124.41 2152 118.92.124.72 2152 Tunnel::GTPv1 Tunnel::DISCOVER
|
||||||
|
1333458851.969236 UWkUyAuUGXf 118.92.124.41 2152 118.92.124.72 2152 Tunnel::GTPv1 Tunnel::CLOSE
|
||||||
|
#close 2012-10-19-17-21-27
|
|
@ -0,0 +1,26 @@
|
||||||
|
#separator \x09
|
||||||
|
#set_separator ,
|
||||||
|
#empty_field (empty)
|
||||||
|
#unset_field -
|
||||||
|
#path conn
|
||||||
|
#open 2012-10-19-17-34-25
|
||||||
|
#fields ts uid id.orig_h id.orig_p id.resp_h id.resp_p proto service duration orig_bytes resp_bytes conn_state local_orig missed_bytes history orig_pkts orig_ip_bytes resp_pkts resp_ip_bytes tunnel_parents
|
||||||
|
#types time string addr port addr port enum string interval count count string bool count string count count count count table[string]
|
||||||
|
1333458850.037956 qCaWGmzFtM5 10.131.112.102 51403 94.245.121.253 3544 udp teredo - - - SHR - 0 d 0 0 1 84 GSxOnSLghOa
|
||||||
|
1333458850.040098 70MGiRM1Qf4 174.94.190.229 2152 190.104.181.57 2152 udp gtpv1 0.003698 192 0 S0 - 0 D 2 248 0 0 (empty)
|
||||||
|
1333458850.016620 nQcgTWjvg4c 172.24.16.121 61901 94.245.121.251 3544 udp teredo - - - S0 - 0 D 1 80 0 0 k6kgXLOoSKl
|
||||||
|
1333458850.029781 FrJExwHcSal 172.24.16.67 52298 94.245.121.253 3544 udp teredo - - - S0 - 0 D 1 88 0 0 TEfuqmmG4bh
|
||||||
|
1333458850.035456 VW0XPVINV8a 190.104.181.210 2152 190.104.181.125 2152 udp gtpv1 0.000004 194 0 S0 - 0 D 2 250 0 0 (empty)
|
||||||
|
1333458850.016620 k6kgXLOoSKl 174.94.190.229 2152 190.104.181.62 2152 udp gtpv1 0.016267 88 92 SF - 0 Dd 1 116 1 120 (empty)
|
||||||
|
1333458850.029781 TEfuqmmG4bh 190.104.181.254 2152 190.104.181.62 2152 udp gtpv1 0.000002 192 0 S0 - 0 D 2 248 0 0 (empty)
|
||||||
|
1333458850.035460 iE6yhOq3SF 172.27.159.9 63912 94.245.121.254 3544 udp teredo - - - S0 - 0 D 1 89 0 0 VW0XPVINV8a
|
||||||
|
1333458850.037956 GSxOnSLghOa 190.104.181.57 2152 190.104.181.222 2152 udp gtpv1 - - - S0 - 0 D 1 120 0 0 (empty)
|
||||||
|
1333458850.014199 UWkUyAuUGXf 174.94.190.213 2152 190.104.181.57 2152 udp gtpv1 - - - S0 - 0 D 1 124 0 0 (empty)
|
||||||
|
1333458850.040098 h5DsfNtYzi1 172.24.203.81 54447 65.55.158.118 3544 udp teredo 0.003698 120 0 S0 - 0 D 2 176 0 0 70MGiRM1Qf4
|
||||||
|
1333458850.029783 5OKnoww6xl4 172.24.16.67 52298 65.55.158.118 3544 udp teredo - - - S0 - 0 D 1 88 0 0 TEfuqmmG4bh
|
||||||
|
1333458850.032887 3PKsZ2Uye21 10.131.42.160 62069 94.245.121.253 3544 udp teredo - - - SHR - 0 d 0 0 1 84 k6kgXLOoSKl
|
||||||
|
1333458850.014199 arKYeMETxOg 172.24.204.200 56528 65.55.158.118 3544 udp teredo - - - S0 - 0 D 1 88 0 0 UWkUyAuUGXf
|
||||||
|
1333458850.035456 fRFu0wcOle6 172.27.159.9 63912 94.245.121.253 3544 udp teredo - - - S0 - 0 D 1 89 0 0 VW0XPVINV8a
|
||||||
|
1333458850.016620 j4u32Pc5bif 2001:0:5ef5:79fb:38b8:1695:2b37:be8e 128 2002:2571:c817::2571:c817 129 icmp - - - - OTH - 0 - 1 52 0 0 nQcgTWjvg4c
|
||||||
|
1333458850.035456 qSsw6ESzHV4 fe80::ffff:ffff:fffe 133 ff02::2 134 icmp - 0.000004 0 0 OTH - 0 - 2 96 0 0 fRFu0wcOle6,iE6yhOq3SF
|
||||||
|
#close 2012-10-19-17-34-25
|
|
@ -0,0 +1,27 @@
|
||||||
|
#separator \x09
|
||||||
|
#set_separator ,
|
||||||
|
#empty_field (empty)
|
||||||
|
#unset_field -
|
||||||
|
#path tunnel
|
||||||
|
#open 2012-10-19-17-34-25
|
||||||
|
#fields ts uid id.orig_h id.orig_p id.resp_h id.resp_p tunnel_type action
|
||||||
|
#types time string addr port addr port enum enum
|
||||||
|
1333458850.014199 UWkUyAuUGXf 174.94.190.213 2152 190.104.181.57 2152 Tunnel::GTPv1 Tunnel::DISCOVER
|
||||||
|
1333458850.016620 k6kgXLOoSKl 174.94.190.229 2152 190.104.181.62 2152 Tunnel::GTPv1 Tunnel::DISCOVER
|
||||||
|
1333458850.016620 nQcgTWjvg4c 172.24.16.121 61901 94.245.121.251 3544 Tunnel::TEREDO Tunnel::DISCOVER
|
||||||
|
1333458850.029781 TEfuqmmG4bh 190.104.181.254 2152 190.104.181.62 2152 Tunnel::GTPv1 Tunnel::DISCOVER
|
||||||
|
1333458850.035456 VW0XPVINV8a 190.104.181.210 2152 190.104.181.125 2152 Tunnel::GTPv1 Tunnel::DISCOVER
|
||||||
|
1333458850.035456 fRFu0wcOle6 172.27.159.9 63912 94.245.121.253 3544 Tunnel::TEREDO Tunnel::DISCOVER
|
||||||
|
1333458850.035460 iE6yhOq3SF 172.27.159.9 63912 94.245.121.254 3544 Tunnel::TEREDO Tunnel::DISCOVER
|
||||||
|
1333458850.037956 GSxOnSLghOa 190.104.181.57 2152 190.104.181.222 2152 Tunnel::GTPv1 Tunnel::DISCOVER
|
||||||
|
1333458850.040098 70MGiRM1Qf4 174.94.190.229 2152 190.104.181.57 2152 Tunnel::GTPv1 Tunnel::DISCOVER
|
||||||
|
1333458850.043796 70MGiRM1Qf4 174.94.190.229 2152 190.104.181.57 2152 Tunnel::GTPv1 Tunnel::CLOSE
|
||||||
|
1333458850.043796 nQcgTWjvg4c 172.24.16.121 61901 94.245.121.251 3544 Tunnel::TEREDO Tunnel::CLOSE
|
||||||
|
1333458850.043796 VW0XPVINV8a 190.104.181.210 2152 190.104.181.125 2152 Tunnel::GTPv1 Tunnel::CLOSE
|
||||||
|
1333458850.043796 k6kgXLOoSKl 174.94.190.229 2152 190.104.181.62 2152 Tunnel::GTPv1 Tunnel::CLOSE
|
||||||
|
1333458850.043796 TEfuqmmG4bh 190.104.181.254 2152 190.104.181.62 2152 Tunnel::GTPv1 Tunnel::CLOSE
|
||||||
|
1333458850.043796 iE6yhOq3SF 172.27.159.9 63912 94.245.121.254 3544 Tunnel::TEREDO Tunnel::CLOSE
|
||||||
|
1333458850.043796 GSxOnSLghOa 190.104.181.57 2152 190.104.181.222 2152 Tunnel::GTPv1 Tunnel::CLOSE
|
||||||
|
1333458850.043796 UWkUyAuUGXf 174.94.190.213 2152 190.104.181.57 2152 Tunnel::GTPv1 Tunnel::CLOSE
|
||||||
|
1333458850.043796 fRFu0wcOle6 172.27.159.9 63912 94.245.121.253 3544 Tunnel::TEREDO Tunnel::CLOSE
|
||||||
|
#close 2012-10-19-17-34-25
|
|
@ -0,0 +1 @@
|
||||||
|
protocol_violation, [orig_h=74.125.216.149, orig_p=2152/udp, resp_h=10.131.138.69, resp_p=2152/udp], GTP-in-GTP [n\xd9'|\x00\x00\x01\xb6[\xf6\xdc0\xb7d\xe5\xe6\xa76\x91\xfbk\x0e\x02\xc8A\x05\xa8\xe6\xf3Gi\x80(]\xcew\x84\xae}\xd2...]
|
|
@ -0,0 +1,11 @@
|
||||||
|
#separator \x09
|
||||||
|
#set_separator ,
|
||||||
|
#empty_field (empty)
|
||||||
|
#unset_field -
|
||||||
|
#path conn
|
||||||
|
#open 2012-10-19-17-46-48
|
||||||
|
#fields ts uid id.orig_h id.orig_p id.resp_h id.resp_p proto service duration orig_bytes resp_bytes conn_state local_orig missed_bytes history orig_pkts orig_ip_bytes resp_pkts resp_ip_bytes tunnel_parents
|
||||||
|
#types time string addr port addr port enum string interval count count string bool count string count count count count table[string]
|
||||||
|
1333458850.532814 UWkUyAuUGXf 247.56.43.90 2152 247.56.43.248 2152 udp - - - - S0 - 0 D 1 52 0 0 (empty)
|
||||||
|
1333458850.867091 arKYeMETxOg 247.56.43.214 2152 237.56.101.238 2152 udp - 0.028676 12 14 SF - 0 Dd 1 40 1 42 (empty)
|
||||||
|
#close 2012-10-19-17-46-48
|
11
testing/btest/Baseline/core.tunnels.gtp.opt_header/conn.log
Normal file
11
testing/btest/Baseline/core.tunnels.gtp.opt_header/conn.log
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
#separator \x09
|
||||||
|
#set_separator ,
|
||||||
|
#empty_field (empty)
|
||||||
|
#unset_field -
|
||||||
|
#path conn
|
||||||
|
#open 2012-10-19-17-19-16
|
||||||
|
#fields ts uid id.orig_h id.orig_p id.resp_h id.resp_p proto service duration orig_bytes resp_bytes conn_state local_orig missed_bytes history orig_pkts orig_ip_bytes resp_pkts resp_ip_bytes tunnel_parents
|
||||||
|
#types time string addr port addr port enum string interval count count string bool count string count count count count table[string]
|
||||||
|
1333458852.011535 arKYeMETxOg 10.222.10.10 44960 173.194.69.188 5228 tcp ssl 0.573499 704 1026 S1 - 0 ShADad 17 1604 14 1762 UWkUyAuUGXf
|
||||||
|
1333458852.011535 UWkUyAuUGXf 79.188.154.91 2152 243.149.173.198 2152 udp gtpv1 0.573499 1740 1930 SF - 0 Dd 17 2216 14 2322 (empty)
|
||||||
|
#close 2012-10-19-17-19-16
|
31
testing/btest/Baseline/core.tunnels.gtp.opt_header/out
Normal file
31
testing/btest/Baseline/core.tunnels.gtp.opt_header/out
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=F, pn_flag=F, msg_type=255, length=60, teid=1980578736, seq=<uninitialized>, n_pdu=<uninitialized>, next_type=<uninitialized>]
|
||||||
|
gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=F, pn_flag=F, msg_type=255, length=60, teid=1980578736, seq=<uninitialized>, n_pdu=<uninitialized>, next_type=<uninitialized>]
|
||||||
|
gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=T, pn_flag=F, msg_type=255, length=64, teid=159098, seq=0, n_pdu=0, next_type=0]
|
||||||
|
gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=F, pn_flag=F, msg_type=255, length=52, teid=1980578736, seq=<uninitialized>, n_pdu=<uninitialized>, next_type=<uninitialized>]
|
||||||
|
gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=F, pn_flag=F, msg_type=255, length=170, teid=1980578736, seq=<uninitialized>, n_pdu=<uninitialized>, next_type=<uninitialized>]
|
||||||
|
gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=T, pn_flag=F, msg_type=255, length=56, teid=159098, seq=1, n_pdu=0, next_type=0]
|
||||||
|
gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=T, pn_flag=F, msg_type=255, length=194, teid=159098, seq=2, n_pdu=0, next_type=0]
|
||||||
|
gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=F, pn_flag=F, msg_type=255, length=52, teid=1980578736, seq=<uninitialized>, n_pdu=<uninitialized>, next_type=<uninitialized>]
|
||||||
|
gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=F, pn_flag=F, msg_type=255, length=111, teid=1980578736, seq=<uninitialized>, n_pdu=<uninitialized>, next_type=<uninitialized>]
|
||||||
|
gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=T, pn_flag=F, msg_type=255, length=56, teid=159098, seq=3, n_pdu=0, next_type=0]
|
||||||
|
gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=F, pn_flag=F, msg_type=255, length=89, teid=1980578736, seq=<uninitialized>, n_pdu=<uninitialized>, next_type=<uninitialized>]
|
||||||
|
gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=T, pn_flag=F, msg_type=255, length=56, teid=159098, seq=4, n_pdu=0, next_type=0]
|
||||||
|
gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=T, pn_flag=F, msg_type=255, length=93, teid=159098, seq=5, n_pdu=0, next_type=0]
|
||||||
|
gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=F, pn_flag=F, msg_type=255, length=52, teid=1980578736, seq=<uninitialized>, n_pdu=<uninitialized>, next_type=<uninitialized>]
|
||||||
|
gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=F, pn_flag=F, msg_type=255, length=457, teid=1980578736, seq=<uninitialized>, n_pdu=<uninitialized>, next_type=<uninitialized>]
|
||||||
|
gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=T, pn_flag=F, msg_type=255, length=157, teid=159098, seq=6, n_pdu=0, next_type=0]
|
||||||
|
gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=T, pn_flag=F, msg_type=255, length=173, teid=159098, seq=7, n_pdu=0, next_type=0]
|
||||||
|
gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=F, pn_flag=F, msg_type=255, length=52, teid=1980578736, seq=<uninitialized>, n_pdu=<uninitialized>, next_type=<uninitialized>]
|
||||||
|
gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=F, pn_flag=F, msg_type=255, length=52, teid=1980578736, seq=<uninitialized>, n_pdu=<uninitialized>, next_type=<uninitialized>]
|
||||||
|
gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=F, pn_flag=F, msg_type=255, length=137, teid=1980578736, seq=<uninitialized>, n_pdu=<uninitialized>, next_type=<uninitialized>]
|
||||||
|
gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=T, pn_flag=F, msg_type=255, length=56, teid=159098, seq=8, n_pdu=0, next_type=0]
|
||||||
|
gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=T, pn_flag=F, msg_type=255, length=157, teid=159098, seq=9, n_pdu=0, next_type=0]
|
||||||
|
gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=T, pn_flag=F, msg_type=255, length=189, teid=159098, seq=10, n_pdu=0, next_type=0]
|
||||||
|
gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=T, pn_flag=F, msg_type=255, length=173, teid=159098, seq=11, n_pdu=0, next_type=0]
|
||||||
|
gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=T, pn_flag=F, msg_type=255, length=205, teid=159098, seq=12, n_pdu=0, next_type=0]
|
||||||
|
gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=T, pn_flag=F, msg_type=255, length=189, teid=159098, seq=13, n_pdu=0, next_type=0]
|
||||||
|
gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=F, pn_flag=F, msg_type=255, length=52, teid=1980578736, seq=<uninitialized>, n_pdu=<uninitialized>, next_type=<uninitialized>]
|
||||||
|
gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=F, pn_flag=F, msg_type=255, length=52, teid=1980578736, seq=<uninitialized>, n_pdu=<uninitialized>, next_type=<uninitialized>]
|
||||||
|
gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=F, pn_flag=F, msg_type=255, length=52, teid=1980578736, seq=<uninitialized>, n_pdu=<uninitialized>, next_type=<uninitialized>]
|
||||||
|
gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=F, pn_flag=F, msg_type=255, length=52, teid=1980578736, seq=<uninitialized>, n_pdu=<uninitialized>, next_type=<uninitialized>]
|
||||||
|
gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=F, pn_flag=F, msg_type=255, length=52, teid=1980578736, seq=<uninitialized>, n_pdu=<uninitialized>, next_type=<uninitialized>]
|
|
@ -0,0 +1,11 @@
|
||||||
|
#separator \x09
|
||||||
|
#set_separator ,
|
||||||
|
#empty_field (empty)
|
||||||
|
#unset_field -
|
||||||
|
#path tunnel
|
||||||
|
#open 2012-10-19-17-19-16
|
||||||
|
#fields ts uid id.orig_h id.orig_p id.resp_h id.resp_p tunnel_type action
|
||||||
|
#types time string addr port addr port enum enum
|
||||||
|
1333458852.011535 UWkUyAuUGXf 79.188.154.91 2152 243.149.173.198 2152 Tunnel::GTPv1 Tunnel::DISCOVER
|
||||||
|
1333458852.585034 UWkUyAuUGXf 79.188.154.91 2152 243.149.173.198 2152 Tunnel::GTPv1 Tunnel::CLOSE
|
||||||
|
#close 2012-10-19-17-19-16
|
|
@ -0,0 +1,11 @@
|
||||||
|
#separator \x09
|
||||||
|
#set_separator ,
|
||||||
|
#empty_field (empty)
|
||||||
|
#unset_field -
|
||||||
|
#path conn
|
||||||
|
#open 2012-10-19-16-44-02
|
||||||
|
#fields ts uid id.orig_h id.orig_p id.resp_h id.resp_p proto service duration orig_bytes resp_bytes conn_state local_orig missed_bytes history orig_pkts orig_ip_bytes resp_pkts resp_ip_bytes tunnel_parents
|
||||||
|
#types time string addr port addr port enum string interval count count string bool count string count count count count table[string]
|
||||||
|
1333458850.364667 arKYeMETxOg 10.131.47.185 1923 79.101.110.141 80 tcp http 0.069783 2100 56702 SF - 0 ShADadfF 27 3204 41 52594 UWkUyAuUGXf
|
||||||
|
1333458850.364667 UWkUyAuUGXf 239.114.155.111 2152 63.94.149.181 2152 udp gtpv1 0.069813 3420 52922 SF - 0 Dd 27 4176 41 54070 (empty)
|
||||||
|
#close 2012-10-19-16-44-02
|
|
@ -0,0 +1,10 @@
|
||||||
|
#separator \x09
|
||||||
|
#set_separator ,
|
||||||
|
#empty_field (empty)
|
||||||
|
#unset_field -
|
||||||
|
#path http
|
||||||
|
#open 2012-10-19-16-44-02
|
||||||
|
#fields ts uid id.orig_h id.orig_p id.resp_h id.resp_p trans_depth method host uri referrer user_agent request_body_len response_body_len status_code status_msg info_code info_msg filename tags username password proxied mime_type md5 extraction_file
|
||||||
|
#types time string addr port addr port count string string string string string count count count string count string string table[enum] string string table[string] string string file
|
||||||
|
1333458850.375568 arKYeMETxOg 10.131.47.185 1923 79.101.110.141 80 1 GET o-o.preferred.telekomrs-beg1.v2.lscache8.c.youtube.com /videoplayback?upn=MTU2MDY5NzQ5OTM0NTI3NDY4NDc&sparams=algorithm,burst,cp,factor,id,ip,ipbits,itag,source,upn,expire&fexp=912300,907210&algorithm=throttle-factor&itag=34&ip=212.0.0.0&burst=40&sver=3&signature=832FB1042E20780CFCA77A4DB5EA64AC593E8627.D1166C7E8365732E52DAFD68076DAE0146E0AE01&source=youtube&expire=1333484980&key=yt1&ipbits=8&factor=1.25&cp=U0hSSFRTUl9NSkNOMl9MTVZKOjh5eEN2SG8tZF84&id=ebf1e932d4bd1286&cm2=1 http://s.ytimg.com/yt/swfbin/watch_as3-vflqrJwOA.swf Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko; X-SBLSP) Chrome/17.0.963.83 Safari/535.11 0 56320 206 Partial Content - - - (empty) - - - application/octet-stream - -
|
||||||
|
#close 2012-10-19-16-44-02
|
|
@ -0,0 +1,11 @@
|
||||||
|
#separator \x09
|
||||||
|
#set_separator ,
|
||||||
|
#empty_field (empty)
|
||||||
|
#unset_field -
|
||||||
|
#path tunnel
|
||||||
|
#open 2012-10-19-16-44-02
|
||||||
|
#fields ts uid id.orig_h id.orig_p id.resp_h id.resp_p tunnel_type action
|
||||||
|
#types time string addr port addr port enum enum
|
||||||
|
1333458850.364667 UWkUyAuUGXf 239.114.155.111 2152 63.94.149.181 2152 Tunnel::GTPv1 Tunnel::DISCOVER
|
||||||
|
1333458850.434480 UWkUyAuUGXf 239.114.155.111 2152 63.94.149.181 2152 Tunnel::GTPv1 Tunnel::CLOSE
|
||||||
|
#close 2012-10-19-16-44-02
|
|
@ -0,0 +1,10 @@
|
||||||
|
#separator \x09
|
||||||
|
#set_separator ,
|
||||||
|
#empty_field (empty)
|
||||||
|
#unset_field -
|
||||||
|
#path dpd
|
||||||
|
#open 2012-10-19-17-38-54
|
||||||
|
#fields ts uid id.orig_h id.orig_p id.resp_h id.resp_p proto analyzer failure_reason
|
||||||
|
#types time string addr port addr port enum string string
|
||||||
|
1333458853.075889 UWkUyAuUGXf 173.86.159.28 2152 213.72.147.186 2152 udp GTPV1 Truncated GTPv1 [E\x00\x05\xc8G\xea@\x00\x80\x06\xb6\x83\x0a\x83w&\xd9\x14\x9c\x04\xd9\xc2\x00P\xddh\xb4\x8f41eVP\x10\x10\xe0u\xcf\x00\x00...]
|
||||||
|
#close 2012-10-19-17-38-54
|
|
@ -0,0 +1,11 @@
|
||||||
|
#separator \x09
|
||||||
|
#set_separator ,
|
||||||
|
#empty_field (empty)
|
||||||
|
#unset_field -
|
||||||
|
#path tunnel
|
||||||
|
#open 2012-10-19-17-38-54
|
||||||
|
#fields ts uid id.orig_h id.orig_p id.resp_h id.resp_p tunnel_type action
|
||||||
|
#types time string addr port addr port enum enum
|
||||||
|
1333458853.034734 UWkUyAuUGXf 173.86.159.28 2152 213.72.147.186 2152 Tunnel::GTPv1 Tunnel::DISCOVER
|
||||||
|
1333458853.108391 UWkUyAuUGXf 173.86.159.28 2152 213.72.147.186 2152 Tunnel::GTPv1 Tunnel::CLOSE
|
||||||
|
#close 2012-10-19-17-38-54
|
BIN
testing/btest/Traces/tunnels/gtp/gtp10_not_0xff.pcap
Executable file
BIN
testing/btest/Traces/tunnels/gtp/gtp10_not_0xff.pcap
Executable file
Binary file not shown.
BIN
testing/btest/Traces/tunnels/gtp/gtp1_gn_normal_incl_fragmentation.pcap
Executable file
BIN
testing/btest/Traces/tunnels/gtp/gtp1_gn_normal_incl_fragmentation.pcap
Executable file
Binary file not shown.
BIN
testing/btest/Traces/tunnels/gtp/gtp2_different_udp_port.pcap
Executable file
BIN
testing/btest/Traces/tunnels/gtp/gtp2_different_udp_port.pcap
Executable file
Binary file not shown.
BIN
testing/btest/Traces/tunnels/gtp/gtp3_false_gtp.pcap
Executable file
BIN
testing/btest/Traces/tunnels/gtp/gtp3_false_gtp.pcap
Executable file
Binary file not shown.
BIN
testing/btest/Traces/tunnels/gtp/gtp4_udp_2152_inside.pcap
Executable file
BIN
testing/btest/Traces/tunnels/gtp/gtp4_udp_2152_inside.pcap
Executable file
Binary file not shown.
BIN
testing/btest/Traces/tunnels/gtp/gtp6_gtp_0x32.pcap
Executable file
BIN
testing/btest/Traces/tunnels/gtp/gtp6_gtp_0x32.pcap
Executable file
Binary file not shown.
BIN
testing/btest/Traces/tunnels/gtp/gtp7_ipv6.pcap
Executable file
BIN
testing/btest/Traces/tunnels/gtp/gtp7_ipv6.pcap
Executable file
Binary file not shown.
BIN
testing/btest/Traces/tunnels/gtp/gtp8_teredo.pcap
Executable file
BIN
testing/btest/Traces/tunnels/gtp/gtp8_teredo.pcap
Executable file
Binary file not shown.
BIN
testing/btest/Traces/tunnels/gtp/gtp9_unknown_or_too_short_payload.pcap
Executable file
BIN
testing/btest/Traces/tunnels/gtp/gtp9_unknown_or_too_short_payload.pcap
Executable file
Binary file not shown.
10
testing/btest/core/tunnels/gtp/different_dl_and_ul.test
Normal file
10
testing/btest/core/tunnels/gtp/different_dl_and_ul.test
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
# @TEST-EXEC: bro -C -r $TRACES/tunnels/gtp/gtp2_different_udp_port.pcap
|
||||||
|
# @TEST-EXEC: btest-diff conn.log
|
||||||
|
# @TEST-EXEC: btest-diff http.log
|
||||||
|
# @TEST-EXEC: btest-diff tunnel.log
|
||||||
|
|
||||||
|
# Uplink GTP tunnel uses src port 5906 and dst port 2152.
|
||||||
|
# One side on port 2152 qualifies for GTP user plane.
|
||||||
|
# The Downlink GTP tunnel uses port 2152 for both src and dst.
|
||||||
|
# (checksums are incorrect because packets were anonymized and tcprewrite
|
||||||
|
# seems to fail to correct the checksums when there's IP fragmentation).
|
8
testing/btest/core/tunnels/gtp/false_gtp.test
Normal file
8
testing/btest/core/tunnels/gtp/false_gtp.test
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
# @TEST-EXEC: bro -r $TRACES/tunnels/gtp/gtp3_false_gtp.pcap
|
||||||
|
# @TEST-EXEC: btest-diff conn.log
|
||||||
|
# @TEST-EXEC: btest-diff dns.log
|
||||||
|
# @TEST-EXEC: test ! -e tunnel.log
|
||||||
|
|
||||||
|
# The fact that udp port 2152 on only one side already qualifies for GTP
|
||||||
|
# increases the risk for false positives, see this trace. This is not a
|
||||||
|
# GTP packet, but a DNS packet which just happens to use port 2152
|
6
testing/btest/core/tunnels/gtp/inner_ipv6.test
Normal file
6
testing/btest/core/tunnels/gtp/inner_ipv6.test
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
# @TEST-EXEC: bro -r $TRACES/tunnels/gtp/gtp7_ipv6.pcap
|
||||||
|
# @TEST-EXEC: btest-diff conn.log
|
||||||
|
# @TEST-EXEC: btest-diff tunnel.log
|
||||||
|
|
||||||
|
# While the majority of user plane traffic inside the GTP tunnel is still IPv4,
|
||||||
|
# there is sometimes already native IPv6.
|
7
testing/btest/core/tunnels/gtp/inner_teredo.test
Normal file
7
testing/btest/core/tunnels/gtp/inner_teredo.test
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
# @TEST-EXEC: bro -r $TRACES/tunnels/gtp/gtp8_teredo.pcap "Tunnel::delay_teredo_confirmation=F"
|
||||||
|
# @TEST-EXEC: btest-diff conn.log
|
||||||
|
# @TEST-EXEC: btest-diff tunnel.log
|
||||||
|
|
||||||
|
# GTP packets may carry Teredo packets. Toggled the delay teredo confirmation
|
||||||
|
# option so that it shows in the service field (in one case the inner
|
||||||
|
# connection of the teredo packet is carried over differing outer connections).
|
11
testing/btest/core/tunnels/gtp/non_recursive.test
Normal file
11
testing/btest/core/tunnels/gtp/non_recursive.test
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
# @TEST-EXEC: bro -r $TRACES/tunnels/gtp/gtp4_udp_2152_inside.pcap %INPUT >out
|
||||||
|
# @TEST-EXEC: btest-diff out
|
||||||
|
|
||||||
|
# In telecoms there is never a GTP tunnel within another GTP tunnel.
|
||||||
|
# So if we find inside a GTP tunnel anohter IP/UDP packet with port 2152,
|
||||||
|
# it is just a UDP packet, but not another GTP tunnel.
|
||||||
|
|
||||||
|
event protocol_violation(c: connection, atype: count, aid: count, reason: string)
|
||||||
|
{
|
||||||
|
print "protocol_violation", c$id, reason;
|
||||||
|
}
|
9
testing/btest/core/tunnels/gtp/not_user_plane_data.test
Normal file
9
testing/btest/core/tunnels/gtp/not_user_plane_data.test
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
# @TEST-EXEC: bro -r $TRACES/tunnels/gtp/gtp10_not_0xff.pcap
|
||||||
|
# @TEST-EXEC: btest-diff conn.log
|
||||||
|
# @TEST-EXEC: test ! -e tunnel.log
|
||||||
|
|
||||||
|
# There are GTP tunnel packets, which do not contain user plane data. Only
|
||||||
|
# those with gtp.message==0xff contain user plane data. Other GTP packets
|
||||||
|
# without user plane data are echo request, echo reply, error indication
|
||||||
|
# and stop marker (not included in trace). Those non-user plane GTP
|
||||||
|
# packets are ignored for now.
|
12
testing/btest/core/tunnels/gtp/opt_header.test
Normal file
12
testing/btest/core/tunnels/gtp/opt_header.test
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
# @TEST-EXEC: bro -r $TRACES/tunnels/gtp/gtp6_gtp_0x32.pcap %INPUT >out
|
||||||
|
# @TEST-EXEC: btest-diff out
|
||||||
|
# @TEST-EXEC: btest-diff conn.log
|
||||||
|
# @TEST-EXEC: btest-diff tunnel.log
|
||||||
|
|
||||||
|
# Some GTPv1 headers have some optional fields totaling to a 4-byte extension
|
||||||
|
# of the mandatory header.
|
||||||
|
|
||||||
|
event gtpv1_g_pdu_packet(outer: connection, inner_gtp: gtpv1_hdr, inner_ip: pkt_hdr)
|
||||||
|
{
|
||||||
|
print "gtpv1_packet", inner_gtp;
|
||||||
|
}
|
11
testing/btest/core/tunnels/gtp/outer_ip_frag.test
Normal file
11
testing/btest/core/tunnels/gtp/outer_ip_frag.test
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
# @TEST-EXEC: bro -C -r $TRACES/tunnels/gtp/gtp1_gn_normal_incl_fragmentation.pcap
|
||||||
|
# @TEST-EXEC: btest-diff conn.log
|
||||||
|
# @TEST-EXEC: btest-diff http.log
|
||||||
|
# @TEST-EXEC: btest-diff tunnel.log
|
||||||
|
|
||||||
|
# Normal GTP file, incl. TCP handshake and HTTP message.
|
||||||
|
# The inner IP packet is put into a GTP tunnel and as the original user payload
|
||||||
|
# is already 1500 byte, the tunneled packet incl. GTP/UDP/IP payload is
|
||||||
|
# bigger than 1500 byte and thus the outer IP must be fragmented, as seen here.
|
||||||
|
# (checksums are incorrect because packets were anonymized and tcprewrite
|
||||||
|
# seems to fail to correct the checksums when there's IP fragmentation).
|
13
testing/btest/core/tunnels/gtp/unknown_or_too_short.test
Normal file
13
testing/btest/core/tunnels/gtp/unknown_or_too_short.test
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
# @TEST-EXEC: bro -C -r $TRACES/tunnels/gtp/gtp9_unknown_or_too_short_payload.pcap
|
||||||
|
# @TEST-EXEC: btest-diff dpd.log
|
||||||
|
# @TEST-EXEC: btest-diff tunnel.log
|
||||||
|
|
||||||
|
# Packet 11, epoch time 1333458853.075889 is malformed. Only 222 byte are
|
||||||
|
# captured, although according to the IP header a full packet should be
|
||||||
|
# available. In Sessions.cc this throws a weird message at line 710.
|
||||||
|
# Packet 12, epoch time 1333458853.075904 is malformed. The user plane
|
||||||
|
# packet is no IPv4 nor IPv6 packet. Very probably this is a follow up
|
||||||
|
# issue on a problem of the user plane packet before it was put into the
|
||||||
|
# tunnel. The user plane packet may got corrupt and then put into 2 tunnel
|
||||||
|
# packets, here packet 11 and 12, and in packet 12 the user plane data is
|
||||||
|
# part of the remainder of the broken user plane packet of packet 11.
|
Loading…
Add table
Add a link
Reference in a new issue