Commit 4dafc72f authored by nikolajev's avatar nikolajev
Browse files

Added GtpDissector and Dispatcher implementation

parent 039c8795
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -5,6 +5,7 @@
#include "UdpDispatcher.h"
#include "UdpDispatcher.h"
#include "TcpDispatcher.h"
#include "TcpDispatcher.h"
#include "SipDispatcher.h"
#include "SipDispatcher.h"
#include "GtpDispatcher.h"


DispatcherFactory::DispatcherFactory() {
DispatcherFactory::DispatcherFactory() {
  Register(EProtocolType_Ethernet, &(EthernetDispatcher::Instance()));
  Register(EProtocolType_Ethernet, &(EthernetDispatcher::Instance()));
@@ -13,6 +14,7 @@ DispatcherFactory::DispatcherFactory() {
  Register(EProtocolType_Udp, &(UdpDispatcher::Instance()));
  Register(EProtocolType_Udp, &(UdpDispatcher::Instance()));
  Register(EProtocolType_Tcp, &(TcpDispatcher::Instance()));
  Register(EProtocolType_Tcp, &(TcpDispatcher::Instance()));
  Register(EProtocolType_Sip, &(SipDispatcher::Instance()));
  Register(EProtocolType_Sip, &(SipDispatcher::Instance()));
  Register(EProtocolType_Gtp, &(GtpDispatcher::Instance()));
}
}


DispatcherFactory::~DispatcherFactory() {
DispatcherFactory::~DispatcherFactory() {
+2 −0
Original line number Original line Diff line number Diff line
@@ -6,6 +6,7 @@
#include "UdpDissector.h"
#include "UdpDissector.h"
#include "TcpDissector.h"
#include "TcpDissector.h"
#include "SipDissector.h"
#include "SipDissector.h"
#include "GtpDissector.h"


DissectorFactory::DissectorFactory() {
DissectorFactory::DissectorFactory() {
  Register("Ethernet", new EthernetDissector);
  Register("Ethernet", new EthernetDissector);
@@ -14,6 +15,7 @@ DissectorFactory::DissectorFactory() {
  Register("UDP", new UdpDissector);
  Register("UDP", new UdpDissector);
  Register("TCP", new TcpDissector);
  Register("TCP", new TcpDissector);
  Register("SIP", new SipDissector);
  Register("SIP", new SipDissector);
  Register("GTP", new GtpDissector);
}
}


DissectorFactory::~DissectorFactory() {
DissectorFactory::~DissectorFactory() {
+11 −0
Original line number Original line Diff line number Diff line

#include "GtpDispatcher.h"

GtpDispatcher::GtpDispatcher() 
  :Dispatcher("GTP") {
  
}

GtpDispatcher::~GtpDispatcher() {

}
+21 −0
Original line number Original line Diff line number Diff line
#ifndef GTP_DISPATCHER_H
#define GTP_DISPATCHER_H

#include "Helper/Singleton.h"
#include "Dispatcher.h"

class GtpDispatcher : public Dispatcher, public Singleton<GtpDispatcher> {
  
 protected:
  //Singleton
  GtpDispatcher();
  
  //Singleton
  friend class Singleton<GtpDispatcher>;

 public:
  ~GtpDispatcher();

};

#endif
+92 −0
Original line number Original line Diff line number Diff line
#include "GtpDissector.h"
#include "Logger/Logger.h"


GtpDissector::GtpDissector() 
{
	nUpperIPv = 0;
}

GtpDissector::~GtpDissector() {
  delete m_gtpHdr;
}

GtpDissector * GtpDissector::Clone() const {
  return new GtpDissector();
}

bool GtpDissector::IsPacketValid() const
{
  return m_nMessageLength != PARSING_ERROR;
}

bool GtpDissector::Dissect(const unsigned char * pData, const ssize_t nLen)
{
	std::clog << ">>> GtpDissector::Dissect: " << pData << std::endl;
	m_gtpHdr = new GtpHeader;
	int nHdrLen = 8;
	memcpy(m_gtpHdr, pData, nHdrLen);//8 bytes always mandatory for GTP
	
	if(m_gtpHdr->version != 1)
	{
		Logger::Instance().LogError("Invalid GTP message, bad version number");
		m_nMessageLength = PARSING_ERROR;
	}
	else
	{
		if(m_gtpHdr->s_flag)
		{
			memcpy(&m_gtpHdr->seqNum, &pData[nHdrLen], 2);
			nHdrLen += 2;
		}
		if(m_gtpHdr->pn_flag)
			m_gtpHdr->npduNum = pData[nHdrLen++];
		if(m_gtpHdr->e_flag)
			m_gtpHdr->extensionHeader = pData[nHdrLen++];

		m_nMessageLength = nLen - nHdrLen;
		SavePayload(&pData[nHdrLen], m_nMessageLength);
		//determine if the payload is IPv4 or IPv6
		if(m_nMessageLength && m_gtpHdr->messageType == 0xFF)
		{
			nUpperIPv = pData[nHdrLen];
#if BYTE_ORDER == LITTLE_ENDIAN
			nUpperIPv = nUpperIPv >> 4;
#else
#if BYTE_ORDER == BIG_ENDIAN
			nUpperIPv = nUpperIPv & 0x0F;
#endif
#endif
		}
	}
	return m_nMessageLength >= 0;
}

bool GtpDissector::NeedReassembly() const {
  return false;
}

const EProtocolType GtpDissector::GetUpperLayerType() const 
{
	EProtocolType res = EProtocolType_Unknown;
	switch(m_gtpHdr->messageType)
	{
		case 0xFF:
			if(nUpperIPv == 4)
				res = EProtocolType_IPv4;
			else if(nUpperIPv == 6)
				res = EProtocolType_IPv6;
			break;
		default:
			break;
	}
	std::clog << ">>> EProtocolType GtpDissector::GetUpperLayerType: " << res << std::endl;
	return res;
}


ProtocolInfoElement * GtpDissector::CreateLayerInfo()
{
	return 0;
}
Loading