1 #ifndef RAW_IP_PACKET_H
2 #define RAW_IP_PACKET_H
4 #if defined(FREE_BSD) || defined(FREE_BSD5)
5 #include <netinet/in_systm.h> // n_long in netinet/ip.h
8 #include <netinet/in.h> // for htons
9 #include <netinet/ip.h> // for struct ip
13 #include "stg_const.h"
18 enum { pcktSize = 68 }; //60(max) ip + 8 udp or tcp (part of tcp or udp header to ports)
19 //-----------------------------------------------------------------------------
25 memset(pckt, 0, pcktSize);
28 RAW_PACKET(const RAW_PACKET & rp)
31 memcpy(pckt, rp.pckt, pcktSize);
34 uint16_t GetIPVersion() const;
35 uint8_t GetHeaderLen() const;
36 uint8_t GetProto() const;
37 uint32_t GetLen() const;
38 uint32_t GetSrcIP() const;
39 uint32_t GetDstIP() const;
40 uint16_t GetSrcPort() const;
41 uint16_t GetDstPort() const;
43 bool operator==(const RAW_PACKET & rvalue) const;
44 bool operator!=(const RAW_PACKET & rvalue) const { return !(*this == rvalue); };
45 bool operator<(const RAW_PACKET & rvalue) const;
49 uint8_t pckt[pcktSize]; // îÁÞÁÌÏ ÐÁËÅÔÁ ÚÁÈ×ÁÞÅÎÎÏÇÏ ÉÚ ÓÅÔÉ
53 // Only for packets without options field
56 } header __attribute__ ((packed));
58 int32_t dataLen; // äÌÉÎÁ IP ÐÁËÅÔÁ. åÓÌÉ -1, ÔÏ ÉÓÐÏÌØÚÏ×ÁÔØ ÄÌÉÎÕ ÉÚ ÚÁÇÏÌÏ×ËÁ ÓÁÍÏÇÏ ÐÁËÅÔÁ.
60 //-----------------------------------------------------------------------------
61 inline uint16_t RAW_PACKET::GetIPVersion() const
63 return header.ipHeader.ip_v;
65 //-----------------------------------------------------------------------------
66 inline uint8_t RAW_PACKET::GetHeaderLen() const
68 return header.ipHeader.ip_hl * 4;
70 //-----------------------------------------------------------------------------
71 inline uint8_t RAW_PACKET::GetProto() const
73 return header.ipHeader.ip_p;
75 //-----------------------------------------------------------------------------
76 inline uint32_t RAW_PACKET::GetLen() const
80 return ntohs(header.ipHeader.ip_len);
82 //-----------------------------------------------------------------------------
83 inline uint32_t RAW_PACKET::GetSrcIP() const
85 return header.ipHeader.ip_src.s_addr;
87 //-----------------------------------------------------------------------------
88 inline uint32_t RAW_PACKET::GetDstIP() const
90 return header.ipHeader.ip_dst.s_addr;
92 //-----------------------------------------------------------------------------
93 inline uint16_t RAW_PACKET::GetSrcPort() const
95 if (header.ipHeader.ip_p == 1) // for icmp proto return port 0
97 return ntohs(*((uint16_t*)(pckt + header.ipHeader.ip_hl * 4)));
99 //-----------------------------------------------------------------------------
100 inline uint16_t RAW_PACKET::GetDstPort() const
102 if (header.ipHeader.ip_p == 1) // for icmp proto return port 0
104 return ntohs(*((uint16_t*)(pckt + header.ipHeader.ip_hl * 4 + 2)));
106 //-----------------------------------------------------------------------------
107 inline bool RAW_PACKET::operator==(const RAW_PACKET & rvalue) const
109 if (header.ipHeader.ip_src.s_addr != rvalue.header.ipHeader.ip_src.s_addr)
112 if (header.ipHeader.ip_dst.s_addr != rvalue.header.ipHeader.ip_dst.s_addr)
115 if (header.ipHeader.ip_p != 1 && rvalue.header.ipHeader.ip_p != 1)
117 if (*((uint16_t *)(pckt + header.ipHeader.ip_hl * 4)) !=
118 *((uint16_t *)(rvalue.pckt + rvalue.header.ipHeader.ip_hl * 4)))
121 if (*((uint16_t *)(pckt + header.ipHeader.ip_hl * 4 + 2)) !=
122 *((uint16_t *)(rvalue.pckt + rvalue.header.ipHeader.ip_hl * 4 + 2)))
126 if (header.ipHeader.ip_p != rvalue.header.ipHeader.ip_p)
131 /*//-----------------------------------------------------------------------------
132 inline bool operator==(const RAW_PACKET & lhs, const RAW_PACKET & rhs)
134 if (lhs.GetSrcIP() != rhs.GetSrcIP())
137 if (lhs.GetDstIP() != rhs.GetDstIP())
140 if (lhs.GetSrcPort() != rhs.GetSrcPort())
143 if (lhs.GetDstPort() != rhs.GetDstPort())
146 if (lhs.GetProto() != rhs.GetProto())
151 //-----------------------------------------------------------------------------
152 inline bool RAW_PACKET::operator<(const RAW_PACKET & rvalue) const
154 if (header.ipHeader.ip_src.s_addr < rvalue.header.ipHeader.ip_src.s_addr)
156 if (header.ipHeader.ip_src.s_addr > rvalue.header.ipHeader.ip_src.s_addr)
159 if (header.ipHeader.ip_dst.s_addr < rvalue.header.ipHeader.ip_dst.s_addr)
161 if (header.ipHeader.ip_dst.s_addr > rvalue.header.ipHeader.ip_dst.s_addr)
164 if (header.ipHeader.ip_p != 1 && rvalue.header.ipHeader.ip_p != 1)
166 if (*((uint16_t *)(pckt + header.ipHeader.ip_hl * 4)) <
167 *((uint16_t *)(rvalue.pckt + rvalue.header.ipHeader.ip_hl * 4)))
169 if (*((uint16_t *)(pckt + header.ipHeader.ip_hl * 4)) >
170 *((uint16_t *)(rvalue.pckt + rvalue.header.ipHeader.ip_hl * 4)))
173 if (*((uint16_t *)(pckt + header.ipHeader.ip_hl * 4 + 2)) <
174 *((uint16_t *)(rvalue.pckt + rvalue.header.ipHeader.ip_hl * 4 + 2)))
176 if (*((uint16_t *)(pckt + header.ipHeader.ip_hl * 4 + 2)) >
177 *((uint16_t *)(rvalue.pckt + rvalue.header.ipHeader.ip_hl * 4 + 2)))
181 if (header.ipHeader.ip_p < rvalue.header.ipHeader.ip_p)
186 //-----------------------------------------------------------------------------
187 /*inline bool operator<(const RAW_PACKET & lhs, const RAW_PACKET & rhs)
189 if (lhs.GetSrcIP() < rhs.GetSrcIP())
191 if (lhs.GetSrcIP() > rhs.GetSrcIP())
194 if (lhs.GetDstIP() < rhs.GetDstIP())
196 if (lhs.GetDstIP() > rhs.GetDstIP())
199 if (lhs.GetSrcPort() < rhs.GetSrcPort())
201 if (lhs.GetSrcPort() > rhs.GetSrcPort())
204 if (lhs.GetDstPort() < rhs.GetDstPort())
206 if (lhs.GetDstPort() > rhs.GetDstPort())
209 if (lhs.GetProto() < rhs.GetProto())
214 //-----------------------------------------------------------------------------