author | masputra |
Sat, 22 Oct 2005 22:50:14 -0700 | |
changeset 741 | 40027a3621ac |
parent 679 | f2c9450b58f4 |
child 898 | 64b2a371a6bd |
permissions | -rw-r--r-- |
0 | 1 |
/* |
2 |
* CDDL HEADER START |
|
3 |
* |
|
4 |
* The contents of this file are subject to the terms of the |
|
5 |
* Common Development and Distribution License, Version 1.0 only |
|
6 |
* (the "License"). You may not use this file except in compliance |
|
7 |
* with the License. |
|
8 |
* |
|
9 |
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE |
|
10 |
* or http://www.opensolaris.org/os/licensing. |
|
11 |
* See the License for the specific language governing permissions |
|
12 |
* and limitations under the License. |
|
13 |
* |
|
14 |
* When distributing Covered Code, include this CDDL HEADER in each |
|
15 |
* file and include the License file at usr/src/OPENSOLARIS.LICENSE. |
|
16 |
* If applicable, add the following below this CDDL HEADER, with the |
|
17 |
* fields enclosed by brackets "[]" replaced with your own identifying |
|
18 |
* information: Portions Copyright [yyyy] [name of copyright owner] |
|
19 |
* |
|
20 |
* CDDL HEADER END |
|
21 |
*/ |
|
22 |
/* |
|
23 |
* Copyright 2005 Sun Microsystems, Inc. All rights reserved. |
|
24 |
* Use is subject to license terms. |
|
25 |
*/ |
|
26 |
/* Copyright (c) 1990 Mentat Inc. */ |
|
27 |
||
28 |
#ifndef _INET_IP_H |
|
29 |
#define _INET_IP_H |
|
30 |
||
31 |
#pragma ident "%Z%%M% %I% %E% SMI" |
|
32 |
||
33 |
#ifdef __cplusplus |
|
34 |
extern "C" { |
|
35 |
#endif |
|
36 |
||
37 |
#include <sys/isa_defs.h> |
|
38 |
#include <sys/types.h> |
|
39 |
#include <inet/mib2.h> |
|
40 |
#include <inet/nd.h> |
|
41 |
#include <sys/atomic.h> |
|
42 |
#include <sys/socket.h> |
|
43 |
#include <net/if_dl.h> |
|
44 |
#include <net/if.h> |
|
45 |
#include <netinet/ip.h> |
|
46 |
#include <sys/dlpi.h> |
|
47 |
#include <netinet/igmp.h> |
|
48 |
||
49 |
#ifdef _KERNEL |
|
50 |
#include <netinet/ip6.h> |
|
51 |
#include <sys/avl.h> |
|
52 |
#include <sys/vmem.h> |
|
53 |
#include <sys/squeue.h> |
|
54 |
#include <sys/systm.h> |
|
741
40027a3621ac
PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents:
679
diff
changeset
|
55 |
#include <sys/multidata.h> |
0 | 56 |
|
57 |
#ifdef DEBUG |
|
58 |
#define ILL_DEBUG |
|
59 |
#define IRE_DEBUG |
|
60 |
#define NCE_DEBUG |
|
61 |
#define CONN_DEBUG |
|
62 |
#endif |
|
63 |
||
64 |
#define IP_DEBUG |
|
65 |
/* |
|
66 |
* The mt-streams(9F) flags for the IP module; put here so that other |
|
67 |
* "drivers" that are actually IP (e.g., ICMP, UDP) can use the same set |
|
68 |
* of flags. |
|
69 |
*/ |
|
70 |
#define IP_DEVMTFLAGS D_MP |
|
741
40027a3621ac
PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents:
679
diff
changeset
|
71 |
#endif /* _KERNEL */ |
40027a3621ac
PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents:
679
diff
changeset
|
72 |
|
40027a3621ac
PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents:
679
diff
changeset
|
73 |
#define IP_MOD_NAME "ip" |
40027a3621ac
PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents:
679
diff
changeset
|
74 |
#define IP_DEV_NAME "/dev/ip" |
40027a3621ac
PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents:
679
diff
changeset
|
75 |
#define IP6_DEV_NAME "/dev/ip6" |
40027a3621ac
PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents:
679
diff
changeset
|
76 |
|
40027a3621ac
PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents:
679
diff
changeset
|
77 |
#define UDP_MOD_NAME "udp" |
40027a3621ac
PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents:
679
diff
changeset
|
78 |
#define UDP_DEV_NAME "/dev/udp" |
40027a3621ac
PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents:
679
diff
changeset
|
79 |
#define UDP6_DEV_NAME "/dev/udp6" |
40027a3621ac
PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents:
679
diff
changeset
|
80 |
|
40027a3621ac
PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents:
679
diff
changeset
|
81 |
#define TCP_MOD_NAME "tcp" |
40027a3621ac
PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents:
679
diff
changeset
|
82 |
#define TCP_DEV_NAME "/dev/tcp" |
40027a3621ac
PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents:
679
diff
changeset
|
83 |
#define TCP6_DEV_NAME "/dev/tcp6" |
0 | 84 |
|
85 |
/* Minor numbers */ |
|
86 |
#define IPV4_MINOR 0 |
|
87 |
#define IPV6_MINOR 1 |
|
88 |
#define TCP_MINOR 2 |
|
89 |
#define TCP_MINOR6 3 |
|
90 |
||
91 |
#ifndef _IPADDR_T |
|
92 |
#define _IPADDR_T |
|
93 |
typedef uint32_t ipaddr_t; |
|
94 |
#endif |
|
95 |
||
96 |
/* Number of bits in an address */ |
|
97 |
#define IP_ABITS 32 |
|
98 |
#define IPV6_ABITS 128 |
|
99 |
||
100 |
#define IP_HOST_MASK (ipaddr_t)0xffffffffU |
|
101 |
||
102 |
#define IP_CSUM(mp, off, sum) (~ip_cksum(mp, off, sum) & 0xFFFF) |
|
103 |
#define IP_CSUM_PARTIAL(mp, off, sum) ip_cksum(mp, off, sum) |
|
104 |
#define IP_BCSUM_PARTIAL(bp, len, sum) bcksum(bp, len, sum) |
|
105 |
#define IP_MD_CSUM(pd, off, sum) (~ip_md_cksum(pd, off, sum) & 0xffff) |
|
106 |
#define IP_MD_CSUM_PARTIAL(pd, off, sum) ip_md_cksum(pd, off, sum) |
|
107 |
||
108 |
/* |
|
109 |
* Flag to IP write side to indicate that the appln has sent in a pre-built |
|
110 |
* IP header. Stored in ipha_ident (which is otherwise zero). |
|
111 |
*/ |
|
112 |
#define IP_HDR_INCLUDED 0xFFFF |
|
113 |
||
114 |
#define ILL_FRAG_HASH_TBL_COUNT ((unsigned int)64) |
|
115 |
#define ILL_FRAG_HASH_TBL_SIZE (ILL_FRAG_HASH_TBL_COUNT * sizeof (ipfb_t)) |
|
116 |
||
117 |
#define IPV4_ADDR_LEN 4 |
|
118 |
#define IP_ADDR_LEN IPV4_ADDR_LEN |
|
119 |
#define IP_ARP_PROTO_TYPE 0x0800 |
|
120 |
||
121 |
#define IPV4_VERSION 4 |
|
122 |
#define IP_VERSION IPV4_VERSION |
|
123 |
#define IP_SIMPLE_HDR_LENGTH_IN_WORDS 5 |
|
124 |
#define IP_SIMPLE_HDR_LENGTH 20 |
|
125 |
#define IP_MAX_HDR_LENGTH 60 |
|
126 |
||
127 |
#define IP_MIN_MTU (IP_MAX_HDR_LENGTH + 8) /* 68 bytes */ |
|
128 |
||
129 |
/* |
|
130 |
* XXX IP_MAXPACKET is defined in <netinet/ip.h> as well. At some point the |
|
131 |
* 2 files should be cleaned up to remove all redundant definitions. |
|
132 |
*/ |
|
133 |
#define IP_MAXPACKET 65535 |
|
134 |
#define IP_SIMPLE_HDR_VERSION \ |
|
135 |
((IP_VERSION << 4) | IP_SIMPLE_HDR_LENGTH_IN_WORDS) |
|
136 |
||
137 |
/* |
|
138 |
* Constants and type definitions to support IP IOCTL commands |
|
139 |
*/ |
|
140 |
#define IP_IOCTL (('i'<<8)|'p') |
|
141 |
#define IP_IOC_IRE_DELETE 4 |
|
142 |
#define IP_IOC_IRE_DELETE_NO_REPLY 5 |
|
143 |
#define IP_IOC_IRE_ADVISE_NO_REPLY 6 |
|
144 |
#define IP_IOC_RTS_REQUEST 7 |
|
145 |
||
146 |
/* Common definitions used by IP IOCTL data structures */ |
|
147 |
typedef struct ipllcmd_s { |
|
148 |
uint_t ipllc_cmd; |
|
149 |
uint_t ipllc_name_offset; |
|
150 |
uint_t ipllc_name_length; |
|
151 |
} ipllc_t; |
|
152 |
||
153 |
/* IP IRE Change Command Structure. */ |
|
154 |
typedef struct ipic_s { |
|
155 |
ipllc_t ipic_ipllc; |
|
156 |
uint_t ipic_ire_type; |
|
157 |
uint_t ipic_max_frag; |
|
158 |
uint_t ipic_addr_offset; |
|
159 |
uint_t ipic_addr_length; |
|
160 |
uint_t ipic_mask_offset; |
|
161 |
uint_t ipic_mask_length; |
|
162 |
uint_t ipic_src_addr_offset; |
|
163 |
uint_t ipic_src_addr_length; |
|
164 |
uint_t ipic_ll_hdr_offset; |
|
165 |
uint_t ipic_ll_hdr_length; |
|
166 |
uint_t ipic_gateway_addr_offset; |
|
167 |
uint_t ipic_gateway_addr_length; |
|
168 |
clock_t ipic_rtt; |
|
169 |
uint32_t ipic_ssthresh; |
|
170 |
clock_t ipic_rtt_sd; |
|
171 |
uchar_t ipic_ire_marks; |
|
172 |
} ipic_t; |
|
173 |
||
174 |
#define ipic_cmd ipic_ipllc.ipllc_cmd |
|
175 |
#define ipic_ll_name_length ipic_ipllc.ipllc_name_length |
|
176 |
#define ipic_ll_name_offset ipic_ipllc.ipllc_name_offset |
|
177 |
||
178 |
/* IP IRE Delete Command Structure. */ |
|
179 |
typedef struct ipid_s { |
|
180 |
ipllc_t ipid_ipllc; |
|
181 |
uint_t ipid_ire_type; |
|
182 |
uint_t ipid_addr_offset; |
|
183 |
uint_t ipid_addr_length; |
|
184 |
uint_t ipid_mask_offset; |
|
185 |
uint_t ipid_mask_length; |
|
186 |
} ipid_t; |
|
187 |
||
188 |
#define ipid_cmd ipid_ipllc.ipllc_cmd |
|
189 |
||
190 |
#ifdef _KERNEL |
|
191 |
/* |
|
192 |
* Temporary state for ip options parser. |
|
193 |
*/ |
|
194 |
typedef struct ipoptp_s |
|
195 |
{ |
|
196 |
uint8_t *ipoptp_next; /* next option to look at */ |
|
197 |
uint8_t *ipoptp_end; /* end of options */ |
|
198 |
uint8_t *ipoptp_cur; /* start of current option */ |
|
199 |
uint8_t ipoptp_len; /* length of current option */ |
|
200 |
uint32_t ipoptp_flags; |
|
201 |
} ipoptp_t; |
|
202 |
||
203 |
/* |
|
204 |
* Flag(s) for ipoptp_flags |
|
205 |
*/ |
|
206 |
#define IPOPTP_ERROR 0x00000001 |
|
207 |
#endif /* _KERNEL */ |
|
208 |
||
209 |
||
210 |
/* Controls forwarding of IP packets, set via ndd */ |
|
211 |
#define IP_FORWARD_NEVER 0 |
|
212 |
#define IP_FORWARD_ALWAYS 1 |
|
213 |
||
214 |
#define WE_ARE_FORWARDING (ip_g_forward == IP_FORWARD_ALWAYS) |
|
215 |
||
216 |
#define IPH_HDR_LENGTH(ipha) \ |
|
217 |
((int)(((ipha_t *)ipha)->ipha_version_and_hdr_length & 0xF) << 2) |
|
218 |
||
219 |
#define IPH_HDR_VERSION(ipha) \ |
|
220 |
((int)(((ipha_t *)ipha)->ipha_version_and_hdr_length) >> 4) |
|
221 |
||
222 |
#ifdef _KERNEL |
|
223 |
/* |
|
224 |
* IP reassembly macros. We hide starting and ending offsets in b_next and |
|
225 |
* b_prev of messages on the reassembly queue. The messages are chained using |
|
226 |
* b_cont. These macros are used in ip_reassemble() so we don't have to see |
|
227 |
* the ugly casts and assignments. |
|
228 |
* Note that the offsets are <= 64k i.e. a uint_t is sufficient to represent |
|
229 |
* them. |
|
230 |
*/ |
|
231 |
#define IP_REASS_START(mp) ((uint_t)(uintptr_t)((mp)->b_next)) |
|
232 |
#define IP_REASS_SET_START(mp, u) \ |
|
233 |
((mp)->b_next = (mblk_t *)(uintptr_t)(u)) |
|
234 |
#define IP_REASS_END(mp) ((uint_t)(uintptr_t)((mp)->b_prev)) |
|
235 |
#define IP_REASS_SET_END(mp, u) \ |
|
236 |
((mp)->b_prev = (mblk_t *)(uintptr_t)(u)) |
|
237 |
||
238 |
#define IP_REASS_COMPLETE 0x1 |
|
239 |
#define IP_REASS_PARTIAL 0x2 |
|
240 |
#define IP_REASS_FAILED 0x4 |
|
241 |
||
242 |
/* |
|
243 |
* Test to determine whether this is a module instance of IP or a |
|
244 |
* driver instance of IP. |
|
245 |
*/ |
|
246 |
#define CONN_Q(q) (WR(q)->q_next == NULL) |
|
247 |
||
248 |
#define Q_TO_CONN(q) ((conn_t *)(q)->q_ptr) |
|
249 |
#define Q_TO_TCP(q) (Q_TO_CONN((q))->conn_tcp) |
|
741
40027a3621ac
PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents:
679
diff
changeset
|
250 |
#define Q_TO_UDP(q) (Q_TO_CONN((q))->conn_udp) |
0 | 251 |
|
252 |
/* |
|
253 |
* The following two macros are used by IP to get the appropriate |
|
254 |
* wq and rq for a conn. If it is a TCP conn, then we need |
|
255 |
* tcp_wq/tcp_rq else, conn_wq/conn_rq. IP can use conn_wq and conn_rq |
|
256 |
* from a conn directly if it knows that the conn is not TCP. |
|
257 |
*/ |
|
258 |
#define CONNP_TO_WQ(connp) \ |
|
741
40027a3621ac
PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents:
679
diff
changeset
|
259 |
(IPCL_IS_TCP(connp) ? (connp)->conn_tcp->tcp_wq : (connp)->conn_wq) |
0 | 260 |
|
261 |
#define CONNP_TO_RQ(connp) RD(CONNP_TO_WQ(connp)) |
|
262 |
||
263 |
#define GRAB_CONN_LOCK(q) { \ |
|
264 |
if (q != NULL && CONN_Q(q)) \ |
|
265 |
mutex_enter(&(Q_TO_CONN(q))->conn_lock); \ |
|
266 |
} |
|
267 |
||
268 |
#define RELEASE_CONN_LOCK(q) { \ |
|
269 |
if (q != NULL && CONN_Q(q)) \ |
|
270 |
mutex_exit(&(Q_TO_CONN(q))->conn_lock); \ |
|
271 |
} |
|
272 |
||
273 |
/* "Congestion controlled" protocol */ |
|
274 |
#define IP_FLOW_CONTROLLED_ULP(p) ((p) == IPPROTO_TCP || (p) == IPPROTO_SCTP) |
|
275 |
||
276 |
/* |
|
277 |
* Complete the pending operation. Usually an ioctl. Can also |
|
278 |
* be a bind or option management request that got enqueued |
|
279 |
* in an ipsq_t. Called on completion of the operation. |
|
280 |
*/ |
|
281 |
#define CONN_OPER_PENDING_DONE(connp) { \ |
|
282 |
mutex_enter(&(connp)->conn_lock); \ |
|
283 |
(connp)->conn_oper_pending_ill = NULL; \ |
|
284 |
cv_broadcast(&(connp)->conn_refcv); \ |
|
285 |
mutex_exit(&(connp)->conn_lock); \ |
|
286 |
CONN_DEC_REF(connp); \ |
|
287 |
} |
|
288 |
||
289 |
/* Get the credential of an IP queue of unknown type */ |
|
290 |
#define GET_QUEUE_CRED(wq) \ |
|
291 |
((wq)->q_next ? (((ill_t *)(wq)->q_ptr)->ill_credp) \ |
|
292 |
: ((Q_TO_CONN((wq)))->conn_cred)) |
|
293 |
||
294 |
/* |
|
295 |
* Flags for the various ip_fanout_* routines. |
|
296 |
*/ |
|
297 |
#define IP_FF_SEND_ICMP 0x01 /* Send an ICMP error */ |
|
298 |
#define IP_FF_HDR_COMPLETE 0x02 /* Call ip_hdr_complete if error */ |
|
299 |
#define IP_FF_CKSUM 0x04 /* Recompute ipha_cksum if error */ |
|
300 |
#define IP_FF_RAWIP 0x08 /* Use rawip mib variable */ |
|
301 |
#define IP_FF_SRC_QUENCH 0x10 /* OK to send ICMP_SOURCE_QUENCH */ |
|
302 |
#define IP_FF_SYN_ADDIRE 0x20 /* Add IRE if TCP syn packet */ |
|
303 |
#define IP_FF_IP6INFO 0x80 /* Add ip6i_t if needed */ |
|
304 |
#define IP_FF_SEND_SLLA 0x100 /* Send source link layer info ? */ |
|
305 |
#define IPV6_REACHABILITY_CONFIRMATION 0x200 /* Flags for ip_xmit_v6 */ |
|
306 |
#define IP_FF_NO_MCAST_LOOP 0x400 /* No multicasts for sending zone */ |
|
307 |
||
308 |
/* |
|
309 |
* Following flags are used by IPQoS to determine if policy processing is |
|
310 |
* required. |
|
311 |
*/ |
|
312 |
#define IP6_NO_IPPOLICY 0x800 /* Don't do IPQoS processing */ |
|
313 |
#define IP6_IN_LLMCAST 0x1000 /* Multicast */ |
|
741
40027a3621ac
PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents:
679
diff
changeset
|
314 |
|
40027a3621ac
PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents:
679
diff
changeset
|
315 |
#define IP_FF_LOOPBACK 0x2000 /* Loopback fanout */ |
0 | 316 |
|
317 |
#ifndef IRE_DB_TYPE |
|
318 |
#define IRE_DB_TYPE M_SIG |
|
319 |
#endif |
|
320 |
||
321 |
#ifndef IRE_DB_REQ_TYPE |
|
322 |
#define IRE_DB_REQ_TYPE M_PCSIG |
|
323 |
#endif |
|
324 |
||
325 |
/* |
|
326 |
* Values for squeue switch: |
|
327 |
*/ |
|
328 |
||
329 |
#define IP_SQUEUE_ENTER_NODRAIN 1 |
|
330 |
#define IP_SQUEUE_ENTER 2 |
|
331 |
/* |
|
332 |
* This is part of the interface between Transport provider and |
|
333 |
* IP which can be used to set policy information. This is usually |
|
334 |
* accompanied with O_T_BIND_REQ/T_BIND_REQ.ip_bind assumes that |
|
335 |
* only IPSEC_POLICY_SET is there when it is found in the chain. |
|
336 |
* The information contained is an struct ipsec_req_t. On success |
|
337 |
* or failure, either the T_BIND_ACK or the T_ERROR_ACK is returned. |
|
338 |
* IPSEC_POLICY_SET is never returned. |
|
339 |
*/ |
|
340 |
#define IPSEC_POLICY_SET M_SETOPTS |
|
341 |
||
342 |
#define IRE_IS_LOCAL(ire) ((ire != NULL) && \ |
|
343 |
((ire)->ire_type & (IRE_LOCAL | IRE_LOOPBACK))) |
|
344 |
||
345 |
#define IRE_IS_TARGET(ire) ((ire != NULL) && \ |
|
346 |
((ire)->ire_type != IRE_BROADCAST)) |
|
347 |
||
348 |
/* IP Fragmentation Reassembly Header */ |
|
349 |
typedef struct ipf_s { |
|
350 |
struct ipf_s *ipf_hash_next; |
|
351 |
struct ipf_s **ipf_ptphn; /* Pointer to previous hash next. */ |
|
352 |
uint32_t ipf_ident; /* Ident to match. */ |
|
353 |
uint8_t ipf_protocol; /* Protocol to match. */ |
|
354 |
uchar_t ipf_last_frag_seen : 1; /* Last fragment seen ? */ |
|
355 |
time_t ipf_timestamp; /* Reassembly start time. */ |
|
356 |
mblk_t *ipf_mp; /* mblk we live in. */ |
|
357 |
mblk_t *ipf_tail_mp; /* Frag queue tail pointer. */ |
|
358 |
int ipf_hole_cnt; /* Number of holes (hard-case). */ |
|
359 |
int ipf_end; /* Tail end offset (0 -> hard-case). */ |
|
360 |
uint_t ipf_gen; /* Frag queue generation */ |
|
361 |
size_t ipf_count; /* Count of bytes used by frag */ |
|
362 |
uint_t ipf_nf_hdr_len; /* Length of nonfragmented header */ |
|
363 |
in6_addr_t ipf_v6src; /* IPv6 source address */ |
|
364 |
in6_addr_t ipf_v6dst; /* IPv6 dest address */ |
|
365 |
uint_t ipf_prev_nexthdr_offset; /* Offset for nexthdr value */ |
|
366 |
uint8_t ipf_ecn; /* ECN info for the fragments */ |
|
367 |
uint8_t ipf_num_dups; /* Number of times dup frags recvd */ |
|
741
40027a3621ac
PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents:
679
diff
changeset
|
368 |
uint16_t ipf_checksum_flags; /* Hardware checksum flags */ |
40027a3621ac
PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents:
679
diff
changeset
|
369 |
uint32_t ipf_checksum; /* Partial checksum of fragment data */ |
0 | 370 |
} ipf_t; |
371 |
||
372 |
#define ipf_src V4_PART_OF_V6(ipf_v6src) |
|
373 |
#define ipf_dst V4_PART_OF_V6(ipf_v6dst) |
|
374 |
||
375 |
typedef enum { |
|
376 |
IB_PKT = 0x01, |
|
377 |
OB_PKT = 0x02 |
|
378 |
} ip_pkt_t; |
|
379 |
||
380 |
#define UPDATE_IB_PKT_COUNT(ire)\ |
|
381 |
{ \ |
|
382 |
(ire)->ire_ib_pkt_count++; \ |
|
383 |
if ((ire)->ire_ipif != NULL) { \ |
|
384 |
/* \ |
|
385 |
* forwarding packet \ |
|
386 |
*/ \ |
|
387 |
if ((ire)->ire_type & (IRE_LOCAL|IRE_BROADCAST)) \ |
|
388 |
atomic_add_32(&(ire)->ire_ipif->ipif_ib_pkt_count, 1);\ |
|
389 |
else \ |
|
390 |
atomic_add_32(&(ire)->ire_ipif->ipif_fo_pkt_count, 1);\ |
|
391 |
} \ |
|
392 |
} |
|
393 |
#define UPDATE_OB_PKT_COUNT(ire)\ |
|
394 |
{ \ |
|
395 |
(ire)->ire_ob_pkt_count++;\ |
|
396 |
if ((ire)->ire_ipif != NULL) { \ |
|
397 |
atomic_add_32(&(ire)->ire_ipif->ipif_ob_pkt_count, 1); \ |
|
398 |
} \ |
|
399 |
} |
|
400 |
||
401 |
||
402 |
#define IP_RPUT_LOCAL(q, mp, ipha, ire, recv_ill) \ |
|
403 |
{ \ |
|
404 |
switch (ipha->ipha_protocol) { \ |
|
405 |
case IPPROTO_UDP: \ |
|
406 |
ip_udp_input(q, mp, ipha, ire, recv_ill); \ |
|
407 |
break; \ |
|
408 |
default: \ |
|
409 |
ip_proto_input(q, mp, ipha, ire, recv_ill); \ |
|
410 |
break; \ |
|
411 |
} \ |
|
412 |
} |
|
413 |
||
414 |
||
415 |
#endif /* _KERNEL */ |
|
416 |
||
417 |
/* ICMP types */ |
|
418 |
#define ICMP_ECHO_REPLY 0 |
|
419 |
#define ICMP_DEST_UNREACHABLE 3 |
|
420 |
#define ICMP_SOURCE_QUENCH 4 |
|
421 |
#define ICMP_REDIRECT 5 |
|
422 |
#define ICMP_ECHO_REQUEST 8 |
|
423 |
#define ICMP_ROUTER_ADVERTISEMENT 9 |
|
424 |
#define ICMP_ROUTER_SOLICITATION 10 |
|
425 |
#define ICMP_TIME_EXCEEDED 11 |
|
426 |
#define ICMP_PARAM_PROBLEM 12 |
|
427 |
#define ICMP_TIME_STAMP_REQUEST 13 |
|
428 |
#define ICMP_TIME_STAMP_REPLY 14 |
|
429 |
#define ICMP_INFO_REQUEST 15 |
|
430 |
#define ICMP_INFO_REPLY 16 |
|
431 |
#define ICMP_ADDRESS_MASK_REQUEST 17 |
|
432 |
#define ICMP_ADDRESS_MASK_REPLY 18 |
|
433 |
||
434 |
/* ICMP_TIME_EXCEEDED codes */ |
|
435 |
#define ICMP_TTL_EXCEEDED 0 |
|
436 |
#define ICMP_REASSEMBLY_TIME_EXCEEDED 1 |
|
437 |
||
438 |
/* ICMP_DEST_UNREACHABLE codes */ |
|
439 |
#define ICMP_NET_UNREACHABLE 0 |
|
440 |
#define ICMP_HOST_UNREACHABLE 1 |
|
441 |
#define ICMP_PROTOCOL_UNREACHABLE 2 |
|
442 |
#define ICMP_PORT_UNREACHABLE 3 |
|
443 |
#define ICMP_FRAGMENTATION_NEEDED 4 |
|
444 |
#define ICMP_SOURCE_ROUTE_FAILED 5 |
|
445 |
#define ICMP_DEST_NET_UNKNOWN 6 |
|
446 |
#define ICMP_DEST_HOST_UNKNOWN 7 |
|
447 |
#define ICMP_SRC_HOST_ISOLATED 8 |
|
448 |
#define ICMP_DEST_NET_UNREACH_ADMIN 9 |
|
449 |
#define ICMP_DEST_HOST_UNREACH_ADMIN 10 |
|
450 |
#define ICMP_DEST_NET_UNREACH_TOS 11 |
|
451 |
#define ICMP_DEST_HOST_UNREACH_TOS 12 |
|
452 |
||
453 |
/* ICMP Header Structure */ |
|
454 |
typedef struct icmph_s { |
|
455 |
uint8_t icmph_type; |
|
456 |
uint8_t icmph_code; |
|
457 |
uint16_t icmph_checksum; |
|
458 |
union { |
|
459 |
struct { /* ECHO request/response structure */ |
|
460 |
uint16_t u_echo_ident; |
|
461 |
uint16_t u_echo_seqnum; |
|
462 |
} u_echo; |
|
463 |
struct { /* Destination unreachable structure */ |
|
464 |
uint16_t u_du_zero; |
|
465 |
uint16_t u_du_mtu; |
|
466 |
} u_du; |
|
467 |
struct { /* Parameter problem structure */ |
|
468 |
uint8_t u_pp_ptr; |
|
469 |
uint8_t u_pp_rsvd[3]; |
|
470 |
} u_pp; |
|
471 |
struct { /* Redirect structure */ |
|
472 |
ipaddr_t u_rd_gateway; |
|
473 |
} u_rd; |
|
474 |
} icmph_u; |
|
475 |
} icmph_t; |
|
476 |
||
477 |
#define icmph_echo_ident icmph_u.u_echo.u_echo_ident |
|
478 |
#define icmph_echo_seqnum icmph_u.u_echo.u_echo_seqnum |
|
479 |
#define icmph_du_zero icmph_u.u_du.u_du_zero |
|
480 |
#define icmph_du_mtu icmph_u.u_du.u_du_mtu |
|
481 |
#define icmph_pp_ptr icmph_u.u_pp.u_pp_ptr |
|
482 |
#define icmph_rd_gateway icmph_u.u_rd.u_rd_gateway |
|
483 |
||
484 |
#define ICMPH_SIZE 8 |
|
485 |
||
486 |
/* |
|
487 |
* Minimum length of transport layer header included in an ICMP error |
|
488 |
* message for it to be considered valid. |
|
489 |
*/ |
|
490 |
#define ICMP_MIN_TP_HDR_LEN 8 |
|
491 |
||
492 |
/* Aligned IP header */ |
|
493 |
typedef struct ipha_s { |
|
494 |
uint8_t ipha_version_and_hdr_length; |
|
495 |
uint8_t ipha_type_of_service; |
|
496 |
uint16_t ipha_length; |
|
497 |
uint16_t ipha_ident; |
|
498 |
uint16_t ipha_fragment_offset_and_flags; |
|
499 |
uint8_t ipha_ttl; |
|
500 |
uint8_t ipha_protocol; |
|
501 |
uint16_t ipha_hdr_checksum; |
|
502 |
ipaddr_t ipha_src; |
|
503 |
ipaddr_t ipha_dst; |
|
504 |
} ipha_t; |
|
505 |
||
506 |
#define IPH_DF 0x4000 /* Don't fragment */ |
|
507 |
#define IPH_MF 0x2000 /* More fragments to come */ |
|
508 |
#define IPH_OFFSET 0x1FFF /* Where the offset lives */ |
|
509 |
#define IPH_FRAG_HDR 0x8000 /* IPv6 don't fragment bit */ |
|
510 |
||
511 |
/* ECN code points for IPv4 TOS byte and IPv6 traffic class octet. */ |
|
512 |
#define IPH_ECN_NECT 0x0 /* Not ECN-Capabable Transport */ |
|
513 |
#define IPH_ECN_ECT1 0x1 /* ECN-Capable Transport, ECT(1) */ |
|
514 |
#define IPH_ECN_ECT0 0x2 /* ECN-Capable Transport, ECT(0) */ |
|
515 |
#define IPH_ECN_CE 0x3 /* ECN-Congestion Experienced (CE) */ |
|
516 |
||
517 |
/* IP Mac info structure */ |
|
518 |
typedef struct ip_m_s { |
|
519 |
t_uscalar_t ip_m_mac_type; /* From <sys/dlpi.h> */ |
|
520 |
int ip_m_type; /* From <net/if_types.h> */ |
|
521 |
boolean_t (*ip_m_v4mapinfo)(uint_t, uint8_t *, uint8_t *, |
|
522 |
uint32_t *, ipaddr_t *); |
|
523 |
boolean_t (*ip_m_v6mapinfo)(uint_t, uint8_t *, uint8_t *, |
|
524 |
uint32_t *, in6_addr_t *); |
|
525 |
boolean_t (*ip_m_v6intfid)(uint_t, uint8_t *, in6_addr_t *); |
|
526 |
} ip_m_t; |
|
527 |
||
528 |
/* |
|
529 |
* The following functions attempt to reduce the link layer dependency |
|
530 |
* of the IP stack. The current set of link specific operations are: |
|
531 |
* a. map from IPv4 class D (224.0/4) multicast address range to the link |
|
532 |
* layer multicast address range. |
|
533 |
* b. map from IPv6 multicast address range (ff00::/8) to the link |
|
534 |
* layer multicast address range. |
|
535 |
* c. derive the default IPv6 interface identifier from the link layer |
|
536 |
* address. |
|
537 |
*/ |
|
538 |
#define MEDIA_V4MINFO(ip_m, plen, bphys, maddr, hwxp, v4ptr) \ |
|
539 |
(((ip_m)->ip_m_v4mapinfo != NULL) && \ |
|
540 |
(*(ip_m)->ip_m_v4mapinfo)(plen, bphys, maddr, hwxp, v4ptr)) |
|
541 |
#define MEDIA_V6INTFID(ip_m, plen, phys, v6ptr) \ |
|
542 |
(((ip_m)->ip_m_v6intfid != NULL) && \ |
|
543 |
(*(ip_m)->ip_m_v6intfid)(plen, phys, v6ptr)) |
|
544 |
#define MEDIA_V6MINFO(ip_m, plen, bphys, maddr, hwxp, v6ptr) \ |
|
545 |
(((ip_m)->ip_m_v6mapinfo != NULL) && \ |
|
546 |
(*(ip_m)->ip_m_v6mapinfo)(plen, bphys, maddr, hwxp, v6ptr)) |
|
547 |
||
548 |
/* Router entry types */ |
|
549 |
#define IRE_BROADCAST 0x0001 /* Route entry for broadcast address */ |
|
550 |
#define IRE_DEFAULT 0x0002 /* Route entry for default gateway */ |
|
551 |
#define IRE_LOCAL 0x0004 /* Route entry for local address */ |
|
552 |
#define IRE_LOOPBACK 0x0008 /* Route entry for loopback address */ |
|
553 |
#define IRE_PREFIX 0x0010 /* Route entry for prefix routes */ |
|
554 |
#define IRE_CACHE 0x0020 /* Cached Route entry */ |
|
555 |
#define IRE_IF_NORESOLVER 0x0040 /* Route entry for local interface */ |
|
556 |
/* net without any address mapping. */ |
|
557 |
#define IRE_IF_RESOLVER 0x0080 /* Route entry for local interface */ |
|
558 |
/* net with resolver. */ |
|
559 |
#define IRE_HOST 0x0100 /* Host route entry */ |
|
560 |
#define IRE_HOST_REDIRECT 0x0200 /* Host route entry from redirects */ |
|
561 |
||
562 |
/* |
|
563 |
* IRE_MIPRTUN is only set on the ires in the ip_mrtun_table. |
|
564 |
* This ire_type must not be set for ftable and ctable routing entries. |
|
565 |
*/ |
|
566 |
#define IRE_MIPRTUN 0x0400 /* Reverse tunnel route entry */ |
|
567 |
||
568 |
#define IRE_INTERFACE (IRE_IF_NORESOLVER | IRE_IF_RESOLVER) |
|
569 |
#define IRE_OFFSUBNET (IRE_DEFAULT | IRE_PREFIX | IRE_HOST | \ |
|
570 |
IRE_HOST_REDIRECT) |
|
571 |
#define IRE_CACHETABLE (IRE_CACHE | IRE_BROADCAST | IRE_LOCAL | \ |
|
572 |
IRE_LOOPBACK) |
|
573 |
#define IRE_FORWARDTABLE (IRE_INTERFACE | IRE_OFFSUBNET) |
|
574 |
||
575 |
/* |
|
576 |
* If an IRE is marked with IRE_MARK_CONDEMNED, the last walker of |
|
577 |
* the bucket should delete this IRE from this bucket. |
|
578 |
*/ |
|
579 |
#define IRE_MARK_CONDEMNED 0x0001 |
|
580 |
/* |
|
581 |
* If a broadcast IRE is marked with IRE_MARK_NORECV, ip_rput will drop the |
|
582 |
* broadcast packets received on that interface. This is marked only |
|
583 |
* on broadcast ires. Employed by IPMP, where we have multiple NICs on the |
|
584 |
* same subnet receiving the same broadcast packet. |
|
585 |
*/ |
|
586 |
#define IRE_MARK_NORECV 0x0002 |
|
587 |
/* |
|
588 |
* IRE_CACHE marked this way won't be returned by ire_cache_lookup. Need |
|
589 |
* to look specifically using MATCH_IRE_MARK_HIDDEN. Used by IPMP. |
|
590 |
*/ |
|
591 |
#define IRE_MARK_HIDDEN 0x0004 /* Typically Used by in.mpathd */ |
|
592 |
||
593 |
/* |
|
594 |
* ire with IRE_MARK_NOADD is created in ip_newroute_ipif, when outgoing |
|
595 |
* interface is specified by IP_XMIT_IF socket option. This ire is not |
|
596 |
* added in IRE_CACHE. For example, this is used by mipagent to prevent |
|
597 |
* any entry to be added in the cache table. We do not want to add any |
|
598 |
* entry for a mobile-node in the routing table for foreign agent originated |
|
599 |
* packets. Adding routes in cache table in this case, may run the risks of |
|
600 |
* incorrect routing path in case of private overlapping addresses. |
|
601 |
*/ |
|
602 |
#define IRE_MARK_NOADD 0x0008 /* Mark not to add ire in cache */ |
|
603 |
||
604 |
/* |
|
605 |
* IRE marked with IRE_MARK_TEMPORARY means that this IRE has been used |
|
606 |
* either for forwarding a packet or has not been used for sending |
|
607 |
* traffic on TCP connections terminated on this system. In both |
|
608 |
* cases, this IRE is the first to go when IRE is being cleaned up. |
|
609 |
*/ |
|
610 |
#define IRE_MARK_TEMPORARY 0x0010 |
|
611 |
||
612 |
/* |
|
613 |
* IRE marked with IRE_MARK_USESRC_CHECK means that while adding an IRE with |
|
614 |
* this mark, additional atomic checks need to be performed. For eg: by the |
|
615 |
* time an IRE_CACHE is created, sent up to ARP and then comes back to IP; the |
|
616 |
* usesrc grouping could have changed in which case we want to fail adding |
|
617 |
* the IRE_CACHE entry |
|
618 |
*/ |
|
619 |
#define IRE_MARK_USESRC_CHECK 0x0020 |
|
620 |
||
621 |
/* Flags with ire_expire routine */ |
|
622 |
#define FLUSH_ARP_TIME 0x0001 /* ARP info potentially stale timer */ |
|
623 |
#define FLUSH_REDIRECT_TIME 0x0002 /* Redirects potentially stale */ |
|
624 |
#define FLUSH_MTU_TIME 0x0004 /* Include path MTU per RFC 1191 */ |
|
625 |
||
626 |
/* Arguments to ire_flush_cache() */ |
|
627 |
#define IRE_FLUSH_DELETE 0 |
|
628 |
#define IRE_FLUSH_ADD 1 |
|
629 |
||
630 |
/* |
|
631 |
* Open/close synchronization flags. |
|
632 |
* These are kept in a separate field in the conn and the synchronization |
|
633 |
* depends on the atomic 32 bit access to that field. |
|
634 |
*/ |
|
635 |
#define CONN_CLOSING 0x01 /* ip_close waiting for ip_wsrv */ |
|
741
40027a3621ac
PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents:
679
diff
changeset
|
636 |
#define CONN_IPSEC_LOAD_WAIT 0x02 /* waiting for load */ |
40027a3621ac
PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents:
679
diff
changeset
|
637 |
#define CONN_CONDEMNED 0x04 /* conn is closing, no more refs */ |
40027a3621ac
PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents:
679
diff
changeset
|
638 |
#define CONN_INCIPIENT 0x08 /* conn not yet visible, no refs */ |
40027a3621ac
PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents:
679
diff
changeset
|
639 |
#define CONN_QUIESCED 0x10 /* conn is now quiescent */ |
0 | 640 |
|
641 |
/* |
|
642 |
* Parameter to ip_output giving the identity of the caller. |
|
643 |
* IP_WSRV means the packet was enqueued in the STREAMS queue |
|
644 |
* due to flow control and is now being reprocessed in the context of |
|
645 |
* the STREAMS service procedure, consequent to flow control relief. |
|
646 |
* IRE_SEND means the packet is being reprocessed consequent to an |
|
647 |
* ire cache creation and addition and this may or may not be happening |
|
648 |
* in the service procedure context. Anything other than the above 2 |
|
649 |
* cases is identified as IP_WPUT. Most commonly this is the case of |
|
650 |
* packets coming down from the application. |
|
651 |
*/ |
|
652 |
#ifdef _KERNEL |
|
653 |
#define IP_WSRV 1 /* Called from ip_wsrv */ |
|
654 |
#define IP_WPUT 2 /* Called from ip_wput */ |
|
655 |
#define IRE_SEND 3 /* Called from ire_send */ |
|
656 |
||
657 |
/* |
|
658 |
* Extra structures need for per-src-addr filtering (IGMPv3/MLDv2) |
|
659 |
*/ |
|
660 |
#define MAX_FILTER_SIZE 64 |
|
661 |
||
662 |
typedef struct slist_s { |
|
663 |
int sl_numsrc; |
|
664 |
in6_addr_t sl_addr[MAX_FILTER_SIZE]; |
|
665 |
} slist_t; |
|
666 |
||
667 |
/* |
|
668 |
* Following struct is used to maintain retransmission state for |
|
669 |
* a multicast group. One rtx_state_t struct is an in-line field |
|
670 |
* of the ilm_t struct; the slist_ts in the rtx_state_t struct are |
|
671 |
* alloc'd as needed. |
|
672 |
*/ |
|
673 |
typedef struct rtx_state_s { |
|
674 |
uint_t rtx_timer; /* retrans timer */ |
|
675 |
int rtx_cnt; /* retrans count */ |
|
676 |
int rtx_fmode_cnt; /* retrans count for fmode change */ |
|
677 |
slist_t *rtx_allow; |
|
678 |
slist_t *rtx_block; |
|
679 |
} rtx_state_t; |
|
680 |
||
681 |
/* |
|
682 |
* Used to construct list of multicast address records that will be |
|
683 |
* sent in a single listener report. |
|
684 |
*/ |
|
685 |
typedef struct mrec_s { |
|
686 |
struct mrec_s *mrec_next; |
|
687 |
uint8_t mrec_type; |
|
688 |
uint8_t mrec_auxlen; /* currently unused */ |
|
689 |
in6_addr_t mrec_group; |
|
690 |
slist_t mrec_srcs; |
|
691 |
} mrec_t; |
|
692 |
||
693 |
/* Group membership list per upper conn */ |
|
694 |
/* |
|
695 |
* XXX add ilg info for ifaddr/ifindex. |
|
696 |
* XXX can we make ilg survive an ifconfig unplumb + plumb |
|
697 |
* by setting the ipif/ill to NULL and recover that later? |
|
698 |
* |
|
699 |
* ilg_ipif is used by IPv4 as multicast groups are joined using an interface |
|
700 |
* address (ipif). |
|
701 |
* ilg_ill is used by IPv6 as multicast groups are joined using an interface |
|
702 |
* index (phyint->phyint_ifindex). |
|
703 |
* ilg_ill is NULL for IPv4 and ilg_ipif is NULL for IPv6. |
|
704 |
* |
|
705 |
* ilg records the state of multicast memberships of a socket end point. |
|
706 |
* ilm records the state of multicast memberships with the driver and is |
|
707 |
* maintained per interface. |
|
708 |
* |
|
709 |
* Notes : |
|
710 |
* |
|
711 |
* 1) There is no direct link between a given ilg and ilm. If the |
|
712 |
* application has joined a group G with ifindex I, we will have |
|
713 |
* an ilg with ilg_v6group and ilg_ill. There will be a corresponding |
|
714 |
* ilm with ilm_ill/ilm_v6addr recording the multicast membership. |
|
715 |
* To delete the membership, |
|
716 |
* |
|
717 |
* a) Search for ilg matching on G and I with ilg_v6group |
|
718 |
* and ilg_ill. Delete ilg_ill. |
|
719 |
* b) Search the corresponding ilm matching on G and I with |
|
720 |
* ilm_v6addr and ilm_ill. Delete ilm. |
|
721 |
* |
|
722 |
* In IPv4, the only difference is, we look using ipifs instead of |
|
723 |
* ills. |
|
724 |
* |
|
725 |
* 2) With IP multipathing, we want to keep receiving even after the |
|
726 |
* interface has failed. We do this by moving multicast memberships |
|
727 |
* to a new_ill within the group. This is acheived by sending |
|
728 |
* DL_DISABMULTI_REQS on ilg_ill/ilm_ill and sending DL_ENABMULTIREQS |
|
729 |
* on the new_ill and changing ilg_ill/ilm_ill to new_ill. But, we |
|
730 |
* need to be able to delete memberships which will still come down |
|
731 |
* with the ifindex of the old ill which is what the application |
|
732 |
* knows of. Thus we store the ilm_/ilg_orig_ifindex to keep track |
|
733 |
* of where we joined initially so that we can lookup even after we |
|
734 |
* moved the membership. It is also used for moving back the membership |
|
735 |
* when the old ill has been repaired. This is done by looking up for |
|
736 |
* ilms with ilm_orig_ifindex matching on the old ill's ifindex. Only |
|
737 |
* ilms actually move from old ill to new ill. ilgs don't move (just |
|
738 |
* the ilg_ill is changed when it moves) as it just records the state |
|
739 |
* of the application that has joined a group G where as ilm records |
|
740 |
* the state joined with the driver. Thus when we send DL_XXXMULTI_REQs |
|
741 |
* we also need to keep the ilm in the right ill. |
|
742 |
* |
|
743 |
* In IPv4, as ipifs move from old ill to new_ill, ilgs and ilms move |
|
744 |
* implicitly as we use only ipifs in IPv4. Thus, one can always lookup |
|
745 |
* a given ilm/ilg even after it fails without the support of |
|
746 |
* orig_ifindex. We move ilms still to record the driver state as |
|
747 |
* mentioned above. |
|
748 |
*/ |
|
749 |
||
750 |
/* |
|
751 |
* The ilg_t and ilm_t members are protected by ipsq. They can be changed only |
|
752 |
* by a thread executing in the ipsq. In other words add/delete of a |
|
753 |
* multicast group has to execute in the ipsq. |
|
754 |
*/ |
|
755 |
#define ILG_DELETED 0x1 /* ilg_flags */ |
|
756 |
typedef struct ilg_s { |
|
757 |
in6_addr_t ilg_v6group; |
|
758 |
struct ipif_s *ilg_ipif; /* Logical interface we are member on */ |
|
759 |
struct ill_s *ilg_ill; /* Used by IPv6 */ |
|
760 |
int ilg_orig_ifindex; /* Interface originally joined on */ |
|
761 |
uint_t ilg_flags; |
|
762 |
mcast_record_t ilg_fmode; /* MODE_IS_INCLUDE/MODE_IS_EXCLUDE */ |
|
763 |
slist_t *ilg_filter; |
|
764 |
} ilg_t; |
|
765 |
||
766 |
||
767 |
/* |
|
768 |
* Multicast address list entry for lower ill. |
|
769 |
* ilm_ipif is used by IPv4 as multicast groups are joined using ipif. |
|
770 |
* ilm_ill is used by IPv6 as multicast groups are joined using ill. |
|
771 |
* ilm_ill is NULL for IPv4 and ilm_ipif is NULL for IPv6. |
|
772 |
*/ |
|
773 |
#define ILM_DELETED 0x1 /* ilm_flags */ |
|
774 |
typedef struct ilm_s { |
|
775 |
in6_addr_t ilm_v6addr; |
|
776 |
int ilm_refcnt; |
|
777 |
uint_t ilm_timer; /* IGMP/MLD query resp timer, in msec */ |
|
778 |
struct ipif_s *ilm_ipif; /* Back pointer to ipif for IPv4 */ |
|
779 |
struct ilm_s *ilm_next; /* Linked list for each ill */ |
|
780 |
uint_t ilm_state; /* state of the membership */ |
|
781 |
struct ill_s *ilm_ill; /* Back pointer to ill for IPv6 */ |
|
782 |
int ilm_orig_ifindex; /* V6_MULTICAST_IF/ilm_ipif index */ |
|
783 |
uint_t ilm_flags; |
|
784 |
boolean_t ilm_is_new; /* new ilm */ |
|
785 |
boolean_t ilm_notify_driver; /* Need to notify the driver */ |
|
786 |
boolean_t ilm_join_mld; /* call mld_joingroup */ |
|
787 |
zoneid_t ilm_zoneid; |
|
788 |
int ilm_no_ilg_cnt; /* number of joins w/ no ilg */ |
|
789 |
mcast_record_t ilm_fmode; /* MODE_IS_INCLUDE/MODE_IS_EXCLUDE */ |
|
790 |
slist_t *ilm_filter; /* source filter list */ |
|
791 |
slist_t *ilm_pendsrcs; /* relevant src addrs for pending req */ |
|
792 |
rtx_state_t ilm_rtx; /* SCR retransmission state */ |
|
793 |
} ilm_t; |
|
794 |
||
795 |
#define ilm_addr V4_PART_OF_V6(ilm_v6addr) |
|
796 |
||
797 |
/* |
|
798 |
* ilm_walker_cleanup needs to execute when the ilm_walker_cnt goes down to |
|
799 |
* zero. In addition it needs to block new walkers while it is unlinking ilm's |
|
800 |
* from the list. Thus simple atomics for the ill_ilm_walker_cnt don't suffice. |
|
801 |
*/ |
|
802 |
#define ILM_WALKER_HOLD(ill) { \ |
|
803 |
mutex_enter(&(ill)->ill_lock); \ |
|
804 |
ill->ill_ilm_walker_cnt++; \ |
|
805 |
mutex_exit(&(ill)->ill_lock); \ |
|
806 |
} |
|
807 |
||
808 |
#define ILM_WALKER_RELE(ill) { \ |
|
809 |
mutex_enter(&(ill)->ill_lock); \ |
|
810 |
(ill)->ill_ilm_walker_cnt--; \ |
|
811 |
if ((ill)->ill_ilm_walker_cnt == 0 && (ill)->ill_ilm_cleanup_reqd) \ |
|
812 |
ilm_walker_cleanup(ill); \ |
|
813 |
mutex_exit(&(ill)->ill_lock); \ |
|
814 |
} |
|
815 |
||
816 |
/* |
|
817 |
* Soft reference to an IPsec SA. |
|
818 |
* |
|
819 |
* On relative terms, conn's can be persistant (living as long as the |
|
820 |
* processes which create them), while SA's are ephemeral (dying when |
|
821 |
* they hit their time-based or byte-based lifetimes). |
|
822 |
* |
|
823 |
* We could hold a hard reference to an SA from an ipsec_latch_t, |
|
824 |
* but this would cause expired SA's to linger for a potentially |
|
825 |
* unbounded time. |
|
826 |
* |
|
827 |
* Instead, we remember the hash bucket number and bucket generation |
|
828 |
* in addition to the pointer. The bucket generation is incremented on |
|
829 |
* each deletion. |
|
830 |
*/ |
|
831 |
typedef struct ipsa_ref_s |
|
832 |
{ |
|
833 |
struct ipsa_s *ipsr_sa; |
|
834 |
struct isaf_s *ipsr_bucket; |
|
835 |
uint64_t ipsr_gen; |
|
836 |
} ipsa_ref_t; |
|
837 |
||
838 |
/* |
|
839 |
* IPsec "latching" state. |
|
840 |
* |
|
841 |
* In the presence of IPsec policy, fully-bound conn's bind a connection |
|
842 |
* to more than just the 5-tuple, but also a specific IPsec action and |
|
843 |
* identity-pair. |
|
844 |
* |
|
845 |
* As an optimization, we also cache soft references to IPsec SA's |
|
846 |
* here so that we can fast-path around most of the work needed for |
|
847 |
* outbound IPsec SA selection. |
|
848 |
* |
|
849 |
* Were it not for TCP's detached connections, this state would be |
|
850 |
* in-line in conn_t; instead, this is in a separate structure so it |
|
851 |
* can be handed off to TCP when a connection is detached. |
|
852 |
*/ |
|
853 |
typedef struct ipsec_latch_s |
|
854 |
{ |
|
855 |
kmutex_t ipl_lock; |
|
856 |
uint32_t ipl_refcnt; |
|
857 |
||
858 |
uint64_t ipl_unique; |
|
859 |
struct ipsec_policy_s *ipl_in_policy; /* latched policy (in) */ |
|
860 |
struct ipsec_policy_s *ipl_out_policy; /* latched policy (out) */ |
|
861 |
struct ipsec_action_s *ipl_in_action; /* latched action (in) */ |
|
862 |
struct ipsec_action_s *ipl_out_action; /* latched action (out) */ |
|
863 |
cred_t *ipl_local_id; |
|
864 |
struct ipsid_s *ipl_local_cid; |
|
865 |
struct ipsid_s *ipl_remote_cid; |
|
866 |
unsigned int |
|
867 |
ipl_out_action_latched : 1, |
|
868 |
ipl_in_action_latched : 1, |
|
869 |
ipl_out_policy_latched : 1, |
|
870 |
ipl_in_policy_latched : 1, |
|
871 |
||
872 |
ipl_ids_latched : 1, |
|
873 |
||
874 |
ipl_pad_to_bit_31 : 27; |
|
875 |
||
876 |
ipsa_ref_t ipl_ref[2]; /* 0: ESP, 1: AH */ |
|
877 |
||
878 |
} ipsec_latch_t; |
|
879 |
||
880 |
#define IPLATCH_REFHOLD(ipl) { \ |
|
881 |
atomic_add_32(&(ipl)->ipl_refcnt, 1); \ |
|
882 |
ASSERT((ipl)->ipl_refcnt != 0); \ |
|
883 |
} |
|
884 |
||
885 |
#define IPLATCH_REFRELE(ipl) { \ |
|
886 |
ASSERT((ipl)->ipl_refcnt != 0); \ |
|
887 |
membar_exit(); \ |
|
888 |
if (atomic_add_32_nv(&(ipl)->ipl_refcnt, -1) == 0) \ |
|
889 |
iplatch_free(ipl); \ |
|
890 |
} |
|
891 |
||
892 |
/* |
|
893 |
* peer identity structure. |
|
894 |
*/ |
|
895 |
||
896 |
typedef struct conn_s conn_t; |
|
897 |
||
898 |
/* |
|
899 |
* The old IP client structure "ipc_t" is gone. All the data is stored in the |
|
900 |
* connection structure "conn_t" now. The mapping of old and new fields looks |
|
901 |
* like this: |
|
902 |
* |
|
903 |
* ipc_ulp conn_ulp |
|
904 |
* ipc_rq conn_rq |
|
905 |
* ipc_wq conn_wq |
|
906 |
* |
|
907 |
* ipc_laddr conn_src |
|
908 |
* ipc_faddr conn_rem |
|
909 |
* ipc_v6laddr conn_srcv6 |
|
910 |
* ipc_v6faddr conn_remv6 |
|
911 |
* |
|
912 |
* ipc_lport conn_lport |
|
913 |
* ipc_fport conn_fport |
|
914 |
* ipc_ports conn_ports |
|
915 |
* |
|
916 |
* ipc_policy conn_policy |
|
917 |
* ipc_latch conn_latch |
|
918 |
* |
|
919 |
* ipc_irc_lock conn_lock |
|
920 |
* ipc_ire_cache conn_ire_cache |
|
921 |
* |
|
922 |
* ipc_state_flags conn_state_flags |
|
923 |
* ipc_outgoing_ill conn_outgoing_ill |
|
924 |
* |
|
925 |
* ipc_dontroute conn_dontroute |
|
926 |
* ipc_loopback conn_loopback |
|
927 |
* ipc_broadcast conn_broadcast |
|
928 |
* ipc_reuseaddr conn_reuseaddr |
|
929 |
* |
|
930 |
* ipc_multicast_loop conn_multicast_loop |
|
931 |
* ipc_multi_router conn_multi_router |
|
932 |
* ipc_priv_stream conn_priv_stream |
|
933 |
* ipc_draining conn_draining |
|
934 |
* |
|
935 |
* ipc_did_putbq conn_did_putbq |
|
936 |
* ipc_unspec_src conn_unspec_src |
|
937 |
* ipc_policy_cached conn_policy_cached |
|
938 |
* |
|
939 |
* ipc_in_enforce_policy conn_in_enforce_policy |
|
940 |
* ipc_out_enforce_policy conn_out_enforce_policy |
|
941 |
* ipc_af_isv6 conn_af_isv6 |
|
942 |
* ipc_pkt_isv6 conn_pkt_isv6 |
|
943 |
* |
|
944 |
* ipc_ipv6_recvpktinfo conn_ipv6_recvpktinfo |
|
945 |
* |
|
946 |
* ipc_ipv6_recvhoplimit conn_ipv6_recvhoplimit |
|
947 |
* ipc_ipv6_recvhopopts conn_ipv6_recvhopopts |
|
948 |
* ipc_ipv6_recvdstopts conn_ipv6_recvdstopts |
|
949 |
* |
|
950 |
* ipc_ipv6_recvrthdr conn_ipv6_recvrthdr |
|
951 |
* ipc_ipv6_recvrtdstopts conn_ipv6_recvrtdstopts |
|
952 |
* ipc_fully_bound conn_fully_bound |
|
953 |
* |
|
954 |
* ipc_recvif conn_recvif |
|
955 |
* |
|
956 |
* ipc_recvslla conn_recvslla |
|
957 |
* ipc_acking_unbind conn_acking_unbind |
|
958 |
* ipc_pad_to_bit_31 conn_pad_to_bit_31 |
|
959 |
* |
|
960 |
* ipc_xmit_if_ill conn_xmit_if_ill |
|
961 |
* ipc_nofailover_ill conn_nofailover_ill |
|
962 |
* |
|
963 |
* ipc_proto conn_proto |
|
964 |
* ipc_incoming_ill conn_incoming_ill |
|
965 |
* ipc_outgoing_pill conn_outgoing_pill |
|
966 |
* ipc_pending_ill conn_pending_ill |
|
967 |
* ipc_unbind_mp conn_unbind_mp |
|
968 |
* ipc_ilg conn_ilg |
|
969 |
* ipc_ilg_allocated conn_ilg_allocated |
|
970 |
* ipc_ilg_inuse conn_ilg_inuse |
|
971 |
* ipc_ilg_walker_cnt conn_ilg_walker_cnt |
|
972 |
* ipc_refcv conn_refcv |
|
973 |
* ipc_multicast_ipif conn_multicast_ipif |
|
974 |
* ipc_multicast_ill conn_multicast_ill |
|
975 |
* ipc_orig_bound_ifindex conn_orig_bound_ifindex |
|
976 |
* ipc_orig_multicast_ifindex conn_orig_multicast_ifindex |
|
977 |
* ipc_orig_xmit_ifindex conn_orig_xmit_ifindex |
|
978 |
* ipc_drain_next conn_drain_next |
|
979 |
* ipc_drain_prev conn_drain_prev |
|
980 |
* ipc_idl conn_idl |
|
981 |
*/ |
|
982 |
||
983 |
/* |
|
984 |
* This is used to match an inbound/outbound datagram with |
|
985 |
* policy. |
|
986 |
*/ |
|
987 |
||
988 |
typedef struct ipsec_selector { |
|
989 |
in6_addr_t ips_local_addr_v6; |
|
990 |
in6_addr_t ips_remote_addr_v6; |
|
991 |
uint16_t ips_local_port; |
|
992 |
uint16_t ips_remote_port; |
|
993 |
uint8_t ips_icmp_type; |
|
994 |
uint8_t ips_icmp_code; |
|
995 |
uint8_t ips_protocol; |
|
996 |
uint8_t ips_isv4 : 1, |
|
997 |
ips_is_icmp_inv_acq: 1; |
|
998 |
} ipsec_selector_t; |
|
999 |
||
1000 |
/* |
|
1001 |
* Note that we put v4 addresses in the *first* 32-bit word of the |
|
1002 |
* selector rather than the last to simplify the prefix match/mask code |
|
1003 |
* in spd.c |
|
1004 |
*/ |
|
1005 |
#define ips_local_addr_v4 ips_local_addr_v6.s6_addr32[0] |
|
1006 |
#define ips_remote_addr_v4 ips_remote_addr_v6.s6_addr32[0] |
|
1007 |
||
1008 |
/* Values used in IP by IPSEC Code */ |
|
1009 |
#define IPSEC_OUTBOUND B_TRUE |
|
1010 |
#define IPSEC_INBOUND B_FALSE |
|
1011 |
||
1012 |
/* |
|
1013 |
* There are two variants in policy failures. The packet may come in |
|
1014 |
* secure when not needed (IPSEC_POLICY_???_NOT_NEEDED) or it may not |
|
1015 |
* have the desired level of protection (IPSEC_POLICY_MISMATCH). |
|
1016 |
*/ |
|
1017 |
#define IPSEC_POLICY_NOT_NEEDED 0 |
|
1018 |
#define IPSEC_POLICY_MISMATCH 1 |
|
1019 |
#define IPSEC_POLICY_AUTH_NOT_NEEDED 2 |
|
1020 |
#define IPSEC_POLICY_ENCR_NOT_NEEDED 3 |
|
1021 |
#define IPSEC_POLICY_SE_NOT_NEEDED 4 |
|
1022 |
#define IPSEC_POLICY_MAX 5 /* Always max + 1. */ |
|
1023 |
||
1024 |
/* |
|
1025 |
* Folowing macro is used whenever the code does not know whether there |
|
1026 |
* is a M_CTL present in the front and it needs to examine the actual mp |
|
1027 |
* i.e the IP header. As a M_CTL message could be in the front, this |
|
1028 |
* extracts the packet into mp and the M_CTL mp into first_mp. If M_CTL |
|
1029 |
* mp is not present, both first_mp and mp point to the same message. |
|
1030 |
*/ |
|
1031 |
#define EXTRACT_PKT_MP(mp, first_mp, mctl_present) \ |
|
1032 |
(first_mp) = (mp); \ |
|
1033 |
if ((mp)->b_datap->db_type == M_CTL) { \ |
|
1034 |
(mp) = (mp)->b_cont; \ |
|
1035 |
(mctl_present) = B_TRUE; \ |
|
1036 |
} else { \ |
|
1037 |
(mctl_present) = B_FALSE; \ |
|
1038 |
} |
|
1039 |
||
1040 |
/* |
|
1041 |
* Check with IPSEC inbound policy if |
|
1042 |
* |
|
1043 |
* 1) per-socket policy is present - indicated by conn_in_enforce_policy. |
|
1044 |
* 2) Or if we have not cached policy on the conn and the global policy is |
|
1045 |
* non-empty. |
|
1046 |
*/ |
|
1047 |
#define CONN_INBOUND_POLICY_PRESENT(connp) \ |
|
1048 |
((connp)->conn_in_enforce_policy || \ |
|
1049 |
(!((connp)->conn_policy_cached) && \ |
|
1050 |
ipsec_inbound_v4_policy_present)) |
|
1051 |
||
1052 |
#define CONN_INBOUND_POLICY_PRESENT_V6(connp) \ |
|
1053 |
((connp)->conn_in_enforce_policy || \ |
|
1054 |
(!(connp)->conn_policy_cached && \ |
|
1055 |
ipsec_inbound_v6_policy_present)) |
|
1056 |
||
1057 |
#define CONN_OUTBOUND_POLICY_PRESENT(connp) \ |
|
1058 |
((connp)->conn_out_enforce_policy || \ |
|
1059 |
(!((connp)->conn_policy_cached) && \ |
|
1060 |
ipsec_outbound_v4_policy_present)) |
|
1061 |
||
1062 |
#define CONN_OUTBOUND_POLICY_PRESENT_V6(connp) \ |
|
1063 |
((connp)->conn_out_enforce_policy || \ |
|
1064 |
(!(connp)->conn_policy_cached && \ |
|
1065 |
ipsec_outbound_v6_policy_present)) |
|
1066 |
||
1067 |
/* |
|
1068 |
* Information cached in IRE for upper layer protocol (ULP). |
|
1069 |
* |
|
1070 |
* Notice that ire_max_frag is not included in the iulp_t structure, which |
|
1071 |
* it may seem that it should. But ire_max_frag cannot really be cached. It |
|
1072 |
* is fixed for each interface. For MTU found by PMTUd, we may want to cache |
|
1073 |
* it. But currently, we do not do that. |
|
1074 |
*/ |
|
1075 |
typedef struct iulp_s { |
|
1076 |
boolean_t iulp_set; /* Is any metric set? */ |
|
1077 |
uint32_t iulp_ssthresh; /* Slow start threshold (TCP). */ |
|
1078 |
clock_t iulp_rtt; /* Guestimate in millisecs. */ |
|
1079 |
clock_t iulp_rtt_sd; /* Cached value of RTT variance. */ |
|
1080 |
uint32_t iulp_spipe; /* Send pipe size. */ |
|
1081 |
uint32_t iulp_rpipe; /* Receive pipe size. */ |
|
1082 |
uint32_t iulp_rtomax; /* Max round trip timeout. */ |
|
1083 |
uint32_t iulp_sack; /* Use SACK option (TCP)? */ |
|
1084 |
uint32_t |
|
1085 |
iulp_tstamp_ok : 1, /* Use timestamp option (TCP)? */ |
|
1086 |
iulp_wscale_ok : 1, /* Use window scale option (TCP)? */ |
|
1087 |
iulp_ecn_ok : 1, /* Enable ECN (for TCP)? */ |
|
1088 |
iulp_pmtud_ok : 1, /* Enable PMTUd? */ |
|
1089 |
||
1090 |
iulp_not_used : 28; |
|
1091 |
} iulp_t; |
|
1092 |
||
1093 |
/* Zero iulp_t. */ |
|
1094 |
extern const iulp_t ire_uinfo_null; |
|
1095 |
||
1096 |
/* |
|
1097 |
* The conn drain list structure. |
|
1098 |
* The list is protected by idl_lock. Each conn_t inserted in the list |
|
1099 |
* points back at this idl_t using conn_idl. IP primes the draining of the |
|
1100 |
* conns queued in these lists, by qenabling the 1st conn of each list. This |
|
1101 |
* occurs when STREAMS backenables ip_wsrv on the IP module. Each conn instance |
|
1102 |
* of ip_wsrv successively qenables the next conn in the list. |
|
1103 |
* idl_lock protects all other members of idl_t and conn_drain_next |
|
1104 |
* and conn_drain_prev of conn_t. The conn_lock protects IPCF_DRAIN_DISABLED |
|
1105 |
* flag of the conn_t and conn_idl. |
|
1106 |
*/ |
|
1107 |
typedef struct idl_s { |
|
1108 |
conn_t *idl_conn; /* Head of drain list */ |
|
1109 |
kmutex_t idl_lock; /* Lock for this list */ |
|
1110 |
conn_t *idl_conn_draining; /* conn that is draining */ |
|
1111 |
uint32_t |
|
1112 |
idl_repeat : 1, /* Last conn must re-enable */ |
|
1113 |
/* drain list again */ |
|
1114 |
idl_unused : 31; |
|
1115 |
} idl_t; |
|
1116 |
||
1117 |
#define CONN_DRAIN_LIST_LOCK(connp) (&((connp)->conn_idl->idl_lock)) |
|
1118 |
/* |
|
1119 |
* Interface route structure which holds the necessary information to recreate |
|
1120 |
* routes that are tied to an interface (namely where ire_ipif != NULL). |
|
1121 |
* These routes which were initially created via a routing socket or via the |
|
1122 |
* SIOCADDRT ioctl may be gateway routes (RTF_GATEWAY being set) or may be |
|
1123 |
* traditional interface routes. When an interface comes back up after being |
|
1124 |
* marked down, this information will be used to recreate the routes. These |
|
1125 |
* are part of an mblk_t chain that hangs off of the IPIF (ipif_saved_ire_mp). |
|
1126 |
*/ |
|
1127 |
typedef struct ifrt_s { |
|
1128 |
ushort_t ifrt_type; /* Type of IRE */ |
|
1129 |
in6_addr_t ifrt_v6addr; /* Address IRE represents. */ |
|
1130 |
in6_addr_t ifrt_v6gateway_addr; /* Gateway if IRE_OFFSUBNET */ |
|
1131 |
in6_addr_t ifrt_v6src_addr; /* Src addr if RTF_SETSRC */ |
|
1132 |
in6_addr_t ifrt_v6mask; /* Mask for matching IRE. */ |
|
1133 |
uint32_t ifrt_flags; /* flags related to route */ |
|
1134 |
uint_t ifrt_max_frag; /* MTU (next hop or path). */ |
|
1135 |
iulp_t ifrt_iulp_info; /* Cached IRE ULP info. */ |
|
1136 |
} ifrt_t; |
|
1137 |
||
1138 |
#define ifrt_addr V4_PART_OF_V6(ifrt_v6addr) |
|
1139 |
#define ifrt_gateway_addr V4_PART_OF_V6(ifrt_v6gateway_addr) |
|
1140 |
#define ifrt_src_addr V4_PART_OF_V6(ifrt_v6src_addr) |
|
1141 |
#define ifrt_mask V4_PART_OF_V6(ifrt_v6mask) |
|
1142 |
||
1143 |
/* Number of IP addresses that can be hosted on a physical interface */ |
|
1144 |
#define MAX_ADDRS_PER_IF 8192 |
|
1145 |
/* |
|
1146 |
* Number of Source addresses to be considered for source address |
|
1147 |
* selection. Used by ipif_select_source[_v6]. |
|
1148 |
*/ |
|
1149 |
#define MAX_IPIF_SELECT_SOURCE 50 |
|
1150 |
||
1151 |
#ifdef IP_DEBUG |
|
1152 |
/* |
|
1153 |
* Tracing refholds and refreleases for debugging. Existing tracing mechanisms |
|
1154 |
* do not allow the granularity need to trace refrences to ipif/ill/ire's. This |
|
1155 |
* mechanism should be revisited once dtrace is available. |
|
1156 |
*/ |
|
1157 |
#define IP_STACK_DEPTH 15 |
|
1158 |
typedef struct tr_buf_s { |
|
1159 |
int tr_depth; |
|
1160 |
pc_t tr_stack[IP_STACK_DEPTH]; |
|
1161 |
} tr_buf_t; |
|
1162 |
||
1163 |
typedef struct th_trace_s { |
|
1164 |
struct th_trace_s *th_next; |
|
1165 |
struct th_trace_s **th_prev; |
|
1166 |
kthread_t *th_id; |
|
1167 |
int th_refcnt; |
|
1168 |
uint_t th_trace_lastref; |
|
1169 |
#define TR_BUF_MAX 38 |
|
1170 |
tr_buf_t th_trbuf[TR_BUF_MAX]; |
|
1171 |
} th_trace_t; |
|
1172 |
#endif |
|
1173 |
||
1174 |
/* The following are ipif_state_flags */ |
|
1175 |
#define IPIF_CONDEMNED 0x1 /* The ipif is being removed */ |
|
1176 |
#define IPIF_CHANGING 0x2 /* A critcal ipif field is changing */ |
|
1177 |
#define IPIF_MOVING 0x8 /* The ipif is being moved */ |
|
1178 |
#define IPIF_SET_LINKLOCAL 0x10 /* transient flag during bringup */ |
|
1179 |
#define IPIF_ZERO_SOURCE 0x20 /* transient flag during bringup */ |
|
1180 |
||
1181 |
/* IP interface structure, one per local address */ |
|
1182 |
typedef struct ipif_s { |
|
1183 |
struct ipif_s *ipif_next; |
|
1184 |
struct ill_s *ipif_ill; /* Back pointer to our ill */ |
|
1185 |
int ipif_id; /* Logical unit number */ |
|
1186 |
uint_t ipif_mtu; /* Starts at ipif_ill->ill_max_frag */ |
|
1187 |
uint_t ipif_saved_mtu; /* Save of mtu during ipif_move() */ |
|
1188 |
in6_addr_t ipif_v6lcl_addr; /* Local IP address for this if. */ |
|
1189 |
in6_addr_t ipif_v6src_addr; /* Source IP address for this if. */ |
|
1190 |
in6_addr_t ipif_v6subnet; /* Subnet prefix for this if. */ |
|
1191 |
in6_addr_t ipif_v6net_mask; /* Net mask for this interface. */ |
|
1192 |
in6_addr_t ipif_v6brd_addr; /* Broadcast addr for this interface. */ |
|
1193 |
in6_addr_t ipif_v6pp_dst_addr; /* Point-to-point dest address. */ |
|
1194 |
uint64_t ipif_flags; /* Interface flags. */ |
|
1195 |
uint_t ipif_metric; /* BSD if metric, for compatibility. */ |
|
1196 |
uint_t ipif_ire_type; /* IRE_LOCAL or IRE_LOOPBACK */ |
|
1197 |
mblk_t *ipif_arp_del_mp; /* Allocated at time arp comes up, to */ |
|
1198 |
/* prevent awkward out of mem */ |
|
1199 |
/* condition later */ |
|
1200 |
mblk_t *ipif_saved_ire_mp; /* Allocated for each extra */ |
|
1201 |
/* IRE_IF_NORESOLVER/IRE_IF_RESOLVER */ |
|
1202 |
/* on this interface so that they */ |
|
1203 |
/* can survive ifconfig down. */ |
|
1204 |
kmutex_t ipif_saved_ire_lock; /* Protects ipif_saved_ire_mp */ |
|
1205 |
||
1206 |
mrec_t *ipif_igmp_rpt; /* List of group memberships which */ |
|
1207 |
/* will be reported on. Used when */ |
|
1208 |
/* handling an igmp timeout. */ |
|
1209 |
||
1210 |
/* |
|
1211 |
* The packet counts in the ipif contain the sum of the |
|
1212 |
* packet counts in dead IREs that were affiliated with |
|
1213 |
* this ipif. |
|
1214 |
*/ |
|
1215 |
uint_t ipif_fo_pkt_count; /* Forwarded thru our dead IREs */ |
|
1216 |
uint_t ipif_ib_pkt_count; /* Inbound packets for our dead IREs */ |
|
1217 |
uint_t ipif_ob_pkt_count; /* Outbound packets to our dead IREs */ |
|
1218 |
/* Exclusive bit fields, protected by ipsq_t */ |
|
1219 |
unsigned int |
|
1220 |
ipif_multicast_up : 1, /* We have joined the allhosts group */ |
|
1221 |
ipif_solmcast_up : 1, /* We joined solicited node mcast */ |
|
1222 |
ipif_replace_zero : 1, /* Replacement for zero */ |
|
1223 |
ipif_was_up : 1, /* ipif was up before */ |
|
1224 |
||
1225 |
ipif_pad_to_31 : 28; |
|
1226 |
||
1227 |
int ipif_orig_ifindex; /* ifindex before SLIFFAILOVER */ |
|
1228 |
uint_t ipif_seqid; /* unique index across all ills */ |
|
1229 |
uint_t ipif_orig_ipifid; /* ipif_id before SLIFFAILOVER */ |
|
1230 |
uint_t ipif_state_flags; /* See IPIF_* flag defs above */ |
|
1231 |
uint_t ipif_refcnt; /* active consistent reader cnt */ |
|
1232 |
uint_t ipif_ire_cnt; /* Number of ire's referencing ipif */ |
|
1233 |
uint_t ipif_saved_ire_cnt; |
|
1234 |
zoneid_t |
|
1235 |
ipif_zoneid; /* zone ID number */ |
|
1236 |
#ifdef ILL_DEBUG |
|
1237 |
#define IP_TR_HASH_MAX 64 |
|
1238 |
th_trace_t *ipif_trace[IP_TR_HASH_MAX]; |
|
1239 |
boolean_t ipif_trace_disable; /* True when alloc fails */ |
|
1240 |
#endif |
|
1241 |
} ipif_t; |
|
1242 |
||
1243 |
/* |
|
1244 |
* The following table lists the protection levels of the various members |
|
1245 |
* of the ipif_t. The following notation is used. |
|
1246 |
* |
|
1247 |
* Write once - Written to only once at the time of bringing up |
|
1248 |
* the interface and can be safely read after the bringup without any lock. |
|
1249 |
* |
|
1250 |
* ipsq - Need to execute in the ipsq to perform the indicated access. |
|
1251 |
* |
|
1252 |
* ill_lock - Need to hold this mutex to perform the indicated access. |
|
1253 |
* |
|
1254 |
* ill_g_lock - Need to hold this rw lock as reader/writer for read access or |
|
1255 |
* write access respectively. |
|
1256 |
* |
|
1257 |
* down ill - Written to only when the ill is down (i.e all ipifs are down) |
|
1258 |
* up ill - Read only when the ill is up (i.e. at least 1 ipif is up) |
|
1259 |
* |
|
1260 |
* Table of ipif_t members and their protection |
|
1261 |
* |
|
1262 |
* ipif_next ill_g_lock ill_g_lock |
|
1263 |
* ipif_ill ipsq + down ipif write once |
|
1264 |
* ipif_id ipsq + down ipif write once |
|
1265 |
* ipif_mtu ipsq |
|
1266 |
* ipif_v6lcl_addr ipsq + down ipif up ipif |
|
1267 |
* ipif_v6src_addr ipsq + down ipif up ipif |
|
1268 |
* ipif_v6subnet ipsq + down ipif up ipif |
|
1269 |
* ipif_v6net_mask ipsq + down ipif up ipif |
|
1270 |
* |
|
1271 |
* ipif_v6brd_addr |
|
1272 |
* ipif_v6pp_dst_addr |
|
1273 |
* ipif_flags ill_lock ill_lock |
|
1274 |
* ipif_metric |
|
1275 |
* ipif_ire_type ipsq + down ill up ill |
|
1276 |
* |
|
1277 |
* ipif_arp_del_mp ipsq ipsq |
|
1278 |
* ipif_saved_ire_mp ipif_saved_ire_lock ipif_saved_ire_lock |
|
1279 |
* ipif_igmp_rpt ipsq ipsq |
|
1280 |
* |
|
1281 |
* ipif_fo_pkt_count Approx |
|
1282 |
* ipif_ib_pkt_count Approx |
|
1283 |
* ipif_ob_pkt_count Approx |
|
1284 |
* |
|
1285 |
* bit fields ill_lock ill_lock |
|
1286 |
* |
|
1287 |
* ipif_orig_ifindex ipsq None |
|
1288 |
* ipif_orig_ipifid ipsq None |
|
1289 |
* ipif_seqid ipsq Write once |
|
1290 |
* |
|
1291 |
* ipif_state_flags ill_lock ill_lock |
|
1292 |
* ipif_refcnt ill_lock ill_lock |
|
1293 |
* ipif_ire_cnt ill_lock ill_lock |
|
1294 |
* ipif_saved_ire_cnt |
|
1295 |
*/ |
|
1296 |
||
1297 |
#define IP_TR_HASH(tid) ((((uintptr_t)tid) >> 6) & (IP_TR_HASH_MAX - 1)) |
|
1298 |
||
1299 |
#ifdef ILL_DEBUG |
|
1300 |
#define IPIF_TRACE_REF(ipif) ipif_trace_ref(ipif) |
|
1301 |
#define ILL_TRACE_REF(ill) ill_trace_ref(ill) |
|
1302 |
#define IPIF_UNTRACE_REF(ipif) ipif_untrace_ref(ipif) |
|
1303 |
#define ILL_UNTRACE_REF(ill) ill_untrace_ref(ill) |
|
1304 |
#define ILL_TRACE_CLEANUP(ill) ill_trace_cleanup(ill) |
|
1305 |
#define IPIF_TRACE_CLEANUP(ipif) ipif_trace_cleanup(ipif) |
|
1306 |
#else |
|
1307 |
#define IPIF_TRACE_REF(ipif) |
|
1308 |
#define ILL_TRACE_REF(ill) |
|
1309 |
#define IPIF_UNTRACE_REF(ipif) |
|
1310 |
#define ILL_UNTRACE_REF(ill) |
|
1311 |
#define ILL_TRACE_CLEANUP(ill) |
|
1312 |
#define IPIF_TRACE_CLEANUP(ipif) |
|
1313 |
#endif |
|
1314 |
||
1315 |
/* IPv4 compatability macros */ |
|
1316 |
#define ipif_lcl_addr V4_PART_OF_V6(ipif_v6lcl_addr) |
|
1317 |
#define ipif_src_addr V4_PART_OF_V6(ipif_v6src_addr) |
|
1318 |
#define ipif_subnet V4_PART_OF_V6(ipif_v6subnet) |
|
1319 |
#define ipif_net_mask V4_PART_OF_V6(ipif_v6net_mask) |
|
1320 |
#define ipif_brd_addr V4_PART_OF_V6(ipif_v6brd_addr) |
|
1321 |
#define ipif_pp_dst_addr V4_PART_OF_V6(ipif_v6pp_dst_addr) |
|
1322 |
||
1323 |
/* Macros for easy backreferences to the ill. */ |
|
1324 |
#define ipif_wq ipif_ill->ill_wq |
|
1325 |
#define ipif_rq ipif_ill->ill_rq |
|
1326 |
#define ipif_net_type ipif_ill->ill_net_type |
|
1327 |
#define ipif_resolver_mp ipif_ill->ill_resolver_mp |
|
1328 |
#define ipif_ipif_up_count ipif_ill->ill_ipif_up_count |
|
1329 |
#define ipif_bcast_mp ipif_ill->ill_bcast_mp |
|
1330 |
#define ipif_type ipif_ill->ill_type |
|
1331 |
#define ipif_isv6 ipif_ill->ill_isv6 |
|
1332 |
||
1333 |
#define SIOCLIFADDR_NDX 112 /* ndx of SIOCLIFADDR in the ndx ioctl table */ |
|
1334 |
||
1335 |
/* |
|
1336 |
* mode value for ip_ioctl_finish for finishing an ioctl |
|
1337 |
*/ |
|
1338 |
#define CONN_CLOSE 1 /* No mi_copy */ |
|
1339 |
#define COPYOUT 2 /* do an mi_copyout if needed */ |
|
1340 |
#define NO_COPYOUT 3 /* do an mi_copy_done */ |
|
1341 |
||
1342 |
/* |
|
1343 |
* The IP-MT design revolves around the serialization object ipsq_t. |
|
1344 |
* It is associated with an IPMP group. If IPMP is not enabled, there is |
|
1345 |
* 1 ipsq_t per phyint. Eg. an ipsq_t would cover both hme0's IPv4 stream |
|
1346 |
* |
|
1347 |
* ipsq_lock protects |
|
1348 |
* ipsq_reentry_cnt, ipsq_writer, ipsq_xopq_mphead, ipsq_xopq_mptail, |
|
1349 |
* ipsq_mphead, ipsq_mptail, ipsq_split |
|
1350 |
* |
|
1351 |
* ipsq_pending_ipif, ipsq_current_ipif, ipsq_pending_mp, ipsq_flags, |
|
1352 |
* ipsq_waitfor |
|
1353 |
* |
|
1354 |
* The fields in the last line above below are set mostly by a writer thread |
|
1355 |
* But there is an exception in the last call to ipif_ill_refrele_tail which |
|
1356 |
* could also race with a conn close which could be cleaning up the |
|
1357 |
* fields. So we choose to protect using ipsq_lock instead of depending on |
|
1358 |
* the property of the writer. |
|
1359 |
* ill_g_lock protects |
|
1360 |
* ipsq_refs, ipsq_phyint_list |
|
1361 |
*/ |
|
1362 |
typedef struct ipsq_s { |
|
1363 |
kmutex_t ipsq_lock; |
|
1364 |
int ipsq_reentry_cnt; |
|
1365 |
kthread_t *ipsq_writer; /* current owner (thread id) */ |
|
1366 |
int ipsq_flags; |
|
1367 |
mblk_t *ipsq_xopq_mphead; /* list of excl ops mostly ioctls */ |
|
1368 |
mblk_t *ipsq_xopq_mptail; |
|
1369 |
mblk_t *ipsq_mphead; /* msgs on ipsq linked thru b_next */ |
|
1370 |
mblk_t *ipsq_mptail; /* msgs on ipsq linked thru b_next */ |
|
1371 |
ipif_t *ipsq_pending_ipif; /* ipif associated w. ipsq_pending_mp */ |
|
1372 |
ipif_t *ipsq_current_ipif; /* ipif associated with current ioctl */ |
|
1373 |
mblk_t *ipsq_pending_mp; /* current ioctl mp while waiting for */ |
|
1374 |
/* response from another module */ |
|
1375 |
struct ipsq_s *ipsq_next; /* list of all syncq's (ipsq_g_list) */ |
|
1376 |
uint_t ipsq_refs; /* Number of phyints on this ipsq */ |
|
1377 |
struct phyint *ipsq_phyint_list; /* List of phyints on this ipsq */ |
|
1378 |
boolean_t ipsq_split; /* ipsq may need to be split */ |
|
1379 |
int ipsq_waitfor; /* Values encoded below */ |
|
1380 |
char ipsq_name[LIFNAMSIZ+1]; /* same as phyint_groupname */ |
|
1381 |
int ipsq_last_cmd; /* debugging aid */ |
|
1382 |
#ifdef ILL_DEBUG |
|
1383 |
int ipsq_depth; /* debugging aid */ |
|
1384 |
pc_t ipsq_stack[IP_STACK_DEPTH]; /* debugging aid */ |
|
1385 |
#endif |
|
1386 |
} ipsq_t; |
|
1387 |
||
1388 |
/* ipsq_flags */ |
|
1389 |
#define IPSQ_GROUP 0x1 /* This ipsq belongs to an IPMP group */ |
|
1390 |
||
1391 |
/* |
|
1392 |
* ipsq_waitfor: |
|
1393 |
* |
|
1394 |
* IPIF_DOWN 1 ipif_down waiting for refcnts to drop |
|
1395 |
* ILL_DOWN 2 ill_down waiting for refcnts to drop |
|
1396 |
* IPIF_FREE 3 ipif_free waiting for refcnts to drop |
|
1397 |
* ILL_FREE 4 ill unplumb waiting for refcnts to drop |
|
1398 |
* ILL_MOVE_OK 5 failover waiting for refcnts to drop |
|
1399 |
*/ |
|
1400 |
||
1401 |
enum { IPIF_DOWN = 1, ILL_DOWN, IPIF_FREE, ILL_FREE, ILL_MOVE_OK }; |
|
1402 |
||
1403 |
/* Flags passed to ipsq_try_enter */ |
|
1404 |
#define CUR_OP 0 /* Current ioctl continuing again */ |
|
1405 |
#define NEW_OP 1 /* New ioctl starting afresh */ |
|
1406 |
||
1407 |
/* |
|
1408 |
* phyint represents state that is common to both IPv4 and IPv6 interfaces. |
|
1409 |
* There is a separate ill_t representing IPv4 and IPv6 which has a |
|
1410 |
* backpointer to the phyint structure for acessing common state. |
|
1411 |
* |
|
1412 |
* NOTE : It just stores the group name as there is only one name for |
|
1413 |
* IPv4 and IPv6 i.e it is a underlying link property. Actually |
|
1414 |
* IPv4 and IPv6 ill are grouped together when their phyints have |
|
1415 |
* the same name. |
|
1416 |
*/ |
|
1417 |
typedef struct phyint { |
|
1418 |
struct ill_s *phyint_illv4; |
|
1419 |
struct ill_s *phyint_illv6; |
|
1420 |
uint_t phyint_ifindex; /* SIOCLSLIFINDEX */ |
|
1421 |
uint_t phyint_notify_delay; /* SIOCSLIFNOTIFYDELAY */ |
|
1422 |
char *phyint_groupname; /* SIOCSLIFGROUPNAME */ |
|
1423 |
uint_t phyint_groupname_len; |
|
1424 |
uint64_t phyint_flags; |
|
1425 |
avl_node_t phyint_avl_by_index; /* avl tree by index */ |
|
1426 |
avl_node_t phyint_avl_by_name; /* avl tree by name */ |
|
1427 |
kmutex_t phyint_lock; |
|
1428 |
struct ipsq_s *phyint_ipsq; /* back pointer to ipsq */ |
|
1429 |
struct phyint *phyint_ipsq_next; /* phyint list on this ipsq */ |
|
1430 |
} phyint_t; |
|
1431 |
||
1432 |
#define CACHE_ALIGN_SIZE 64 |
|
1433 |
||
1434 |
#define CACHE_ALIGN(align_struct) P2ROUNDUP(sizeof (struct align_struct),\ |
|
1435 |
CACHE_ALIGN_SIZE) |
|
1436 |
struct _phyint_list_s_ { |
|
1437 |
avl_tree_t phyint_list_avl_by_index; /* avl tree by index */ |
|
1438 |
avl_tree_t phyint_list_avl_by_name; /* avl tree by name */ |
|
1439 |
}; |
|
1440 |
||
1441 |
typedef union phyint_list_u { |
|
1442 |
struct _phyint_list_s_ phyint_list_s; |
|
1443 |
char phyint_list_filler[CACHE_ALIGN(_phyint_list_s_)]; |
|
1444 |
} phyint_list_t; |
|
1445 |
||
1446 |
#define phyint_list_avl_by_index phyint_list_s.phyint_list_avl_by_index |
|
1447 |
#define phyint_list_avl_by_name phyint_list_s.phyint_list_avl_by_name |
|
1448 |
/* |
|
1449 |
* ILL groups. We group ills, |
|
1450 |
* |
|
1451 |
* - if the ills have the same group name. (New way) |
|
1452 |
* |
|
1453 |
* ill_group locking notes: |
|
1454 |
* |
|
1455 |
* illgrp_lock protects ill_grp_ill_schednext. |
|
1456 |
* |
|
1457 |
* ill_g_lock protects ill_grp_next, illgrp_ill, illgrp_ill_count. |
|
1458 |
* Holding ill_g_lock freezes the memberships of ills in IPMP groups. |
|
1459 |
* It also freezes the global list of ills and all ipifs in all ills. |
|
1460 |
* |
|
1461 |
* To remove an ipif from the linked list of ipifs of that ill ipif_free_tail |
|
1462 |
* holds both ill_g_lock, and ill_lock. Similarly to remove an ill from the |
|
1463 |
* global list of ills, ill_delete_glist holds ill_g_lock as writer. |
|
1464 |
* This simplifies things for ipif_select_source, illgrp_scheduler etc. |
|
1465 |
* that need to walk the members of an illgrp. They just hold ill_g_lock |
|
1466 |
* as reader to do the walk. |
|
1467 |
* |
|
1468 |
*/ |
|
1469 |
typedef struct ill_group { |
|
1470 |
kmutex_t illgrp_lock; |
|
1471 |
struct ill_group *illgrp_next; /* Next ill_group */ |
|
1472 |
struct ill_s *illgrp_ill_schednext; /* Next ill to be scheduled */ |
|
1473 |
struct ill_s *illgrp_ill; /* First ill in the group */ |
|
1474 |
int illgrp_ill_count; |
|
1475 |
} ill_group_t; |
|
1476 |
||
1477 |
extern ill_group_t *illgrp_head_v6; |
|
1478 |
||
1479 |
/* |
|
1480 |
* Fragmentation hash bucket |
|
1481 |
*/ |
|
1482 |
typedef struct ipfb_s { |
|
1483 |
struct ipf_s *ipfb_ipf; /* List of ... */ |
|
1484 |
size_t ipfb_count; /* Count of bytes used by frag(s) */ |
|
1485 |
kmutex_t ipfb_lock; /* Protect all ipf in list */ |
|
1486 |
uint_t ipfb_frag_pkts; /* num of distinct fragmented pkts */ |
|
1487 |
} ipfb_t; |
|
1488 |
||
1489 |
/* |
|
1490 |
* IRE bucket structure. Usually there is an array of such structures, |
|
1491 |
* each pointing to a linked list of ires. irb_refcnt counts the number |
|
1492 |
* of walkers of a given hash bucket. Usually the reference count is |
|
1493 |
* bumped up if the walker wants no IRES to be DELETED while walking the |
|
1494 |
* list. Bumping up does not PREVENT ADDITION. This allows walking a given |
|
1495 |
* hash bucket without stumbling up on a free pointer. |
|
1496 |
*/ |
|
1497 |
typedef struct irb { |
|
1498 |
struct ire_s *irb_ire; /* First ire in this bucket */ |
|
1499 |
/* Should be first in this struct */ |
|
1500 |
krwlock_t irb_lock; /* Protect this bucket */ |
|
1501 |
uint_t irb_refcnt; /* Protected by irb_lock */ |
|
1502 |
uchar_t irb_marks; /* CONDEMNED ires in this bucket ? */ |
|
1503 |
uint_t irb_ire_cnt; /* Num of IRE in this bucket */ |
|
1504 |
uint_t irb_tmp_ire_cnt; /* Num of temporary IRE */ |
|
1505 |
} irb_t; |
|
1506 |
||
1507 |
#define IP_V4_G_HEAD 0 |
|
1508 |
#define IP_V6_G_HEAD 1 |
|
1509 |
||
1510 |
#define MAX_G_HEADS 2 |
|
1511 |
||
1512 |
/* |
|
1513 |
* unpadded ill_if structure |
|
1514 |
*/ |
|
1515 |
struct _ill_if_s_ { |
|
1516 |
union ill_if_u *illif_next; |
|
1517 |
union ill_if_u *illif_prev; |
|
1518 |
avl_tree_t illif_avl_by_ppa; /* AVL tree sorted on ppa */ |
|
1519 |
vmem_t *illif_ppa_arena; /* ppa index space */ |
|
1520 |
uint16_t illif_mcast_v1; /* hints for */ |
|
1521 |
uint16_t illif_mcast_v2; /* [igmp|mld]_slowtimo */ |
|
1522 |
int illif_name_len; /* name length */ |
|
1523 |
char illif_name[LIFNAMSIZ]; /* name of interface type */ |
|
1524 |
}; |
|
1525 |
||
1526 |
/* cache aligned ill_if structure */ |
|
1527 |
typedef union ill_if_u { |
|
1528 |
struct _ill_if_s_ ill_if_s; |
|
1529 |
char illif_filler[CACHE_ALIGN(_ill_if_s_)]; |
|
1530 |
} ill_if_t; |
|
1531 |
||
1532 |
||
1533 |
#define illif_next ill_if_s.illif_next |
|
1534 |
#define illif_prev ill_if_s.illif_prev |
|
1535 |
#define illif_avl_by_ppa ill_if_s.illif_avl_by_ppa |
|
1536 |
#define illif_ppa_arena ill_if_s.illif_ppa_arena |
|
1537 |
#define illif_mcast_v1 ill_if_s.illif_mcast_v1 |
|
1538 |
#define illif_mcast_v2 ill_if_s.illif_mcast_v2 |
|
1539 |
#define illif_name ill_if_s.illif_name |
|
1540 |
#define illif_name_len ill_if_s.illif_name_len |
|
1541 |
||
1542 |
typedef struct ill_walk_context_s { |
|
1543 |
int ctx_current_list; /* current list being searched */ |
|
1544 |
int ctx_last_list; /* last list to search */ |
|
1545 |
} ill_walk_context_t; |
|
1546 |
||
1547 |
/* |
|
1548 |
* ill_gheads structure, one for IPV4 and one for IPV6 |
|
1549 |
*/ |
|
1550 |
struct _ill_g_head_s_ { |
|
1551 |
ill_if_t *ill_g_list_head; |
|
1552 |
ill_if_t *ill_g_list_tail; |
|
1553 |
}; |
|
1554 |
||
1555 |
typedef union ill_g_head_u { |
|
1556 |
struct _ill_g_head_s_ ill_g_head_s; |
|
1557 |
char ill_g_head_filler[CACHE_ALIGN(_ill_g_head_s_)]; |
|
1558 |
} ill_g_head_t; |
|
1559 |
||
1560 |
#define ill_g_list_head ill_g_head_s.ill_g_list_head |
|
1561 |
#define ill_g_list_tail ill_g_head_s.ill_g_list_tail |
|
1562 |
||
1563 |
#pragma align CACHE_ALIGN_SIZE(ill_g_heads) |
|
1564 |
extern ill_g_head_t ill_g_heads[]; /* ILL List Head */ |
|
1565 |
||
1566 |
||
1567 |
#define IP_V4_ILL_G_LIST ill_g_heads[IP_V4_G_HEAD].ill_g_list_head |
|
1568 |
#define IP_V6_ILL_G_LIST ill_g_heads[IP_V6_G_HEAD].ill_g_list_head |
|
1569 |
#define IP_VX_ILL_G_LIST(i) ill_g_heads[i].ill_g_list_head |
|
1570 |
||
1571 |
#define ILL_START_WALK_V4(ctx_ptr) ill_first(IP_V4_G_HEAD, IP_V4_G_HEAD, \ |
|
1572 |
ctx_ptr) |
|
1573 |
#define ILL_START_WALK_V6(ctx_ptr) ill_first(IP_V6_G_HEAD, IP_V6_G_HEAD, \ |
|
1574 |
ctx_ptr) |
|
1575 |
#define ILL_START_WALK_ALL(ctx_ptr) ill_first(MAX_G_HEADS, MAX_G_HEADS, \ |
|
1576 |
ctx_ptr) |
|
1577 |
||
1578 |
/* |
|
1579 |
* Capabilities, possible flags for ill_capabilities. |
|
1580 |
*/ |
|
1581 |
||
1582 |
#define ILL_CAPAB_AH 0x01 /* IPsec AH acceleration */ |
|
1583 |
#define ILL_CAPAB_ESP 0x02 /* IPsec ESP acceleration */ |
|
1584 |
#define ILL_CAPAB_MDT 0x04 /* Multidata Transmit */ |
|
1585 |
#define ILL_CAPAB_HCKSUM 0x08 /* Hardware checksumming */ |
|
1586 |
#define ILL_CAPAB_ZEROCOPY 0x10 /* Zero-copy */ |
|
1587 |
#define ILL_CAPAB_POLL 0x20 /* Polling Toggle */ |
|
1588 |
||
1589 |
/* |
|
1590 |
* Per-ill Multidata Transmit capabilities. |
|
1591 |
*/ |
|
1592 |
typedef struct ill_mdt_capab_s ill_mdt_capab_t; |
|
1593 |
||
1594 |
/* |
|
1595 |
* Per-ill IPsec capabilities. |
|
1596 |
*/ |
|
1597 |
typedef struct ill_ipsec_capab_s ill_ipsec_capab_t; |
|
1598 |
||
1599 |
/* |
|
1600 |
* Per-ill Hardware Checksumming capbilities. |
|
1601 |
*/ |
|
1602 |
typedef struct ill_hcksum_capab_s ill_hcksum_capab_t; |
|
1603 |
||
1604 |
/* |
|
1605 |
* Per-ill Zero-copy capabilities. |
|
1606 |
*/ |
|
1607 |
typedef struct ill_zerocopy_capab_s ill_zerocopy_capab_t; |
|
1608 |
||
1609 |
/* |
|
1610 |
* Per-ill Polling capbilities. |
|
1611 |
*/ |
|
1612 |
typedef struct ill_poll_capab_s ill_poll_capab_t; |
|
1613 |
||
1614 |
/* |
|
1615 |
* Per-ill polling resource map. |
|
1616 |
*/ |
|
1617 |
typedef struct ill_rx_ring ill_rx_ring_t; |
|
1618 |
||
1619 |
/* The following are ill_state_flags */ |
|
1620 |
#define ILL_LL_SUBNET_PENDING 0x01 /* Waiting for DL_INFO_ACK from drv */ |
|
1621 |
#define ILL_CONDEMNED 0x02 /* No more new ref's to the ILL */ |
|
1622 |
#define ILL_CHANGING 0x04 /* ILL not globally visible */ |
|
1623 |
#define ILL_DL_UNBIND_DONE 0x08 /* UNBIND_REQ has been Acked */ |
|
1624 |
||
1625 |
/* Is this an ILL whose source address is used by other ILL's ? */ |
|
1626 |
#define IS_USESRC_ILL(ill) \ |
|
1627 |
(((ill)->ill_usesrc_ifindex == 0) && \ |
|
1628 |
((ill)->ill_usesrc_grp_next != NULL)) \ |
|
1629 |
||
1630 |
/* Is this a client/consumer of the usesrc ILL ? */ |
|
1631 |
#define IS_USESRC_CLI_ILL(ill) \ |
|
1632 |
(((ill)->ill_usesrc_ifindex != 0) && \ |
|
1633 |
((ill)->ill_usesrc_grp_next != NULL)) \ |
|
1634 |
||
1635 |
/* Is this an virtual network interface (vni) ILL ? */ |
|
1636 |
#define IS_VNI(ill) \ |
|
1637 |
(((ill) != NULL) && !((ill)->ill_phyint->phyint_flags & \ |
|
1638 |
PHYI_LOOPBACK) && ((ill)->ill_phyint->phyint_flags & \ |
|
1639 |
PHYI_VIRTUAL)) \ |
|
1640 |
||
1641 |
/* |
|
1642 |
* IP Lower level Structure. |
|
1643 |
* Instance data structure in ip_open when there is a device below us. |
|
1644 |
*/ |
|
1645 |
typedef struct ill_s { |
|
1646 |
ill_if_t *ill_ifptr; /* pointer to interface type */ |
|
1647 |
queue_t *ill_rq; /* Read queue. */ |
|
1648 |
queue_t *ill_wq; /* Write queue. */ |
|
1649 |
||
1650 |
int ill_error; /* Error value sent up by device. */ |
|
1651 |
||
1652 |
ipif_t *ill_ipif; /* Interface chain for this ILL. */ |
|
1653 |
||
1654 |
uint_t ill_ipif_up_count; /* Number of IPIFs currently up. */ |
|
1655 |
uint_t ill_max_frag; /* Max IDU from DLPI. */ |
|
1656 |
char *ill_name; /* Our name. */ |
|
1657 |
uint_t ill_name_length; /* Name length, incl. terminator. */ |
|
1658 |
char *ill_ndd_name; /* Name + ":ip?_forwarding" for NDD. */ |
|
1659 |
uint_t ill_net_type; /* IRE_IF_RESOLVER/IRE_IF_NORESOLVER. */ |
|
1660 |
/* |
|
1661 |
* Physical Point of Attachment num. If DLPI style 1 provider |
|
1662 |
* then this is derived from the devname. |
|
1663 |
*/ |
|
1664 |
uint_t ill_ppa; |
|
1665 |
t_uscalar_t ill_sap; |
|
1666 |
t_scalar_t ill_sap_length; /* Including sign (for position) */ |
|
1667 |
uint_t ill_phys_addr_length; /* Excluding the sap. */ |
|
1668 |
uint_t ill_bcast_addr_length; /* Only set when the DL provider */ |
|
1669 |
/* supports broadcast. */ |
|
1670 |
t_uscalar_t ill_mactype; |
|
1671 |
uint8_t *ill_frag_ptr; /* Reassembly state. */ |
|
1672 |
timeout_id_t ill_frag_timer_id; /* timeout id for the frag timer */ |
|
1673 |
ipfb_t *ill_frag_hash_tbl; /* Fragment hash list head. */ |
|
1674 |
ipif_t *ill_pending_ipif; /* IPIF waiting for DL operation. */ |
|
1675 |
||
1676 |
ilm_t *ill_ilm; /* Multicast mebership for lower ill */ |
|
1677 |
uint_t ill_global_timer; /* for IGMPv3/MLDv2 general queries */ |
|
1678 |
int ill_mcast_type; /* type of router which is querier */ |
|
1679 |
/* on this interface */ |
|
1680 |
uint16_t ill_mcast_v1_time; /* # slow timeouts since last v1 qry */ |
|
1681 |
uint16_t ill_mcast_v2_time; /* # slow timeouts since last v2 qry */ |
|
1682 |
uint8_t ill_mcast_v1_tset; /* 1 => timer is set; 0 => not set */ |
|
1683 |
uint8_t ill_mcast_v2_tset; /* 1 => timer is set; 0 => not set */ |
|
1684 |
||
1685 |
uint8_t ill_mcast_rv; /* IGMPv3/MLDv2 robustness variable */ |
|
1686 |
int ill_mcast_qi; /* IGMPv3/MLDv2 query interval var */ |
|
1687 |
||
1688 |
mblk_t *ill_pending_mp; /* IOCTL/DLPI awaiting completion. */ |
|
1689 |
/* |
|
1690 |
* All non-NULL cells between 'ill_first_mp_to_free' and |
|
1691 |
* 'ill_last_mp_to_free' are freed in ill_delete. |
|
1692 |
*/ |
|
1693 |
#define ill_first_mp_to_free ill_bcast_mp |
|
1694 |
mblk_t *ill_bcast_mp; /* DLPI header for broadcasts. */ |
|
1695 |
mblk_t *ill_resolver_mp; /* Resolver template. */ |
|
1696 |
mblk_t *ill_detach_mp; /* detach mp, or NULL if style1 */ |
|
1697 |
mblk_t *ill_unbind_mp; /* unbind mp from ill_dl_up() */ |
|
1698 |
mblk_t *ill_dlpi_deferred; /* b_next chain of control messages */ |
|
1699 |
mblk_t *ill_phys_addr_mp; /* mblk which holds ill_phys_addr */ |
|
1700 |
#define ill_last_mp_to_free ill_phys_addr_mp |
|
1701 |
||
1702 |
cred_t *ill_credp; /* opener's credentials */ |
|
1703 |
uint8_t *ill_phys_addr; /* ill_phys_addr_mp->b_rptr + off */ |
|
1704 |
||
1705 |
uint_t ill_state_flags; /* see ILL_* flags above */ |
|
1706 |
||
1707 |
/* Following bit fields protected by ipsq_t */ |
|
1708 |
uint_t |
|
1709 |
ill_needs_attach : 1, |
|
1710 |
ill_reserved : 1, |
|
1711 |
ill_isv6 : 1, |
|
1712 |
ill_dlpi_style_set : 1, |
|
1713 |
||
1714 |
ill_ifname_pending : 1, |
|
1715 |
ill_move_in_progress : 1, /* FAILOVER/FAILBACK in progress */ |
|
1716 |
ill_join_allmulti : 1, |
|
1717 |
ill_logical_down : 1, |
|
1718 |
||
1719 |
ill_is_6to4tun : 1, /* Interface is a 6to4 tunnel */ |
|
1720 |
ill_promisc_on_phys : 1, /* phys interface in promisc mode */ |
|
1721 |
ill_dl_up : 1, |
|
1722 |
ill_up_ipifs : 1, |
|
1723 |
||
1724 |
ill_pad_to_bit_31 : 20; |
|
1725 |
||
1726 |
/* Following bit fields protected by ill_lock */ |
|
1727 |
uint_t |
|
1728 |
ill_fragtimer_executing : 1, |
|
1729 |
ill_fragtimer_needrestart : 1, |
|
1730 |
ill_ilm_cleanup_reqd : 1, |
|
1731 |
ill_arp_closing : 1, |
|
1732 |
||
1733 |
ill_arp_bringup_pending : 1, |
|
1734 |
ill_mtu_userspecified : 1, /* SIOCSLNKINFO has set the mtu */ |
|
1735 |
ill_pad_bit_31 : 26; |
|
1736 |
||
1737 |
/* |
|
1738 |
* Used in SIOCSIFMUXID and SIOCGIFMUXID for 'ifconfig unplumb'. |
|
1739 |
*/ |
|
1740 |
int ill_arp_muxid; /* muxid returned from plink for arp */ |
|
1741 |
int ill_ip_muxid; /* muxid returned from plink for ip */ |
|
1742 |
||
1743 |
/* |
|
1744 |
* Used for IP frag reassembly throttling on a per ILL basis. |
|
1745 |
* |
|
1746 |
* Note: frag_count is approximate, its added to and subtracted from |
|
1747 |
* without any locking, so simultaneous load/modify/stores can |
|
1748 |
* collide, also ill_frag_purge() recalculates its value by |
|
1749 |
* summing all the ipfb_count's without locking out updates |
|
1750 |
* to the ipfb's. |
|
1751 |
*/ |
|
1752 |
uint_t ill_ipf_gen; /* Generation of next fragment queue */ |
|
1753 |
uint_t ill_frag_count; /* Approx count of all mblk bytes */ |
|
1754 |
uint_t ill_frag_free_num_pkts; /* num of fragmented packets to free */ |
|
1755 |
clock_t ill_last_frag_clean_time; /* time when frag's were pruned */ |
|
1756 |
int ill_type; /* From <net/if_types.h> */ |
|
1757 |
uint_t ill_dlpi_multicast_state; /* See below IDMS_* */ |
|
1758 |
uint_t ill_dlpi_fastpath_state; /* See below IDMS_* */ |
|
1759 |
||
1760 |
/* |
|
1761 |
* Capabilities related fields. |
|
1762 |
*/ |
|
1763 |
uint_t ill_capab_state; /* State of capability query, IDMS_* */ |
|
1764 |
uint64_t ill_capabilities; /* Enabled capabilities, ILL_CAPAB_* */ |
|
1765 |
ill_mdt_capab_t *ill_mdt_capab; /* Multidata Transmit capabilities */ |
|
1766 |
ill_ipsec_capab_t *ill_ipsec_capab_ah; /* IPsec AH capabilities */ |
|
1767 |
ill_ipsec_capab_t *ill_ipsec_capab_esp; /* IPsec ESP capabilities */ |
|
1768 |
ill_hcksum_capab_t *ill_hcksum_capab; /* H/W cksumming capabilities */ |
|
1769 |
ill_zerocopy_capab_t *ill_zerocopy_capab; /* Zero-copy capabilities */ |
|
1770 |
ill_poll_capab_t *ill_poll_capab; /* Polling capabilities */ |
|
1771 |
||
1772 |
/* |
|
1773 |
* New fields for IPv6 |
|
1774 |
*/ |
|
1775 |
uint8_t ill_max_hops; /* Maximum hops for any logical interface */ |
|
1776 |
uint_t ill_max_mtu; /* Maximum MTU for any logical interface */ |
|
1777 |
uint32_t ill_reachable_time; /* Value for ND algorithm in msec */ |
|
1778 |
uint32_t ill_reachable_retrans_time; /* Value for ND algorithm msec */ |
|
1779 |
uint_t ill_max_buf; /* Max # of req to buffer for ND */ |
|
1780 |
in6_addr_t ill_token; |
|
1781 |
uint_t ill_token_length; |
|
1782 |
uint32_t ill_xmit_count; /* ndp max multicast xmits */ |
|
1783 |
mib2_ipv6IfStatsEntry_t *ill_ip6_mib; /* Per interface mib */ |
|
1784 |
mib2_ipv6IfIcmpEntry_t *ill_icmp6_mib; /* Per interface mib */ |
|
1785 |
/* |
|
1786 |
* Following two mblks are allocated common to all |
|
1787 |
* the ipifs when the first interface is coming up. |
|
1788 |
* It is sent up to arp when the last ipif is coming |
|
1789 |
* down. |
|
1790 |
*/ |
|
1791 |
mblk_t *ill_arp_down_mp; |
|
1792 |
mblk_t *ill_arp_del_mapping_mp; |
|
1793 |
/* |
|
1794 |
* Used for implementing IFF_NOARP. As IFF_NOARP is used |
|
1795 |
* to turn off for all the logicals, it is here instead |
|
1796 |
* of the ipif. |
|
1797 |
*/ |
|
1798 |
mblk_t *ill_arp_on_mp; |
|
1799 |
/* Peer ill of an IPMP move operation */ |
|
1800 |
struct ill_s *ill_move_peer; |
|
1801 |
||
1802 |
phyint_t *ill_phyint; |
|
1803 |
uint64_t ill_flags; |
|
1804 |
ill_group_t *ill_group; |
|
1805 |
struct ill_s *ill_group_next; |
|
1806 |
/* |
|
1807 |
* Reverse tunnel related count. This count |
|
1808 |
* determines how many mobile nodes are using this |
|
1809 |
* ill to send packet to reverse tunnel via foreign |
|
1810 |
* agent. A non-zero count specifies presence of |
|
1811 |
* mobile node(s) using reverse tunnel through this |
|
1812 |
* interface. |
|
1813 |
*/ |
|
1814 |
uint32_t ill_mrtun_refcnt; |
|
1815 |
||
1816 |
/* |
|
1817 |
* This count is bumped up when a route is added with |
|
1818 |
* RTA_SRCIFP bit flag using routing socket. |
|
1819 |
*/ |
|
1820 |
uint32_t ill_srcif_refcnt; |
|
1821 |
/* |
|
1822 |
* Pointer to the special interface based routing table. |
|
1823 |
* This routing table is created dynamically when RTA_SRCIFP |
|
1824 |
* is set by the routing socket. |
|
1825 |
*/ |
|
1826 |
irb_t *ill_srcif_table; |
|
1827 |
kmutex_t ill_lock; /* Please see table below */ |
|
1828 |
/* |
|
1829 |
* The ill_nd_lla* fields handle the link layer address option |
|
1830 |
* from neighbor discovery. This is used for external IPv6 |
|
1831 |
* address resolution. |
|
1832 |
*/ |
|
1833 |
mblk_t *ill_nd_lla_mp; /* mblk which holds ill_nd_lla */ |
|
1834 |
uint8_t *ill_nd_lla; /* Link Layer Address */ |
|
1835 |
uint_t ill_nd_lla_len; /* Link Layer Address length */ |
|
1836 |
/* |
|
1837 |
* We now have 3 phys_addr_req's sent down. This field keeps track |
|
1838 |
* of which one is pending. |
|
1839 |
*/ |
|
1840 |
t_uscalar_t ill_phys_addr_pend; /* which dl_phys_addr_req pending */ |
|
1841 |
/* |
|
1842 |
* Used to save errors that occur during plumbing |
|
1843 |
*/ |
|
1844 |
uint_t ill_ifname_pending_err; |
|
1845 |
avl_node_t ill_avl_byppa; /* avl node based on ppa */ |
|
1846 |
void *ill_fastpath_list; /* both ire and nce hang off this */ |
|
1847 |
uint_t ill_refcnt; /* active refcnt by threads */ |
|
1848 |
uint_t ill_ire_cnt; /* ires associated with this ill */ |
|
1849 |
kcondvar_t ill_cv; |
|
1850 |
uint_t ill_ilm_walker_cnt; /* snmp ilm walkers */ |
|
1851 |
uint_t ill_nce_cnt; /* nces associated with this ill */ |
|
1852 |
uint_t ill_waiters; /* threads waiting in ipsq_enter */ |
|
1853 |
/* |
|
1854 |
* Contains the upper read queue pointer of the module immediately |
|
1855 |
* beneath IP. This field allows IP to validate sub-capability |
|
1856 |
* acknowledgments coming up from downstream. |
|
1857 |
*/ |
|
1858 |
queue_t *ill_lmod_rq; /* read queue pointer of module below */ |
|
1859 |
uint_t ill_lmod_cnt; /* number of modules beneath IP */ |
|
1860 |
ip_m_t *ill_media; /* media specific params/functions */ |
|
1861 |
t_uscalar_t ill_dlpi_pending; /* Last DLPI primitive issued */ |
|
1862 |
uint_t ill_usesrc_ifindex; /* use src addr from this ILL */ |
|
1863 |
struct ill_s *ill_usesrc_grp_next; /* Next ILL in the usesrc group */ |
|
1864 |
#ifdef ILL_DEBUG |
|
1865 |
th_trace_t *ill_trace[IP_TR_HASH_MAX]; |
|
1866 |
boolean_t ill_trace_disable; /* True when alloc fails */ |
|
1867 |
#endif |
|
1868 |
} ill_t; |
|
1869 |
||
1870 |
extern void ill_delete_glist(ill_t *); |
|
1871 |
||
1872 |
/* |
|
1873 |
* The following table lists the protection levels of the various members |
|
1874 |
* of the ill_t. Same notation as that used for ipif_t above is used. |
|
1875 |
* |
|
1876 |
* Write Read |
|
1877 |
* |
|
1878 |
* ill_ifptr ill_g_lock + s Write once |
|
1879 |
* ill_rq ipsq Write once |
|
1880 |
* ill_wq ipsq Write once |
|
1881 |
* |
|
1882 |
* ill_error ipsq None |
|
1883 |
* ill_ipif ill_g_lock + ipsq ill_g_lock OR ipsq |
|
1884 |
* ill_ipif_up_count ill_lock + ipsq ill_lock |
|
1885 |
* ill_max_frag ipsq Write once |
|
1886 |
* |
|
1887 |
* ill_name ill_g_lock + ipsq Write once |
|
1888 |
* ill_name_length ill_g_lock + ipsq Write once |
|
1889 |
* ill_ndd_name ipsq Write once |
|
1890 |
* ill_net_type ipsq Write once |
|
1891 |
* ill_ppa ill_g_lock + ipsq Write once |
|
1892 |
* ill_sap ipsq + down ill Write once |
|
1893 |
* ill_sap_length ipsq + down ill Write once |
|
1894 |
* ill_phys_addr_length ipsq + down ill Write once |
|
1895 |
* |
|
1896 |
* ill_bcast_addr_length ipsq ipsq |
|
1897 |
* ill_mactype ipsq ipsq |
|
1898 |
* ill_frag_ptr ipsq ipsq |
|
1899 |
* |
|
1900 |
* ill_frag_timer_id ill_lock ill_lock |
|
1901 |
* ill_frag_hash_tbl ipsq up ill |
|
1902 |
* ill_ilm ipsq + ill_lock ill_lock |
|
1903 |
* ill_mcast_type ill_lock ill_lock |
|
1904 |
* ill_mcast_v1_time ill_lock ill_lock |
|
1905 |
* ill_mcast_v2_time ill_lock ill_lock |
|
1906 |
* ill_mcast_v1_tset ill_lock ill_lock |
|
1907 |
* ill_mcast_v2_tset ill_lock ill_lock |
|
1908 |
* ill_mcast_rv ill_lock ill_lock |
|
1909 |
* ill_mcast_qi ill_lock ill_lock |
|
1910 |
* ill_pending_mp ill_lock ill_lock |
|
1911 |
* |
|
1912 |
* ill_bcast_mp ipsq ipsq |
|
1913 |
* ill_resolver_mp ipsq only when ill is up |
|
1914 |
* ill_down_mp ipsq ipsq |
|
1915 |
* ill_dlpi_deferred ipsq ipsq |
|
1916 |
* ill_phys_addr_mp ipsq ipsq |
|
1917 |
* ill_phys_addr ipsq up ill |
|
1918 |
* ill_ick ipsq + down ill only when ill is up |
|
1919 |
* |
|
1920 |
* ill_state_flags ill_lock ill_lock |
|
1921 |
* exclusive bit flags ipsq_t ipsq_t |
|
1922 |
* shared bit flags ill_lock ill_lock |
|
1923 |
* |
|
1924 |
* ill_arp_muxid ipsq Not atomic |
|
1925 |
* ill_ip_muxid ipsq Not atomic |
|
1926 |
* |
|
1927 |
* ill_ipf_gen Not atomic |
|
1928 |
* ill_frag_count Approx. not protected |
|
1929 |
* ill_type ipsq + down ill only when ill is up |
|
1930 |
* ill_dlpi_multicast_state ill_lock ill_lock |
|
1931 |
* ill_dlpi_fastpath_state ill_lock ill_lock |
|
1932 |
* ill_max_hops ipsq Not atomic |
|
1933 |
* |
|
1934 |
* ill_max_mtu |
|
1935 |
* |
|
1936 |
* ill_reachable_time ipsq + ill_lock ill_lock |
|
1937 |
* ill_reachable_retrans_time ipsq + ill_lock ill_lock |
|
1938 |
* ill_max_buf ipsq + ill_lock ill_lock |
|
1939 |
* |
|
1940 |
* Next 2 fields need ill_lock because of the get ioctls. They should not |
|
1941 |
* report partially updated results without executing in the ipsq. |
|
1942 |
* ill_token ipsq + ill_lock ill_lock |
|
1943 |
* ill_token_length ipsq + ill_lock ill_lock |
|
1944 |
* ill_xmit_count ipsq + down ill write once |
|
1945 |
* ill_ip6_mib ipsq + down ill only when ill is up |
|
1946 |
* ill_icmp6_mib ipsq + down ill only when ill is up |
|
1947 |
* ill_arp_down_mp ipsq ipsq |
|
1948 |
* ill_arp_del_mapping_mp ipsq ipsq |
|
1949 |
* ill_arp_on_mp ipsq ipsq |
|
1950 |
* ill_move_peer ipsq ipsq |
|
1951 |
* |
|
1952 |
* ill_phyint ipsq, ill_g_lock, ill_lock Any of them |
|
1953 |
* ill_flags ill_lock ill_lock |
|
1954 |
* ill_group ipsq, ill_g_lock, ill_lock Any of them |
|
1955 |
* ill_group_next ipsq, ill_g_lock, ill_lock Any of them |
|
1956 |
* ill_mrtun_refcnt ill_lock ill_lock |
|
1957 |
* ill_srcif_refcnt ill_lock ill_lock |
|
1958 |
* ill_srcif_table ill_lock ill_lock |
|
1959 |
* ill_nd_lla_mp ill_lock ill_lock |
|
1960 |
* ill_nd_lla ill_lock ill_lock |
|
1961 |
* ill_nd_lla_len ill_lock ill_lock |
|
1962 |
* ill_phys_addr_pend ipsq + down ill only when ill is up |
|
1963 |
* ill_ifname_pending_err ipsq ipsq |
|
1964 |
* ill_avl_byppa ipsq, ill_g_lock Write once |
|
1965 |
* |
|
1966 |
* ill_fastpath_list ill_lock ill_lock |
|
1967 |
* ill_refcnt ill_lock ill_lock |
|
1968 |
* ill_ire_cnt ill_lock ill_lock |
|
1969 |
* ill_cv ill_lock ill_lock |
|
1970 |
* ill_ilm_walker_cnt ill_lock ill_lock |
|
1971 |
* ill_nce_cnt ill_lock ill_lock |
|
1972 |
* ill_trace ill_lock ill_lock |
|
1973 |
* ill_usesrc_grp_next ill_g_usesrc_lock ill_g_usesrc_lock |
|
1974 |
*/ |
|
1975 |
||
1976 |
/* |
|
1977 |
* For ioctl restart mechanism see ip_reprocess_ioctl() |
|
1978 |
*/ |
|
1979 |
struct ip_ioctl_cmd_s; |
|
1980 |
||
1981 |
typedef int (*ifunc_t)(ipif_t *, struct sockaddr_in *, queue_t *, mblk_t *, |
|
1982 |
struct ip_ioctl_cmd_s *, void *); |
|
1983 |
||
1984 |
typedef struct ip_ioctl_cmd_s { |
|
1985 |
int ipi_cmd; |
|
1986 |
size_t ipi_copyin_size; |
|
1987 |
uint_t ipi_flags; |
|
1988 |
uint_t ipi_cmd_type; |
|
1989 |
ifunc_t ipi_func; |
|
1990 |
ifunc_t ipi_func_restart; |
|
1991 |
} ip_ioctl_cmd_t; |
|
1992 |
||
1993 |
/* |
|
1994 |
* ipi_cmd_type: |
|
1995 |
* |
|
1996 |
* IF_CMD 1 old style ifreq cmd |
|
1997 |
* LIF_CMD 2 new style lifreq cmd |
|
1998 |
* MISC_CMD 3 Misc. (non [l]ifreq, tun) cmds |
|
1999 |
* TUN_CMD 4 tunnel related |
|
2000 |
*/ |
|
2001 |
||
2002 |
enum { IF_CMD = 1, LIF_CMD, MISC_CMD, TUN_CMD }; |
|
2003 |
||
2004 |
#define IPI_DONTCARE 0 /* For ioctl encoded values that don't matter */ |
|
2005 |
||
2006 |
/* Flag values in ipi_flags */ |
|
2007 |
#define IPI_PRIV 0x1 /* Root only command */ |
|
2008 |
#define IPI_MODOK 0x2 /* Permitted on mod instance of IP */ |
|
2009 |
#define IPI_WR 0x4 /* Need to grab writer access */ |
|
2010 |
#define IPI_GET_CMD 0x8 /* branch to mi_copyout on success */ |
|
2011 |
#define IPI_REPL 0x10 /* valid for replacement ipif created in MOVE */ |
|
2012 |
#define IPI_NULL_BCONT 0x20 /* ioctl has not data and hence no b_cont */ |
|
2013 |
#define IPI_PASS_DOWN 0x40 /* pass this ioctl down when a module only */ |
|
2014 |
||
2015 |
extern ip_ioctl_cmd_t ip_ndx_ioctl_table[]; |
|
2016 |
extern ip_ioctl_cmd_t ip_misc_ioctl_table[]; |
|
2017 |
extern int ip_ndx_ioctl_count; |
|
2018 |
extern int ip_misc_ioctl_count; |
|
2019 |
||
2020 |
#define ILL_CLEAR_MOVE(ill) { \ |
|
2021 |
ill_t *peer_ill; \ |
|
2022 |
\ |
|
2023 |
peer_ill = (ill)->ill_move_peer; \ |
|
2024 |
ASSERT(peer_ill != NULL); \ |
|
2025 |
(ill)->ill_move_in_progress = B_FALSE; \ |
|
2026 |
peer_ill->ill_move_in_progress = B_FALSE; \ |
|
2027 |
(ill)->ill_move_peer = NULL; \ |
|
2028 |
peer_ill->ill_move_peer = NULL; \ |
|
2029 |
} |
|
2030 |
||
2031 |
/* Passed down by ARP to IP during I_PLINK/I_PUNLINK */ |
|
2032 |
typedef struct ipmx_s { |
|
2033 |
char ipmx_name[LIFNAMSIZ]; /* if name */ |
|
2034 |
uint_t |
|
2035 |
ipmx_arpdev_stream : 1, /* This is the arp stream */ |
|
2036 |
ipmx_notused : 31; |
|
2037 |
} ipmx_t; |
|
2038 |
||
2039 |
/* |
|
2040 |
* State for detecting if a driver supports certain features. |
|
2041 |
* Support for DL_ENABMULTI_REQ uses ill_dlpi_multicast_state. |
|
2042 |
* Support for DLPI M_DATA fastpath uses ill_dlpi_fastpath_state. |
|
2043 |
*/ |
|
2044 |
#define IDMS_UNKNOWN 0 /* No DL_ENABMULTI_REQ sent */ |
|
2045 |
#define IDMS_INPROGRESS 1 /* Sent DL_ENABMULTI_REQ */ |
|
2046 |
#define IDMS_OK 2 /* DL_ENABMULTI_REQ ok */ |
|
2047 |
#define IDMS_FAILED 3 /* DL_ENABMULTI_REQ failed */ |
|
2048 |
#define IDMS_RENEG 4 /* Driver asked for a renegotiation */ |
|
2049 |
||
2050 |
/* Named Dispatch Parameter Management Structure */ |
|
2051 |
typedef struct ipparam_s { |
|
2052 |
uint_t ip_param_min; |
|
2053 |
uint_t ip_param_max; |
|
2054 |
uint_t ip_param_value; |
|
2055 |
char *ip_param_name; |
|
2056 |
} ipparam_t; |
|
2057 |
||
2058 |
/* Extended NDP Management Structure */ |
|
2059 |
typedef struct ipndp_s { |
|
2060 |
ndgetf_t ip_ndp_getf; |
|
2061 |
ndsetf_t ip_ndp_setf; |
|
2062 |
caddr_t ip_ndp_data; |
|
2063 |
char *ip_ndp_name; |
|
2064 |
} ipndp_t; |
|
2065 |
||
2066 |
/* |
|
2067 |
* Following are the macros to increment/decrement the reference |
|
2068 |
* count of the IREs and IRBs (ire bucket). |
|
2069 |
* |
|
2070 |
* 1) We bump up the reference count of an IRE to make sure that |
|
2071 |
* it does not get deleted and freed while we are using it. |
|
2072 |
* Typically all the lookup functions hold the bucket lock, |
|
2073 |
* and look for the IRE. If it finds an IRE, it bumps up the |
|
2074 |
* reference count before dropping the lock. Sometimes we *may* want |
|
2075 |
* to bump up the reference count after we *looked* up i.e without |
|
2076 |
* holding the bucket lock. So, the IRE_REFHOLD macro does not assert |
|
2077 |
* on the bucket lock being held. Any thread trying to delete from |
|
2078 |
* the hash bucket can still do so but cannot free the IRE if |
|
2079 |
* ire_refcnt is not 0. |
|
2080 |
* |
|
2081 |
* 2) We bump up the reference count on the bucket where the IRE resides |
|
2082 |
* (IRB), when we want to prevent the IREs getting deleted from a given |
|
2083 |
* hash bucket. This makes life easier for ire_walk type functions which |
|
2084 |
* wants to walk the IRE list, call a function, but needs to drop |
|
2085 |
* the bucket lock to prevent recursive rw_enters. While the |
|
2086 |
* lock is dropped, the list could be changed by other threads or |
|
2087 |
* the same thread could end up deleting the ire or the ire pointed by |
|
2088 |
* ire_next. IRE_REFHOLDing the ire or ire_next is not sufficient as |
|
2089 |
* a delete will still remove the ire from the bucket while we have |
|
2090 |
* dropped the lock and hence the ire_next would be NULL. Thus, we |
|
2091 |
* need a mechanism to prevent deletions from a given bucket. |
|
2092 |
* |
|
2093 |
* To prevent deletions, we bump up the reference count on the |
|
2094 |
* bucket. If the bucket is held, ire_delete just marks IRE_MARK_CONDEMNED |
|
2095 |
* both on the ire's ire_marks and the bucket's irb_marks. When the |
|
2096 |
* reference count on the bucket drops to zero, all the CONDEMNED ires |
|
2097 |
* are deleted. We don't have to bump up the reference count on the |
|
2098 |
* bucket if we are walking the bucket and never have to drop the bucket |
|
2099 |
* lock. Note that IRB_REFHOLD does not prevent addition of new ires |
|
2100 |
* in the list. It is okay because addition of new ires will not cause |
|
2101 |
* ire_next to point to freed memory. We do IRB_REFHOLD only when |
|
2102 |
* all of the 3 conditions are true : |
|
2103 |
* |
|
2104 |
* 1) The code needs to walk the IRE bucket from start to end. |
|
2105 |
* 2) It may have to drop the bucket lock sometimes while doing (1) |
|
2106 |
* 3) It does not want any ires to be deleted meanwhile. |
|
2107 |
*/ |
|
2108 |
||
2109 |
/* |
|
2110 |
* Bump up the reference count on the IRE. We cannot assert that the |
|
2111 |
* bucket lock is being held as it is legal to bump up the reference |
|
2112 |
* count after the first lookup has returned the IRE without |
|
2113 |
* holding the lock. Currently ip_wput does this for caching IRE_CACHEs. |
|
2114 |
*/ |
|
2115 |
||
2116 |
#ifndef IRE_DEBUG |
|
2117 |
||
2118 |
#define IRE_REFHOLD_NOTR(ire) IRE_REFHOLD(ire) |
|
2119 |
#define IRE_UNTRACE_REF(ire) |
|
2120 |
#define IRE_TRACE_REF(ire) |
|
2121 |
||
2122 |
#else |
|
2123 |
||
2124 |
#define IRE_REFHOLD_NOTR(ire) { \ |
|
2125 |
atomic_add_32(&(ire)->ire_refcnt, 1); \ |
|
2126 |
ASSERT((ire)->ire_refcnt != 0); \ |
|
2127 |
} |
|
2128 |
||
2129 |
#define IRE_UNTRACE_REF(ire) ire_untrace_ref(ire); |
|
2130 |
#define IRE_TRACE_REF(ire) ire_trace_ref(ire); |
|
2131 |
#endif |
|
2132 |
||
2133 |
#define IRE_REFHOLD(ire) { \ |
|
2134 |
atomic_add_32(&(ire)->ire_refcnt, 1); \ |
|
2135 |
ASSERT((ire)->ire_refcnt != 0); \ |
|
2136 |
IRE_TRACE_REF(ire); \ |
|
2137 |
} |
|
2138 |
||
2139 |
#define IRE_REFHOLD_LOCKED(ire) { \ |
|
2140 |
IRE_TRACE_REF(ire); \ |
|
2141 |
(ire)->ire_refcnt++; \ |
|
2142 |
} |
|
2143 |
||
2144 |
/* |
|
2145 |
* Decrement the reference count on the IRE. |
|
2146 |
* In architectures e.g sun4u, where atomic_add_32_nv is just |
|
2147 |
* a cas, we need to maintain the right memory barrier semantics |
|
2148 |
* as that of mutex_exit i.e all the loads and stores should complete |
|
2149 |
* before the cas is executed. membar_exit() does that here. |
|
2150 |
* |
|
2151 |
* NOTE : This macro is used only in places where we want performance. |
|
2152 |
* To avoid bloating the code, we use the function "ire_refrele" |
|
2153 |
* which essentially calls the macro. |
|
2154 |
*/ |
|
2155 |
#ifndef IRE_DEBUG |
|
2156 |
#define IRE_REFRELE(ire) { \ |
|
2157 |
ASSERT((ire)->ire_refcnt != 0); \ |
|
2158 |
membar_exit(); \ |
|
2159 |
if (atomic_add_32_nv(&(ire)->ire_refcnt, -1) == 0) \ |
|
2160 |
ire_inactive(ire); \ |
|
2161 |
} |
|
2162 |
#define IRE_REFRELE_NOTR(ire) IRE_REFRELE(ire) |
|
2163 |
#else |
|
2164 |
#define IRE_REFRELE(ire) { \ |
|
2165 |
if (ire->ire_bucket != NULL) \ |
|
2166 |
ire_untrace_ref(ire); \ |
|
2167 |
ASSERT((ire)->ire_refcnt != 0); \ |
|
2168 |
membar_exit(); \ |
|
2169 |
if (atomic_add_32_nv(&(ire)->ire_refcnt, -1) == 0) \ |
|
2170 |
ire_inactive(ire); \ |
|
2171 |
} |
|
2172 |
#define IRE_REFRELE_NOTR(ire) { \ |
|
2173 |
ASSERT((ire)->ire_refcnt != 0); \ |
|
2174 |
membar_exit(); \ |
|
2175 |
if (atomic_add_32_nv(&(ire)->ire_refcnt, -1) == 0) \ |
|
2176 |
ire_inactive(ire); \ |
|
2177 |
} |
|
2178 |
#endif |
|
2179 |
||
2180 |
/* |
|
2181 |
* Bump up the reference count on the hash bucket - IRB to |
|
2182 |
* prevent ires from being deleted in this bucket. |
|
2183 |
*/ |
|
2184 |
#define IRB_REFHOLD(irb) { \ |
|
2185 |
rw_enter(&(irb)->irb_lock, RW_WRITER); \ |
|
2186 |
(irb)->irb_refcnt++; \ |
|
2187 |
ASSERT((irb)->irb_refcnt != 0); \ |
|
2188 |
rw_exit(&(irb)->irb_lock); \ |
|
2189 |
} |
|
2190 |
||
2191 |
#define IRB_REFRELE(irb) { \ |
|
2192 |
rw_enter(&(irb)->irb_lock, RW_WRITER); \ |
|
2193 |
ASSERT((irb)->irb_refcnt != 0); \ |
|
2194 |
if (--(irb)->irb_refcnt == 0 && \ |
|
2195 |
((irb)->irb_marks & IRE_MARK_CONDEMNED)) { \ |
|
2196 |
ire_t *ire_list; \ |
|
2197 |
\ |
|
2198 |
ire_list = ire_unlink(irb); \ |
|
2199 |
rw_exit(&(irb)->irb_lock); \ |
|
2200 |
ASSERT(ire_list != NULL); \ |
|
2201 |
ire_cleanup(ire_list); \ |
|
2202 |
} else { \ |
|
2203 |
rw_exit(&(irb)->irb_lock); \ |
|
2204 |
} \ |
|
2205 |
} |
|
2206 |
||
2207 |
/* |
|
2208 |
* Lock the fast path mp for access, since the ire_fp_mp can be deleted |
|
2209 |
* due a DL_NOTE_FASTPATH_FLUSH in the case of IRE_BROADCAST and IRE_MIPRTUN |
|
2210 |
*/ |
|
2211 |
||
2212 |
#define LOCK_IRE_FP_MP(ire) { \ |
|
2213 |
if ((ire)->ire_type == IRE_BROADCAST || \ |
|
2214 |
(ire)->ire_type == IRE_MIPRTUN) \ |
|
2215 |
mutex_enter(&ire->ire_lock); \ |
|
2216 |
} |
|
2217 |
#define UNLOCK_IRE_FP_MP(ire) { \ |
|
2218 |
if ((ire)->ire_type == IRE_BROADCAST || \ |
|
2219 |
(ire)->ire_type == IRE_MIPRTUN) \ |
|
2220 |
mutex_exit(&ire->ire_lock); \ |
|
2221 |
} |
|
2222 |
||
2223 |
typedef struct ire4 { |
|
2224 |
ipaddr_t ire4_src_addr; /* Source address to use. */ |
|
2225 |
ipaddr_t ire4_mask; /* Mask for matching this IRE. */ |
|
2226 |
ipaddr_t ire4_addr; /* Address this IRE represents. */ |
|
2227 |
ipaddr_t ire4_gateway_addr; /* Gateway if IRE_CACHE/IRE_OFFSUBNET */ |
|
2228 |
ipaddr_t ire4_cmask; /* Mask from parent prefix route */ |
|
2229 |
} ire4_t; |
|
2230 |
||
2231 |
typedef struct ire6 { |
|
2232 |
in6_addr_t ire6_src_addr; /* Source address to use. */ |
|
2233 |
in6_addr_t ire6_mask; /* Mask for matching this IRE. */ |
|
2234 |
in6_addr_t ire6_addr; /* Address this IRE represents. */ |
|
2235 |
in6_addr_t ire6_gateway_addr; /* Gateway if IRE_CACHE/IRE_OFFSUBNET */ |
|
2236 |
in6_addr_t ire6_cmask; /* Mask from parent prefix route */ |
|
2237 |
} ire6_t; |
|
2238 |
||
2239 |
typedef union ire_addr { |
|
2240 |
ire6_t ire6_u; |
|
2241 |
ire4_t ire4_u; |
|
2242 |
} ire_addr_u_t; |
|
2243 |
||
2244 |
/* Internet Routing Entry */ |
|
2245 |
typedef struct ire_s { |
|
2246 |
struct ire_s *ire_next; /* The hash chain must be first. */ |
|
2247 |
struct ire_s **ire_ptpn; /* Pointer to previous next. */ |
|
2248 |
uint32_t ire_refcnt; /* Number of references */ |
|
2249 |
mblk_t *ire_mp; /* Non-null if allocated as mblk */ |
|
2250 |
mblk_t *ire_fp_mp; /* Fast path header */ |
|
2251 |
queue_t *ire_rfq; /* recv from this queue */ |
|
2252 |
queue_t *ire_stq; /* send to this queue */ |
|
2253 |
union { |
|
2254 |
uint_t *max_fragp; /* Used only during ire creation */ |
|
2255 |
uint_t max_frag; /* MTU (next hop or path). */ |
|
2256 |
} imf_u; |
|
2257 |
#define ire_max_frag imf_u.max_frag |
|
2258 |
#define ire_max_fragp imf_u.max_fragp |
|
2259 |
uint32_t ire_frag_flag; /* IPH_DF or zero. */ |
|
2260 |
uint32_t ire_ident; /* Per IRE IP ident. */ |
|
2261 |
uint32_t ire_tire_mark; /* Used for reclaim of unused. */ |
|
2262 |
uchar_t ire_ipversion; /* IPv4/IPv6 version */ |
|
2263 |
uchar_t ire_marks; /* IRE_MARK_CONDEMNED etc. */ |
|
2264 |
ushort_t ire_type; /* Type of IRE */ |
|
2265 |
uint_t ire_ib_pkt_count; /* Inbound packets for ire_addr */ |
|
2266 |
uint_t ire_ob_pkt_count; /* Outbound packets to ire_addr */ |
|
2267 |
uint_t ire_ll_hdr_length; /* Non-zero if we do M_DATA prepends */ |
|
2268 |
time_t ire_create_time; /* Time (in secs) IRE was created. */ |
|
2269 |
mblk_t *ire_dlureq_mp; /* DL_UNIT_DATA_REQ/RESOLVER mp */ |
|
2270 |
uint32_t ire_phandle; /* Associate prefix IREs to cache */ |
|
2271 |
uint32_t ire_ihandle; /* Associate interface IREs to cache */ |
|
2272 |
ipif_t *ire_ipif; /* the interface that this ire uses */ |
|
2273 |
uint32_t ire_flags; /* flags related to route (RTF_*) */ |
|
2274 |
uint_t ire_ipsec_overhead; /* IPSEC overhead */ |
|
2275 |
struct nce_s *ire_nce; /* Neighbor Cache Entry for IPv6 */ |
|
2276 |
uint_t ire_masklen; /* # bits in ire_mask{,_v6} */ |
|
2277 |
ire_addr_u_t ire_u; /* IPv4/IPv6 address info. */ |
|
2278 |
||
2279 |
irb_t *ire_bucket; /* Hash bucket when ire_ptphn is set */ |
|
2280 |
iulp_t ire_uinfo; /* Upper layer protocol info. */ |
|
2281 |
/* |
|
2282 |
* Protects ire_uinfo, ire_max_frag, and ire_frag_flag. |
|
2283 |
*/ |
|
2284 |
kmutex_t ire_lock; |
|
2285 |
uint_t ire_ipif_seqid; /* ipif_seqid of ire_ipif */ |
|
2286 |
/* |
|
2287 |
* For regular routes in forwarding table and cache table the |
|
2288 |
* the following entries are NULL/zero. Only reverse tunnel |
|
2289 |
* table and interface based forwarding table use these fields. |
|
2290 |
* Routes added with RTA_SRCIFP and RTA_SRC respectively have |
|
2291 |
* non-zero values for the following fields. |
|
2292 |
*/ |
|
2293 |
ill_t *ire_in_ill; /* Incoming ill interface */ |
|
2294 |
ipaddr_t ire_in_src_addr; |
|
2295 |
/* source ip-addr of incoming packet */ |
|
2296 |
clock_t ire_last_used_time; /* Last used time */ |
|
2297 |
struct ire_s *ire_fastpath; /* Pointer to next ire in fastpath */ |
|
2298 |
zoneid_t ire_zoneid; /* for local address discrimination */ |
|
2299 |
#ifdef IRE_DEBUG |
|
2300 |
th_trace_t *ire_trace[IP_TR_HASH_MAX]; |
|
2301 |
boolean_t ire_trace_disable; /* True when alloc fails */ |
|
2302 |
#endif |
|
2303 |
} ire_t; |
|
2304 |
||
2305 |
/* IPv4 compatiblity macros */ |
|
2306 |
#define ire_src_addr ire_u.ire4_u.ire4_src_addr |
|
2307 |
#define ire_mask ire_u.ire4_u.ire4_mask |
|
2308 |
#define ire_addr ire_u.ire4_u.ire4_addr |
|
2309 |
#define ire_gateway_addr ire_u.ire4_u.ire4_gateway_addr |
|
2310 |
#define ire_cmask ire_u.ire4_u.ire4_cmask |
|
2311 |
||
2312 |
#define ire_src_addr_v6 ire_u.ire6_u.ire6_src_addr |
|
2313 |
#define ire_mask_v6 ire_u.ire6_u.ire6_mask |
|
2314 |
#define ire_addr_v6 ire_u.ire6_u.ire6_addr |
|
2315 |
#define ire_gateway_addr_v6 ire_u.ire6_u.ire6_gateway_addr |
|
2316 |
#define ire_cmask_v6 ire_u.ire6_u.ire6_cmask |
|
2317 |
||
2318 |
/* Convenient typedefs for sockaddrs */ |
|
2319 |
typedef struct sockaddr_in sin_t; |
|
2320 |
typedef struct sockaddr_in6 sin6_t; |
|
2321 |
||
2322 |
/* Address structure used for internal bind with IP */ |
|
2323 |
typedef struct ipa_conn_s { |
|
2324 |
ipaddr_t ac_laddr; |
|
2325 |
ipaddr_t ac_faddr; |
|
2326 |
uint16_t ac_fport; |
|
2327 |
uint16_t ac_lport; |
|
2328 |
} ipa_conn_t; |
|
2329 |
||
2330 |
typedef struct ipa6_conn_s { |
|
2331 |
in6_addr_t ac6_laddr; |
|
2332 |
in6_addr_t ac6_faddr; |
|
2333 |
uint16_t ac6_fport; |
|
2334 |
uint16_t ac6_lport; |
|
2335 |
} ipa6_conn_t; |
|
2336 |
||
2337 |
/* |
|
2338 |
* Using ipa_conn_x_t or ipa6_conn_x_t allows us to modify the behavior of IP's |
|
2339 |
* bind handler. |
|
2340 |
*/ |
|
2341 |
typedef struct ipa_conn_extended_s { |
|
2342 |
uint64_t acx_flags; |
|
2343 |
ipa_conn_t acx_conn; |
|
2344 |
} ipa_conn_x_t; |
|
2345 |
||
2346 |
typedef struct ipa6_conn_extended_s { |
|
2347 |
uint64_t ac6x_flags; |
|
2348 |
ipa6_conn_t ac6x_conn; |
|
2349 |
} ipa6_conn_x_t; |
|
2350 |
||
2351 |
/* flag values for ipa_conn_x_t and ipa6_conn_x_t. */ |
|
2352 |
#define ACX_VERIFY_DST 0x1ULL /* verify destination address is reachable */ |
|
2353 |
||
2354 |
/* Name/Value Descriptor. */ |
|
2355 |
typedef struct nv_s { |
|
2356 |
uint64_t nv_value; |
|
2357 |
char *nv_name; |
|
2358 |
} nv_t; |
|
2359 |
||
2360 |
/* IP Forwarding Ticket */ |
|
2361 |
typedef struct ipftk_s { |
|
2362 |
queue_t *ipftk_queue; |
|
2363 |
ipaddr_t ipftk_dst; |
|
2364 |
} ipftk_t; |
|
2365 |
||
2366 |
typedef struct ipt_s { |
|
2367 |
pfv_t func; /* Routine to call */ |
|
2368 |
uchar_t *arg; /* ire or nce passed in */ |
|
2369 |
} ipt_t; |
|
2370 |
||
2371 |
#define ILL_FRAG_HASH(s, i) \ |
|
2372 |
((ntohl(s) ^ ((i) ^ ((i) >> 8))) % ILL_FRAG_HASH_TBL_COUNT) |
|
2373 |
||
2374 |
/* |
|
2375 |
* The MAX number of allowed fragmented packets per hash bucket |
|
2376 |
* calculation is based on the most common mtu size of 1500. This limit |
|
2377 |
* will work well for other mtu sizes as well. |
|
2378 |
*/ |
|
2379 |
#define COMMON_IP_MTU 1500 |
|
2380 |
#define MAX_FRAG_MIN 10 |
|
2381 |
#define MAX_FRAG_PKTS \ |
|
2382 |
MAX(MAX_FRAG_MIN, (2 * (ip_reass_queue_bytes / \ |
|
2383 |
(COMMON_IP_MTU * ILL_FRAG_HASH_TBL_COUNT)))) |
|
2384 |
||
2385 |
/* |
|
2386 |
* Maximum dups allowed per packet. |
|
2387 |
*/ |
|
2388 |
extern uint_t ip_max_frag_dups; |
|
2389 |
||
2390 |
/* |
|
2391 |
* Per-packet information for received packets and transmitted. |
|
2392 |
* Used by the transport protocols when converting between the packet |
|
2393 |
* and ancillary data and socket options. |
|
2394 |
* |
|
2395 |
* Note: This private data structure and related IPPF_* constant |
|
2396 |
* definitions are exposed to enable compilation of some debugging tools |
|
2397 |
* like lsof which use struct tcp_t in <inet/tcp.h>. This is intended to be |
|
2398 |
* a temporary hack and long term alternate interfaces should be defined |
|
2399 |
* to support the needs of such tools and private definitions moved to |
|
2400 |
* private headers. |
|
2401 |
*/ |
|
2402 |
struct ip6_pkt_s { |
|
2403 |
uint_t ipp_fields; /* Which fields are valid */ |
|
2404 |
uint_t ipp_sticky_ignored; /* sticky fields to ignore */ |
|
2405 |
uint_t ipp_ifindex; /* pktinfo ifindex */ |
|
2406 |
in6_addr_t ipp_addr; /* pktinfo src/dst addr */ |
|
679
f2c9450b58f4
6201425 setting IPV6_UNICAST_HOPS on SCTP socket doesn't do anything
seb
parents:
449
diff
changeset
|
2407 |
uint_t ipp_unicast_hops; /* IPV6_UNICAST_HOPS */ |
f2c9450b58f4
6201425 setting IPV6_UNICAST_HOPS on SCTP socket doesn't do anything
seb
parents:
449
diff
changeset
|
2408 |
uint_t ipp_multicast_hops; /* IPV6_MULTICAST_HOPS */ |
f2c9450b58f4
6201425 setting IPV6_UNICAST_HOPS on SCTP socket doesn't do anything
seb
parents:
449
diff
changeset
|
2409 |
uint_t ipp_hoplimit; /* IPV6_HOPLIMIT */ |
0 | 2410 |
uint_t ipp_hopoptslen; |
2411 |
uint_t ipp_rtdstoptslen; |
|
2412 |
uint_t ipp_rthdrlen; |
|
2413 |
uint_t ipp_dstoptslen; |
|
2414 |
uint_t ipp_pathmtulen; |
|
2415 |
ip6_hbh_t *ipp_hopopts; |
|
2416 |
ip6_dest_t *ipp_rtdstopts; |
|
2417 |
ip6_rthdr_t *ipp_rthdr; |
|
2418 |
ip6_dest_t *ipp_dstopts; |
|
2419 |
struct ip6_mtuinfo *ipp_pathmtu; |
|
2420 |
in6_addr_t ipp_nexthop; /* Transmit only */ |
|
2421 |
uint8_t ipp_tclass; |
|
2422 |
int8_t ipp_use_min_mtu; |
|
2423 |
}; |
|
2424 |
typedef struct ip6_pkt_s ip6_pkt_t; |
|
2425 |
||
2426 |
/* |
|
2427 |
* This structure is used to convey information from IP and the ULP. |
|
2428 |
* Currently used for the IP_RECVSLLA and IP_RECVIF options. The |
|
2429 |
* type of information field is set to IN_PKTINFO (i.e inbound pkt info) |
|
2430 |
*/ |
|
2431 |
typedef struct in_pktinfo { |
|
2432 |
uint32_t in_pkt_ulp_type; /* type of info sent */ |
|
2433 |
/* to UDP */ |
|
2434 |
uint32_t in_pkt_flags; /* what is sent up by IP */ |
|
2435 |
uint32_t in_pkt_ifindex; /* inbound interface index */ |
|
2436 |
struct sockaddr_dl in_pkt_slla; /* has source link layer addr */ |
|
2437 |
} in_pktinfo_t; |
|
2438 |
||
2439 |
/* |
|
2440 |
* flags to tell UDP what IP is sending |
|
2441 |
*/ |
|
2442 |
#define IPF_RECVIF 0x01 /* inbound interface index */ |
|
2443 |
#define IPF_RECVSLLA 0x02 /* source link layer address */ |
|
2444 |
||
2445 |
/* ipp_fields values */ |
|
2446 |
#define IPPF_IFINDEX 0x0001 /* Part of in6_pktinfo: ifindex */ |
|
2447 |
#define IPPF_ADDR 0x0002 /* Part of in6_pktinfo: src/dst addr */ |
|
2448 |
#define IPPF_SCOPE_ID 0x0004 /* Add xmit ip6i_t for sin6_scope_id */ |
|
2449 |
#define IPPF_NO_CKSUM 0x0008 /* Add xmit ip6i_t for IP6I_NO_*_CKSUM */ |
|
2450 |
||
2451 |
#define IPPF_RAW_CKSUM 0x0010 /* Add xmit ip6i_t for IP6I_RAW_CHECKSUM */ |
|
2452 |
#define IPPF_HOPLIMIT 0x0020 |
|
2453 |
#define IPPF_HOPOPTS 0x0040 |
|
2454 |
#define IPPF_RTHDR 0x0080 |
|
2455 |
||
2456 |
#define IPPF_RTDSTOPTS 0x0100 |
|
2457 |
#define IPPF_DSTOPTS 0x0200 |
|
2458 |
#define IPPF_NEXTHOP 0x0400 |
|
2459 |
#define IPPF_PATHMTU 0x0800 |
|
2460 |
||
2461 |
#define IPPF_TCLASS 0x1000 |
|
2462 |
#define IPPF_DONTFRAG 0x2000 |
|
679
f2c9450b58f4
6201425 setting IPV6_UNICAST_HOPS on SCTP socket doesn't do anything
seb
parents:
449
diff
changeset
|
2463 |
#define IPPF_USE_MIN_MTU 0x04000 |
f2c9450b58f4
6201425 setting IPV6_UNICAST_HOPS on SCTP socket doesn't do anything
seb
parents:
449
diff
changeset
|
2464 |
#define IPPF_MULTICAST_HOPS 0x08000 |
f2c9450b58f4
6201425 setting IPV6_UNICAST_HOPS on SCTP socket doesn't do anything
seb
parents:
449
diff
changeset
|
2465 |
#define IPPF_UNICAST_HOPS 0x10000 |
0 | 2466 |
|
2467 |
#define IPPF_HAS_IP6I \ |
|
2468 |
(IPPF_IFINDEX|IPPF_ADDR|IPPF_NEXTHOP|IPPF_SCOPE_ID| \ |
|
2469 |
IPPF_NO_CKSUM|IPPF_RAW_CKSUM|IPPF_HOPLIMIT|IPPF_DONTFRAG| \ |
|
679
f2c9450b58f4
6201425 setting IPV6_UNICAST_HOPS on SCTP socket doesn't do anything
seb
parents:
449
diff
changeset
|
2470 |
IPPF_USE_MIN_MTU|IPPF_MULTICAST_HOPS|IPPF_UNICAST_HOPS) |
0 | 2471 |
|
2472 |
#define TCP_PORTS_OFFSET 0 |
|
2473 |
#define UDP_PORTS_OFFSET 0 |
|
2474 |
||
2475 |
/* |
|
2476 |
* lookups return the ill/ipif only if the flags are clear OR Iam writer. |
|
2477 |
* ill / ipif lookup functions increment the refcnt on the ill / ipif only |
|
2478 |
* after calling these macros. This ensures that the refcnt on the ipif or |
|
2479 |
* ill will eventually drop down to zero. |
|
2480 |
*/ |
|
2481 |
#define ILL_LOOKUP_FAILED 1 /* Used as error code */ |
|
2482 |
#define IPIF_LOOKUP_FAILED 2 /* Used as error code */ |
|
2483 |
||
2484 |
#define ILL_CAN_LOOKUP(ill) \ |
|
2485 |
(!((ill)->ill_state_flags & (ILL_CONDEMNED | ILL_CHANGING)) || \ |
|
2486 |
IAM_WRITER_ILL(ill)) |
|
2487 |
||
2488 |
#define ILL_CAN_WAIT(ill, q) \ |
|
2489 |
(((q) != NULL) && !((ill)->ill_state_flags & (ILL_CONDEMNED))) |
|
2490 |
||
2491 |
#define ILL_CAN_LOOKUP_WALKER(ill) \ |
|
2492 |
(!((ill)->ill_state_flags & ILL_CONDEMNED)) |
|
2493 |
||
2494 |
#define IPIF_CAN_LOOKUP(ipif) \ |
|
2495 |
(!((ipif)->ipif_state_flags & (IPIF_CONDEMNED | IPIF_CHANGING)) || \ |
|
2496 |
IAM_WRITER_IPIF(ipif)) |
|
2497 |
||
2498 |
/* |
|
2499 |
* If the parameter 'q' is NULL, the caller is not interested in wait and |
|
2500 |
* restart of the operation if the ILL or IPIF cannot be looked up when it is |
|
2501 |
* marked as 'CHANGING'. Typically a thread that tries to send out data will |
|
2502 |
* end up passing NULLs as the last 4 parameters to ill_lookup_on_ifindex and |
|
2503 |
* in this case 'q' is NULL |
|
2504 |
*/ |
|
2505 |
#define IPIF_CAN_WAIT(ipif, q) \ |
|
2506 |
(((q) != NULL) && !((ipif)->ipif_state_flags & (IPIF_CONDEMNED))) |
|
2507 |
||
2508 |
#define IPIF_CAN_LOOKUP_WALKER(ipif) \ |
|
2509 |
(!((ipif)->ipif_state_flags & (IPIF_CONDEMNED)) || \ |
|
2510 |
IAM_WRITER_IPIF(ipif)) |
|
2511 |
||
2512 |
/* |
|
2513 |
* These macros are used by critical set ioctls and failover ioctls to |
|
2514 |
* mark the ipif appropriately before starting the operation and to clear the |
|
2515 |
* marks after completing the operation. |
|
2516 |
*/ |
|
2517 |
#define IPIF_UNMARK_MOVING(ipif) \ |
|
2518 |
(ipif)->ipif_state_flags &= ~IPIF_MOVING & ~IPIF_CHANGING; |
|
2519 |
||
2520 |
#define ILL_UNMARK_CHANGING(ill) \ |
|
2521 |
(ill)->ill_state_flags &= ~ILL_CHANGING; |
|
2522 |
||
2523 |
/* Macros used to assert that this thread is a writer */ |
|
2524 |
#define IAM_WRITER_IPSQ(ipsq) ((ipsq)->ipsq_writer == curthread) |
|
2525 |
#define IAM_WRITER_ILL(ill) \ |
|
2526 |
((ill)->ill_phyint->phyint_ipsq->ipsq_writer == curthread) |
|
2527 |
#define IAM_WRITER_IPIF(ipif) \ |
|
2528 |
((ipif)->ipif_ill->ill_phyint->phyint_ipsq->ipsq_writer == curthread) |
|
2529 |
||
2530 |
/* |
|
2531 |
* Grab ill locks in the proper order. The order is highest addressed |
|
2532 |
* ill is locked first. |
|
2533 |
*/ |
|
2534 |
#define GRAB_ILL_LOCKS(ill_1, ill_2) \ |
|
2535 |
{ \ |
|
2536 |
if ((ill_1) > (ill_2)) { \ |
|
2537 |
if (ill_1 != NULL) \ |
|
2538 |
mutex_enter(&(ill_1)->ill_lock); \ |
|
2539 |
if (ill_2 != NULL) \ |
|
2540 |
mutex_enter(&(ill_2)->ill_lock); \ |
|
2541 |
} else { \ |
|
2542 |
if (ill_2 != NULL) \ |
|
2543 |
mutex_enter(&(ill_2)->ill_lock); \ |
|
2544 |
if (ill_1 != NULL && ill_1 != ill_2) \ |
|
2545 |
mutex_enter(&(ill_1)->ill_lock); \ |
|
2546 |
} \ |
|
2547 |
} |
|
2548 |
||
2549 |
#define RELEASE_ILL_LOCKS(ill_1, ill_2) \ |
|
2550 |
{ \ |
|
2551 |
if (ill_1 != NULL) \ |
|
2552 |
mutex_exit(&(ill_1)->ill_lock); \ |
|
2553 |
if (ill_2 != NULL && ill_2 != ill_1) \ |
|
2554 |
mutex_exit(&(ill_2)->ill_lock); \ |
|
2555 |
} |
|
2556 |
||
2557 |
/* Get the other protocol instance ill */ |
|
2558 |
#define ILL_OTHER(ill) \ |
|
2559 |
((ill)->ill_isv6 ? (ill)->ill_phyint->phyint_illv4 : \ |
|
2560 |
(ill)->ill_phyint->phyint_illv6) |
|
2561 |
||
2562 |
#define MATCH_V4_ONLY 0x1 |
|
2563 |
#define MATCH_V6_ONLY 0x2 |
|
2564 |
#define MATCH_ILL_ONLY 0x4 |
|
2565 |
||
2566 |
/* ioctl command info: Ioctl properties extracted and stored in here */ |
|
2567 |
typedef struct cmd_info_s |
|
2568 |
{ |
|
2569 |
char ci_groupname[LIFNAMSIZ + 1]; /* SIOCSLIFGROUPNAME */ |
|
2570 |
ipif_t *ci_ipif; /* ipif associated with [l]ifreq ioctl's */ |
|
2571 |
sin_t *ci_sin; /* the sin struct passed down */ |
|
2572 |
sin6_t *ci_sin6; /* the sin6_t struct passed down */ |
|
2573 |
struct lifreq *ci_lifr; /* the lifreq struct passed down */ |
|
2574 |
} cmd_info_t; |
|
2575 |
||
2576 |
extern krwlock_t ill_g_lock; |
|
2577 |
extern kmutex_t ip_addr_avail_lock; |
|
2578 |
extern ipsq_t *ipsq_g_head; |
|
2579 |
||
2580 |
extern ill_t *ip_timer_ill; /* ILL for IRE expiration timer. */ |
|
2581 |
extern timeout_id_t ip_ire_expire_id; /* IRE expiration timeout id. */ |
|
2582 |
extern timeout_id_t ip_ire_reclaim_id; /* IRE recalaim timeout id. */ |
|
2583 |
||
2584 |
extern kmutex_t ip_mi_lock; |
|
2585 |
extern krwlock_t ip_g_nd_lock; /* For adding/removing nd variables */ |
|
2586 |
extern kmutex_t ip_trash_timer_lock; /* Protects ip_ire_expire_id */ |
|
2587 |
||
2588 |
extern kmutex_t igmp_timer_lock; /* Protects the igmp timer */ |
|
2589 |
extern kmutex_t mld_timer_lock; /* Protects the mld timer */ |
|
2590 |
||
2591 |
extern krwlock_t ill_g_usesrc_lock; /* Protects usesrc related fields */ |
|
2592 |
||
2593 |
extern struct kmem_cache *ire_cache; |
|
2594 |
||
2595 |
extern uint_t ip_ire_default_count; /* Number of IPv4 IRE_DEFAULT entries */ |
|
2596 |
extern uint_t ip_ire_default_index; /* Walking index used to mod in */ |
|
2597 |
||
2598 |
extern ipaddr_t ip_g_all_ones; |
|
2599 |
extern caddr_t ip_g_nd; /* Named Dispatch List Head */ |
|
2600 |
||
2601 |
extern uint_t ip_loopback_mtu; |
|
2602 |
||
2603 |
extern ipparam_t *ip_param_arr; |
|
2604 |
||
2605 |
extern int ip_g_forward; |
|
2606 |
extern int ipv6_forward; |
|
741
40027a3621ac
PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents:
679
diff
changeset
|
2607 |
extern vmem_t *ip_minor_arena; |
0 | 2608 |
|
2609 |
#define ip_respond_to_address_mask_broadcast ip_param_arr[0].ip_param_value |
|
2610 |
#define ip_g_send_redirects ip_param_arr[5].ip_param_value |
|
2611 |
#define ip_debug ip_param_arr[7].ip_param_value |
|
2612 |
#define ip_mrtdebug ip_param_arr[8].ip_param_value |
|
2613 |
#define ip_timer_interval ip_param_arr[9].ip_param_value |
|
2614 |
#define ip_ire_arp_interval ip_param_arr[10].ip_param_value |
|
2615 |
#define ip_def_ttl ip_param_arr[12].ip_param_value |
|
2616 |
#define ip_wroff_extra ip_param_arr[14].ip_param_value |
|
2617 |
#define ip_path_mtu_discovery ip_param_arr[17].ip_param_value |
|
2618 |
#define ip_ignore_delete_time ip_param_arr[18].ip_param_value |
|
2619 |
#define ip_output_queue ip_param_arr[20].ip_param_value |
|
2620 |
#define ip_broadcast_ttl ip_param_arr[21].ip_param_value |
|
2621 |
#define ip_icmp_err_interval ip_param_arr[22].ip_param_value |
|
2622 |
#define ip_icmp_err_burst ip_param_arr[23].ip_param_value |
|
2623 |
#define ip_reass_queue_bytes ip_param_arr[24].ip_param_value |
|
2624 |
#define ip_addrs_per_if ip_param_arr[26].ip_param_value |
|
2625 |
#define ipsec_override_persocket_policy ip_param_arr[27].ip_param_value |
|
2626 |
#define icmp_accept_clear_messages ip_param_arr[28].ip_param_value |
|
2627 |
#define delay_first_probe_time ip_param_arr[30].ip_param_value |
|
2628 |
#define max_unicast_solicit ip_param_arr[31].ip_param_value |
|
2629 |
#define ipv6_def_hops ip_param_arr[32].ip_param_value |
|
2630 |
#define ipv6_icmp_return ip_param_arr[33].ip_param_value |
|
2631 |
#define ipv6_forward_src_routed ip_param_arr[34].ip_param_value |
|
2632 |
#define ipv6_resp_echo_mcast ip_param_arr[35].ip_param_value |
|
2633 |
#define ipv6_send_redirects ip_param_arr[36].ip_param_value |
|
2634 |
#define ipv6_ignore_redirect ip_param_arr[37].ip_param_value |
|
2635 |
#define ipv6_strict_dst_multihoming ip_param_arr[38].ip_param_value |
|
2636 |
#define ip_ire_reclaim_fraction ip_param_arr[39].ip_param_value |
|
2637 |
#define ipsec_policy_log_interval ip_param_arr[40].ip_param_value |
|
2638 |
#define ip_ndp_unsolicit_interval ip_param_arr[42].ip_param_value |
|
2639 |
#define ip_ndp_unsolicit_count ip_param_arr[43].ip_param_value |
|
2640 |
#define ipv6_ignore_home_address_opt ip_param_arr[44].ip_param_value |
|
2641 |
#define ip_policy_mask ip_param_arr[45].ip_param_value |
|
2642 |
#define ip_multirt_resolution_interval ip_param_arr[46].ip_param_value |
|
2643 |
#define ip_multirt_ttl ip_param_arr[47].ip_param_value |
|
2644 |
#define ip_multidata_outbound ip_param_arr[48].ip_param_value |
|
2645 |
#ifdef DEBUG |
|
2646 |
#define ipv6_drop_inbound_icmpv6 ip_param_arr[49].ip_param_value |
|
2647 |
#else |
|
2648 |
#define ipv6_drop_inbound_icmpv6 0 |
|
2649 |
#endif |
|
2650 |
||
2651 |
extern hrtime_t ipsec_policy_failure_last; |
|
2652 |
||
2653 |
extern int dohwcksum; /* use h/w cksum if supported by the h/w */ |
|
2654 |
#ifdef ZC_TEST |
|
2655 |
extern int noswcksum; |
|
2656 |
#endif |
|
2657 |
||
2658 |
extern char ipif_loopback_name[]; |
|
2659 |
||
2660 |
extern nv_t *ire_nv_tbl; |
|
2661 |
||
2662 |
extern time_t ip_g_frag_timeout; |
|
2663 |
extern clock_t ip_g_frag_timo_ms; |
|
2664 |
||
2665 |
extern mib2_ip_t ip_mib; /* For tcpInErrs and udpNoPorts */ |
|
2666 |
||
2667 |
extern struct module_info ip_mod_info; |
|
2668 |
||
2669 |
extern timeout_id_t igmp_slowtimeout_id; |
|
2670 |
extern timeout_id_t mld_slowtimeout_id; |
|
2671 |
||
2672 |
extern uint_t loopback_packets; |
|
2673 |
||
2674 |
/* |
|
2675 |
* Network byte order macros |
|
2676 |
*/ |
|
2677 |
#ifdef _BIG_ENDIAN |
|
2678 |
#define N_IN_CLASSD_NET IN_CLASSD_NET |
|
2679 |
#define N_INADDR_UNSPEC_GROUP INADDR_UNSPEC_GROUP |
|
2680 |
#else /* _BIG_ENDIAN */ |
|
2681 |
#define N_IN_CLASSD_NET (ipaddr_t)0x000000f0U |
|
2682 |
#define N_INADDR_UNSPEC_GROUP (ipaddr_t)0x000000e0U |
|
2683 |
#endif /* _BIG_ENDIAN */ |
|
2684 |
#define CLASSD(addr) (((addr) & N_IN_CLASSD_NET) == N_INADDR_UNSPEC_GROUP) |
|
2685 |
||
2686 |
#ifdef DEBUG |
|
2687 |
/* IPsec HW acceleration debugging support */ |
|
2688 |
||
2689 |
#define IPSECHW_CAPAB 0x0001 /* capability negotiation */ |
|
2690 |
#define IPSECHW_SADB 0x0002 /* SADB exchange */ |
|
2691 |
#define IPSECHW_PKT 0x0004 /* general packet flow */ |
|
2692 |
#define IPSECHW_PKTIN 0x0008 /* driver in pkt processing details */ |
|
2693 |
#define IPSECHW_PKTOUT 0x0010 /* driver out pkt processing details */ |
|
2694 |
||
2695 |
#define IPSECHW_DEBUG(f, x) if (ipsechw_debug & (f)) { (void) printf x; } |
|
2696 |
#define IPSECHW_CALL(f, r, x) if (ipsechw_debug & (f)) { (void) r x; } |
|
2697 |
||
2698 |
extern uint32_t ipsechw_debug; |
|
2699 |
#else |
|
2700 |
#define IPSECHW_DEBUG(f, x) {} |
|
2701 |
#define IPSECHW_CALL(f, r, x) {} |
|
2702 |
#endif |
|
2703 |
||
2704 |
#ifdef IP_DEBUG |
|
2705 |
#include <sys/debug.h> |
|
2706 |
#include <sys/promif.h> |
|
2707 |
||
2708 |
#define ip0dbg(a) printf a |
|
2709 |
#define ip1dbg(a) if (ip_debug > 2) printf a |
|
2710 |
#define ip2dbg(a) if (ip_debug > 3) printf a |
|
2711 |
#define ip3dbg(a) if (ip_debug > 4) printf a |
|
2712 |
#else |
|
2713 |
#define ip0dbg(a) /* */ |
|
2714 |
#define ip1dbg(a) /* */ |
|
2715 |
#define ip2dbg(a) /* */ |
|
2716 |
#define ip3dbg(a) /* */ |
|
2717 |
#endif /* IP_DEBUG */ |
|
2718 |
||
2719 |
extern const char *dlpi_prim_str(int); |
|
2720 |
extern const char *dlpi_err_str(int); |
|
2721 |
extern void ill_frag_timer(void *); |
|
2722 |
extern ill_t *ill_first(int, int, ill_walk_context_t *); |
|
2723 |
extern ill_t *ill_next(ill_walk_context_t *, ill_t *); |
|
2724 |
extern void ill_frag_timer_start(ill_t *); |
|
2725 |
extern mblk_t *ip_carve_mp(mblk_t **, ssize_t); |
|
2726 |
extern mblk_t *ip_dlpi_alloc(size_t, t_uscalar_t); |
|
2727 |
extern char *ip_dot_addr(ipaddr_t, char *); |
|
2728 |
extern void ip_lwput(queue_t *, mblk_t *); |
|
2729 |
extern boolean_t icmp_err_rate_limit(void); |
|
2730 |
extern void icmp_time_exceeded(queue_t *, mblk_t *, uint8_t); |
|
2731 |
extern void icmp_unreachable(queue_t *, mblk_t *, uint8_t); |
|
2732 |
extern mblk_t *ip_add_info(mblk_t *, ill_t *, uint_t); |
|
2733 |
extern mblk_t *ip_bind_v4(queue_t *, mblk_t *, conn_t *); |
|
2734 |
extern int ip_bind_connected(conn_t *, mblk_t *, ipaddr_t *, uint16_t, |
|
2735 |
ipaddr_t, uint16_t, boolean_t, boolean_t, boolean_t, |
|
2736 |
boolean_t); |
|
2737 |
extern boolean_t ip_bind_ipsec_policy_set(conn_t *, mblk_t *); |
|
2738 |
extern int ip_bind_laddr(conn_t *, mblk_t *, ipaddr_t, uint16_t, |
|
2739 |
boolean_t, boolean_t, boolean_t); |
|
2740 |
extern uint_t ip_cksum(mblk_t *, int, uint32_t); |
|
2741 |
extern int ip_close(queue_t *, int); |
|
2742 |
extern uint16_t ip_csum_hdr(ipha_t *); |
|
2743 |
extern void ip_proto_not_sup(queue_t *, mblk_t *, uint_t, zoneid_t); |
|
2744 |
extern void ip_ire_fini(void); |
|
2745 |
extern void ip_ire_init(void); |
|
2746 |
extern int ip_open(queue_t *, dev_t *, int, int, cred_t *); |
|
2747 |
extern int ip_reassemble(mblk_t *, ipf_t *, uint_t, boolean_t, ill_t *, |
|
2748 |
size_t); |
|
2749 |
extern int ip_opt_set_ill(conn_t *, int, boolean_t, boolean_t, |
|
2750 |
int, int, mblk_t *); |
|
2751 |
extern void ip_rput(queue_t *, mblk_t *); |
|
2752 |
extern void ip_input(ill_t *, ill_rx_ring_t *, mblk_t *, size_t); |
|
2753 |
extern void ip_rput_dlpi(queue_t *, mblk_t *); |
|
2754 |
extern void ip_rput_forward(ire_t *, ipha_t *, mblk_t *, ill_t *); |
|
2755 |
extern void ip_rput_forward_multicast(ipaddr_t, mblk_t *, ipif_t *); |
|
741
40027a3621ac
PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents:
679
diff
changeset
|
2756 |
|
40027a3621ac
PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents:
679
diff
changeset
|
2757 |
extern int ip_snmpmod_close(queue_t *); |
40027a3621ac
PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents:
679
diff
changeset
|
2758 |
extern void ip_snmpmod_wput(queue_t *, mblk_t *); |
0 | 2759 |
extern void ip_udp_input(queue_t *, mblk_t *, ipha_t *, ire_t *, ill_t *); |
2760 |
extern void ip_proto_input(queue_t *, mblk_t *, ipha_t *, ire_t *, ill_t *); |
|
2761 |
extern void ip_rput_other(ipsq_t *, queue_t *, mblk_t *, void *); |
|
2762 |
extern void ip_setqinfo(queue_t *, minor_t, boolean_t); |
|
2763 |
extern void ip_trash_ire_reclaim(void *); |
|
2764 |
extern void ip_trash_timer_expire(void *); |
|
2765 |
extern void ip_wput(queue_t *, mblk_t *); |
|
2766 |
extern void ip_output(void *, mblk_t *, void *, int); |
|
2767 |
extern void ip_wput_md(queue_t *, mblk_t *, conn_t *); |
|
2768 |
||
2769 |
extern void ip_wput_ire(queue_t *, mblk_t *, ire_t *, conn_t *, int); |
|
2770 |
extern void ip_wput_local(queue_t *, ill_t *, ipha_t *, mblk_t *, ire_t *, |
|
2771 |
int, zoneid_t); |
|
2772 |
extern void ip_wput_multicast(queue_t *, mblk_t *, ipif_t *); |
|
2773 |
extern void ip_wput_nondata(ipsq_t *, queue_t *, mblk_t *, void *); |
|
2774 |
extern void ip_wsrv(queue_t *); |
|
2775 |
extern char *ip_nv_lookup(nv_t *, int); |
|
2776 |
extern boolean_t ip_local_addr_ok_v6(const in6_addr_t *, const in6_addr_t *); |
|
2777 |
extern boolean_t ip_remote_addr_ok_v6(const in6_addr_t *, const in6_addr_t *); |
|
2778 |
extern ipaddr_t ip_massage_options(ipha_t *); |
|
2779 |
extern ipaddr_t ip_net_mask(ipaddr_t); |
|
2780 |
extern void ip_newroute(queue_t *, mblk_t *, ipaddr_t, ill_t *, conn_t *); |
|
2781 |
||
2782 |
extern struct qinit rinit_ipv6; |
|
2783 |
extern struct qinit winit_ipv6; |
|
2784 |
extern struct qinit rinit_tcp; |
|
2785 |
extern struct qinit rinit_tcp6; |
|
2786 |
extern struct qinit winit_tcp; |
|
2787 |
extern struct qinit rinit_acceptor_tcp; |
|
2788 |
extern struct qinit winit_acceptor_tcp; |
|
2789 |
||
2790 |
extern void conn_drain_insert(conn_t *connp); |
|
2791 |
extern int conn_ipsec_length(conn_t *connp); |
|
2792 |
extern void ip_wput_ipsec_out(queue_t *, mblk_t *, ipha_t *, ill_t *, |
|
2793 |
ire_t *); |
|
2794 |
extern ipaddr_t ip_get_dst(ipha_t *); |
|
2795 |
extern int ipsec_out_extra_length(mblk_t *); |
|
2796 |
extern int ipsec_in_extra_length(mblk_t *); |
|
2797 |
extern mblk_t *ipsec_in_alloc(); |
|
2798 |
extern boolean_t ipsec_in_is_secure(mblk_t *); |
|
2799 |
extern void ipsec_out_process(queue_t *, mblk_t *, ire_t *, uint_t); |
|
2800 |
extern void ipsec_out_to_in(mblk_t *); |
|
2801 |
extern int ill_forward_set(queue_t *, mblk_t *, boolean_t, caddr_t); |
|
2802 |
extern void ip_fanout_proto_again(mblk_t *, ill_t *, ill_t *, ire_t *); |
|
2803 |
||
2804 |
extern void ire_cleanup(ire_t *); |
|
2805 |
extern void ire_inactive(ire_t *); |
|
2806 |
extern ire_t *ire_unlink(irb_t *); |
|
2807 |
#ifdef IRE_DEBUG |
|
2808 |
extern void ire_trace_ref(ire_t *ire); |
|
2809 |
extern void ire_untrace_ref(ire_t *ire); |
|
2810 |
extern void ire_thread_exit(ire_t *ire, caddr_t); |
|
2811 |
#endif |
|
2812 |
#ifdef ILL_DEBUG |
|
2813 |
extern void ill_trace_cleanup(ill_t *); |
|
2814 |
extern void ipif_trace_cleanup(ipif_t *); |
|
2815 |
#endif |
|
2816 |
||
2817 |
extern int ip_srcid_insert(const in6_addr_t *, zoneid_t); |
|
2818 |
extern int ip_srcid_remove(const in6_addr_t *, zoneid_t); |
|
2819 |
extern void ip_srcid_find_id(uint_t, in6_addr_t *, zoneid_t); |
|
2820 |
extern uint_t ip_srcid_find_addr(const in6_addr_t *, zoneid_t); |
|
2821 |
extern int ip_srcid_report(queue_t *, mblk_t *, caddr_t, cred_t *); |
|
2822 |
||
2823 |
extern uint8_t ipoptp_next(ipoptp_t *); |
|
2824 |
extern uint8_t ipoptp_first(ipoptp_t *, ipha_t *); |
|
2825 |
extern ill_t *ip_grab_attach_ill(ill_t *, mblk_t *, int, boolean_t); |
|
2826 |
extern ire_t *conn_set_outgoing_ill(conn_t *, ire_t *, ill_t **); |
|
2827 |
extern int ipsec_req_from_conn(conn_t *, ipsec_req_t *, int); |
|
2828 |
extern int ip_snmp_get(queue_t *q, mblk_t *mctl); |
|
2829 |
extern int ip_snmp_set(queue_t *q, int, int, uchar_t *, int); |
|
2830 |
extern void ip_process_ioctl(ipsq_t *, queue_t *, mblk_t *, void *); |
|
741
40027a3621ac
PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents:
679
diff
changeset
|
2831 |
extern void ip_quiesce_conn(conn_t *); |
0 | 2832 |
extern void ip_reprocess_ioctl(ipsq_t *, queue_t *, mblk_t *, void *); |
2833 |
extern void ip_restart_optmgmt(ipsq_t *, queue_t *, mblk_t *, void *); |
|
2834 |
extern void ip_ioctl_finish(queue_t *, mblk_t *, int, int, ipif_t *, |
|
2835 |
ipsq_t *); |
|
2836 |
||
2837 |
extern boolean_t ipsq_pending_mp_cleanup(ill_t *, conn_t *); |
|
2838 |
extern void conn_ioctl_cleanup(conn_t *); |
|
2839 |
extern ill_t *conn_get_held_ill(conn_t *, ill_t **, int *); |
|
2840 |
||
2841 |
struct multidata_s; |
|
2842 |
struct pdesc_s; |
|
2843 |
||
2844 |
extern mblk_t *ip_mdinfo_alloc(ill_mdt_capab_t *); |
|
2845 |
extern mblk_t *ip_mdinfo_return(ire_t *, conn_t *, char *, ill_mdt_capab_t *); |
|
2846 |
extern uint_t ip_md_cksum(struct pdesc_s *, int, uint_t); |
|
2847 |
extern boolean_t ip_md_addr_attr(struct multidata_s *, struct pdesc_s *, |
|
2848 |
const mblk_t *); |
|
2849 |
extern boolean_t ip_md_hcksum_attr(struct multidata_s *, struct pdesc_s *, |
|
2850 |
uint32_t, uint32_t, uint32_t, uint32_t); |
|
2851 |
extern boolean_t ip_md_zcopy_attr(struct multidata_s *, struct pdesc_s *, |
|
2852 |
uint_t); |
|
741
40027a3621ac
PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents:
679
diff
changeset
|
2853 |
extern mblk_t *ip_unbind(queue_t *, mblk_t *); |
0 | 2854 |
|
2855 |
/* Hooks for CGTP (multirt routes) filtering module */ |
|
2856 |
#define CGTP_FILTER_REV_1 1 |
|
2857 |
#define CGTP_FILTER_REV_2 2 |
|
2858 |
#define CGTP_FILTER_REV CGTP_FILTER_REV_2 |
|
2859 |
||
2860 |
/* cfo_filter, cfo_filter_fp, cfo_filter_v6 hooks return values */ |
|
2861 |
#define CGTP_IP_PKT_NOT_CGTP 0 |
|
2862 |
#define CGTP_IP_PKT_PREMIUM 1 |
|
2863 |
#define CGTP_IP_PKT_DUPLICATE 2 |
|
2864 |
||
2865 |
typedef struct cgtp_filter_ops { |
|
2866 |
int cfo_filter_rev; |
|
2867 |
int (*cfo_change_state)(int); |
|
2868 |
int (*cfo_add_dest_v4)(ipaddr_t, ipaddr_t, ipaddr_t, ipaddr_t); |
|
2869 |
int (*cfo_del_dest_v4)(ipaddr_t, ipaddr_t); |
|
2870 |
int (*cfo_add_dest_v6)(in6_addr_t *, in6_addr_t *, in6_addr_t *, |
|
2871 |
in6_addr_t *); |
|
2872 |
int (*cfo_del_dest_v6)(in6_addr_t *, in6_addr_t *); |
|
2873 |
int (*cfo_filter)(queue_t *, mblk_t *); |
|
2874 |
int (*cfo_filter_fp)(queue_t *, mblk_t *); |
|
2875 |
int (*cfo_filter_v6)(queue_t *, ip6_t *, ip6_frag_t *); |
|
2876 |
} cgtp_filter_ops_t; |
|
2877 |
||
2878 |
#define CGTP_MCAST_SUCCESS 1 |
|
2879 |
||
2880 |
extern cgtp_filter_ops_t *ip_cgtp_filter_ops; |
|
2881 |
extern boolean_t ip_cgtp_filter; |
|
2882 |
||
2883 |
extern int ip_cgtp_filter_supported(void); |
|
2884 |
extern int ip_cgtp_filter_register(cgtp_filter_ops_t *); |
|
2885 |
||
2886 |
/* Flags for ire_multirt_lookup() */ |
|
2887 |
||
2888 |
#define MULTIRT_USESTAMP 0x0001 |
|
2889 |
#define MULTIRT_SETSTAMP 0x0002 |
|
2890 |
#define MULTIRT_CACHEGW 0x0004 |
|
2891 |
||
2892 |
/* Debug stuff for multirt route resolution. */ |
|
2893 |
#if defined(DEBUG) && !defined(__lint) |
|
2894 |
/* Our "don't send, rather drop" flag. */ |
|
2895 |
#define MULTIRT_DEBUG_FLAG 0x8000 |
|
2896 |
||
2897 |
#define MULTIRT_TRACE(x) ip2dbg(x) |
|
2898 |
||
2899 |
#define MULTIRT_DEBUG_TAG(mblk) \ |
|
2900 |
do { \ |
|
2901 |
ASSERT(mblk != NULL); \ |
|
2902 |
MULTIRT_TRACE(("%s[%d]: tagging mblk %p, tag was %d\n", \ |
|
2903 |
__FILE__, __LINE__, \ |
|
2904 |
(void *)(mblk), (mblk)->b_flag & MULTIRT_DEBUG_FLAG)); \ |
|
2905 |
(mblk)->b_flag |= MULTIRT_DEBUG_FLAG; \ |
|
2906 |
} while (0) |
|
2907 |
||
2908 |
#define MULTIRT_DEBUG_UNTAG(mblk) \ |
|
2909 |
do { \ |
|
2910 |
ASSERT(mblk != NULL); \ |
|
2911 |
MULTIRT_TRACE(("%s[%d]: untagging mblk %p, tag was %d\n", \ |
|
2912 |
__FILE__, __LINE__, \ |
|
2913 |
(void *)(mblk), (mblk)->b_flag & MULTIRT_DEBUG_FLAG)); \ |
|
2914 |
(mblk)->b_flag &= ~MULTIRT_DEBUG_FLAG; \ |
|
2915 |
} while (0) |
|
2916 |
||
2917 |
#define MULTIRT_DEBUG_TAGGED(mblk) \ |
|
2918 |
(((mblk)->b_flag & MULTIRT_DEBUG_FLAG) ? B_TRUE : B_FALSE) |
|
2919 |
#else |
|
2920 |
#define MULTIRT_DEBUG_TAG(mblk) ASSERT(mblk != NULL) |
|
2921 |
#define MULTIRT_DEBUG_UNTAG(mblk) ASSERT(mblk != NULL) |
|
2922 |
#define MULTIRT_DEBUG_TAGGED(mblk) B_FALSE |
|
2923 |
#endif |
|
2924 |
||
2925 |
/* |
|
2926 |
* Per-ILL Multidata Transmit capabilities. |
|
2927 |
*/ |
|
2928 |
struct ill_mdt_capab_s { |
|
2929 |
uint_t ill_mdt_version; /* interface version */ |
|
2930 |
uint_t ill_mdt_on; /* on/off switch for MDT on this ILL */ |
|
2931 |
uint_t ill_mdt_hdr_head; /* leading header fragment extra space */ |
|
2932 |
uint_t ill_mdt_hdr_tail; /* trailing header fragment extra space */ |
|
2933 |
uint_t ill_mdt_max_pld; /* maximum payload buffers per Multidata */ |
|
2934 |
uint_t ill_mdt_span_limit; /* maximum payload span per packet */ |
|
2935 |
}; |
|
2936 |
||
2937 |
struct ill_hcksum_capab_s { |
|
2938 |
uint_t ill_hcksum_version; /* interface version */ |
|
2939 |
uint_t ill_hcksum_txflags; /* capabilities on transmit */ |
|
2940 |
}; |
|
2941 |
||
2942 |
struct ill_zerocopy_capab_s { |
|
2943 |
uint_t ill_zerocopy_version; /* interface version */ |
|
2944 |
uint_t ill_zerocopy_flags; /* capabilities */ |
|
2945 |
}; |
|
2946 |
||
2947 |
/* Possible ill_states */ |
|
2948 |
#define ILL_RING_INPROC 3 /* Being assigned to squeue */ |
|
2949 |
#define ILL_RING_INUSE 2 /* Already Assigned to Rx Ring */ |
|
2950 |
#define ILL_RING_BEING_FREED 1 /* Being Unassigned */ |
|
2951 |
#define ILL_RING_FREE 0 /* Available to be assigned to Ring */ |
|
2952 |
||
2953 |
#define ILL_MAX_RINGS 256 /* Max num of rx rings we can manage */ |
|
2954 |
#define ILL_POLLING 0x01 /* Polling in use */ |
|
2955 |
||
2956 |
/* |
|
449
8625752bb102
6252036 dladm show-link outputs nothing for regular users
ericheng
parents:
269
diff
changeset
|
2957 |
* This function pointer type is exported by the mac layer. |
8625752bb102
6252036 dladm show-link outputs nothing for regular users
ericheng
parents:
269
diff
changeset
|
2958 |
* we need to duplicate the definition here because we cannot |
0 | 2959 |
* include mac.h in this file. |
2960 |
*/ |
|
2961 |
typedef void (*ip_mac_blank_t)(void *, time_t, uint_t); |
|
2962 |
||
2963 |
struct ill_rx_ring { |
|
2964 |
ip_mac_blank_t rr_blank; /* Driver interrupt blanking func */ |
|
2965 |
void *rr_handle; /* Handle for Rx ring */ |
|
2966 |
squeue_t *rr_sqp; /* Squeue the ring is bound to */ |
|
2967 |
ill_t *rr_ill; /* back pointer to ill */ |
|
2968 |
clock_t rr_poll_time; /* Last lbolt polling was used */ |
|
2969 |
uint32_t rr_poll_state; /* polling state flags */ |
|
2970 |
uint32_t rr_max_blank_time; /* Max interrupt blank */ |
|
2971 |
uint32_t rr_min_blank_time; /* Min interrupt blank */ |
|
2972 |
uint32_t rr_max_pkt_cnt; /* Max pkts before interrupt */ |
|
2973 |
uint32_t rr_min_pkt_cnt; /* Mix pkts before interrupt */ |
|
2974 |
uint32_t rr_normal_blank_time; /* Normal intr freq */ |
|
2975 |
uint32_t rr_normal_pkt_cnt; /* Normal intr pkt cnt */ |
|
2976 |
uint32_t rr_ring_state; /* State of this ring */ |
|
2977 |
}; |
|
2978 |
||
449
8625752bb102
6252036 dladm show-link outputs nothing for regular users
ericheng
parents:
269
diff
changeset
|
2979 |
/* |
8625752bb102
6252036 dladm show-link outputs nothing for regular users
ericheng
parents:
269
diff
changeset
|
2980 |
* This is exported by dld and is meant to be invoked from a ULP. |
8625752bb102
6252036 dladm show-link outputs nothing for regular users
ericheng
parents:
269
diff
changeset
|
2981 |
*/ |
8625752bb102
6252036 dladm show-link outputs nothing for regular users
ericheng
parents:
269
diff
changeset
|
2982 |
typedef void (*ip_dld_tx_t)(void *, mblk_t *); |
8625752bb102
6252036 dladm show-link outputs nothing for regular users
ericheng
parents:
269
diff
changeset
|
2983 |
|
0 | 2984 |
struct ill_poll_capab_s { |
449
8625752bb102
6252036 dladm show-link outputs nothing for regular users
ericheng
parents:
269
diff
changeset
|
2985 |
ip_dld_tx_t ill_tx; /* dld-supplied tx routine */ |
8625752bb102
6252036 dladm show-link outputs nothing for regular users
ericheng
parents:
269
diff
changeset
|
2986 |
void *ill_tx_handle; /* dld-supplied tx handle */ |
0 | 2987 |
ill_rx_ring_t *ill_ring_tbl; /* Ring to Sqp mapping table */ |
2988 |
conn_t *ill_unbind_conn; /* Conn used during unplumb */ |
|
2989 |
}; |
|
2990 |
||
2991 |
/* |
|
2992 |
* IP squeues exports |
|
2993 |
*/ |
|
2994 |
extern int ip_squeue_profile; |
|
2995 |
extern int ip_squeue_bind; |
|
2996 |
extern boolean_t ip_squeue_fanout; |
|
2997 |
||
2998 |
typedef struct squeue_set_s { |
|
2999 |
kmutex_t sqs_lock; |
|
3000 |
struct squeue_s **sqs_list; |
|
3001 |
int sqs_size; |
|
3002 |
int sqs_max_size; |
|
3003 |
processorid_t sqs_bind; |
|
3004 |
} squeue_set_t; |
|
3005 |
||
3006 |
#define IP_SQUEUE_GET(hint) \ |
|
3007 |
(!ip_squeue_fanout ? \ |
|
3008 |
(CPU->cpu_squeue_set->sqs_list[hint % \ |
|
3009 |
CPU->cpu_squeue_set->sqs_size]) : \ |
|
3010 |
ip_squeue_random(hint)) |
|
3011 |
||
3012 |
typedef void (*squeue_func_t)(squeue_t *, mblk_t *, sqproc_t, void *, uint8_t); |
|
3013 |
||
3014 |
extern void ip_squeue_init(void (*)(squeue_t *)); |
|
3015 |
extern squeue_t *ip_squeue_random(uint_t); |
|
3016 |
extern squeue_t *ip_squeue_get(ill_rx_ring_t *); |
|
3017 |
extern void ip_squeue_get_pkts(squeue_t *); |
|
3018 |
extern int ip_squeue_bind_set(queue_t *, mblk_t *, char *, caddr_t, cred_t *); |
|
3019 |
extern int ip_squeue_bind_get(queue_t *, mblk_t *, caddr_t, cred_t *); |
|
3020 |
extern void ip_squeue_clean(void *, mblk_t *, void *); |
|
741
40027a3621ac
PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents:
679
diff
changeset
|
3021 |
extern void ip_resume_tcp_bind(void *, mblk_t *, void *); |
40027a3621ac
PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents:
679
diff
changeset
|
3022 |
|
40027a3621ac
PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents:
679
diff
changeset
|
3023 |
extern void tcp_wput(queue_t *, mblk_t *); |
40027a3621ac
PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents:
679
diff
changeset
|
3024 |
|
0 | 3025 |
extern int ip_fill_mtuinfo(struct in6_addr *, in_port_t, |
3026 |
struct ip6_mtuinfo *); |
|
741
40027a3621ac
PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents:
679
diff
changeset
|
3027 |
extern ipif_t *conn_get_held_ipif(conn_t *, ipif_t **, int *); |
40027a3621ac
PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents:
679
diff
changeset
|
3028 |
|
40027a3621ac
PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents:
679
diff
changeset
|
3029 |
typedef void (*ipsq_func_t)(ipsq_t *, queue_t *, mblk_t *, void *); |
0 | 3030 |
|
3031 |
/* |
|
3032 |
* Squeue tags. Tags only need to be unique when the callback function is the |
|
3033 |
* same to distinguish between different calls, but we use unique tags for |
|
3034 |
* convenience anyway. |
|
3035 |
*/ |
|
3036 |
#define SQTAG_IP_INPUT 1 |
|
3037 |
#define SQTAG_TCP_INPUT_ICMP_ERR 2 |
|
3038 |
#define SQTAG_TCP6_INPUT_ICMP_ERR 3 |
|
3039 |
#define SQTAG_IP_TCP_INPUT 4 |
|
3040 |
#define SQTAG_IP6_TCP_INPUT 5 |
|
3041 |
#define SQTAG_IP_TCP_CLOSE 6 |
|
3042 |
#define SQTAG_TCP_OUTPUT 7 |
|
3043 |
#define SQTAG_TCP_TIMER 8 |
|
3044 |
#define SQTAG_TCP_TIMEWAIT 9 |
|
3045 |
#define SQTAG_TCP_ACCEPT_FINISH 10 |
|
3046 |
#define SQTAG_TCP_ACCEPT_FINISH_Q0 11 |
|
3047 |
#define SQTAG_TCP_ACCEPT_PENDING 12 |
|
3048 |
#define SQTAG_TCP_LISTEN_DISCON 13 |
|
3049 |
#define SQTAG_TCP_CONN_REQ 14 |
|
3050 |
#define SQTAG_TCP_EAGER_BLOWOFF 15 |
|
3051 |
#define SQTAG_TCP_EAGER_CLEANUP 16 |
|
3052 |
#define SQTAG_TCP_EAGER_CLEANUP_Q0 17 |
|
3053 |
#define SQTAG_TCP_CONN_IND 18 |
|
3054 |
#define SQTAG_TCP_RSRV 19 |
|
3055 |
#define SQTAG_TCP_ABORT_BUCKET 20 |
|
3056 |
#define SQTAG_TCP_REINPUT 21 |
|
3057 |
#define SQTAG_TCP_REINPUT_EAGER 22 |
|
3058 |
#define SQTAG_TCP_INPUT_MCTL 23 |
|
3059 |
#define SQTAG_TCP_RPUTOTHER 24 |
|
3060 |
#define SQTAG_IP_PROTO_AGAIN 25 |
|
3061 |
#define SQTAG_IP_FANOUT_TCP 26 |
|
3062 |
#define SQTAG_IPSQ_CLEAN_RING 27 |
|
3063 |
#define SQTAG_TCP_WPUT_OTHER 28 |
|
3064 |
#define SQTAG_TCP_CONN_REQ_UNBOUND 29 |
|
3065 |
#define SQTAG_TCP_SEND_PENDING 30 |
|
741
40027a3621ac
PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents:
679
diff
changeset
|
3066 |
#define SQTAG_BIND_RETRY 31 |
40027a3621ac
PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents:
679
diff
changeset
|
3067 |
#define SQTAG_UDP_FANOUT 32 |
40027a3621ac
PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents:
679
diff
changeset
|
3068 |
#define SQTAG_UDP_INPUT 33 |
40027a3621ac
PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents:
679
diff
changeset
|
3069 |
#define SQTAG_UDP_WPUT 34 |
40027a3621ac
PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents:
679
diff
changeset
|
3070 |
#define SQTAG_UDP_OUTPUT 35 |
0 | 3071 |
|
3072 |
#endif /* _KERNEL */ |
|
3073 |
||
3074 |
#ifdef __cplusplus |
|
3075 |
} |
|
3076 |
#endif |
|
3077 |
||
3078 |
#endif /* _INET_IP_H */ |