1 #ifndef RAW_IP_PACKET_H
2 #define RAW_IP_PACKET_H
4 #include <netinet/in.h> // for htons
5 #include <netinet/ip.h> // for struct ip
14 enum { pcktSize = 68 }; //60(max) ip + 8 udp or tcp (part of tcp or udp header to ports)
15 //-----------------------------------------------------------------------------
21 memset(pckt, 0, pcktSize);
24 RAW_PACKET(const RAW_PACKET & rp)
27 memcpy(pckt, rp.pckt, pcktSize);
30 uint16_t GetIPVersion() const;
31 uint8_t GetHeaderLen() const;
32 uint8_t GetProto() const;
33 uint32_t GetLen() const;
34 uint32_t GetSrcIP() const;
35 uint32_t GetDstIP() const;
36 uint16_t GetSrcPort() const;
37 uint16_t GetDstPort() const;
39 bool operator==(const RAW_PACKET & rvalue) const;
40 bool operator!=(const RAW_PACKET & rvalue) const { return !(*this == rvalue); };
41 bool operator<(const RAW_PACKET & rvalue) const;
45 uint8_t pckt[pcktSize]; // îÁÞÁÌÏ ÐÁËÅÔÁ ÚÁÈ×ÁÞÅÎÎÏÇÏ ÉÚ ÓÅÔÉ
49 // Only for packets without options field
52 } __attribute__ ((packed));
54 int32_t dataLen; // äÌÉÎÁ IP ÐÁËÅÔÁ. åÓÌÉ -1, ÔÏ ÉÓÐÏÌØÚÏ×ÁÔØ ÄÌÉÎÕ ÉÚ ÚÁÇÏÌÏ×ËÁ ÓÁÍÏÇÏ ÐÁËÅÔÁ.
56 //-----------------------------------------------------------------------------
57 inline uint16_t RAW_PACKET::GetIPVersion() const
61 //-----------------------------------------------------------------------------
62 inline uint8_t RAW_PACKET::GetHeaderLen() const
64 return ipHeader.ip_hl * 4;
66 //-----------------------------------------------------------------------------
67 inline uint8_t RAW_PACKET::GetProto() const
71 //-----------------------------------------------------------------------------
72 inline uint32_t RAW_PACKET::GetLen() const
76 return ntohs(ipHeader.ip_len);
78 //-----------------------------------------------------------------------------
79 inline uint32_t RAW_PACKET::GetSrcIP() const
81 return ipHeader.ip_src.s_addr;
83 //-----------------------------------------------------------------------------
84 inline uint32_t RAW_PACKET::GetDstIP() const
86 return ipHeader.ip_dst.s_addr;
88 //-----------------------------------------------------------------------------
89 inline uint16_t RAW_PACKET::GetSrcPort() const
91 if (ipHeader.ip_p == 1) // for icmp proto return port 0
93 return ntohs(*((uint16_t*)(pckt + ipHeader.ip_hl * 4)));
95 //-----------------------------------------------------------------------------
96 inline uint16_t RAW_PACKET::GetDstPort() const
98 if (ipHeader.ip_p == 1) // for icmp proto return port 0
100 return ntohs(*((uint16_t*)(pckt + ipHeader.ip_hl * 4 + 2)));
102 //-----------------------------------------------------------------------------
103 inline bool RAW_PACKET::operator==(const RAW_PACKET & rvalue) const
105 if (ipHeader.ip_src.s_addr != rvalue.ipHeader.ip_src.s_addr)
108 if (ipHeader.ip_dst.s_addr != rvalue.ipHeader.ip_dst.s_addr)
111 if (ipHeader.ip_p != 1 && rvalue.ipHeader.ip_p != 1)
113 if (*((uint16_t *)(pckt + ipHeader.ip_hl * 4)) !=
114 *((uint16_t *)(rvalue.pckt + rvalue.ipHeader.ip_hl * 4)))
117 if (*((uint16_t *)(pckt + ipHeader.ip_hl * 4 + 2)) !=
118 *((uint16_t *)(rvalue.pckt + rvalue.ipHeader.ip_hl * 4 + 2)))
122 if (ipHeader.ip_p != rvalue.ipHeader.ip_p)
127 /*//-----------------------------------------------------------------------------
128 inline bool operator==(const RAW_PACKET & lhs, const RAW_PACKET & rhs)
130 if (lhs.GetSrcIP() != rhs.GetSrcIP())
133 if (lhs.GetDstIP() != rhs.GetDstIP())
136 if (lhs.GetSrcPort() != rhs.GetSrcPort())
139 if (lhs.GetDstPort() != rhs.GetDstPort())
142 if (lhs.GetProto() != rhs.GetProto())
147 //-----------------------------------------------------------------------------
148 inline bool RAW_PACKET::operator<(const RAW_PACKET & rvalue) const
150 if (ipHeader.ip_src.s_addr < rvalue.ipHeader.ip_src.s_addr)
152 if (ipHeader.ip_src.s_addr > rvalue.ipHeader.ip_src.s_addr)
155 if (ipHeader.ip_dst.s_addr < rvalue.ipHeader.ip_dst.s_addr)
157 if (ipHeader.ip_dst.s_addr > rvalue.ipHeader.ip_dst.s_addr)
160 if (ipHeader.ip_p != 1 && rvalue.ipHeader.ip_p != 1)
162 if (*((uint16_t *)(pckt + ipHeader.ip_hl * 4)) <
163 *((uint16_t *)(rvalue.pckt + rvalue.ipHeader.ip_hl * 4)))
165 if (*((uint16_t *)(pckt + ipHeader.ip_hl * 4)) >
166 *((uint16_t *)(rvalue.pckt + rvalue.ipHeader.ip_hl * 4)))
169 if (*((uint16_t *)(pckt + ipHeader.ip_hl * 4 + 2)) <
170 *((uint16_t *)(rvalue.pckt + rvalue.ipHeader.ip_hl * 4 + 2)))
172 if (*((uint16_t *)(pckt + ipHeader.ip_hl * 4 + 2)) >
173 *((uint16_t *)(rvalue.pckt + rvalue.ipHeader.ip_hl * 4 + 2)))
177 if (ipHeader.ip_p < rvalue.ipHeader.ip_p)
182 //-----------------------------------------------------------------------------
183 /*inline bool operator<(const RAW_PACKET & lhs, const RAW_PACKET & rhs)
185 if (lhs.GetSrcIP() < rhs.GetSrcIP())
187 if (lhs.GetSrcIP() > rhs.GetSrcIP())
190 if (lhs.GetDstIP() < rhs.GetDstIP())
192 if (lhs.GetDstIP() > rhs.GetDstIP())
195 if (lhs.GetSrcPort() < rhs.GetSrcPort())
197 if (lhs.GetSrcPort() > rhs.GetSrcPort())
200 if (lhs.GetDstPort() < rhs.GetDstPort())
202 if (lhs.GetDstPort() > rhs.GetDstPort())
205 if (lhs.GetProto() < rhs.GetProto())
210 //-----------------------------------------------------------------------------