1 /** 2 * @file 3 * ND6 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_ND6_H 38 #define LWIP_HDR_PROT_ND6_H 39 40 #include "lwip/arch.h" 41 #include "lwip/ip6_addr.h" 42 #include "lwip/prot/ip6.h" 43 44 #ifdef __cplusplus 45 extern "C" { 46 #endif 47 48 /** Neighbor solicitation message header. */ 49 #ifdef PACK_STRUCT_USE_INCLUDES 50 # include "arch/bpstruct.h" 51 #endif 52 PACK_STRUCT_BEGIN 53 struct ns_header { 54 PACK_STRUCT_FLD_8(u8_t type); 55 PACK_STRUCT_FLD_8(u8_t code); 56 PACK_STRUCT_FIELD(u16_t chksum); 57 PACK_STRUCT_FIELD(u32_t reserved); 58 PACK_STRUCT_FLD_S(ip6_addr_p_t target_address); 59 /* Options follow. */ 60 } PACK_STRUCT_STRUCT; 61 PACK_STRUCT_END 62 #ifdef PACK_STRUCT_USE_INCLUDES 63 # include "arch/epstruct.h" 64 #endif 65 66 /** Neighbor advertisement message header. */ 67 #ifdef PACK_STRUCT_USE_INCLUDES 68 # include "arch/bpstruct.h" 69 #endif 70 PACK_STRUCT_BEGIN 71 struct na_header { 72 PACK_STRUCT_FLD_8(u8_t type); 73 PACK_STRUCT_FLD_8(u8_t code); 74 PACK_STRUCT_FIELD(u16_t chksum); 75 PACK_STRUCT_FLD_8(u8_t flags); 76 PACK_STRUCT_FLD_8(u8_t reserved[3]); 77 PACK_STRUCT_FLD_S(ip6_addr_p_t target_address); 78 /* Options follow. */ 79 } PACK_STRUCT_STRUCT; 80 PACK_STRUCT_END 81 #ifdef PACK_STRUCT_USE_INCLUDES 82 # include "arch/epstruct.h" 83 #endif 84 #define ND6_FLAG_ROUTER (0x80) 85 #define ND6_FLAG_SOLICITED (0x40) 86 #define ND6_FLAG_OVERRIDE (0x20) 87 88 /** Router solicitation message header. */ 89 #ifdef PACK_STRUCT_USE_INCLUDES 90 # include "arch/bpstruct.h" 91 #endif 92 PACK_STRUCT_BEGIN 93 struct rs_header { 94 PACK_STRUCT_FLD_8(u8_t type); 95 PACK_STRUCT_FLD_8(u8_t code); 96 PACK_STRUCT_FIELD(u16_t chksum); 97 PACK_STRUCT_FIELD(u32_t reserved); 98 /* Options follow. */ 99 } PACK_STRUCT_STRUCT; 100 PACK_STRUCT_END 101 #ifdef PACK_STRUCT_USE_INCLUDES 102 # include "arch/epstruct.h" 103 #endif 104 105 /** Router advertisement message header. */ 106 #define ND6_RA_FLAG_MANAGED_ADDR_CONFIG (0x80) 107 #define ND6_RA_FLAG_OTHER_CONFIG (0x40) 108 #define ND6_RA_FLAG_HOME_AGENT (0x20) 109 #define ND6_RA_PREFERENCE_MASK (0x18) 110 #define ND6_RA_PREFERENCE_HIGH (0x08) 111 #define ND6_RA_PREFERENCE_MEDIUM (0x00) 112 #define ND6_RA_PREFERENCE_LOW (0x18) 113 #define ND6_RA_PREFERENCE_DISABLED (0x10) 114 #ifdef PACK_STRUCT_USE_INCLUDES 115 # include "arch/bpstruct.h" 116 #endif 117 PACK_STRUCT_BEGIN 118 struct ra_header { 119 PACK_STRUCT_FLD_8(u8_t type); 120 PACK_STRUCT_FLD_8(u8_t code); 121 PACK_STRUCT_FIELD(u16_t chksum); 122 PACK_STRUCT_FLD_8(u8_t current_hop_limit); 123 PACK_STRUCT_FLD_8(u8_t flags); 124 PACK_STRUCT_FIELD(u16_t router_lifetime); 125 PACK_STRUCT_FIELD(u32_t reachable_time); 126 PACK_STRUCT_FIELD(u32_t retrans_timer); 127 /* Options follow. */ 128 } PACK_STRUCT_STRUCT; 129 PACK_STRUCT_END 130 #ifdef PACK_STRUCT_USE_INCLUDES 131 # include "arch/epstruct.h" 132 #endif 133 134 /** Redirect message header. */ 135 #ifdef PACK_STRUCT_USE_INCLUDES 136 # include "arch/bpstruct.h" 137 #endif 138 PACK_STRUCT_BEGIN 139 struct redirect_header { 140 PACK_STRUCT_FLD_8(u8_t type); 141 PACK_STRUCT_FLD_8(u8_t code); 142 PACK_STRUCT_FIELD(u16_t chksum); 143 PACK_STRUCT_FIELD(u32_t reserved); 144 PACK_STRUCT_FLD_S(ip6_addr_p_t target_address); 145 PACK_STRUCT_FLD_S(ip6_addr_p_t destination_address); 146 /* Options follow. */ 147 } PACK_STRUCT_STRUCT; 148 PACK_STRUCT_END 149 #ifdef PACK_STRUCT_USE_INCLUDES 150 # include "arch/epstruct.h" 151 #endif 152 153 /** Link-layer address option. */ 154 #define ND6_OPTION_TYPE_SOURCE_LLADDR (0x01) 155 #define ND6_OPTION_TYPE_TARGET_LLADDR (0x02) 156 #define ND6_LLADDR_OPTION_MIN_LENGTH (2) 157 #ifdef PACK_STRUCT_USE_INCLUDES 158 # include "arch/bpstruct.h" 159 #endif 160 PACK_STRUCT_BEGIN 161 struct lladdr_option { 162 PACK_STRUCT_FLD_8(u8_t type); 163 PACK_STRUCT_FLD_8(u8_t length); 164 PACK_STRUCT_FLD_8(u8_t addr[NETIF_MAX_HWADDR_LEN]); 165 } PACK_STRUCT_STRUCT; 166 PACK_STRUCT_END 167 #ifdef PACK_STRUCT_USE_INCLUDES 168 # include "arch/epstruct.h" 169 #endif 170 171 /** Prefix information option. */ 172 #define ND6_OPTION_TYPE_PREFIX_INFO (0x03) 173 #define ND6_PREFIX_FLAG_ON_LINK (0x80) 174 #define ND6_PREFIX_FLAG_AUTONOMOUS (0x40) 175 #define ND6_PREFIX_FLAG_ROUTER_ADDRESS (0x20) 176 #define ND6_PREFIX_FLAG_SITE_PREFIX (0x10) 177 #ifdef PACK_STRUCT_USE_INCLUDES 178 # include "arch/bpstruct.h" 179 #endif 180 PACK_STRUCT_BEGIN 181 struct prefix_option { 182 PACK_STRUCT_FLD_8(u8_t type); 183 PACK_STRUCT_FLD_8(u8_t length); 184 PACK_STRUCT_FLD_8(u8_t prefix_length); 185 PACK_STRUCT_FLD_8(u8_t flags); 186 PACK_STRUCT_FIELD(u32_t valid_lifetime); 187 PACK_STRUCT_FIELD(u32_t preferred_lifetime); 188 PACK_STRUCT_FLD_8(u8_t reserved2[3]); 189 PACK_STRUCT_FLD_8(u8_t site_prefix_length); 190 PACK_STRUCT_FLD_S(ip6_addr_p_t prefix); 191 } PACK_STRUCT_STRUCT; 192 PACK_STRUCT_END 193 #ifdef PACK_STRUCT_USE_INCLUDES 194 # include "arch/epstruct.h" 195 #endif 196 197 /** Redirected header option. */ 198 #define ND6_OPTION_TYPE_REDIR_HDR (0x04) 199 #ifdef PACK_STRUCT_USE_INCLUDES 200 # include "arch/bpstruct.h" 201 #endif 202 PACK_STRUCT_BEGIN 203 struct redirected_header_option { 204 PACK_STRUCT_FLD_8(u8_t type); 205 PACK_STRUCT_FLD_8(u8_t length); 206 PACK_STRUCT_FLD_8(u8_t reserved[6]); 207 /* Portion of redirected packet follows. */ 208 /* PACK_STRUCT_FLD_8(u8_t redirected[8]); */ 209 } PACK_STRUCT_STRUCT; 210 PACK_STRUCT_END 211 #ifdef PACK_STRUCT_USE_INCLUDES 212 # include "arch/epstruct.h" 213 #endif 214 215 /** MTU option. */ 216 #define ND6_OPTION_TYPE_MTU (0x05) 217 #ifdef PACK_STRUCT_USE_INCLUDES 218 # include "arch/bpstruct.h" 219 #endif 220 PACK_STRUCT_BEGIN 221 struct mtu_option { 222 PACK_STRUCT_FLD_8(u8_t type); 223 PACK_STRUCT_FLD_8(u8_t length); 224 PACK_STRUCT_FIELD(u16_t reserved); 225 PACK_STRUCT_FIELD(u32_t mtu); 226 } PACK_STRUCT_STRUCT; 227 PACK_STRUCT_END 228 #ifdef PACK_STRUCT_USE_INCLUDES 229 # include "arch/epstruct.h" 230 #endif 231 232 /** Route information option. */ 233 #define ND6_OPTION_TYPE_ROUTE_INFO (24) 234 #ifdef PACK_STRUCT_USE_INCLUDES 235 # include "arch/bpstruct.h" 236 #endif 237 PACK_STRUCT_BEGIN 238 struct route_option { 239 PACK_STRUCT_FLD_8(u8_t type); 240 PACK_STRUCT_FLD_8(u8_t length); 241 PACK_STRUCT_FLD_8(u8_t prefix_length); 242 PACK_STRUCT_FLD_8(u8_t preference); 243 PACK_STRUCT_FIELD(u32_t route_lifetime); 244 PACK_STRUCT_FLD_S(ip6_addr_p_t prefix); 245 } PACK_STRUCT_STRUCT; 246 PACK_STRUCT_END 247 #ifdef PACK_STRUCT_USE_INCLUDES 248 # include "arch/epstruct.h" 249 #endif 250 251 /** Recursive DNS Server Option. */ 252 #define ND6_OPTION_TYPE_RDNSS (25) 253 #ifdef PACK_STRUCT_USE_INCLUDES 254 # include "arch/bpstruct.h" 255 #endif 256 PACK_STRUCT_BEGIN 257 struct rdnss_option { 258 PACK_STRUCT_FLD_8(u8_t type); 259 PACK_STRUCT_FLD_8(u8_t length); 260 PACK_STRUCT_FIELD(u16_t reserved); 261 PACK_STRUCT_FIELD(u32_t lifetime); 262 PACK_STRUCT_FLD_S(ip6_addr_p_t rdnss_address[1]); 263 } PACK_STRUCT_STRUCT; 264 PACK_STRUCT_END 265 #ifdef PACK_STRUCT_USE_INCLUDES 266 # include "arch/epstruct.h" 267 #endif 268 269 #define SIZEOF_RDNSS_OPTION_BASE 8 /* size without addresses */ 270 271 #ifdef __cplusplus 272 } 273 #endif 274 275 #endif /* LWIP_HDR_PROT_ND6_H */ 276