43 lines
838 B
C
43 lines
838 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]);
|
|
return 0;
|
|
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;
|
|
}
|