1 | #include "TcpDissector.h" |
---|
2 | #include "Logger/Logger.h" |
---|
3 | #ifdef WIN32 |
---|
4 | #include <Winsock2.h> |
---|
5 | #else |
---|
6 | #include <netinet/in.h> |
---|
7 | #endif |
---|
8 | |
---|
9 | TcpDissector::TcpDissector() : |
---|
10 | m_tcpHdr(0) |
---|
11 | { |
---|
12 | } |
---|
13 | |
---|
14 | TcpDissector::~TcpDissector() |
---|
15 | { |
---|
16 | delete m_tcpHdr; |
---|
17 | } |
---|
18 | |
---|
19 | TcpDissector * TcpDissector::Clone() const |
---|
20 | { |
---|
21 | return new TcpDissector(); |
---|
22 | } |
---|
23 | |
---|
24 | bool TcpDissector::Dissect(const unsigned char * pData, const ssize_t nDataLen) |
---|
25 | { |
---|
26 | if (!m_tcpHdr) |
---|
27 | m_tcpHdr = new TcpHeader; |
---|
28 | memcpy(m_tcpHdr, pData, sizeof(TcpHeader)); |
---|
29 | #if BYTE_ORDER == LITTLE_ENDIAN |
---|
30 | m_tcpHdr->destPort = ntohs(m_tcpHdr->destPort); |
---|
31 | m_tcpHdr->srcPort = ntohs(m_tcpHdr->srcPort); |
---|
32 | #endif |
---|
33 | int nOffset = m_tcpHdr->dataOffset; |
---|
34 | nOffset *= 4; |
---|
35 | pData += nOffset; |
---|
36 | |
---|
37 | ssize_t nLen = nDataLen - nOffset; |
---|
38 | if (nLen > 0) |
---|
39 | { |
---|
40 | SavePayload(pData, nLen); |
---|
41 | SaveLayerInfo(); |
---|
42 | } |
---|
43 | if (nLen == 0) |
---|
44 | Logger::Instance().LogDebug("TCP control packet discarded"); |
---|
45 | return nLen > 0; |
---|
46 | // TODO: This implementation is not sufficient for all cases. It doesn't handle |
---|
47 | // out-of-order messages and packet loss issues. |
---|
48 | } |
---|
49 | |
---|
50 | bool TcpDissector::NeedReassembly() const { |
---|
51 | return false; |
---|
52 | } |
---|
53 | |
---|
54 | bool TcpDissector::Reassemble(Dissector * pDissector, ProtocolInfo * pProtocolInfo) { |
---|
55 | // Fragmentation has to be solved in application layere protocols |
---|
56 | return Dissector::Reassemble(pDissector, pProtocolInfo); |
---|
57 | } |
---|
58 | |
---|
59 | const EProtocolType TcpDissector::GetUpperLayerType() const { |
---|
60 | return EProtocolType_Sip; |
---|
61 | } |
---|
62 | |
---|
63 | ProtocolInfoElement * TcpDissector::CreateLayerInfo() |
---|
64 | { |
---|
65 | TcpInfo * pRes = new TcpInfo(); |
---|
66 | pRes->SetSourcePort(m_tcpHdr->srcPort); |
---|
67 | pRes->SetDestinationPort(m_tcpHdr->destPort); |
---|
68 | return pRes; |
---|
69 | } |
---|