• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**
2  * @file
3  *
4  * IPv6 layer.
5  */
6 
7 /*
8  * Copyright (c) 2010 Inico Technologies Ltd.
9  * All rights reserved.
10  *
11  * Redistribution and use in source and binary forms, with or without modification,
12  * are permitted provided that the following conditions are met:
13  *
14  * 1. Redistributions of source code must retain the above copyright notice,
15  *    this list of conditions and the following disclaimer.
16  * 2. Redistributions in binary form must reproduce the above copyright notice,
17  *    this list of conditions and the following disclaimer in the documentation
18  *    and/or other materials provided with the distribution.
19  * 3. The name of the author may not be used to endorse or promote products
20  *    derived from this software without specific prior written permission.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
23  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
24  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
25  * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
26  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
27  * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
30  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
31  * OF SUCH DAMAGE.
32  *
33  * This file is part of the lwIP TCP/IP stack.
34  *
35  * Author: Ivan Delamer <delamer@inicotech.com>
36  *
37  *
38  * Please coordinate changes and requests with Ivan Delamer
39  * <delamer@inicotech.com>
40  */
41 #ifndef LWIP_HDR_IP6_H
42 #define LWIP_HDR_IP6_H
43 
44 #include "lwip/opt.h"
45 
46 #if LWIP_IPV6  /* don't build if not configured for use in lwipopts.h */
47 
48 #include "lwip/ip6_addr.h"
49 #include "lwip/prot/ip6.h"
50 #include "lwip/def.h"
51 #include "lwip/pbuf.h"
52 #include "lwip/netif.h"
53 
54 #include "lwip/err.h"
55 
56 #if defined (__cplusplus) && __cplusplus
57 extern "C" {
58 #endif
59 
60 /* \brief  Destination and Hop By Hop extension headers option types */
61 #define LWIP_EXT_HDR_OPT_PAD1  0
62 #define LWIP_EXT_HDR_OPT_PADN  1
63 
64 #define LWIP_RPL_RPI_TYPE_NEW   0x23
65 #define LWIP_RPL_RPI_TYPE_OLD   0x63
66 
67 #define LWIP_IPH_LEN 40
68 
69 #define IP_PROTO_VERSION_6 6
70 
71 /*
72  * brief is address a multicast address, see RFC 3513
73  * a is of type uip_ipaddr_t*
74  */
75 #define lwip_rpl_is_addr_mcast(a) ((a)->addr[0] == 0xFF000000)
76 
77 void ip6_process_destination_header_extension_options(struct pbuf *p, struct ip6_dest_hdr *opt_hdr,
78                                                       u16_t hlen, u8_t *need_ip6_input_cleanup);
79 
80 struct netif *ip6_route(const ip6_addr_t *src, const ip6_addr_t *dest
81 #if LWIP_SO_DONTROUTE
82                         , rt_scope_t scope
83 #endif
84                        );
85 
86 
87 /*
88  * @ingroup ip6
89  * Select the best IPv6 source address for a given destination IPv6 address.
90  *
91  * This implementation follows RFC 6724 Sec. 5 to the following extent:
92  * - Rules 1, 2, 3: fully implemented
93  * - Rules 4, 5, 5.5: not applicable
94  * - Rule 6: not implemented
95  * - Rule 7: not applicable
96  * - Rule 8: limited to addresses with /64 addresses
97  *
98  * For Rule 2, we deliberately deviate from RFC 6724 Sec. 3.1 by considering
99  * ULAs to be of smaller scope than global addresses, to avoid that a preferred
100  * ULA is picked over a deprecated global address when given a global address
101  * as destination, as that would likely result in broken two-way communication.
102  *
103  * As long as temporary addresses are not supported (as used in Rule 7), a
104  * proper implementation of Rule 8 would obviate the need to implement Rule 6.
105  *
106  * @param netif the netif on which to send a packet
107  * @param dest the destination we are trying to reach (possibly not properly
108  *             zoned)
109  * @return the most suitable source address to use, or NULL if no suitable
110  *         source address is found
111  */
112 const ip_addr_t *ip6_select_source_address(struct netif *netif, const ip6_addr_t *dest);
113 
114 const ip6_addr_t *ip6_select_first_valid_address(struct netif *netif);
115 
116 /*
117  * @ingroup ip6
118  * Compute the number of common network prefix bits between two IPv6 addresses
119  *
120  * @param addr1 IPv6 Address 1
121  * @param addr2 IPv6 Address 2
122  * @param prefix_length Length of network prefix(in bits)
123  * @return
124  * Number of common prefix bits in addr1 & addr2 : On success
125  * -1 : Invalid parameters
126  */
127 int ip6_common_prefix_length(const ip6_addr_t *addr1, const ip6_addr_t *addr2, u8_t prefix_length);
128 
129 
130 err_t         ip6_input(struct pbuf *p, struct netif *inp);
131 #if LWIP_API_RICH
132 err_t         ip6_output(struct pbuf *p, const ip6_addr_t *src, const ip6_addr_t *dest,
133                          u8_t hl, u8_t tc, u8_t nexth, struct ip_pcb *pcb);
134 #endif /* LWIP_API_RICH */
135 err_t         ip6_output_if(struct pbuf *p, const ip6_addr_t *src, const ip6_addr_t *dest,
136                             u8_t hl, u8_t tc, u8_t nexth, struct netif *netif);
137 err_t         ip6_output_if_src(struct pbuf *p, const ip6_addr_t *src, const ip6_addr_t *dest,
138                                 u8_t hl, u8_t tc, u8_t nexth, struct netif *netif);
139 #if LWIP_NETIF_USE_HINTS
140 err_t         ip6_output_hinted(struct pbuf *p, const ip6_addr_t *src, const ip6_addr_t *dest,
141                                 u8_t hl, u8_t tc, u8_t nexth, struct netif_hint *netif_hint);
142 #endif /* LWIP_NETIF_USE_HINTS */
143 #if LWIP_IPV6_MLD
144 err_t         ip6_options_add_hbh_ra(struct pbuf *p, u8_t nexth, u8_t value);
145 #endif /* LWIP_IPV6_MLD */
146 
147 #define ip6_netif_get_local_ip(netif, dest) (((netif) != NULL) ? \
148   ip6_select_source_address(netif, dest) : NULL)
149 
150 #if IP6_DEBUG
151 void ip6_debug_print(struct pbuf *p);
152 #else
153 #define ip6_debug_print(p)  (void)0
154 #endif /* IP6_DEBUG */
155 
156 #if LWIP_RPL || LWIP_RIPPLE
157 int lwip_get_pkt_route_status(void);
158 
159 void lwip_set_pkt_route_status(int up);
160 
161 int lwip_get_rte_nexthop_nonmesh(void);
162 
163 void lwip_set_rte_nexthop_nonmesh(int stat);
164 
165 /* For accessing hardcoded hbh_len. */
166 u16_t lwip_hbh_len(struct pbuf *p);
167 #endif /* LWIP_RPL || LWIP_RIPPLE */
168 
169 #if LWIP_RPL
170 struct pbuf *lwip_add_rpi_hdr(struct pbuf *p, u8_t nexth, u16_t hbh_len, u8_t flags);
171 #endif
172 
173 #if defined (__cplusplus) && __cplusplus
174 }
175 #endif
176 
177 #endif /* LWIP_IPV6 */
178 
179 #endif /* LWIP_HDR_IP6_H */
180