Contiki 2.6

uip-nd6.h

Go to the documentation of this file.
00001 /**
00002  * \addtogroup uip6
00003  * @{
00004  */
00005 
00006 /**
00007  * \file
00008  *         Neighbor discovery (RFC 4861)
00009  * \author Julien Abeille <jabeille@cisco.com>
00010  * \author Mathilde Durvy <mdurvy@cisco.com>
00011  */
00012 
00013 /*
00014  * Copyright (c) 2006, Swedish Institute of Computer Science.
00015  * All rights reserved.
00016  *
00017  * Redistribution and use in source and binary forms, with or without
00018  * modification, are permitted provided that the following conditions
00019  * are met:
00020  * 1. Redistributions of source code must retain the above copyright
00021  *    notice, this list of conditions and the following disclaimer.
00022  * 2. Redistributions in binary form must reproduce the above copyright
00023  *    notice, this list of conditions and the following disclaimer in the
00024  *    documentation and/or other materials provided with the distribution.
00025  * 3. Neither the name of the Institute nor the names of its contributors
00026  *    may be used to endorse or promote products derived from this software
00027  *    without specific prior written permission.
00028  *
00029  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
00030  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00031  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00032  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
00033  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
00034  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
00035  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
00036  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
00037  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
00038  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
00039  * SUCH DAMAGE.
00040  *
00041  * This file is part of the Contiki operating system.
00042  *
00043  */
00044 
00045 #ifndef __UIP_ND6_H__
00046 #define __UIP_ND6_H__
00047 
00048 #include "net/uip.h"
00049 #include "sys/stimer.h"
00050 /**
00051  *  \name General
00052  * @{
00053  */
00054 /** \brief HOP LIMIT to be used when sending ND messages (255) */
00055 #define UIP_ND6_HOP_LIMIT               255
00056 /** \brief INFINITE lifetime */
00057 #define UIP_ND6_INFINITE_LIFETIME       0xFFFFFFFF
00058 /** @} */
00059 
00060 #ifndef UIP_CONF_ND6_DEF_MAXDADNS
00061 /** \brief Do not try DAD when using EUI-64 as allowed by draft-ietf-6lowpan-nd-15 section 8.2 */
00062 #if UIP_CONF_LL_802154
00063 #define UIP_ND6_DEF_MAXDADNS 0
00064 #else /* UIP_CONF_LL_802154 */
00065 #define UIP_ND6_DEF_MAXDADNS 1
00066 #endif /* UIP_CONF_LL_802154 */
00067 #else /* UIP_CONF_ND6_DEF_MAXDADNS */
00068 #define UIP_ND6_DEF_MAXDADNS UIP_CONF_ND6_DEF_MAXDADNS
00069 #endif /* UIP_CONF_ND6_DEF_MAXDADNS */
00070 
00071 /** \name RFC 4861 Host constant */
00072 /** @{ */
00073 #define UIP_ND6_MAX_RTR_SOLICITATION_DELAY 1
00074 #define UIP_ND6_RTR_SOLICITATION_INTERVAL  4
00075 #define UIP_ND6_MAX_RTR_SOLICITATIONS      3
00076 /** @} */
00077 
00078 /** \name RFC 4861 Router constants */
00079 /** @{ */
00080 #ifndef UIP_CONF_ND6_SEND_RA
00081 #define UIP_ND6_SEND_RA                     1   /* enable/disable RA sending */
00082 #else
00083 #define UIP_ND6_SEND_RA UIP_CONF_ND6_SEND_RA
00084 #endif
00085 #define UIP_ND6_MAX_RA_INTERVAL             600
00086 #define UIP_ND6_MIN_RA_INTERVAL             (UIP_ND6_MAX_RA_INTERVAL / 3)
00087 #define UIP_ND6_M_FLAG                      0
00088 #define UIP_ND6_O_FLAG                      0
00089 #define UIP_ND6_ROUTER_LIFETIME             3 * UIP_ND6_MAX_RA_INTERVAL
00090 
00091 #define UIP_ND6_MAX_INITIAL_RA_INTERVAL     16  /*seconds*/
00092 #define UIP_ND6_MAX_INITIAL_RAS             3   /*transmissions*/
00093 #define UIP_ND6_MIN_DELAY_BETWEEN_RAS       3   /*seconds*/
00094 //#define UIP_ND6_MAX_RA_DELAY_TIME           0.5 /*seconds*/
00095 #define UIP_ND6_MAX_RA_DELAY_TIME_MS        500 /*milli seconds*/
00096 /** @} */
00097 
00098 
00099 /** \name RFC 4861 Node constant */
00100 #define UIP_ND6_MAX_MULTICAST_SOLICIT  3
00101 #define UIP_ND6_MAX_UNICAST_SOLICIT    3
00102 #ifdef UIP_CONF_ND6_REACHABLE_TIME
00103 #define UIP_ND6_REACHABLE_TIME         UIP_CONF_ND6_REACHABLE_TIME
00104 #else
00105 #define UIP_ND6_REACHABLE_TIME         30000
00106 #endif
00107 #ifdef UIP_CONF_ND6_RETRANS_TIMER
00108 #define UIP_ND6_RETRANS_TIMER          UIP_CONF_ND6_RETRANS_TIMER
00109 #else
00110 #define UIP_ND6_RETRANS_TIMER          1000
00111 #endif
00112 #define UIP_ND6_DELAY_FIRST_PROBE_TIME 5
00113 #define UIP_ND6_MIN_RANDOM_FACTOR(x)   (x / 2)
00114 #define UIP_ND6_MAX_RANDOM_FACTOR(x)   ((x) + (x) / 2)
00115 /** @} */
00116 
00117 
00118 /** \name ND6 option types */
00119 /** @{ */
00120 #define UIP_ND6_OPT_SLLAO               1
00121 #define UIP_ND6_OPT_TLLAO               2
00122 #define UIP_ND6_OPT_PREFIX_INFO         3
00123 #define UIP_ND6_OPT_REDIRECTED_HDR      4
00124 #define UIP_ND6_OPT_MTU                 5
00125 /** @} */
00126 
00127 /** \name ND6 option types */
00128 /** @{ */
00129 #define UIP_ND6_OPT_TYPE_OFFSET         0
00130 #define UIP_ND6_OPT_LEN_OFFSET          1
00131 #define UIP_ND6_OPT_DATA_OFFSET         2
00132 
00133 /** \name ND6 message length (excluding options) */
00134 /** @{ */
00135 #define UIP_ND6_NA_LEN                  20
00136 #define UIP_ND6_NS_LEN                  20
00137 #define UIP_ND6_RA_LEN                  12
00138 #define UIP_ND6_RS_LEN                  4
00139 /** @} */
00140 
00141 
00142 /** \name ND6 option length in bytes */
00143 /** @{ */
00144 #define UIP_ND6_OPT_HDR_LEN            2
00145 #define UIP_ND6_OPT_PREFIX_INFO_LEN    32
00146 #define UIP_ND6_OPT_MTU_LEN            8
00147 
00148 
00149 /* Length of TLLAO and SLLAO options, it is L2 dependant */
00150 #if UIP_CONF_LL_802154
00151 /* If the interface is 802.15.4. For now we use only long addresses */
00152 #define UIP_ND6_OPT_SHORT_LLAO_LEN     8
00153 #define UIP_ND6_OPT_LONG_LLAO_LEN      16
00154 /** \brief length of a ND6 LLAO option for 802.15.4 */
00155 #define UIP_ND6_OPT_LLAO_LEN UIP_ND6_OPT_LONG_LLAO_LEN
00156 #else /*UIP_CONF_LL_802154*/
00157 #if UIP_CONF_LL_80211
00158 /* If the interface is 802.11 */
00159 /** \brief length of a ND6 LLAO option for 802.11 */
00160 #define UIP_ND6_OPT_LLAO_LEN           8
00161 #else /*UIP_CONF_LL_80211*/
00162 /** \brief length of a ND6 LLAO option for default L2 type (e.g. Ethernet) */
00163 #define UIP_ND6_OPT_LLAO_LEN           8
00164 #endif /*UIP_CONF_LL_80211*/
00165 #endif /*UIP_CONF_LL_802154*/
00166 /** @} */
00167 
00168 
00169 /** \name Neighbor Advertisement flags masks */
00170 /** @{ */
00171 #define UIP_ND6_NA_FLAG_ROUTER          0x80
00172 #define UIP_ND6_NA_FLAG_SOLICITED       0x40
00173 #define UIP_ND6_NA_FLAG_OVERRIDE        0x20
00174 #define UIP_ND6_RA_FLAG_ONLINK          0x80
00175 #define UIP_ND6_RA_FLAG_AUTONOMOUS      0x40
00176 /** @} */
00177 
00178 /**
00179  * \name ND message structures
00180  * @{
00181  */
00182 
00183 /**
00184  * \brief A neighbor solicitation constant part
00185  *
00186  * Possible option is: SLLAO
00187  */
00188 typedef struct uip_nd6_ns {
00189   uint32_t reserved;
00190   uip_ipaddr_t tgtipaddr;
00191 } uip_nd6_ns;
00192 
00193 /**
00194  * \brief A neighbor advertisement constant part.
00195  *
00196  * Possible option is: TLLAO
00197  */
00198 typedef struct uip_nd6_na {
00199   uint8_t flagsreserved;
00200   uint8_t reserved[3];
00201   uip_ipaddr_t tgtipaddr;
00202 } uip_nd6_na;
00203 
00204 /**
00205  * \brief A router solicitation  constant part
00206  *
00207  * Possible option is: SLLAO
00208  */
00209 typedef struct uip_nd6_rs {
00210   uint32_t reserved;
00211 } uip_nd6_rs;
00212 
00213 /**
00214  * \brief A router advertisement constant part
00215  *
00216  * Possible options are: SLLAO, MTU, Prefix Information
00217  */
00218 typedef struct uip_nd6_ra {
00219   uint8_t cur_ttl;
00220   uint8_t flags_reserved;
00221   uint16_t router_lifetime;
00222   uint32_t reachable_time;
00223   uint32_t retrans_timer;
00224 } uip_nd6_ra;
00225 
00226 /**
00227  * \brief A redirect message constant part
00228  *
00229  * Possible options are: TLLAO, redirected header
00230  */
00231 typedef struct uip_nd6_redirect {
00232   uint32_t reserved;
00233   uip_ipaddr_t tgtipaddress;
00234   uip_ipaddr_t destipaddress;
00235 } uip_nd6_redirect;
00236 /** @} */
00237 
00238 /**
00239  * \name ND Option structures
00240  * @{
00241  */
00242 
00243 /** \brief ND option header */
00244 typedef struct uip_nd6_opt_hdr {
00245   uint8_t type;
00246   uint8_t len;
00247 } uip_nd6_opt_hdr;
00248 
00249 /** \brief ND option prefix information */
00250 typedef struct uip_nd6_opt_prefix_info {
00251   uint8_t type;
00252   uint8_t len;
00253   uint8_t preflen;
00254   uint8_t flagsreserved1;
00255   uint32_t validlt;
00256   uint32_t preferredlt;
00257   uint32_t reserved2;
00258   uip_ipaddr_t prefix;
00259 } uip_nd6_opt_prefix_info ;
00260 
00261 /** \brief ND option MTU */
00262 typedef struct uip_nd6_opt_mtu {
00263   uint8_t type;
00264   uint8_t len;
00265   uint16_t reserved;
00266   uint32_t mtu;
00267 } uip_nd6_opt_mtu;
00268 
00269 /** \struct Redirected header option */
00270 typedef struct uip_nd6_opt_redirected_hdr {
00271   uint8_t type;
00272   uint8_t len;
00273   uint8_t reserved[6];
00274 } uip_nd6_opt_redirected_hdr;
00275 /** @} */
00276 
00277 /**
00278  * \name ND Messages Processing and Generation
00279  * @{
00280  */
00281  /**
00282  * \brief Process a neighbor solicitation
00283  *
00284  * The NS can be received in 3 cases (procedures):
00285  * - sender is performing DAD (ip src = unspecified, no SLLAO option)
00286  * - sender is performing NUD (ip dst = unicast)
00287  * - sender is performing address resolution (ip dest = solicited node mcast
00288  * address)
00289  *
00290  * We do:
00291  * - if the tgt belongs to me, reply, otherwise ignore
00292  * - if i was performing DAD for the same address, two cases:
00293  * -- I already sent a NS, hence I win
00294  * -- I did not send a NS yet, hence I lose
00295  *
00296  * If we need to send a NA in response (i.e. the NS was done for NUD, or
00297  * address resolution, or DAD and there is a conflict), we do it in this
00298  * function: set src, dst, tgt address in the three cases, then for all cases
00299  * set the rest, including  SLLAO
00300  *
00301  */
00302 void
00303 uip_nd6_ns_input(void);
00304 
00305 /**
00306  * \brief Send a neighbor solicitation, send a Neighbor Advertisement
00307  * \param src pointer to the src of the NS if known
00308  * \param dest pointer to ip address to send the NS, for DAD or ADDR Resol,
00309  * MUST be NULL, for NUD, must be correct unicast dest
00310  * \param tgt  pointer to ip address to fill the target address field, must
00311  * not be NULL
00312  *
00313  * - RFC 4861, 7.2.2 :
00314  *   "If the source address of the packet prompting the solicitation is the
00315  *   same as one of the addresses assigned to the outgoing interface, that
00316  *   address SHOULD be placed in the IP Source Address of the outgoing
00317  *   solicitation.  Otherwise, any one of the addresses assigned to the
00318  *   interface should be used."
00319  *   This is why we have a src ip address as argument. If NULL, we will do
00320  *   src address selection, otherwise we use the argument.
00321  *
00322  * - we check if it is a NS for Address resolution  or NUD, if yes we include
00323  *   a SLLAO option, otherwise no.
00324  */
00325 void
00326 uip_nd6_ns_output(uip_ipaddr_t *src, uip_ipaddr_t *dest, uip_ipaddr_t *tgt);
00327 
00328 /**
00329  * \brief Process a Neighbor Advertisement
00330  *
00331  * we might have to send a pkt that had been buffered while address
00332  * resolution was performed (if we support buffering, see UIP_CONF_QUEUE_PKT)
00333  *
00334  * As per RFC 4861, on link layer that have addresses, TLLAO options MUST be
00335  * included when responding to multicast solicitations, SHOULD be included in
00336  * response to unicast (here we assume it is for now)
00337  *
00338  * NA can be received after sending NS for DAD, Address resolution or NUD. Can
00339  * be unsolicited as well.
00340  * It can trigger update of the state of the neighbor in the neighbor cache,
00341  * router in the router list.
00342  * If the NS was for DAD, it means DAD failed
00343  *
00344  */
00345 void
00346 uip_nd6_na_input(void);
00347 
00348 #if UIP_CONF_ROUTER
00349 #if UIP_ND6_SEND_RA
00350 /**
00351  * \brief Process a Router Solicitation
00352  *
00353  */
00354 void uip_nd6_rs_input(void);
00355 
00356 /**
00357  * \brief send a Router Advertisement
00358  *
00359  * Only for router, for periodic as well as sollicited RA
00360  */
00361 void uip_nd6_ra_output(uip_ipaddr_t *dest);
00362 #endif /* UIP_ND6_SEND_RA */
00363 #endif /*UIP_CONF_ROUTER*/
00364 
00365 /**
00366  * \brief Send a Router Solicitation
00367  *
00368  * src is chosen through the uip_netif_select_src function. If src is
00369  * unspecified  (i.e. we do not have a preferred address yet), then we do not
00370  * put a SLLAO option (MUST NOT in RFC 4861). Otherwise we do.
00371  *
00372  * RS message format,
00373  * possible option is SLLAO, MUST NOT be included if source = unspecified
00374  * SHOULD be included otherwise
00375  */
00376 void uip_nd6_rs_output(void);
00377 
00378 /**
00379  *
00380  * \brief process a Router Advertisement
00381  *
00382  * - Possible actions when receiving a RA: add router to router list,
00383  *   recalculate reachable time, update link hop limit, update retrans timer.
00384  * - If MTU option: update MTU.
00385  * - If SLLAO option: update entry in neighbor cache
00386  * - If prefix option: start autoconf, add prefix to prefix list
00387  */
00388 void
00389 uip_nd6_ra_input(void);
00390 /** @} */
00391 
00392 
00393 void
00394 uip_appserver_addr_get(uip_ipaddr_t *ipaddr);
00395 /*--------------------------------------*/
00396 /******* ANNEX - message formats ********/
00397 /*--------------------------------------*/
00398 
00399 /*
00400  * RS format. possible option is SLLAO
00401  *    0                   1                   2                   3
00402  *    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
00403  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
00404  *    |     Type      |     Code      |          Checksum             |
00405  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
00406  *    |                            Reserved                           |
00407  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
00408  *    |   Options ...
00409  *    +-+-+-+-+-+-+-+-+-+-+-+-
00410  *
00411  *
00412  * RA format. possible options: prefix information, MTU, SLLAO
00413  *    0                   1                   2                   3
00414  *    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
00415  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
00416  *    |     Type      |     Code      |          Checksum             |
00417  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
00418  *    | Cur Hop Limit |M|O|  Reserved |       Router Lifetime         |
00419  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
00420  *    |                         Reachable Time                        |
00421  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
00422  *    |                          Retrans Timer                        |
00423  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
00424  *    |   Options ...
00425  *    +-+-+-+-+-+-+-+-+-+-+-+-
00426  *
00427  *
00428  * NS format: options should be SLLAO
00429  *    0                   1                   2                   3
00430  *    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
00431  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
00432  *    |     Type      |     Code      |          Checksum             |
00433  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
00434  *    |                           Reserved                            |
00435  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
00436  *    |                                                               |
00437  *    +                                                               +
00438  *    |                                                               |
00439  *    +                       Target Address                          +
00440  *    |                                                               |
00441  *    +                                                               +
00442  *    |                                                               |
00443  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
00444  *    |   Options ...
00445  *    +-+-+-+-+-+-+-+-+-+-+-+-
00446  *
00447  *
00448  * NA message format. possible options is TLLAO
00449  *
00450  *    0                   1                   2                   3
00451  *    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
00452  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
00453  *    |     Type      |     Code      |          Checksum             |
00454  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
00455  *    |R|S|O|                     Reserved                            |
00456  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
00457  *    |                                                               |
00458  *    +                                                               +
00459  *    |                                                               |
00460  *    +                       Target Address                          +
00461  *    |                                                               |
00462  *    +                                                               +
00463  *    |                                                               |
00464  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
00465  *    |   Options ...
00466  *    +-+-+-+-+-+-+-+-+-+-+-+-
00467  *
00468  *
00469  * Redirect message format. Possible options are TLLAO and Redirected header
00470  *
00471  *    0                   1                   2                   3
00472  *    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
00473  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
00474  *    |     Type      |     Code      |          Checksum             |
00475  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
00476  *    |                           Reserved                            |
00477  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
00478  *    |                                                               |
00479  *    +                                                               +
00480  *    |                                                               |
00481  *    +                       Target Address                          +
00482  *    |                                                               |
00483  *    +                                                               +
00484  *    |                                                               |
00485  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
00486  *    |                                                               |
00487  *    +                                                               +
00488  *    |                                                               |
00489  *    +                     Destination Address                       +
00490  *    |                                                               |
00491  *    +                                                               +
00492  *    |                                                               |
00493  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
00494  *    |   Options ...
00495  *    +-+-+-+-+-+-+-+-+-+-+-+-
00496  *
00497  *
00498  * SLLAO/TLLAO option:
00499  *    0                   1                   2                   3
00500  *    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
00501  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
00502  *    |     Type      |    Length     |    Link-Layer Address ...
00503  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
00504  *
00505  *
00506  * Prefix information option
00507  *    0                   1                   2                   3
00508  *    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
00509  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
00510  *    |     Type      |    Length     | Prefix Length |L|A| Reserved1 |
00511  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
00512  *    |                         Valid Lifetime                        |
00513  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
00514  *    |                       Preferred Lifetime                      |
00515  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
00516  *    |                           Reserved2                           |
00517  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
00518  *    |                                                               |
00519  *    +                                                               +
00520  *    |                                                               |
00521  *    +                            Prefix                             +
00522  *    |                                                               |
00523  *    +                                                               +
00524  *    |                                                               |
00525  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
00526  *
00527  *
00528  * MTU option
00529  *    0                   1                   2                   3
00530  *    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
00531  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
00532  *    |     Type      |    Length     |           Reserved            |
00533  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
00534  *    |                              MTU                              |
00535  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
00536  *
00537  *
00538  * Redirected header option
00539  *
00540  *    0                   1                   2                   3
00541  *    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
00542  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
00543  *    |     Type      |    Length     |            Reserved           |
00544  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
00545  *    |                           Reserved                            |
00546  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
00547  *    |                                                               |
00548  *    ~                       IP header + data                        ~
00549  *    |                                                               |
00550  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
00551  *
00552  */
00553 #endif /* __UIP_ND6_H__ */
00554 
00555 /** @} */