/* * Copyright (c) 2012 Jiri Svoboda * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** @addtogroup inet * @{ */ /** * @file IP header definitions * */ #ifndef INET_STD_H_ #define INET_STD_H_ #include <stdint.h> #define IP6_NEXT_FRAGMENT 44 /** IPv4 Datagram header (fixed part) */ typedef struct { /** Version, Internet Header Length */ uint8_t ver_ihl; /* Type of Service */ uint8_t tos; /** Total Length */ uint16_t tot_len; /** Identifier */ uint16_t id; /** Flags, Fragment Offset */ uint16_t flags_foff; /** Time to Live */ uint8_t ttl; /** Protocol */ uint8_t proto; /** Header Checksum */ uint16_t chksum; /** Source Address */ uint32_t src_addr; /** Destination Address */ uint32_t dest_addr; } ip_header_t; /** Bits in ip_header_t.ver_ihl */ enum ver_ihl_bits { /** Version, highest bit */ VI_VERSION_h = 7, /** Version, lowest bit */ VI_VERSION_l = 4, /** Internet Header Length, highest bit */ VI_IHL_h = 3, /** Internet Header Length, lowest bit */ VI_IHL_l = 0 }; /** Bits in ip_header_t.flags_foff */ enum flags_foff_bits { /** Reserved, must be zero */ FF_FLAG_RSVD = 15, /** Don't Fragment */ FF_FLAG_DF = 14, /** More Fragments */ FF_FLAG_MF = 13, /** Fragment Offset, highest bit */ FF_FRAGOFF_h = 12, /** Fragment Offset, lowest bit */ FF_FRAGOFF_l = 0 }; /** Bits in ip6_header_fragment_t.offsmf */ enum flags_offsmt_bits { /** More fragments */ OF_FLAG_M = 0, /** Fragment offset, highest bit */ OF_FRAGOFF_h = 15, /** Fragment offset, lowest bit */ OF_FRAGOFF_l = 3 }; /** IPv6 Datagram header (fixed part) */ typedef struct { /** Version, Traffic class first 4 bits */ uint8_t ver_tc; /** Traffic class (the rest), Flow label */ uint8_t tc_fl[3]; /* Payload length */ uint16_t payload_len; /** Next header */ uint8_t next; /** Hop limit */ uint8_t hop_limit; /** Source address */ uint8_t src_addr[16]; /** Destination address */ uint8_t dest_addr[16]; } ip6_header_t; /** IPv6 Datagram Fragment extension header */ typedef struct { /** Next header */ uint8_t next; /** Reserved */ uint8_t reserved; /** Fragmentation offset, reserved and M flag */ uint16_t offsmf; /** Identifier */ uint32_t id; } ip6_header_fragment_t; /** Fragment offset is expressed in units of 8 bytes */ #define FRAG_OFFS_UNIT 8 #endif /** @} */