1 /** 2 * @file 3 * IPv4 protocol definitions 4 */ 5 6 /* 7 * Copyright (c) 2001-2004 Swedish Institute of Computer Science. 8 * All rights reserved. 9 * 10 * Redistribution and use in source and binary forms, with or without modification, 11 * are permitted provided that the following conditions are met: 12 * 13 * 1. Redistributions of source code must retain the above copyright notice, 14 * this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright notice, 16 * this list of conditions and the following disclaimer in the documentation 17 * and/or other materials provided with the distribution. 18 * 3. The name of the author may not be used to endorse or promote products 19 * derived from this software without specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 22 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 23 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT 24 * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 25 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT 26 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 29 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY 30 * OF SUCH DAMAGE. 31 * 32 * This file is part of the lwIP TCP/IP stack. 33 * 34 * Author: Adam Dunkels <adam@sics.se> 35 * 36 */ 37 #ifndef LWIP_HDR_PROT_IP4_H 38 #define LWIP_HDR_PROT_IP4_H 39 40 #include "lwip/arch.h" 41 #include "lwip/ip4_addr.h" 42 43 #ifdef __cplusplus 44 extern "C" { 45 #endif 46 47 /** This is the packed version of ip4_addr_t, 48 used in network headers that are itself packed */ 49 #ifdef PACK_STRUCT_USE_INCLUDES 50 # include "arch/bpstruct.h" 51 #endif 52 PACK_STRUCT_BEGIN 53 struct ip4_addr_packed { 54 PACK_STRUCT_FIELD(u32_t addr); 55 } PACK_STRUCT_STRUCT; 56 PACK_STRUCT_END 57 #ifdef PACK_STRUCT_USE_INCLUDES 58 # include "arch/epstruct.h" 59 #endif 60 61 typedef struct ip4_addr_packed ip4_addr_p_t; 62 63 /* Size of the IPv4 header. Same as 'sizeof(struct ip_hdr)'. */ 64 #define IP_HLEN 20 65 /* Maximum size of the IPv4 header with options. */ 66 #define IP_HLEN_MAX 60 67 68 #ifdef PACK_STRUCT_USE_INCLUDES 69 # include "arch/bpstruct.h" 70 #endif 71 PACK_STRUCT_BEGIN 72 /* The IPv4 header */ 73 struct ip_hdr { 74 /* version / header length */ 75 PACK_STRUCT_FLD_8(u8_t _v_hl); 76 /* type of service */ 77 PACK_STRUCT_FLD_8(u8_t _tos); 78 /* total length */ 79 PACK_STRUCT_FIELD(u16_t _len); 80 /* identification */ 81 PACK_STRUCT_FIELD(u16_t _id); 82 /* fragment offset field */ 83 PACK_STRUCT_FIELD(u16_t _offset); 84 #ifndef LWIP_SOCKET_STDINCLUDE 85 #define IP_RF 0x8000U /* reserved fragment flag */ 86 #define IP_DF 0x4000U /* don't fragment flag */ 87 #define IP_MF 0x2000U /* more fragments flag */ 88 #define IP_OFFMASK 0x1fffU /* mask for fragmenting bits */ 89 #endif /* LWIP_SOCKET_STDINCLUDE */ 90 /* time to live */ 91 PACK_STRUCT_FLD_8(u8_t _ttl); 92 /* protocol*/ 93 PACK_STRUCT_FLD_8(u8_t _proto); 94 /* checksum */ 95 PACK_STRUCT_FIELD(u16_t _chksum); 96 /* source and destination IP addresses */ 97 PACK_STRUCT_FLD_S(ip4_addr_p_t src); 98 PACK_STRUCT_FLD_S(ip4_addr_p_t dest); 99 } PACK_STRUCT_STRUCT; 100 PACK_STRUCT_END 101 #ifdef PACK_STRUCT_USE_INCLUDES 102 # include "arch/epstruct.h" 103 #endif 104 105 /* Macros to get struct ip_hdr fields: */ 106 #define IPH_V(hdr) ((hdr)->_v_hl >> 4) 107 #define IPH_HL(hdr) ((hdr)->_v_hl & 0x0f) 108 #define IPH_HL_BYTES(hdr) ((u8_t)(IPH_HL(hdr) * 4)) 109 #define IPH_TOS(hdr) ((hdr)->_tos) 110 #define IPH_LEN(hdr) ((hdr)->_len) 111 #define IPH_ID(hdr) ((hdr)->_id) 112 #define IPH_OFFSET(hdr) ((hdr)->_offset) 113 #define IPH_OFFSET_BYTES(hdr) ((u16_t)((lwip_ntohs(IPH_OFFSET(hdr)) & IP_OFFMASK) * 8U)) 114 #define IPH_TTL(hdr) ((hdr)->_ttl) 115 #define IPH_PROTO(hdr) ((hdr)->_proto) 116 #define IPH_CHKSUM(hdr) ((hdr)->_chksum) 117 118 /* Macros to set struct ip_hdr fields: */ 119 #define IPH_VHL_SET(hdr, v, hl) (hdr)->_v_hl = (u8_t)((((v) << 4) | (hl))) 120 #define IPH_TOS_SET(hdr, tos) (hdr)->_tos = (tos) 121 #define IPH_LEN_SET(hdr, len) (hdr)->_len = (len) 122 #define IPH_ID_SET(hdr, id) (hdr)->_id = (id) 123 #define IPH_OFFSET_SET(hdr, off) (hdr)->_offset = (off) 124 #define IPH_TTL_SET(hdr, ttl) (hdr)->_ttl = (u8_t)(ttl) 125 #define IPH_PROTO_SET(hdr, proto) (hdr)->_proto = (u8_t)(proto) 126 #define IPH_CHKSUM_SET(hdr, chksum) (hdr)->_chksum = (chksum) 127 128 129 #ifdef __cplusplus 130 } 131 #endif 132 133 #endif /* LWIP_HDR_PROT_IP4_H */ 134