Rizky Ardi Maulana / mbed-os
Committer:
elessair
Date:
Sun Oct 23 15:10:02 2016 +0000
Revision:
0:f269e3021894
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
elessair 0:f269e3021894 1 /**
elessair 0:f269e3021894 2 * @file
elessair 0:f269e3021894 3 *
elessair 0:f269e3021894 4 * Neighbor discovery and stateless address autoconfiguration for IPv6.
elessair 0:f269e3021894 5 * Aims to be compliant with RFC 4861 (Neighbor discovery) and RFC 4862
elessair 0:f269e3021894 6 * (Address autoconfiguration).
elessair 0:f269e3021894 7 */
elessair 0:f269e3021894 8
elessair 0:f269e3021894 9 /*
elessair 0:f269e3021894 10 * Copyright (c) 2010 Inico Technologies Ltd.
elessair 0:f269e3021894 11 * All rights reserved.
elessair 0:f269e3021894 12 *
elessair 0:f269e3021894 13 * Redistribution and use in source and binary forms, with or without modification,
elessair 0:f269e3021894 14 * are permitted provided that the following conditions are met:
elessair 0:f269e3021894 15 *
elessair 0:f269e3021894 16 * 1. Redistributions of source code must retain the above copyright notice,
elessair 0:f269e3021894 17 * this list of conditions and the following disclaimer.
elessair 0:f269e3021894 18 * 2. Redistributions in binary form must reproduce the above copyright notice,
elessair 0:f269e3021894 19 * this list of conditions and the following disclaimer in the documentation
elessair 0:f269e3021894 20 * and/or other materials provided with the distribution.
elessair 0:f269e3021894 21 * 3. The name of the author may not be used to endorse or promote products
elessair 0:f269e3021894 22 * derived from this software without specific prior written permission.
elessair 0:f269e3021894 23 *
elessair 0:f269e3021894 24 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
elessair 0:f269e3021894 25 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
elessair 0:f269e3021894 26 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
elessair 0:f269e3021894 27 * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
elessair 0:f269e3021894 28 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
elessair 0:f269e3021894 29 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
elessair 0:f269e3021894 30 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
elessair 0:f269e3021894 31 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
elessair 0:f269e3021894 32 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
elessair 0:f269e3021894 33 * OF SUCH DAMAGE.
elessair 0:f269e3021894 34 *
elessair 0:f269e3021894 35 * This file is part of the lwIP TCP/IP stack.
elessair 0:f269e3021894 36 *
elessair 0:f269e3021894 37 * Author: Ivan Delamer <delamer@inicotech.com>
elessair 0:f269e3021894 38 *
elessair 0:f269e3021894 39 *
elessair 0:f269e3021894 40 * Please coordinate changes and requests with Ivan Delamer
elessair 0:f269e3021894 41 * <delamer@inicotech.com>
elessair 0:f269e3021894 42 */
elessair 0:f269e3021894 43
elessair 0:f269e3021894 44 #ifndef LWIP_HDR_ND6_H
elessair 0:f269e3021894 45 #define LWIP_HDR_ND6_H
elessair 0:f269e3021894 46
elessair 0:f269e3021894 47 #include "lwip/opt.h"
elessair 0:f269e3021894 48
elessair 0:f269e3021894 49 #if LWIP_IPV6 /* don't build if not configured for use in lwipopts.h */
elessair 0:f269e3021894 50
elessair 0:f269e3021894 51 #include "lwip/pbuf.h"
elessair 0:f269e3021894 52 #include "lwip/ip6.h"
elessair 0:f269e3021894 53 #include "lwip/ip6_addr.h"
elessair 0:f269e3021894 54 #include "lwip/netif.h"
elessair 0:f269e3021894 55
elessair 0:f269e3021894 56
elessair 0:f269e3021894 57 #ifdef __cplusplus
elessair 0:f269e3021894 58 extern "C" {
elessair 0:f269e3021894 59 #endif
elessair 0:f269e3021894 60
elessair 0:f269e3021894 61 /** Struct for tables. */
elessair 0:f269e3021894 62 struct nd6_neighbor_cache_entry {
elessair 0:f269e3021894 63 ip6_addr_t next_hop_address;
elessair 0:f269e3021894 64 struct netif * netif;
elessair 0:f269e3021894 65 u8_t lladdr[NETIF_MAX_HWADDR_LEN];
elessair 0:f269e3021894 66 /*u32_t pmtu;*/
elessair 0:f269e3021894 67 #if LWIP_ND6_QUEUEING
elessair 0:f269e3021894 68 /** Pointer to queue of pending outgoing packets on this entry. */
elessair 0:f269e3021894 69 struct nd6_q_entry *q;
elessair 0:f269e3021894 70 #else /* LWIP_ND6_QUEUEING */
elessair 0:f269e3021894 71 /** Pointer to a single pending outgoing packet on this entry. */
elessair 0:f269e3021894 72 struct pbuf *q;
elessair 0:f269e3021894 73 #endif /* LWIP_ND6_QUEUEING */
elessair 0:f269e3021894 74 u8_t state;
elessair 0:f269e3021894 75 u8_t isrouter;
elessair 0:f269e3021894 76 union {
elessair 0:f269e3021894 77 u32_t reachable_time;
elessair 0:f269e3021894 78 u32_t delay_time;
elessair 0:f269e3021894 79 u32_t probes_sent;
elessair 0:f269e3021894 80 u32_t stale_time;
elessair 0:f269e3021894 81 } counter;
elessair 0:f269e3021894 82 };
elessair 0:f269e3021894 83
elessair 0:f269e3021894 84 struct nd6_destination_cache_entry {
elessair 0:f269e3021894 85 ip6_addr_t destination_addr;
elessair 0:f269e3021894 86 ip6_addr_t next_hop_addr;
elessair 0:f269e3021894 87 u16_t pmtu;
elessair 0:f269e3021894 88 u32_t age;
elessair 0:f269e3021894 89 };
elessair 0:f269e3021894 90
elessair 0:f269e3021894 91 struct nd6_prefix_list_entry {
elessair 0:f269e3021894 92 ip6_addr_t prefix;
elessair 0:f269e3021894 93 struct netif * netif;
elessair 0:f269e3021894 94 u32_t invalidation_timer;
elessair 0:f269e3021894 95 #if LWIP_IPV6_AUTOCONFIG
elessair 0:f269e3021894 96 u8_t flags;
elessair 0:f269e3021894 97 #define ND6_PREFIX_AUTOCONFIG_AUTONOMOUS 0x01
elessair 0:f269e3021894 98 #define ND6_PREFIX_AUTOCONFIG_ADDRESS_GENERATED 0x02
elessair 0:f269e3021894 99 #define ND6_PREFIX_AUTOCONFIG_ADDRESS_DUPLICATE 0x04
elessair 0:f269e3021894 100 #endif /* LWIP_IPV6_AUTOCONFIG */
elessair 0:f269e3021894 101 };
elessair 0:f269e3021894 102
elessair 0:f269e3021894 103 struct nd6_router_list_entry {
elessair 0:f269e3021894 104 struct nd6_neighbor_cache_entry * neighbor_entry;
elessair 0:f269e3021894 105 u32_t invalidation_timer;
elessair 0:f269e3021894 106 u8_t flags;
elessair 0:f269e3021894 107 };
elessair 0:f269e3021894 108
elessair 0:f269e3021894 109
elessair 0:f269e3021894 110 enum nd6_neighbor_cache_entry_state {
elessair 0:f269e3021894 111 ND6_NO_ENTRY = 0,
elessair 0:f269e3021894 112 ND6_INCOMPLETE,
elessair 0:f269e3021894 113 ND6_REACHABLE,
elessair 0:f269e3021894 114 ND6_STALE,
elessair 0:f269e3021894 115 ND6_DELAY,
elessair 0:f269e3021894 116 ND6_PROBE
elessair 0:f269e3021894 117 };
elessair 0:f269e3021894 118
elessair 0:f269e3021894 119 #if LWIP_ND6_QUEUEING
elessair 0:f269e3021894 120 /** struct for queueing outgoing packets for unknown address
elessair 0:f269e3021894 121 * defined here to be accessed by memp.h
elessair 0:f269e3021894 122 */
elessair 0:f269e3021894 123 struct nd6_q_entry {
elessair 0:f269e3021894 124 struct nd6_q_entry *next;
elessair 0:f269e3021894 125 struct pbuf *p;
elessair 0:f269e3021894 126 };
elessair 0:f269e3021894 127 #endif /* LWIP_ND6_QUEUEING */
elessair 0:f269e3021894 128
elessair 0:f269e3021894 129 /** Neighbor solicitation message header. */
elessair 0:f269e3021894 130 #ifdef PACK_STRUCT_USE_INCLUDES
elessair 0:f269e3021894 131 # include "arch/bpstruct.h"
elessair 0:f269e3021894 132 #endif
elessair 0:f269e3021894 133 PACK_STRUCT_BEGIN
elessair 0:f269e3021894 134 struct ns_header {
elessair 0:f269e3021894 135 PACK_STRUCT_FLD_8(u8_t type);
elessair 0:f269e3021894 136 PACK_STRUCT_FLD_8(u8_t code);
elessair 0:f269e3021894 137 PACK_STRUCT_FIELD(u16_t chksum);
elessair 0:f269e3021894 138 PACK_STRUCT_FIELD(u32_t reserved);
elessair 0:f269e3021894 139 PACK_STRUCT_FLD_S(ip6_addr_p_t target_address);
elessair 0:f269e3021894 140 /* Options follow. */
elessair 0:f269e3021894 141 } PACK_STRUCT_STRUCT;
elessair 0:f269e3021894 142 PACK_STRUCT_END
elessair 0:f269e3021894 143 #ifdef PACK_STRUCT_USE_INCLUDES
elessair 0:f269e3021894 144 # include "arch/epstruct.h"
elessair 0:f269e3021894 145 #endif
elessair 0:f269e3021894 146
elessair 0:f269e3021894 147 /** Neighbor advertisement message header. */
elessair 0:f269e3021894 148 #ifdef PACK_STRUCT_USE_INCLUDES
elessair 0:f269e3021894 149 # include "arch/bpstruct.h"
elessair 0:f269e3021894 150 #endif
elessair 0:f269e3021894 151 PACK_STRUCT_BEGIN
elessair 0:f269e3021894 152 struct na_header {
elessair 0:f269e3021894 153 PACK_STRUCT_FLD_8(u8_t type);
elessair 0:f269e3021894 154 PACK_STRUCT_FLD_8(u8_t code);
elessair 0:f269e3021894 155 PACK_STRUCT_FIELD(u16_t chksum);
elessair 0:f269e3021894 156 PACK_STRUCT_FLD_8(u8_t flags);
elessair 0:f269e3021894 157 PACK_STRUCT_FLD_8(u8_t reserved[3]);
elessair 0:f269e3021894 158 PACK_STRUCT_FLD_S(ip6_addr_p_t target_address);
elessair 0:f269e3021894 159 /* Options follow. */
elessair 0:f269e3021894 160 } PACK_STRUCT_STRUCT;
elessair 0:f269e3021894 161 PACK_STRUCT_END
elessair 0:f269e3021894 162 #ifdef PACK_STRUCT_USE_INCLUDES
elessair 0:f269e3021894 163 # include "arch/epstruct.h"
elessair 0:f269e3021894 164 #endif
elessair 0:f269e3021894 165 #define ND6_FLAG_ROUTER (0x80)
elessair 0:f269e3021894 166 #define ND6_FLAG_SOLICITED (0x40)
elessair 0:f269e3021894 167 #define ND6_FLAG_OVERRIDE (0x20)
elessair 0:f269e3021894 168
elessair 0:f269e3021894 169 /** Router solicitation message header. */
elessair 0:f269e3021894 170 #ifdef PACK_STRUCT_USE_INCLUDES
elessair 0:f269e3021894 171 # include "arch/bpstruct.h"
elessair 0:f269e3021894 172 #endif
elessair 0:f269e3021894 173 PACK_STRUCT_BEGIN
elessair 0:f269e3021894 174 struct rs_header {
elessair 0:f269e3021894 175 PACK_STRUCT_FLD_8(u8_t type);
elessair 0:f269e3021894 176 PACK_STRUCT_FLD_8(u8_t code);
elessair 0:f269e3021894 177 PACK_STRUCT_FIELD(u16_t chksum);
elessair 0:f269e3021894 178 PACK_STRUCT_FIELD(u32_t reserved);
elessair 0:f269e3021894 179 /* Options follow. */
elessair 0:f269e3021894 180 } PACK_STRUCT_STRUCT;
elessair 0:f269e3021894 181 PACK_STRUCT_END
elessair 0:f269e3021894 182 #ifdef PACK_STRUCT_USE_INCLUDES
elessair 0:f269e3021894 183 # include "arch/epstruct.h"
elessair 0:f269e3021894 184 #endif
elessair 0:f269e3021894 185
elessair 0:f269e3021894 186 /** Router advertisement message header. */
elessair 0:f269e3021894 187 #define ND6_RA_FLAG_MANAGED_ADDR_CONFIG (0x80)
elessair 0:f269e3021894 188 #define ND6_RA_FLAG_OTHER_CONFIG (0x40)
elessair 0:f269e3021894 189 #define ND6_RA_FLAG_HOME_AGENT (0x20)
elessair 0:f269e3021894 190 #define ND6_RA_PREFERENCE_MASK (0x18)
elessair 0:f269e3021894 191 #define ND6_RA_PREFERENCE_HIGH (0x08)
elessair 0:f269e3021894 192 #define ND6_RA_PREFERENCE_MEDIUM (0x00)
elessair 0:f269e3021894 193 #define ND6_RA_PREFERENCE_LOW (0x18)
elessair 0:f269e3021894 194 #define ND6_RA_PREFERENCE_DISABLED (0x10)
elessair 0:f269e3021894 195 #ifdef PACK_STRUCT_USE_INCLUDES
elessair 0:f269e3021894 196 # include "arch/bpstruct.h"
elessair 0:f269e3021894 197 #endif
elessair 0:f269e3021894 198 PACK_STRUCT_BEGIN
elessair 0:f269e3021894 199 struct ra_header {
elessair 0:f269e3021894 200 PACK_STRUCT_FLD_8(u8_t type);
elessair 0:f269e3021894 201 PACK_STRUCT_FLD_8(u8_t code);
elessair 0:f269e3021894 202 PACK_STRUCT_FIELD(u16_t chksum);
elessair 0:f269e3021894 203 PACK_STRUCT_FLD_8(u8_t current_hop_limit);
elessair 0:f269e3021894 204 PACK_STRUCT_FLD_8(u8_t flags);
elessair 0:f269e3021894 205 PACK_STRUCT_FIELD(u16_t router_lifetime);
elessair 0:f269e3021894 206 PACK_STRUCT_FIELD(u32_t reachable_time);
elessair 0:f269e3021894 207 PACK_STRUCT_FIELD(u32_t retrans_timer);
elessair 0:f269e3021894 208 /* Options follow. */
elessair 0:f269e3021894 209 } PACK_STRUCT_STRUCT;
elessair 0:f269e3021894 210 PACK_STRUCT_END
elessair 0:f269e3021894 211 #ifdef PACK_STRUCT_USE_INCLUDES
elessair 0:f269e3021894 212 # include "arch/epstruct.h"
elessair 0:f269e3021894 213 #endif
elessair 0:f269e3021894 214
elessair 0:f269e3021894 215 /** Redirect message header. */
elessair 0:f269e3021894 216 #ifdef PACK_STRUCT_USE_INCLUDES
elessair 0:f269e3021894 217 # include "arch/bpstruct.h"
elessair 0:f269e3021894 218 #endif
elessair 0:f269e3021894 219 PACK_STRUCT_BEGIN
elessair 0:f269e3021894 220 struct redirect_header {
elessair 0:f269e3021894 221 PACK_STRUCT_FLD_8(u8_t type);
elessair 0:f269e3021894 222 PACK_STRUCT_FLD_8(u8_t code);
elessair 0:f269e3021894 223 PACK_STRUCT_FIELD(u16_t chksum);
elessair 0:f269e3021894 224 PACK_STRUCT_FIELD(u32_t reserved);
elessair 0:f269e3021894 225 PACK_STRUCT_FLD_S(ip6_addr_p_t target_address);
elessair 0:f269e3021894 226 PACK_STRUCT_FLD_S(ip6_addr_p_t destination_address);
elessair 0:f269e3021894 227 /* Options follow. */
elessair 0:f269e3021894 228 } PACK_STRUCT_STRUCT;
elessair 0:f269e3021894 229 PACK_STRUCT_END
elessair 0:f269e3021894 230 #ifdef PACK_STRUCT_USE_INCLUDES
elessair 0:f269e3021894 231 # include "arch/epstruct.h"
elessair 0:f269e3021894 232 #endif
elessair 0:f269e3021894 233
elessair 0:f269e3021894 234 /** Link-layer address option. */
elessair 0:f269e3021894 235 #define ND6_OPTION_TYPE_SOURCE_LLADDR (0x01)
elessair 0:f269e3021894 236 #define ND6_OPTION_TYPE_TARGET_LLADDR (0x02)
elessair 0:f269e3021894 237 #ifdef PACK_STRUCT_USE_INCLUDES
elessair 0:f269e3021894 238 # include "arch/bpstruct.h"
elessair 0:f269e3021894 239 #endif
elessair 0:f269e3021894 240 PACK_STRUCT_BEGIN
elessair 0:f269e3021894 241 struct lladdr_option {
elessair 0:f269e3021894 242 PACK_STRUCT_FLD_8(u8_t type);
elessair 0:f269e3021894 243 PACK_STRUCT_FLD_8(u8_t length);
elessair 0:f269e3021894 244 PACK_STRUCT_FLD_8(u8_t addr[NETIF_MAX_HWADDR_LEN]);
elessair 0:f269e3021894 245 } PACK_STRUCT_STRUCT;
elessair 0:f269e3021894 246 PACK_STRUCT_END
elessair 0:f269e3021894 247 #ifdef PACK_STRUCT_USE_INCLUDES
elessair 0:f269e3021894 248 # include "arch/epstruct.h"
elessair 0:f269e3021894 249 #endif
elessair 0:f269e3021894 250
elessair 0:f269e3021894 251 /** Prefix information option. */
elessair 0:f269e3021894 252 #define ND6_OPTION_TYPE_PREFIX_INFO (0x03)
elessair 0:f269e3021894 253 #define ND6_PREFIX_FLAG_ON_LINK (0x80)
elessair 0:f269e3021894 254 #define ND6_PREFIX_FLAG_AUTONOMOUS (0x40)
elessair 0:f269e3021894 255 #define ND6_PREFIX_FLAG_ROUTER_ADDRESS (0x20)
elessair 0:f269e3021894 256 #define ND6_PREFIX_FLAG_SITE_PREFIX (0x10)
elessair 0:f269e3021894 257 #ifdef PACK_STRUCT_USE_INCLUDES
elessair 0:f269e3021894 258 # include "arch/bpstruct.h"
elessair 0:f269e3021894 259 #endif
elessair 0:f269e3021894 260 PACK_STRUCT_BEGIN
elessair 0:f269e3021894 261 struct prefix_option {
elessair 0:f269e3021894 262 PACK_STRUCT_FLD_8(u8_t type);
elessair 0:f269e3021894 263 PACK_STRUCT_FLD_8(u8_t length);
elessair 0:f269e3021894 264 PACK_STRUCT_FLD_8(u8_t prefix_length);
elessair 0:f269e3021894 265 PACK_STRUCT_FLD_8(u8_t flags);
elessair 0:f269e3021894 266 PACK_STRUCT_FIELD(u32_t valid_lifetime);
elessair 0:f269e3021894 267 PACK_STRUCT_FIELD(u32_t preferred_lifetime);
elessair 0:f269e3021894 268 PACK_STRUCT_FLD_8(u8_t reserved2[3]);
elessair 0:f269e3021894 269 PACK_STRUCT_FLD_8(u8_t site_prefix_length);
elessair 0:f269e3021894 270 PACK_STRUCT_FLD_S(ip6_addr_p_t prefix);
elessair 0:f269e3021894 271 } PACK_STRUCT_STRUCT;
elessair 0:f269e3021894 272 PACK_STRUCT_END
elessair 0:f269e3021894 273 #ifdef PACK_STRUCT_USE_INCLUDES
elessair 0:f269e3021894 274 # include "arch/epstruct.h"
elessair 0:f269e3021894 275 #endif
elessair 0:f269e3021894 276
elessair 0:f269e3021894 277 /** Redirected header option. */
elessair 0:f269e3021894 278 #define ND6_OPTION_TYPE_REDIR_HDR (0x04)
elessair 0:f269e3021894 279 #ifdef PACK_STRUCT_USE_INCLUDES
elessair 0:f269e3021894 280 # include "arch/bpstruct.h"
elessair 0:f269e3021894 281 #endif
elessair 0:f269e3021894 282 PACK_STRUCT_BEGIN
elessair 0:f269e3021894 283 struct redirected_header_option {
elessair 0:f269e3021894 284 PACK_STRUCT_FLD_8(u8_t type);
elessair 0:f269e3021894 285 PACK_STRUCT_FLD_8(u8_t length);
elessair 0:f269e3021894 286 PACK_STRUCT_FLD_8(u8_t reserved[6]);
elessair 0:f269e3021894 287 /* Portion of redirected packet follows. */
elessair 0:f269e3021894 288 /* PACK_STRUCT_FLD_8(u8_t redirected[8]); */
elessair 0:f269e3021894 289 } PACK_STRUCT_STRUCT;
elessair 0:f269e3021894 290 PACK_STRUCT_END
elessair 0:f269e3021894 291 #ifdef PACK_STRUCT_USE_INCLUDES
elessair 0:f269e3021894 292 # include "arch/epstruct.h"
elessair 0:f269e3021894 293 #endif
elessair 0:f269e3021894 294
elessair 0:f269e3021894 295 /** MTU option. */
elessair 0:f269e3021894 296 #define ND6_OPTION_TYPE_MTU (0x05)
elessair 0:f269e3021894 297 #ifdef PACK_STRUCT_USE_INCLUDES
elessair 0:f269e3021894 298 # include "arch/bpstruct.h"
elessair 0:f269e3021894 299 #endif
elessair 0:f269e3021894 300 PACK_STRUCT_BEGIN
elessair 0:f269e3021894 301 struct mtu_option {
elessair 0:f269e3021894 302 PACK_STRUCT_FLD_8(u8_t type);
elessair 0:f269e3021894 303 PACK_STRUCT_FLD_8(u8_t length);
elessair 0:f269e3021894 304 PACK_STRUCT_FIELD(u16_t reserved);
elessair 0:f269e3021894 305 PACK_STRUCT_FIELD(u32_t mtu);
elessair 0:f269e3021894 306 } PACK_STRUCT_STRUCT;
elessair 0:f269e3021894 307 PACK_STRUCT_END
elessair 0:f269e3021894 308 #ifdef PACK_STRUCT_USE_INCLUDES
elessair 0:f269e3021894 309 # include "arch/epstruct.h"
elessair 0:f269e3021894 310 #endif
elessair 0:f269e3021894 311
elessair 0:f269e3021894 312 /** Route information option. */
elessair 0:f269e3021894 313 #define ND6_OPTION_TYPE_ROUTE_INFO (24)
elessair 0:f269e3021894 314 #ifdef PACK_STRUCT_USE_INCLUDES
elessair 0:f269e3021894 315 # include "arch/bpstruct.h"
elessair 0:f269e3021894 316 #endif
elessair 0:f269e3021894 317 PACK_STRUCT_BEGIN
elessair 0:f269e3021894 318 struct route_option {
elessair 0:f269e3021894 319 PACK_STRUCT_FLD_8(u8_t type);
elessair 0:f269e3021894 320 PACK_STRUCT_FLD_8(u8_t length);
elessair 0:f269e3021894 321 PACK_STRUCT_FLD_8(u8_t prefix_length);
elessair 0:f269e3021894 322 PACK_STRUCT_FLD_8(u8_t preference);
elessair 0:f269e3021894 323 PACK_STRUCT_FIELD(u32_t route_lifetime);
elessair 0:f269e3021894 324 PACK_STRUCT_FLD_S(ip6_addr_p_t prefix);
elessair 0:f269e3021894 325 } PACK_STRUCT_STRUCT;
elessair 0:f269e3021894 326 PACK_STRUCT_END
elessair 0:f269e3021894 327 #ifdef PACK_STRUCT_USE_INCLUDES
elessair 0:f269e3021894 328 # include "arch/epstruct.h"
elessair 0:f269e3021894 329 #endif
elessair 0:f269e3021894 330
elessair 0:f269e3021894 331 /** 1 second period */
elessair 0:f269e3021894 332 #define ND6_TMR_INTERVAL 1000
elessair 0:f269e3021894 333
elessair 0:f269e3021894 334 /* Router tables. */
elessair 0:f269e3021894 335 /* @todo make these static? and entries accessible through API? */
elessair 0:f269e3021894 336 extern struct nd6_neighbor_cache_entry neighbor_cache[];
elessair 0:f269e3021894 337 extern struct nd6_destination_cache_entry destination_cache[];
elessair 0:f269e3021894 338 extern struct nd6_prefix_list_entry prefix_list[];
elessair 0:f269e3021894 339 extern struct nd6_router_list_entry default_router_list[];
elessair 0:f269e3021894 340
elessair 0:f269e3021894 341 /* Default values, can be updated by a RA message. */
elessair 0:f269e3021894 342 extern u32_t reachable_time;
elessair 0:f269e3021894 343 extern u32_t retrans_timer;
elessair 0:f269e3021894 344
elessair 0:f269e3021894 345 void nd6_tmr(void);
elessair 0:f269e3021894 346 void nd6_input(struct pbuf *p, struct netif *inp);
elessair 0:f269e3021894 347 s8_t nd6_get_next_hop_entry(const ip6_addr_t * ip6addr, struct netif * netif);
elessair 0:f269e3021894 348 s8_t nd6_select_router(const ip6_addr_t * ip6addr, struct netif * netif);
elessair 0:f269e3021894 349 u16_t nd6_get_destination_mtu(const ip6_addr_t * ip6addr, struct netif * netif);
elessair 0:f269e3021894 350 err_t nd6_queue_packet(s8_t neighbor_index, struct pbuf * p);
elessair 0:f269e3021894 351 #if LWIP_ND6_TCP_REACHABILITY_HINTS
elessair 0:f269e3021894 352 void nd6_reachability_hint(const ip6_addr_t * ip6addr);
elessair 0:f269e3021894 353 #endif /* LWIP_ND6_TCP_REACHABILITY_HINTS */
elessair 0:f269e3021894 354 void nd6_cleanup_netif(struct netif * netif);
elessair 0:f269e3021894 355
elessair 0:f269e3021894 356 #ifdef __cplusplus
elessair 0:f269e3021894 357 }
elessair 0:f269e3021894 358 #endif
elessair 0:f269e3021894 359
elessair 0:f269e3021894 360 #endif /* LWIP_IPV6 */
elessair 0:f269e3021894 361
elessair 0:f269e3021894 362 #endif /* LWIP_HDR_ND6_H */