/*-------------------------------------------------------------*/ /*************************************************************** * A netwib_iphdr permits to store : * * - an IPv4 header (rfc 791), or * * - an IPv6 header (rfc 2460) * ***************************************************************/ typedef struct { /* common fields */ netwib_iptype iptype; netwib_ip src; netwib_ip dst; netwib_uint8 ttl; netwib_ipproto protocol; /* specific fields */ union { struct { netwib_uint8 ihl; netwib_uint8 tos; netwib_uint16 totlen; netwib_uint16 id; netwib_bool reserved; netwib_bool dontfrag; netwib_bool morefrag; netwib_uint16 offsetfrag; netwib_uint16 check; netwib_bufext opts; /* IPv4 options as defined in ip4opts.h */ } ip4; struct { netwib_uint8 trafficclass; netwib_uint32 flowlabel; netwib_uint16 payloadlength; netwib_bufext exts; /* IPv6 extensions as defined in ip6exts.h */ } ip6; } header; } netwib_iphdr; typedef const netwib_iphdr netwib_constiphdr; #define NETWIB_IPHDR_MINLEN 40 /*-------------------------------------------------------------*/ /* Name : netwib_iphdr_initdefault Description : Initialize a netwib_iphdr with default values. Input parameter(s) : Input/output parameter(s) : Output parameter(s) : *piphdr : netwib_iphdr to initialize Normal return values : NETWIB_ERR_OK : ok */ netwib_err netwib_iphdr_initdefault(netwib_iptype iptype, netwib_iphdr *piphdr); /*-------------------------------------------------------------*/ /* Name : netwib_pkt_append_iphdr Description : Initialize physical data from a netwib_iphdr. Input parameter(s) : *piphdr : netwib_iphdr Input/output parameter(s) : *ppht : buffer to initialize Output parameter(s) : Normal return values : NETWIB_ERR_OK : ok */ netwib_err netwib_pkt_append_iphdr(netwib_constiphdr *piphdr, netwib_buf *ppkt); netwib_err netwib_pkt_prepend_iphdr(netwib_constiphdr *piphdr, netwib_buf *ppkt); /*-------------------------------------------------------------*/ /* Name : netwib_pkt_decode_iphdr Description : Decode a netwib_iphdr from physical data. Input parameter(s) : *ppkt : buffer containing physical data Input/output parameter(s) : Output parameter(s) : *piphdr : netwib_iphdr contained in pkt *pskipsize : size to use to skip this header Normal return values : NETWIB_ERR_OK : ok NETWIB_ERR_NOTCONVERTED : pkt could not be decoded NETWIB_ERR_DATAMISSING : pkt was not big enough */ netwib_err netwib_pkt_decode_iphdr(netwib_constbuf *ppkt, netwib_iphdr *piphdr, netwib_uint32 *pskipsize); /*-------------------------------------------------------------*/ /*************************************************************** * A netwib_iphdr contains a protocol field, it is stored : * * - IPv4 : in header.protocol * * - IPv6 : if exts is empty : in header.protocol, * * else : in last extension of header.ip6.exts * ***************************************************************/ netwib_err netwib_iphdr_set_proto(netwib_iphdr *piphdr, netwib_ipproto ipproto); netwib_err netwib_iphdr_get_proto(netwib_constiphdr *piphdr, netwib_ipproto *pipproto);