46 lines
909 B
C
46 lines
909 B
C
#pragma once
|
|
|
|
#include <stdint.h>
|
|
|
|
struct ip_common {
|
|
uint8_t version;
|
|
uint8_t tc;
|
|
uint8_t proto;
|
|
uint8_t hdr_size;
|
|
uint16_t size;
|
|
};
|
|
|
|
_pure_ static inline uint8_t
|
|
ip_get_version(const uint8_t *data, size_t size)
|
|
{
|
|
if (size < 20)
|
|
return 0;
|
|
|
|
return data[0] >> 4;
|
|
}
|
|
|
|
static inline int
|
|
ip_get_common(struct ip_common *ic, const uint8_t *data, size_t size)
|
|
{
|
|
ic->version = ip_get_version(data, size);
|
|
|
|
switch (ic->version) {
|
|
case 4:
|
|
ic->tc = data[1];
|
|
ic->proto = data[9];
|
|
ic->hdr_size = (data[0] & 0xF) << 2;
|
|
ic->size = ((data[2] << 8) | data[3]);
|
|
if (ic->size >= 20)
|
|
return 0;
|
|
break;
|
|
case 6:
|
|
ic->tc = ((data[0] & 0xF) << 4) | (data[1] >> 4);
|
|
ic->proto = data[6];
|
|
ic->hdr_size = 40;
|
|
ic->size = ((data[4] << 8) | data[5]) + 40;
|
|
return 0;
|
|
}
|
|
|
|
return -1;
|
|
}
|