Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
features/FEATURE_LWIP/lwip-interface/lwip/src/include/lwip/nd6.h@0:f269e3021894, 2016-10-23 (annotated)
- Committer:
- elessair
- Date:
- Sun Oct 23 15:10:02 2016 +0000
- Revision:
- 0:f269e3021894
Initial commit
Who changed what in which revision?
| User | Revision | Line number | New 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 */ |