1
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
58
59
60
62
63
64
65
66
67
68
69
70
71
72
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
95
96
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
116
117
118
120
121
122
123
124
125
126
127
128
129
130
131
135
136
139
140
141
142
143
144
145
146
147
148
149
150
151
152
155
156
157
158
159
160
161
162
163
166
167
169
170
171
172
173
174
175
176
177
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
236
240
244
248
249
253
254
258
262
266
270
273
274
275
276
277
278
279
280
281
283
285
287
289
291
293
294
295
296
297
298
299
300
301
303
305
307
309
311
313
314
315
316
317
318
319
323
324
325
326
327
328
329
330
/* ... */
/* ... */
#ifndef LWIP_HDR_IP_H
#define LWIP_HDR_IP_H
#include "lwip/opt.h"
#include "lwip/def.h"
#include "lwip/pbuf.h"
#include "lwip/ip_addr.h"
#include "lwip/err.h"
#include "lwip/netif.h"
#include "lwip/ip4.h"
#include "lwip/ip6.h"
#include "lwip/prot/ip.h"
9 includes
#ifdef __cplusplus
extern "C" {
#endif
/* ... */
#define LWIP_IP_HDRINCL NULL
/* ... */
#ifndef LWIP_IP_CHECK_PBUF_REF_COUNT_FOR_TX
#define LWIP_IP_CHECK_PBUF_REF_COUNT_FOR_TX(p) LWIP_ASSERT("p->ref == 1", (p)->ref == 1)
#endif
#if LWIP_NETIF_USE_HINTS
#define IP_PCB_NETIFHINT ;struct netif_hint netif_hints
#else
#define IP_PCB_NETIFHINT
#endif
/* ... */
#define IP_PCB \
\
ip_addr_t local_ip; \
ip_addr_t remote_ip; \
\
u8_t netif_idx; \
\
u8_t so_options; \
\
u8_t tos; \
\
u8_t ttl \
\
IP_PCB_NETIFHINT...
struct ip_pcb {
IP_PCB;
...};
/* ... */
#define SOF_REUSEADDR 0x04U
#define SOF_KEEPALIVE 0x08U
#define SOF_BROADCAST 0x20U
#define SOF_INHERITED (SOF_REUSEADDR|SOF_KEEPALIVE)
struct ip_globals
{
struct netif *current_netif;
struct netif *current_input_netif;
#if LWIP_IPV4
const struct ip_hdr *current_ip4_header;/* ... */
#endif
#if LWIP_IPV6
struct ip6_hdr *current_ip6_header;/* ... */
#endif
u16_t current_ip_header_tot_len;
ip_addr_t current_iphdr_src;
ip_addr_t current_iphdr_dest;
...};
extern struct ip_globals ip_data;
/* ... */
#define ip_current_netif() (ip_data.current_netif)
/* ... */
#define ip_current_input_netif() (ip_data.current_input_netif)
#define ip_current_header_tot_len() (ip_data.current_ip_header_tot_len)
#define ip_current_src_addr() (&ip_data.current_iphdr_src)
#define ip_current_dest_addr() (&ip_data.current_iphdr_dest)
5 defines
#if LWIP_IPV4 && LWIP_IPV6
/* ... */
#define ip4_current_header() ip_data.current_ip4_header
/* ... */
#define ip6_current_header() ((const struct ip6_hdr*)(ip_data.current_ip6_header))
#define ip_current_is_v6() (ip6_current_header() != NULL)
#define ip6_current_src_addr() (ip_2_ip6(&ip_data.current_iphdr_src))
#define ip6_current_dest_addr() (ip_2_ip6(&ip_data.current_iphdr_dest))
#define ip_current_header_proto() (ip_current_is_v6() ? \
IP6H_NEXTH(ip6_current_header()) :\
IPH_PROTO(ip4_current_header()))...
#define ip_next_header_ptr() ((const void*)((ip_current_is_v6() ? \
(const u8_t*)ip6_current_header() : (const u8_t*)ip4_current_header()) + ip_current_header_tot_len()))...
#define ip4_current_src_addr() (ip_2_ip4(&ip_data.current_iphdr_src))
#define ip4_current_dest_addr() (ip_2_ip4(&ip_data.current_iphdr_dest))
9 defines
/* ... */#elif LWIP_IPV4
/* ... */
#define ip4_current_header() ip_data.current_ip4_header
#define ip_current_is_v6() 0
#define ip_current_header_proto() IPH_PROTO(ip4_current_header())
#define ip_next_header_ptr() ((const void*)((const u8_t*)ip4_current_header() + ip_current_header_tot_len()))
#define ip4_current_src_addr() (&ip_data.current_iphdr_src)
#define ip4_current_dest_addr() (&ip_data.current_iphdr_dest)
6 defines
/* ... */#elif LWIP_IPV6
/* ... */
#define ip6_current_header() ((const struct ip6_hdr*)(ip_data.current_ip6_header))
#define ip_current_is_v6() 1
#define ip_current_header_proto() IP6H_NEXTH(ip6_current_header())
#define ip_next_header_ptr() ((const void*)(((const u8_t*)ip6_current_header()) + ip_current_header_tot_len()))
#define ip6_current_src_addr() (&ip_data.current_iphdr_src)
#define ip6_current_dest_addr() (&ip_data.current_iphdr_dest)
6 defines
/* ... */#endif
#define ip_current_src_addr() (&ip_data.current_iphdr_src)
#define ip_current_dest_addr() (&ip_data.current_iphdr_dest)
#define ip_get_option(pcb, opt) ((pcb)->so_options & (opt))
#define ip_set_option(pcb, opt) ((pcb)->so_options = (u8_t)((pcb)->so_options | (opt)))
#define ip_reset_option(pcb, opt) ((pcb)->so_options = (u8_t)((pcb)->so_options & ~(opt)))
5 defines
#if LWIP_IPV4 && LWIP_IPV6
/* ... */
#define ip_output(p, src, dest, ttl, tos, proto) \
(IP_IS_V6(dest) ? \
ip6_output(p, ip_2_ip6(src), ip_2_ip6(dest), ttl, tos, proto) : \
ip4_output(p, ip_2_ip4(src), ip_2_ip4(dest), ttl, tos, proto))...
/* ... */
#define ip_output_if(p, src, dest, ttl, tos, proto, netif) \
(IP_IS_V6(dest) ? \
ip6_output_if(p, ip_2_ip6(src), ip_2_ip6(dest), ttl, tos, proto, netif) : \
ip4_output_if(p, ip_2_ip4(src), ip_2_ip4(dest), ttl, tos, proto, netif))...
/* ... */
#define ip_output_if_src(p, src, dest, ttl, tos, proto, netif) \
(IP_IS_V6(dest) ? \
ip6_output_if_src(p, ip_2_ip6(src), ip_2_ip6(dest), ttl, tos, proto, netif) : \
ip4_output_if_src(p, ip_2_ip4(src), ip_2_ip4(dest), ttl, tos, proto, netif))...
#define ip_output_if_hdrincl(p, src, dest, netif) \
(IP_IS_V6(dest) ? \
ip6_output_if(p, ip_2_ip6(src), LWIP_IP_HDRINCL, 0, 0, 0, netif) : \
ip4_output_if(p, ip_2_ip4(src), LWIP_IP_HDRINCL, 0, 0, 0, netif))...
#define ip_output_hinted(p, src, dest, ttl, tos, proto, netif_hint) \
(IP_IS_V6(dest) ? \
ip6_output_hinted(p, ip_2_ip6(src), ip_2_ip6(dest), ttl, tos, proto, netif_hint) : \
ip4_output_hinted(p, ip_2_ip4(src), ip_2_ip4(dest), ttl, tos, proto, netif_hint))...
/* ... */
#define ip_route(src, dest) \
(IP_IS_V6(dest) ? \
ip6_route(ip_2_ip6(src), ip_2_ip6(dest)) : \
ip4_route_src(ip_2_ip4(src), ip_2_ip4(dest)))...
/* ... */
#define ip_netif_get_local_ip(netif, dest) (IP_IS_V6(dest) ? \
ip6_netif_get_local_ip(netif, ip_2_ip6(dest)) : \
ip4_netif_get_local_ip(netif))...
#define ip_debug_print(is_ipv6, p) ((is_ipv6) ? ip6_debug_print(p) : ip4_debug_print(p))
8 defines
err_t ip_input(struct pbuf *p, struct netif *inp);
/* ... */
#elif LWIP_IPV4
#define ip_output(p, src, dest, ttl, tos, proto) \
ip4_output(p, src, dest, ttl, tos, proto)...
#define ip_output_if(p, src, dest, ttl, tos, proto, netif) \
ip4_output_if(p, src, dest, ttl, tos, proto, netif)...
#define ip_output_if_src(p, src, dest, ttl, tos, proto, netif) \
ip4_output_if_src(p, src, dest, ttl, tos, proto, netif)...
#define ip_output_hinted(p, src, dest, ttl, tos, proto, netif_hint) \
ip4_output_hinted(p, src, dest, ttl, tos, proto, netif_hint)...
#define ip_output_if_hdrincl(p, src, dest, netif) \
ip4_output_if(p, src, LWIP_IP_HDRINCL, 0, 0, 0, netif)...
#define ip_route(src, dest) \
ip4_route_src(src, dest)...
#define ip_netif_get_local_ip(netif, dest) \
ip4_netif_get_local_ip(netif)...
#define ip_debug_print(is_ipv6, p) ip4_debug_print(p)
#define ip_input ip4_input
9 defines
/* ... */#elif LWIP_IPV6
#define ip_output(p, src, dest, ttl, tos, proto) \
ip6_output(p, src, dest, ttl, tos, proto)...
#define ip_output_if(p, src, dest, ttl, tos, proto, netif) \
ip6_output_if(p, src, dest, ttl, tos, proto, netif)...
#define ip_output_if_src(p, src, dest, ttl, tos, proto, netif) \
ip6_output_if_src(p, src, dest, ttl, tos, proto, netif)...
#define ip_output_hinted(p, src, dest, ttl, tos, proto, netif_hint) \
ip6_output_hinted(p, src, dest, ttl, tos, proto, netif_hint)...
#define ip_output_if_hdrincl(p, src, dest, netif) \
ip6_output_if(p, src, LWIP_IP_HDRINCL, 0, 0, 0, netif)...
#define ip_route(src, dest) \
ip6_route(src, dest)...
#define ip_netif_get_local_ip(netif, dest) \
ip6_netif_get_local_ip(netif, dest)...
#define ip_debug_print(is_ipv6, p) ip6_debug_print(p)
#define ip_input ip6_input
9 defines
/* ... */#endif
#define ip_route_get_local_ip(src, dest, netif, ipaddr) do { \
(netif) = ip_route(src, dest); \
(ipaddr) = ip_netif_get_local_ip(netif, dest); \
...}while(0)...
#ifdef __cplusplus
}extern "C" { ... }
#endif
/* ... */
#endif