xref: /freebsd/sys/netinet/sctp_var.h (revision c96ae1968a6ab7056427a739bce81bf07447c2d4)
1 /*-
2  * Copyright (c) 2001-2007, Cisco Systems, Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are met:
6  *
7  * a) Redistributions of source code must retain the above copyright notice,
8  *   this list of conditions and the following disclaimer.
9  *
10  * b) Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in
12  *   the documentation and/or other materials provided with the distribution.
13  *
14  * c) Neither the name of Cisco Systems, Inc. nor the names of its
15  *    contributors may be used to endorse or promote products derived
16  *    from this software without specific prior written permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
20  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
22  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
28  * THE POSSIBILITY OF SUCH DAMAGE.
29  */
30 
31 /* $KAME: sctp_var.h,v 1.24 2005/03/06 16:04:19 itojun Exp $	 */
32 
33 #include <sys/cdefs.h>
34 __FBSDID("$FreeBSD$");
35 
36 #ifndef _NETINET_SCTP_VAR_H_
37 #define _NETINET_SCTP_VAR_H_
38 
39 #include <sys/socketvar.h>
40 #include <netinet/sctp_uio.h>
41 
42 /* SCTP Kernel structures */
43 
44 /*
45  * Names for SCTP sysctl objects
46  */
47 #define	SCTPCTL_MAXDGRAM	    1	/* max datagram size */
48 #define	SCTPCTL_RECVSPACE	    2	/* default receive buffer space */
49 #define SCTPCTL_AUTOASCONF          3	/* auto asconf enable/disable flag */
50 #define SCTPCTL_ECN_ENABLE          4	/* Is ecn allowed */
51 #define SCTPCTL_ECN_NONCE           5	/* Is ecn nonce allowed */
52 #define SCTPCTL_STRICT_SACK         6	/* strictly require sack'd TSN's to be
53 					 * smaller than sndnxt. */
54 #define SCTPCTL_NOCSUM_LO           7	/* Require that the Loopback NOT have
55 					 * the crc32 checksum on packets
56 					 * routed over it. */
57 #define SCTPCTL_STRICT_INIT         8
58 #define SCTPCTL_PEER_CHK_OH         9
59 #define SCTPCTL_MAXBURST            10
60 #define SCTPCTL_MAXCHUNKONQ         11
61 #define SCTPCTL_DELAYED_SACK        12
62 #define SCTPCTL_HB_INTERVAL         13
63 #define SCTPCTL_PMTU_RAISE          14
64 #define SCTPCTL_SHUTDOWN_GUARD      15
65 #define SCTPCTL_SECRET_LIFETIME     16
66 #define SCTPCTL_RTO_MAX             17
67 #define SCTPCTL_RTO_MIN             18
68 #define SCTPCTL_RTO_INITIAL         19
69 #define SCTPCTL_INIT_RTO_MAX        20
70 #define SCTPCTL_COOKIE_LIFE         21
71 #define SCTPCTL_INIT_RTX_MAX        22
72 #define SCTPCTL_ASSOC_RTX_MAX       23
73 #define SCTPCTL_PATH_RTX_MAX        24
74 #define SCTPCTL_NR_OUTGOING_STREAMS 25
75 #define SCTPCTL_CMT_ON_OFF          26
76 #define SCTPCTL_CWND_MAXBURST       27
77 #define SCTPCTL_EARLY_FR            28
78 #define SCTPCTL_RTTVAR_CC           29
79 #define SCTPCTL_DEADLOCK_DET        30
80 #define SCTPCTL_EARLY_FR_MSEC       31
81 #define SCTPCTL_ASCONF_AUTH_NOCHK   32
82 #define SCTPCTL_AUTH_DISABLE        33
83 #define SCTPCTL_AUTH_RANDOM_LEN     34
84 #define SCTPCTL_AUTH_HMAC_ID        35
85 #define SCTPCTL_ABC_L_VAR           36
86 #define SCTPCTL_MAX_MBUF_CHAIN      37
87 #define SCTPCTL_CMT_USE_DAC         38
88 #define SCTPCTL_DO_DRAIN            39
89 #define SCTPCTL_WARM_CRC32          40
90 #define SCTPCTL_QLIMIT_ABORT        41
91 #define SCTPCTL_STRICT_ORDER        42
92 #define SCTPCTL_TCBHASHSIZE         43
93 #define SCTPCTL_PCBHASHSIZE         44
94 #define SCTPCTL_CHUNKSCALE          45
95 #define SCTPCTL_MINSPLIT            46
96 #define SCTPCTL_ADD_MORE            47
97 #define SCTPCTL_SYS_RESC            48
98 #define SCTPCTL_ASOC_RESC           49
99 #define SCTPCTL_NAT_FRIENDLY	    50
100 #ifdef SCTP_DEBUG
101 #define SCTPCTL_DEBUG               51
102 #define SCTPCTL_MAXID		    51
103 #else
104 #define SCTPCTL_MAXID		    50
105 #endif
106 
107 #ifdef SCTP_DEBUG
108 #define SCTPCTL_NAMES { \
109 	{ 0, 0 }, \
110 	{ "sendspace", CTLTYPE_INT }, \
111 	{ "recvspace", CTLTYPE_INT }, \
112 	{ "autoasconf", CTLTYPE_INT }, \
113 	{ "ecn_enable", CTLTYPE_INT }, \
114 	{ "ecn_nonce", CTLTYPE_INT }, \
115 	{ "strict_sack", CTLTYPE_INT }, \
116 	{ "looback_nocsum", CTLTYPE_INT }, \
117 	{ "strict_init", CTLTYPE_INT }, \
118 	{ "peer_chkoh", CTLTYPE_INT }, \
119 	{ "maxburst", CTLTYPE_INT }, \
120 	{ "maxchunks", CTLTYPE_INT }, \
121 	{ "delayed_sack_time", CTLTYPE_INT }, \
122 	{ "heartbeat_interval", CTLTYPE_INT }, \
123 	{ "pmtu_raise_time", CTLTYPE_INT }, \
124 	{ "shutdown_guard_time", CTLTYPE_INT }, \
125 	{ "secret_lifetime", CTLTYPE_INT }, \
126 	{ "rto_max", CTLTYPE_INT }, \
127 	{ "rto_min", CTLTYPE_INT }, \
128 	{ "rto_initial", CTLTYPE_INT }, \
129 	{ "init_rto_max", CTLTYPE_INT }, \
130 	{ "valid_cookie_life", CTLTYPE_INT }, \
131 	{ "init_rtx_max", CTLTYPE_INT }, \
132 	{ "assoc_rtx_max", CTLTYPE_INT }, \
133 	{ "path_rtx_max", CTLTYPE_INT }, \
134 	{ "nr_outgoing_streams", CTLTYPE_INT }, \
135 	{ "cmt_on_off", CTLTYPE_INT }, \
136 	{ "cwnd_maxburst", CTLTYPE_INT }, \
137 	{ "early_fast_retran", CTLTYPE_INT }, \
138 	{ "use_rttvar_congctrl", CTLTYPE_INT }, \
139 	{ "deadlock_detect", CTLTYPE_INT }, \
140 	{ "early_fast_retran_msec", CTLTYPE_INT }, \
141 	{ "asconf_auth_nochk", CTLTYPE_INT }, \
142 	{ "auth_disable", CTLTYPE_INT }, \
143 	{ "auth_random_len", CTLTYPE_INT }, \
144 	{ "auth_hmac_id", CTLTYPE_INT }, \
145 	{ "abc_l_var", CTLTYPE_INT }, \
146 	{ "max_mbuf_chain", CTLTYPE_INT }, \
147 	{ "cmt_use_dac", CTLTYPE_INT }, \
148 	{ "do_sctp_drain", CTLTYPE_INT }, \
149 	{ "warm_crc_table", CTLTYPE_INT }, \
150 	{ "abort_at_limit", CTLTYPE_INT }, \
151 	{ "strict_data_order", CTLTYPE_INT }, \
152 	{ "tcbhashsize", CTLTYPE_INT }, \
153 	{ "pcbhashsize", CTLTYPE_INT }, \
154 	{ "chunkscale", CTLTYPE_INT }, \
155 	{ "min_split_point", CTLTYPE_INT }, \
156 	{ "add_more_on_output", CTLTYPE_INT }, \
157 	{ "sys_resource", CTLTYPE_INT }, \
158 	{ "asoc_resource", CTLTYPE_INT }, \
159 	{ "nat_friendly", CTLTYPE_INT }, \
160 	{ "debug", CTLTYPE_INT }, \
161 }
162 #else
163 #define SCTPCTL_NAMES { \
164 	{ 0, 0 }, \
165 	{ "sendspace", CTLTYPE_INT }, \
166 	{ "recvspace", CTLTYPE_INT }, \
167 	{ "autoasconf", CTLTYPE_INT }, \
168 	{ "ecn_enable", CTLTYPE_INT }, \
169 	{ "ecn_nonce", CTLTYPE_INT }, \
170 	{ "strict_sack", CTLTYPE_INT }, \
171 	{ "looback_nocsum", CTLTYPE_INT }, \
172 	{ "strict_init", CTLTYPE_INT }, \
173 	{ "peer_chkoh", CTLTYPE_INT }, \
174 	{ "maxburst", CTLTYPE_INT }, \
175 	{ "maxchunks", CTLTYPE_INT }, \
176 	{ "delayed_sack_time", CTLTYPE_INT }, \
177 	{ "heartbeat_interval", CTLTYPE_INT }, \
178 	{ "pmtu_raise_time", CTLTYPE_INT }, \
179 	{ "shutdown_guard_time", CTLTYPE_INT }, \
180 	{ "secret_lifetime", CTLTYPE_INT }, \
181 	{ "rto_max", CTLTYPE_INT }, \
182 	{ "rto_min", CTLTYPE_INT }, \
183 	{ "rto_initial", CTLTYPE_INT }, \
184 	{ "init_rto_max", CTLTYPE_INT }, \
185 	{ "valid_cookie_life", CTLTYPE_INT }, \
186 	{ "init_rtx_max", CTLTYPE_INT }, \
187 	{ "assoc_rtx_max", CTLTYPE_INT }, \
188 	{ "path_rtx_max", CTLTYPE_INT }, \
189 	{ "nr_outgoing_streams", CTLTYPE_INT }, \
190 	{ "cmt_on_off", CTLTYPE_INT }, \
191 	{ "cwnd_maxburst", CTLTYPE_INT }, \
192 	{ "early_fast_retran", CTLTYPE_INT }, \
193 	{ "use_rttvar_congctrl", CTLTYPE_INT }, \
194 	{ "deadlock_detect", CTLTYPE_INT }, \
195 	{ "early_fast_retran_msec", CTLTYPE_INT }, \
196 	{ "asconf_auth_nochk", CTLTYPE_INT }, \
197 	{ "auth_disable", CTLTYPE_INT }, \
198 	{ "auth_random_len", CTLTYPE_INT }, \
199 	{ "auth_hmac_id", CTLTYPE_INT }, \
200 	{ "abc_l_var", CTLTYPE_INT }, \
201 	{ "max_mbuf_chain", CTLTYPE_INT }, \
202 	{ "cmt_use_dac", CTLTYPE_INT }, \
203 	{ "do_sctp_drain", CTLTYPE_INT }, \
204 	{ "warm_crc_table", CTLTYPE_INT }, \
205 	{ "abort_at_limit", CTLTYPE_INT }, \
206 	{ "strict_data_order", CTLTYPE_INT }, \
207 	{ "tcbhashsize", CTLTYPE_INT }, \
208 	{ "pcbhashsize", CTLTYPE_INT }, \
209 	{ "chunkscale", CTLTYPE_INT }, \
210 	{ "min_split_point", CTLTYPE_INT }, \
211 	{ "add_more_on_output", CTLTYPE_INT }, \
212 	{ "sys_resource", CTLTYPE_INT }, \
213 	{ "asoc_resource", CTLTYPE_INT }, \
214 	{ "nat_friendly", CTLTYPE_INT }, \
215 }
216 #endif
217 
218 
219 #if defined(_KERNEL)
220 
221 #ifdef SYSCTL_DECL
222 SYSCTL_DECL(_net_inet_sctp);
223 #endif
224 extern struct pr_usrreqs sctp_usrreqs;
225 
226 
227 #define sctp_feature_on(inp, feature)  (inp->sctp_features |= feature)
228 #define sctp_feature_off(inp, feature) (inp->sctp_features &= ~feature)
229 #define sctp_is_feature_on(inp, feature) (inp->sctp_features & feature)
230 #define sctp_is_feature_off(inp, feature) ((inp->sctp_features & feature) == 0)
231 
232 #define	sctp_sbspace(asoc, sb) ((long) (((sb)->sb_hiwat > (asoc)->sb_cc) ? ((sb)->sb_hiwat - (asoc)->sb_cc) : 0))
233 
234 #define	sctp_sbspace_failedmsgs(sb) ((long) (((sb)->sb_hiwat > (sb)->sb_cc) ? ((sb)->sb_hiwat - (sb)->sb_cc) : 0))
235 
236 #define sctp_sbspace_sub(a,b) ((a > b) ? (a - b) : 0)
237 
238 extern uint32_t sctp_asoc_free_resc_limit;
239 extern uint32_t sctp_system_free_resc_limit;
240 
241 /* I tried to cache the readq entries at one
242  * point. But the reality is that it did not
243  * add any performance since this meant
244  * we had to lock the STCB on read. And at that point
245  * once you have to do an extra lock, it really does
246  * not matter if the lock is in the ZONE stuff or
247  * in our code. Note that this same problem would
248  * occur with an mbuf cache as well so it is
249  * not really worth doing, at least right now :-D
250  */
251 
252 #define sctp_free_a_readq(_stcb, _readq) { \
253 		SCTP_ZONE_FREE(sctppcbinfo.ipi_zone_readq, (_readq)); \
254 		SCTP_DECR_READQ_COUNT(); \
255 }
256 
257 #define sctp_alloc_a_readq(_stcb, _readq) { \
258 	(_readq) = (struct sctp_queued_to_read  *)SCTP_ZONE_GET(sctppcbinfo.ipi_zone_readq); \
259 	if ((_readq)) { \
260  	     SCTP_INCR_READQ_COUNT(); \
261 	} \
262 }
263 
264 
265 
266 #define sctp_free_a_strmoq(_stcb, _strmoq) { \
267        if (((_stcb)->asoc.free_strmoq_cnt > sctp_asoc_free_resc_limit) || \
268 	   (sctppcbinfo.ipi_free_strmoq > sctp_system_free_resc_limit)) { \
269 		SCTP_ZONE_FREE(sctppcbinfo.ipi_zone_strmoq, (_strmoq)); \
270 		SCTP_DECR_STRMOQ_COUNT(); \
271 	   } else { \
272 		TAILQ_INSERT_TAIL(&(_stcb)->asoc.free_strmoq, (_strmoq), next); \
273                 (_stcb)->asoc.free_strmoq_cnt++; \
274                 atomic_add_int(&sctppcbinfo.ipi_free_strmoq, 1); \
275 	   } \
276 }
277 
278 #define sctp_alloc_a_strmoq(_stcb, _strmoq) { \
279       if(TAILQ_EMPTY(&(_stcb)->asoc.free_strmoq))  { \
280 	(_strmoq) = (struct sctp_stream_queue_pending  *)SCTP_ZONE_GET(sctppcbinfo.ipi_zone_strmoq); \
281 	if ((_strmoq)) { \
282  	     SCTP_INCR_STRMOQ_COUNT(); \
283 	} \
284       } else { \
285         (_strmoq) = TAILQ_FIRST(&(_stcb)->asoc.free_strmoq); \
286          TAILQ_REMOVE(&(_stcb)->asoc.free_strmoq, (_strmoq), next); \
287          atomic_subtract_int(&sctppcbinfo.ipi_free_strmoq, 1); \
288          (_stcb)->asoc.free_strmoq_cnt--; \
289       } \
290 }
291 
292 
293 #define sctp_free_a_chunk(_stcb, _chk) { \
294        if (((_stcb)->asoc.free_chunk_cnt > sctp_asoc_free_resc_limit) || \
295 	   (sctppcbinfo.ipi_free_chunks > sctp_system_free_resc_limit)) { \
296 		SCTP_ZONE_FREE(sctppcbinfo.ipi_zone_chunk, (_chk)); \
297 		SCTP_DECR_CHK_COUNT(); \
298 	   } else { \
299 		TAILQ_INSERT_TAIL(&(_stcb)->asoc.free_chunks, (_chk), sctp_next); \
300                 (_stcb)->asoc.free_chunk_cnt++; \
301                 atomic_add_int(&sctppcbinfo.ipi_free_chunks, 1); \
302 	   } \
303 }
304 
305 #define sctp_alloc_a_chunk(_stcb, _chk) { \
306       if(TAILQ_EMPTY(&(_stcb)->asoc.free_chunks))  { \
307 	(_chk) = (struct sctp_tmit_chunk *)SCTP_ZONE_GET(sctppcbinfo.ipi_zone_chunk); \
308 	if ((_chk)) { \
309  	     SCTP_INCR_CHK_COUNT(); \
310 	} \
311       } else { \
312         (_chk) = TAILQ_FIRST(&(_stcb)->asoc.free_chunks); \
313          TAILQ_REMOVE(&(_stcb)->asoc.free_chunks, (_chk), sctp_next); \
314          atomic_subtract_int(&sctppcbinfo.ipi_free_chunks, 1); \
315          (_stcb)->asoc.free_chunk_cnt--; \
316       } \
317 }
318 
319 
320 
321 #define sctp_free_remote_addr(__net) { \
322 	if ((__net)) { \
323                 if (atomic_fetchadd_int(&(__net)->ref_count, -1) == 1) { \
324 			SCTP_OS_TIMER_STOP(&(__net)->rxt_timer.timer); \
325 			SCTP_OS_TIMER_STOP(&(__net)->pmtu_timer.timer); \
326 			SCTP_OS_TIMER_STOP(&(__net)->fr_timer.timer); \
327 			(__net)->dest_state = SCTP_ADDR_NOT_REACHABLE; \
328 			SCTP_ZONE_FREE(sctppcbinfo.ipi_zone_net, (__net)); \
329 			SCTP_DECR_RADDR_COUNT(); \
330 		} \
331 	} \
332 }
333 
334 #define sctp_sbfree(ctl, stcb, sb, m) { \
335         uint32_t val; \
336         val = atomic_fetchadd_int(&(sb)->sb_cc,-(SCTP_BUF_LEN((m)))); \
337         if(val < SCTP_BUF_LEN((m))) { \
338            panic("sb_cc goes negative"); \
339         } \
340         val = atomic_fetchadd_int(&(sb)->sb_mbcnt,-(MSIZE)); \
341         if(val < MSIZE) { \
342             panic("sb_mbcnt goes negative"); \
343         } \
344         if (SCTP_BUF_IS_EXTENDED(m)) { \
345                 val = atomic_fetchadd_int(&(sb)->sb_mbcnt,-(SCTP_BUF_EXTEND_SIZE(m))); \
346 		if(val < SCTP_BUF_EXTEND_SIZE(m)) { \
347                     panic("sb_mbcnt goes negative2"); \
348                 } \
349         } \
350         if (((ctl)->do_not_ref_stcb == 0) && stcb) {\
351           val = atomic_fetchadd_int(&(stcb)->asoc.sb_cc,-(SCTP_BUF_LEN((m)))); \
352           if(val < SCTP_BUF_LEN((m))) {\
353              panic("stcb->sb_cc goes negative"); \
354           } \
355           val = atomic_fetchadd_int(&(stcb)->asoc.sb_mbcnt,-(MSIZE)); \
356           if(val < MSIZE) { \
357              panic("asoc->mbcnt goes negative"); \
358           } \
359 	  if (SCTP_BUF_IS_EXTENDED(m)) { \
360                 val = atomic_fetchadd_int(&(stcb)->asoc.sb_mbcnt,-(SCTP_BUF_EXTEND_SIZE(m))); \
361 		if(val < SCTP_BUF_EXTEND_SIZE(m)) { \
362 		   panic("assoc stcb->mbcnt would go negative"); \
363                 } \
364           } \
365         } \
366 	if (SCTP_BUF_TYPE(m) != MT_DATA && SCTP_BUF_TYPE(m) != MT_HEADER && \
367 	    SCTP_BUF_TYPE(m) != MT_OOBDATA) \
368 		atomic_subtract_int(&(sb)->sb_ctl,SCTP_BUF_LEN((m))); \
369 }
370 
371 
372 #define sctp_sballoc(stcb, sb, m) { \
373 	atomic_add_int(&(sb)->sb_cc,SCTP_BUF_LEN((m))); \
374 	atomic_add_int(&(sb)->sb_mbcnt, MSIZE); \
375 	if (SCTP_BUF_IS_EXTENDED(m)) \
376 		atomic_add_int(&(sb)->sb_mbcnt,SCTP_BUF_EXTEND_SIZE(m)); \
377         if(stcb) { \
378   	  atomic_add_int(&(stcb)->asoc.sb_cc,SCTP_BUF_LEN((m))); \
379           atomic_add_int(&(stcb)->asoc.sb_mbcnt, MSIZE); \
380 	  if (SCTP_BUF_IS_EXTENDED(m)) \
381 		atomic_add_int(&(stcb)->asoc.sb_mbcnt,SCTP_BUF_EXTEND_SIZE(m)); \
382         } \
383 	if (SCTP_BUF_TYPE(m) != MT_DATA && SCTP_BUF_TYPE(m) != MT_HEADER && \
384 	    SCTP_BUF_TYPE(m) != MT_OOBDATA) \
385 		atomic_add_int(&(sb)->sb_ctl,SCTP_BUF_LEN((m))); \
386 }
387 
388 
389 #define sctp_ucount_incr(val) { \
390 	val++; \
391 }
392 
393 #define sctp_ucount_decr(val) { \
394 	if (val > 0) { \
395 		val--; \
396 	} else { \
397 		val = 0; \
398 	} \
399 }
400 
401 #define sctp_mbuf_crush(data) do { \
402                 struct mbuf *_m; \
403 		_m = (data); \
404 		while(_m && (SCTP_BUF_LEN(_m) == 0)) { \
405 			(data)  = SCTP_BUF_NEXT(_m); \
406 			SCTP_BUF_NEXT(_m) = NULL; \
407 			sctp_m_free(_m); \
408 			_m = (data); \
409 		} \
410 } while (0)
411 
412 
413 /*
414  * some sysctls
415  */
416 extern int sctp_sendspace;
417 extern int sctp_recvspace;
418 extern int sctp_ecn_enable;
419 extern int sctp_ecn_nonce;
420 extern int sctp_use_cwnd_based_maxburst;
421 extern unsigned int sctp_cmt_on_off;
422 extern unsigned int sctp_cmt_use_dac;
423 extern unsigned int sctp_cmt_sockopt_on_off;
424 extern uint32_t sctp_nat_friendly;
425 
426 struct sctp_nets;
427 struct sctp_inpcb;
428 struct sctp_tcb;
429 struct sctphdr;
430 
431 void sctp_ctlinput __P((int, struct sockaddr *, void *));
432 int sctp_ctloutput __P((struct socket *, struct sockopt *));
433 void sctp_input __P((struct mbuf *, int));
434 
435 void sctp_drain __P((void));
436 void sctp_init __P((void));
437 
438 
439 void sctp_pcbinfo_cleanup(void);
440 
441 int sctp_shutdown __P((struct socket *));
442 void sctp_notify
443 __P((struct sctp_inpcb *, int, struct sctphdr *,
444     struct sockaddr *, struct sctp_tcb *,
445     struct sctp_nets *));
446 
447 #if defined(INET6)
448 	void ip_2_ip6_hdr __P((struct ip6_hdr *, struct ip *));
449 
450 #endif
451 
452 	int sctp_bindx(struct socket *, int, struct sockaddr_storage *,
453         int, int, struct proc *);
454 
455 /* can't use sctp_assoc_t here */
456 	int sctp_peeloff(struct socket *, struct socket *, int, caddr_t, int *);
457 
458 	sctp_assoc_t sctp_getassocid(struct sockaddr *);
459 
460 
461 	int sctp_ingetaddr(struct socket *,
462         struct sockaddr **
463 );
464 
465 	int sctp_peeraddr(struct socket *,
466         struct sockaddr **
467 );
468 
469 	int sctp_listen(struct socket *, int, struct thread *);
470 
471 	int sctp_accept(struct socket *, struct sockaddr **);
472 
473 
474 #endif				/* _KERNEL */
475 
476 #endif				/* !_NETINET_SCTP_VAR_H_ */
477