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