#ifndef RAW_IP_PACKET_H
#define RAW_IP_PACKET_H
-#if defined(FREE_BSD) || defined(FREE_BSD5)
+#if defined(FREE_BSD)
#include <netinet/in_systm.h> // n_long in netinet/ip.h
#endif
#include <cstring>
-#include "const.h"
-#include "common.h"
-
#define IPv4 (2)
enum { pcktSize = 68 }; //60(max) ip + 8 udp or tcp (part of tcp or udp header to ports)
struct RAW_PACKET
{
RAW_PACKET()
- : dataLen(-1)
- {
- memset(pckt, 0, pcktSize);
- }
-
- RAW_PACKET(const RAW_PACKET & rp)
- : dataLen(rp.dataLen)
+ : rawPacket(),
+ dataLen(-1)
{
- memcpy(pckt, rp.pckt, pcktSize);
+ memset(rawPacket.pckt, 0, pcktSize);
}
uint16_t GetIPVersion() const;
uint16_t GetDstPort() const;
bool operator==(const RAW_PACKET & rvalue) const;
-bool operator!=(const RAW_PACKET & rvalue) const { return !(*this == rvalue); };
+bool operator!=(const RAW_PACKET & rvalue) const { return !(*this == rvalue); }
bool operator<(const RAW_PACKET & rvalue) const;
union
// Only for packets without options field
uint16_t sPort;
uint16_t dPort;
- } header __attribute__ ((packed));
- };
+ } header;
+ } rawPacket;
int32_t dataLen; // IP packet length. Set to -1 to use length field from the header
};
//-----------------------------------------------------------------------------
inline uint16_t RAW_PACKET::GetIPVersion() const
{
-return header.ipHeader.ip_v;
+return rawPacket.header.ipHeader.ip_v;
}
//-----------------------------------------------------------------------------
inline uint8_t RAW_PACKET::GetHeaderLen() const
{
-return header.ipHeader.ip_hl * 4;
+return rawPacket.header.ipHeader.ip_hl * 4;
}
//-----------------------------------------------------------------------------
inline uint8_t RAW_PACKET::GetProto() const
{
-return header.ipHeader.ip_p;
+return rawPacket.header.ipHeader.ip_p;
}
//-----------------------------------------------------------------------------
inline uint32_t RAW_PACKET::GetLen() const
{
if (dataLen != -1)
return dataLen;
-return ntohs(header.ipHeader.ip_len);
+return ntohs(rawPacket.header.ipHeader.ip_len);
}
//-----------------------------------------------------------------------------
inline uint32_t RAW_PACKET::GetSrcIP() const
{
-return header.ipHeader.ip_src.s_addr;
+return rawPacket.header.ipHeader.ip_src.s_addr;
}
//-----------------------------------------------------------------------------
inline uint32_t RAW_PACKET::GetDstIP() const
{
-return header.ipHeader.ip_dst.s_addr;
+return rawPacket.header.ipHeader.ip_dst.s_addr;
}
//-----------------------------------------------------------------------------
inline uint16_t RAW_PACKET::GetSrcPort() const
{
-if (header.ipHeader.ip_p == 1) // for icmp proto return port 0
+if (rawPacket.header.ipHeader.ip_p == 1) // for icmp proto return port 0
return 0;
-return ntohs(*((uint16_t*)(pckt + header.ipHeader.ip_hl * 4)));
+const uint8_t * pos = rawPacket.pckt + rawPacket.header.ipHeader.ip_hl * 4;
+return ntohs(*reinterpret_cast<const uint16_t *>(pos));
}
//-----------------------------------------------------------------------------
inline uint16_t RAW_PACKET::GetDstPort() const
{
-if (header.ipHeader.ip_p == 1) // for icmp proto return port 0
+if (rawPacket.header.ipHeader.ip_p == 1) // for icmp proto return port 0
return 0;
-return ntohs(*((uint16_t*)(pckt + header.ipHeader.ip_hl * 4 + 2)));
+const uint8_t * pos = rawPacket.pckt + rawPacket.header.ipHeader.ip_hl * 4 + 2;
+return ntohs(*reinterpret_cast<const uint16_t *>(pos));
}
//-----------------------------------------------------------------------------
inline bool RAW_PACKET::operator==(const RAW_PACKET & rvalue) const
{
-if (header.ipHeader.ip_src.s_addr != rvalue.header.ipHeader.ip_src.s_addr)
+if (rawPacket.header.ipHeader.ip_src.s_addr != rvalue.rawPacket.header.ipHeader.ip_src.s_addr)
return false;
-if (header.ipHeader.ip_dst.s_addr != rvalue.header.ipHeader.ip_dst.s_addr)
+if (rawPacket.header.ipHeader.ip_dst.s_addr != rvalue.rawPacket.header.ipHeader.ip_dst.s_addr)
return false;
-if (header.ipHeader.ip_p != 1 && rvalue.header.ipHeader.ip_p != 1)
+if (rawPacket.header.ipHeader.ip_p != 1 && rvalue.rawPacket.header.ipHeader.ip_p != 1)
{
- if (*((uint16_t *)(pckt + header.ipHeader.ip_hl * 4)) !=
- *((uint16_t *)(rvalue.pckt + rvalue.header.ipHeader.ip_hl * 4)))
+ const uint8_t * pos = rawPacket.pckt + rawPacket.header.ipHeader.ip_hl * 4;
+ const uint8_t * rpos = rvalue.rawPacket.pckt + rvalue.rawPacket.header.ipHeader.ip_hl * 4;
+ if (*reinterpret_cast<const uint16_t *>(pos) != *reinterpret_cast<const uint16_t *>(rpos))
return false;
- if (*((uint16_t *)(pckt + header.ipHeader.ip_hl * 4 + 2)) !=
- *((uint16_t *)(rvalue.pckt + rvalue.header.ipHeader.ip_hl * 4 + 2)))
+ pos += 2;
+ rpos += 2;
+ if (*reinterpret_cast<const uint16_t *>(pos) != *reinterpret_cast<const uint16_t *>(rpos))
return false;
}
-if (header.ipHeader.ip_p != rvalue.header.ipHeader.ip_p)
+if (rawPacket.header.ipHeader.ip_p != rvalue.rawPacket.header.ipHeader.ip_p)
return false;
return true;
//-----------------------------------------------------------------------------
inline bool RAW_PACKET::operator<(const RAW_PACKET & rvalue) const
{
-if (header.ipHeader.ip_src.s_addr < rvalue.header.ipHeader.ip_src.s_addr)
+if (rawPacket.header.ipHeader.ip_src.s_addr < rvalue.rawPacket.header.ipHeader.ip_src.s_addr)
return true;
-if (header.ipHeader.ip_src.s_addr > rvalue.header.ipHeader.ip_src.s_addr)
+if (rawPacket.header.ipHeader.ip_src.s_addr > rvalue.rawPacket.header.ipHeader.ip_src.s_addr)
return false;
-if (header.ipHeader.ip_dst.s_addr < rvalue.header.ipHeader.ip_dst.s_addr)
+if (rawPacket.header.ipHeader.ip_dst.s_addr < rvalue.rawPacket.header.ipHeader.ip_dst.s_addr)
return true;
-if (header.ipHeader.ip_dst.s_addr > rvalue.header.ipHeader.ip_dst.s_addr)
+if (rawPacket.header.ipHeader.ip_dst.s_addr > rvalue.rawPacket.header.ipHeader.ip_dst.s_addr)
return false;
-if (header.ipHeader.ip_p != 1 && rvalue.header.ipHeader.ip_p != 1)
+if (rawPacket.header.ipHeader.ip_p != 1 && rvalue.rawPacket.header.ipHeader.ip_p != 1)
{
- if (*((uint16_t *)(pckt + header.ipHeader.ip_hl * 4)) <
- *((uint16_t *)(rvalue.pckt + rvalue.header.ipHeader.ip_hl * 4)))
+ const uint8_t * pos = rawPacket.pckt + rawPacket.header.ipHeader.ip_hl * 4;
+ const uint8_t * rpos = rvalue.rawPacket.pckt + rvalue.rawPacket.header.ipHeader.ip_hl * 4;
+ if (*reinterpret_cast<const uint16_t *>(pos) < *reinterpret_cast<const uint16_t *>(rpos))
return true;
- if (*((uint16_t *)(pckt + header.ipHeader.ip_hl * 4)) >
- *((uint16_t *)(rvalue.pckt + rvalue.header.ipHeader.ip_hl * 4)))
+ if (*reinterpret_cast<const uint16_t *>(pos) > *reinterpret_cast<const uint16_t *>(rpos))
return false;
- if (*((uint16_t *)(pckt + header.ipHeader.ip_hl * 4 + 2)) <
- *((uint16_t *)(rvalue.pckt + rvalue.header.ipHeader.ip_hl * 4 + 2)))
+ pos += 2;
+ rpos += 2;
+ if (*reinterpret_cast<const uint16_t *>(pos) < *reinterpret_cast<const uint16_t *>(rpos))
return true;
- if (*((uint16_t *)(pckt + header.ipHeader.ip_hl * 4 + 2)) >
- *((uint16_t *)(rvalue.pckt + rvalue.header.ipHeader.ip_hl * 4 + 2)))
+ if (*reinterpret_cast<const uint16_t *>(pos) > *reinterpret_cast<const uint16_t *>(rpos))
return false;
}
-if (header.ipHeader.ip_p < rvalue.header.ipHeader.ip_p)
+if (rawPacket.header.ipHeader.ip_p < rvalue.rawPacket.header.ipHeader.ip_p)
return true;
return false;