160{
163 UCHAR ip_version = (ver_len & 0xF0) >> 4;
167
168 if (ip_version == 4)
169 {
170 ipHeaderSize = (ver_len & 0xF) << 2;
172 DPrintf(3, (
"ip_version %d, ipHeaderSize %d, protocol %d, iplen %d",
173 ip_version, ipHeaderSize, pIpHeader->
v4.
ip_protocol, fullLength));
176 if (fullLength) {}
177 else
178 {
179 DPrintf(2, (
"ip v.%d, iplen %d", ip_version, fullLength));
180 }
181 }
182 else if (ip_version == 6)
183 {
186 ipHeaderSize =
sizeof(pIpHeader->
v6);
190 fullLength += ipHeaderSize;
191 while (nextHeader != 59)
192 {
194 switch (nextHeader)
195 {
200 res.xxpFull =
len >= fullLength ? 1 : 0;
202 break;
207 res.xxpFull =
len >= fullLength ? 1 : 0;
209 break;
210
211 case 0:
213 case 60:
215 case 43:
217 case 44:
219 case 51:
221 case 50:
223 case 135:
224 if (
len >= ((
ULONG)ipHeaderSize + 8))
225 {
228 ipHeaderSize += 8;
230 }
231 else
232 {
233 DPrintf(0, (
"[%s] ERROR: Break in the middle of ext. headers(len %d, hdr > %d)",
__FUNCTION__,
len, ipHeaderSize));
236 }
237 break;
238
239 default:
242 break;
243 }
244 if (bParsingDone)
245 break;
246 }
248 {
249 DPrintf(3, (
"ip_version %d, ipHeaderSize %d, protocol %d, iplen %d",
250 ip_version, ipHeaderSize, nextHeader, fullLength));
251 res.ipHeaderSize = ipHeaderSize;
252 }
253 else
254 {
257 }
258 }
259
261 {
262 res.ipHeaderSize = ipHeaderSize;
263 res.xxpFull =
len >= fullLength ? 1 : 0;
264
267 {
269 {
271 }
272 break;
274 {
276 }
277 break;
278 default:
280 break;
281 }
282 }
284}
struct _tagIPv4Header IPv4Header
static __inline tTcpIpPacketParsingResult ProcessUDPHeader(tTcpIpPacketParsingResult _res, PVOID pIpHeader, ULONG len, USHORT ipHeaderSize)
static __inline tTcpIpPacketParsingResult ProcessTCPHeader(tTcpIpPacketParsingResult _res, PVOID pIpHeader, ULONG len, USHORT ipHeaderSize)
#define MAX_SUPPORTED_IPV6_HEADERS