TuyaOS
ip6_zone.h
浏览该文件的文档.
1
54/*
55 * Copyright (c) 2017 The MINIX 3 Project.
56 * All rights reserved.
57 *
58 * Redistribution and use in source and binary forms, with or without modification,
59 * are permitted provided that the following conditions are met:
60 *
61 * 1. Redistributions of source code must retain the above copyright notice,
62 * this list of conditions and the following disclaimer.
63 * 2. Redistributions in binary form must reproduce the above copyright notice,
64 * this list of conditions and the following disclaimer in the documentation
65 * and/or other materials provided with the distribution.
66 * 3. The name of the author may not be used to endorse or promote products
67 * derived from this software without specific prior written permission.
68 *
69 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
70 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
71 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
72 * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
73 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
74 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
75 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
76 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
77 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
78 * OF SUCH DAMAGE.
79 *
80 * This file is part of the lwIP TCP/IP stack.
81 *
82 * Author: David van Moolenbroek <david@minix3.org>
83 *
84 */
85#ifndef LWIP_HDR_IP6_ZONE_H
86#define LWIP_HDR_IP6_ZONE_H
87
88#ifdef __cplusplus
89extern "C" {
90#endif
91
98#if LWIP_IPV6 /* don't build if not configured for use in lwipopts.h */
99
101#define IP6_NO_ZONE 0
102
103#if LWIP_IPV6_SCOPES
104
106#define IPADDR6_ZONE_INIT , IP6_NO_ZONE
107
109#define ip6_addr_zone(ip6addr) ((ip6addr)->zone)
110
112#define ip6_addr_has_zone(ip6addr) (ip6_addr_zone(ip6addr) != IP6_NO_ZONE)
113
115#define ip6_addr_set_zone(ip6addr, zone_idx) ((ip6addr)->zone = (zone_idx))
116
118#define ip6_addr_clear_zone(ip6addr) ((ip6addr)->zone = IP6_NO_ZONE)
119
121#define ip6_addr_copy_zone(ip6addr1, ip6addr2) ((ip6addr1).zone = (ip6addr2).zone)
122
124#define ip6_addr_equals_zone(ip6addr, zone_idx) ((ip6addr)->zone == (zone_idx))
125
128#define ip6_addr_cmp_zone(ip6addr1, ip6addr2) ((ip6addr1)->zone == (ip6addr2)->zone)
129
136enum lwip_ipv6_scope_type
137{
139 IP6_UNKNOWN = 0,
141 IP6_UNICAST = 1,
143 IP6_MULTICAST = 2
144};
145
154#ifndef IPV6_CUSTOM_SCOPES
155#define IPV6_CUSTOM_SCOPES 0
156#endif /* !IPV6_CUSTOM_SCOPES */
157
158#if !IPV6_CUSTOM_SCOPES
159
177#define ip6_addr_has_scope(ip6addr, type) \
178 (ip6_addr_islinklocal(ip6addr) || (((type) != IP6_UNICAST) && \
179 (ip6_addr_ismulticast_iflocal(ip6addr) || \
180 ip6_addr_ismulticast_linklocal(ip6addr))))
181
198#define ip6_addr_assign_zone(ip6addr, type, netif) \
199 (ip6_addr_set_zone((ip6addr), \
200 ip6_addr_has_scope((ip6addr), (type)) ? netif_get_index(netif) : 0))
201
221#define ip6_addr_test_zone(ip6addr, netif) \
222 (ip6_addr_equals_zone((ip6addr), netif_get_index(netif)))
223
224#endif /* !IPV6_CUSTOM_SCOPES */
225
228#define ip6_addr_lacks_zone(ip6addr, type) \
229 (!ip6_addr_has_zone(ip6addr) && ip6_addr_has_scope((ip6addr), (type)))
230
249#define ip6_addr_select_zone(dest, src) do { struct netif *selected_netif; \
250 selected_netif = ip6_route((src), (dest)); \
251 if (selected_netif != NULL) { \
252 ip6_addr_assign_zone((dest), IP6_UNKNOWN, selected_netif); \
253 } } while (0)
254
259#else /* LWIP_IPV6_SCOPES */
260
261#define IPADDR6_ZONE_INIT
262#define ip6_addr_zone(ip6addr) (IP6_NO_ZONE)
263#define ip6_addr_has_zone(ip6addr) (0)
264#define ip6_addr_set_zone(ip6addr, zone_idx)
265#define ip6_addr_clear_zone(ip6addr)
266#define ip6_addr_copy_zone(ip6addr1, ip6addr2)
267#define ip6_addr_equals_zone(ip6addr, zone_idx) (1)
268#define ip6_addr_cmp_zone(ip6addr1, ip6addr2) (1)
269#define IPV6_CUSTOM_SCOPES 0
270#define ip6_addr_has_scope(ip6addr, type) (0)
271#define ip6_addr_assign_zone(ip6addr, type, netif)
272#define ip6_addr_test_zone(ip6addr, netif) (1)
273#define ip6_addr_lacks_zone(ip6addr, type) (0)
274#define ip6_addr_select_zone(ip6addr, src)
275
276#endif /* LWIP_IPV6_SCOPES */
277
278#if LWIP_IPV6_SCOPES && LWIP_IPV6_SCOPES_DEBUG
279
281#define IP6_ADDR_ZONECHECK(ip6addr) LWIP_ASSERT("IPv6 zone check failed", \
282 ip6_addr_has_scope(ip6addr, IP6_UNKNOWN) == ip6_addr_has_zone(ip6addr))
283
285#define IP6_ADDR_ZONECHECK_NETIF(ip6addr, netif) LWIP_ASSERT("IPv6 netif zone check failed", \
286 ip6_addr_has_scope(ip6addr, IP6_UNKNOWN) ? \
287 (ip6_addr_has_zone(ip6addr) && \
288 (((netif) == NULL) || ip6_addr_test_zone((ip6addr), (netif)))) : \
289 !ip6_addr_has_zone(ip6addr))
290
291#else /* LWIP_IPV6_SCOPES && LWIP_IPV6_SCOPES_DEBUG */
292
293#define IP6_ADDR_ZONECHECK(ip6addr)
294#define IP6_ADDR_ZONECHECK_NETIF(ip6addr, netif)
295
296#endif /* LWIP_IPV6_SCOPES && LWIP_IPV6_SCOPES_DEBUG */
297
298#endif /* LWIP_IPV6 */
299
300#ifdef __cplusplus
301}
302#endif
303
304#endif /* LWIP_HDR_IP6_ZONE_H */