23 #include <arpa/inet.h>
52 #if defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 409)
53 #define UNALIGNED_OK __attribute__((no_sanitize_undefined))
54 #elif __has_attribute(no_sanitize)
55 #define UNALIGNED_OK __attribute__((no_sanitize("undefined")))
60 #if (defined(__i386__) || defined(_M_IX86) || defined(__X86__) || defined(__x86_64__) || defined(_M_X64)) || \
61 (defined(__m68k__) && (!defined(__mc68000__) && !defined(__mc68010__))) || \
62 (defined(__ppc__) || defined(__ppc64__) || defined(_M_PPC) || defined(_ARCH_PPC) || defined(_ARCH_PPC64)) || \
63 (defined(__s390__) || defined(__s390x__) || defined(__zarch__))
79 return ((uint16_t)ntohs(*(
const uint16_t *)(p)));
85 return ((int16_t)ntohs(*(
const int16_t *)(p)));
91 return ((uint32_t)ntohl(*(
const uint32_t *)(p)));
97 return ((int32_t)ntohl(*(
const int32_t *)(p)));
103 return ((uint64_t)(((uint64_t)ntohl(*((
const uint32_t *)(p) + 0))) << 32 |
104 ((uint64_t)ntohl(*((
const uint32_t *)(p) + 1))) << 0));
111 return ((int64_t)(((int64_t)ntohl(*((
const uint32_t *)(p) + 0))) << 32 |
112 ((uint64_t)ntohl(*((
const uint32_t *)(p) + 1))) << 0));
115 #elif PCAP_IS_AT_LEAST_GNUC_VERSION(2,0) && \
116 (defined(__alpha) || defined(__alpha__) || \
117 defined(__mips) || defined(__mips__))
172 } __attribute__((packed)) unaligned_uint16_t;
176 } __attribute__((packed)) unaligned_int16_t;
180 } __attribute__((packed)) unaligned_uint32_t;
184 } __attribute__((packed)) unaligned_int32_t;
189 return ((uint16_t)ntohs(((
const unaligned_uint16_t *)(p))->val));
195 return ((int16_t)ntohs(((
const unaligned_int16_t *)(p))->val));
201 return ((uint32_t)ntohl(((
const unaligned_uint32_t *)(p))->val));
207 return ((int32_t)ntohl(((
const unaligned_int32_t *)(p))->val));
213 return ((uint64_t)(((uint64_t)ntohl(((
const unaligned_uint32_t *)(p) + 0)->val)) << 32 |
214 ((uint64_t)ntohl(((
const unaligned_uint32_t *)(p) + 1)->val)) << 0));
220 return ((int64_t)(((uint64_t)ntohl(((
const unaligned_uint32_t *)(p) + 0)->val)) << 32 |
221 ((uint64_t)ntohl(((
const unaligned_uint32_t *)(p) + 1)->val)) << 0));
242 #define EXTRACT_BE_U_2(p) \
243 ((uint16_t)(((uint16_t)(*((const uint8_t *)(p) + 0)) << 8) | \
244 ((uint16_t)(*((const uint8_t *)(p) + 1)) << 0)))
245 #define EXTRACT_BE_S_2(p) \
246 ((int16_t)(((uint16_t)(*((const uint8_t *)(p) + 0)) << 8) | \
247 ((uint16_t)(*((const uint8_t *)(p) + 1)) << 0)))
248 #define EXTRACT_BE_U_4(p) \
249 ((uint32_t)(((uint32_t)(*((const uint8_t *)(p) + 0)) << 24) | \
250 ((uint32_t)(*((const uint8_t *)(p) + 1)) << 16) | \
251 ((uint32_t)(*((const uint8_t *)(p) + 2)) << 8) | \
252 ((uint32_t)(*((const uint8_t *)(p) + 3)) << 0)))
253 #define EXTRACT_BE_S_4(p) \
254 ((int32_t)(((uint32_t)(*((const uint8_t *)(p) + 0)) << 24) | \
255 ((uint32_t)(*((const uint8_t *)(p) + 1)) << 16) | \
256 ((uint32_t)(*((const uint8_t *)(p) + 2)) << 8) | \
257 ((uint32_t)(*((const uint8_t *)(p) + 3)) << 0)))
258 #define EXTRACT_BE_U_8(p) \
259 ((uint64_t)(((uint64_t)(*((const uint8_t *)(p) + 0)) << 56) | \
260 ((uint64_t)(*((const uint8_t *)(p) + 1)) << 48) | \
261 ((uint64_t)(*((const uint8_t *)(p) + 2)) << 40) | \
262 ((uint64_t)(*((const uint8_t *)(p) + 3)) << 32) | \
263 ((uint64_t)(*((const uint8_t *)(p) + 4)) << 24) | \
264 ((uint64_t)(*((const uint8_t *)(p) + 5)) << 16) | \
265 ((uint64_t)(*((const uint8_t *)(p) + 6)) << 8) | \
266 ((uint64_t)(*((const uint8_t *)(p) + 7)) << 0)))
267 #define EXTRACT_BE_S_8(p) \
268 ((int64_t)(((uint64_t)(*((const uint8_t *)(p) + 0)) << 56) | \
269 ((uint64_t)(*((const uint8_t *)(p) + 1)) << 48) | \
270 ((uint64_t)(*((const uint8_t *)(p) + 2)) << 40) | \
271 ((uint64_t)(*((const uint8_t *)(p) + 3)) << 32) | \
272 ((uint64_t)(*((const uint8_t *)(p) + 4)) << 24) | \
273 ((uint64_t)(*((const uint8_t *)(p) + 5)) << 16) | \
274 ((uint64_t)(*((const uint8_t *)(p) + 6)) << 8) | \
275 ((uint64_t)(*((const uint8_t *)(p) + 7)) << 0)))
281 #define EXTRACT_IPV4_TO_HOST_ORDER(p) \
282 ((uint32_t)(((uint32_t)(*((const uint8_t *)(p) + 0)) << 24) | \
283 ((uint32_t)(*((const uint8_t *)(p) + 1)) << 16) | \
284 ((uint32_t)(*((const uint8_t *)(p) + 2)) << 8) | \
285 ((uint32_t)(*((const uint8_t *)(p) + 3)) << 0)))
291 #define EXTRACT_BE_U_3(p) \
292 ((uint32_t)(((uint32_t)(*((const uint8_t *)(p) + 0)) << 16) | \
293 ((uint32_t)(*((const uint8_t *)(p) + 1)) << 8) | \
294 ((uint32_t)(*((const uint8_t *)(p) + 2)) << 0)))
296 #define EXTRACT_BE_S_3(p) \
297 (((*((const uint8_t *)(p) + 0)) & 0x80) ? \
298 ((int32_t)(((uint32_t)(*((const uint8_t *)(p) + 0)) << 16) | \
299 ((uint32_t)(*((const uint8_t *)(p) + 1)) << 8) | \
300 ((uint32_t)(*((const uint8_t *)(p) + 2)) << 0))) : \
301 ((int32_t)(0xFF000000U | \
302 ((uint32_t)(*((const uint8_t *)(p) + 0)) << 16) | \
303 ((uint32_t)(*((const uint8_t *)(p) + 1)) << 8) | \
304 ((uint32_t)(*((const uint8_t *)(p) + 2)) << 0))))
306 #define EXTRACT_BE_U_5(p) \
307 ((uint64_t)(((uint64_t)(*((const uint8_t *)(p) + 0)) << 32) | \
308 ((uint64_t)(*((const uint8_t *)(p) + 1)) << 24) | \
309 ((uint64_t)(*((const uint8_t *)(p) + 2)) << 16) | \
310 ((uint64_t)(*((const uint8_t *)(p) + 3)) << 8) | \
311 ((uint64_t)(*((const uint8_t *)(p) + 4)) << 0)))
313 #define EXTRACT_BE_S_5(p) \
314 (((*((const uint8_t *)(p) + 0)) & 0x80) ? \
315 ((int64_t)(((uint64_t)(*((const uint8_t *)(p) + 0)) << 32) | \
316 ((uint64_t)(*((const uint8_t *)(p) + 1)) << 24) | \
317 ((uint64_t)(*((const uint8_t *)(p) + 2)) << 16) | \
318 ((uint64_t)(*((const uint8_t *)(p) + 3)) << 8) | \
319 ((uint64_t)(*((const uint8_t *)(p) + 4)) << 0))) : \
320 ((int64_t)(INT64_T_CONSTANT(0xFFFFFF0000000000U) | \
321 ((uint64_t)(*((const uint8_t *)(p) + 0)) << 32) | \
322 ((uint64_t)(*((const uint8_t *)(p) + 1)) << 24) | \
323 ((uint64_t)(*((const uint8_t *)(p) + 2)) << 16) | \
324 ((uint64_t)(*((const uint8_t *)(p) + 3)) << 8) | \
325 ((uint64_t)(*((const uint8_t *)(p) + 4)) << 0))))
327 #define EXTRACT_BE_U_6(p) \
328 ((uint64_t)(((uint64_t)(*((const uint8_t *)(p) + 0)) << 40) | \
329 ((uint64_t)(*((const uint8_t *)(p) + 1)) << 32) | \
330 ((uint64_t)(*((const uint8_t *)(p) + 2)) << 24) | \
331 ((uint64_t)(*((const uint8_t *)(p) + 3)) << 16) | \
332 ((uint64_t)(*((const uint8_t *)(p) + 4)) << 8) | \
333 ((uint64_t)(*((const uint8_t *)(p) + 5)) << 0)))
335 #define EXTRACT_BE_S_6(p) \
336 (((*((const uint8_t *)(p) + 0)) & 0x80) ? \
337 ((int64_t)(((uint64_t)(*((const uint8_t *)(p) + 0)) << 40) | \
338 ((uint64_t)(*((const uint8_t *)(p) + 1)) << 32) | \
339 ((uint64_t)(*((const uint8_t *)(p) + 2)) << 24) | \
340 ((uint64_t)(*((const uint8_t *)(p) + 3)) << 16) | \
341 ((uint64_t)(*((const uint8_t *)(p) + 4)) << 8) | \
342 ((uint64_t)(*((const uint8_t *)(p) + 5)) << 0))) : \
343 ((int64_t)(INT64_T_CONSTANT(0xFFFFFFFF00000000U) | \
344 ((uint64_t)(*((const uint8_t *)(p) + 0)) << 40) | \
345 ((uint64_t)(*((const uint8_t *)(p) + 1)) << 32) | \
346 ((uint64_t)(*((const uint8_t *)(p) + 2)) << 24) | \
347 ((uint64_t)(*((const uint8_t *)(p) + 3)) << 16) | \
348 ((uint64_t)(*((const uint8_t *)(p) + 4)) << 8) | \
349 ((uint64_t)(*((const uint8_t *)(p) + 5)) << 0))))
351 #define EXTRACT_BE_U_7(p) \
352 ((uint64_t)(((uint64_t)(*((const uint8_t *)(p) + 0)) << 48) | \
353 ((uint64_t)(*((const uint8_t *)(p) + 1)) << 40) | \
354 ((uint64_t)(*((const uint8_t *)(p) + 2)) << 32) | \
355 ((uint64_t)(*((const uint8_t *)(p) + 3)) << 24) | \
356 ((uint64_t)(*((const uint8_t *)(p) + 4)) << 16) | \
357 ((uint64_t)(*((const uint8_t *)(p) + 5)) << 8) | \
358 ((uint64_t)(*((const uint8_t *)(p) + 6)) << 0)))
360 #define EXTRACT_BE_S_7(p) \
361 (((*((const uint8_t *)(p) + 0)) & 0x80) ? \
362 ((int64_t)(((uint64_t)(*((const uint8_t *)(p) + 0)) << 48) | \
363 ((uint64_t)(*((const uint8_t *)(p) + 1)) << 40) | \
364 ((uint64_t)(*((const uint8_t *)(p) + 2)) << 32) | \
365 ((uint64_t)(*((const uint8_t *)(p) + 3)) << 24) | \
366 ((uint64_t)(*((const uint8_t *)(p) + 4)) << 16) | \
367 ((uint64_t)(*((const uint8_t *)(p) + 5)) << 8) | \
368 ((uint64_t)(*((const uint8_t *)(p) + 6)) << 0))) : \
369 ((int64_t)(INT64_T_CONSTANT(0xFFFFFFFFFF000000U) | \
370 ((uint64_t)(*((const uint8_t *)(p) + 0)) << 48) | \
371 ((uint64_t)(*((const uint8_t *)(p) + 1)) << 40) | \
372 ((uint64_t)(*((const uint8_t *)(p) + 2)) << 32) | \
373 ((uint64_t)(*((const uint8_t *)(p) + 3)) << 24) | \
374 ((uint64_t)(*((const uint8_t *)(p) + 4)) << 16) | \
375 ((uint64_t)(*((const uint8_t *)(p) + 5)) << 8) | \
376 ((uint64_t)(*((const uint8_t *)(p) + 6)) << 0))))
382 #define EXTRACT_LE_U_2(p) \
383 ((uint16_t)(((uint16_t)(*((const uint8_t *)(p) + 1)) << 8) | \
384 ((uint16_t)(*((const uint8_t *)(p) + 0)) << 0)))
385 #define EXTRACT_LE_S_2(p) \
386 ((int16_t)(((uint16_t)(*((const uint8_t *)(p) + 1)) << 8) | \
387 ((uint16_t)(*((const uint8_t *)(p) + 0)) << 0)))
388 #define EXTRACT_LE_U_4(p) \
389 ((uint32_t)(((uint32_t)(*((const uint8_t *)(p) + 3)) << 24) | \
390 ((uint32_t)(*((const uint8_t *)(p) + 2)) << 16) | \
391 ((uint32_t)(*((const uint8_t *)(p) + 1)) << 8) | \
392 ((uint32_t)(*((const uint8_t *)(p) + 0)) << 0)))
393 #define EXTRACT_LE_S_4(p) \
394 ((int32_t)(((uint32_t)(*((const uint8_t *)(p) + 3)) << 24) | \
395 ((uint32_t)(*((const uint8_t *)(p) + 2)) << 16) | \
396 ((uint32_t)(*((const uint8_t *)(p) + 1)) << 8) | \
397 ((uint32_t)(*((const uint8_t *)(p) + 0)) << 0)))
398 #define EXTRACT_LE_U_3(p) \
399 ((uint32_t)(((uint32_t)(*((const uint8_t *)(p) + 2)) << 16) | \
400 ((uint32_t)(*((const uint8_t *)(p) + 1)) << 8) | \
401 ((uint32_t)(*((const uint8_t *)(p) + 0)) << 0)))
402 #define EXTRACT_LE_S_3(p) \
403 ((int32_t)(((uint32_t)(*((const uint8_t *)(p) + 2)) << 16) | \
404 ((uint32_t)(*((const uint8_t *)(p) + 1)) << 8) | \
405 ((uint32_t)(*((const uint8_t *)(p) + 0)) << 0)))
406 #define EXTRACT_LE_U_8(p) \
407 ((uint64_t)(((uint64_t)(*((const uint8_t *)(p) + 7)) << 56) | \
408 ((uint64_t)(*((const uint8_t *)(p) + 6)) << 48) | \
409 ((uint64_t)(*((const uint8_t *)(p) + 5)) << 40) | \
410 ((uint64_t)(*((const uint8_t *)(p) + 4)) << 32) | \
411 ((uint64_t)(*((const uint8_t *)(p) + 3)) << 24) | \
412 ((uint64_t)(*((const uint8_t *)(p) + 2)) << 16) | \
413 ((uint64_t)(*((const uint8_t *)(p) + 1)) << 8) | \
414 ((uint64_t)(*((const uint8_t *)(p) + 0)) << 0)))
415 #define EXTRACT_LE_S_8(p) \
416 ((int64_t)(((uint64_t)(*((const uint8_t *)(p) + 7)) << 56) | \
417 ((uint64_t)(*((const uint8_t *)(p) + 6)) << 48) | \
418 ((uint64_t)(*((const uint8_t *)(p) + 5)) << 40) | \
419 ((uint64_t)(*((const uint8_t *)(p) + 4)) << 32) | \
420 ((uint64_t)(*((const uint8_t *)(p) + 3)) << 24) | \
421 ((uint64_t)(*((const uint8_t *)(p) + 2)) << 16) | \
422 ((uint64_t)(*((const uint8_t *)(p) + 1)) << 8) | \
423 ((uint64_t)(*((const uint8_t *)(p) + 0)) << 0)))