2 * SPDX-License-Identifier: BSD-3-Clause
4 * Copyright (c) 2001-2007, by Cisco Systems, Inc. All rights reserved.
5 * Copyright (c) 2008-2012, by Randall Stewart. All rights reserved.
6 * Copyright (c) 2008-2012, by Michael Tuexen. All rights reserved.
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions are met:
11 * a) Redistributions of source code must retain the above copyright notice,
12 * this list of conditions and the following disclaimer.
14 * b) Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in
16 * the documentation and/or other materials provided with the distribution.
18 * c) Neither the name of Cisco Systems, Inc. nor the names of its
19 * contributors may be used to endorse or promote products derived
20 * from this software without specific prior written permission.
22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
24 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
26 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
30 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
32 * THE POSSIBILITY OF SUCH DAMAGE.
35 #ifndef _NETINET_SCTP_PCB_H_
36 #define _NETINET_SCTP_PCB_H_
38 #include <netinet/sctp_os.h>
39 #include <netinet/sctp.h>
40 #include <netinet/sctp_constants.h>
41 #include <netinet/sctp_sysctl.h>
43 LIST_HEAD(sctppcbhead
, sctp_inpcb
);
44 LIST_HEAD(sctpasochead
, sctp_tcb
);
45 LIST_HEAD(sctpladdr
, sctp_laddr
);
46 LIST_HEAD(sctpvtaghead
, sctp_tagblock
);
47 LIST_HEAD(sctp_vrflist
, sctp_vrf
);
48 LIST_HEAD(sctp_ifnlist
, sctp_ifn
);
49 LIST_HEAD(sctp_ifalist
, sctp_ifa
);
50 TAILQ_HEAD(sctp_readhead
, sctp_queued_to_read
);
51 TAILQ_HEAD(sctp_streamhead
, sctp_stream_queue_pending
);
53 #include <netinet/sctp_structs.h>
54 #include <netinet/sctp_auth.h>
56 #define SCTP_PCBHASH_ALLADDR(port, mask) (port & mask)
57 #define SCTP_PCBHASH_ASOC(tag, mask) (tag & mask)
60 LIST_ENTRY(sctp_vrf
) next_vrf
;
61 struct sctp_ifalist
*vrf_addr_hash
;
62 struct sctp_ifnlist ifnlist
;
64 uint32_t tbl_id_v4
; /* default v4 table id */
65 uint32_t tbl_id_v6
; /* default v6 table id */
66 uint32_t total_ifa_count
;
67 u_long vrf_addr_hashmark
;
72 struct sctp_ifalist ifalist
;
74 LIST_ENTRY(sctp_ifn
) next_ifn
;
75 LIST_ENTRY(sctp_ifn
) next_bucket
;
76 void *ifn_p
; /* never access without appropriate lock */
79 uint32_t ifn_index
; /* shorthand way to look at ifn for reference */
80 uint32_t refcount
; /* number of reference held should be >=
82 uint32_t ifa_count
; /* IFA's we hold (in our list - ifalist) */
83 uint32_t num_v6
; /* number of v6 addresses */
84 uint32_t num_v4
; /* number of v4 addresses */
85 uint32_t registered_af
; /* registered address family for i/f events */
86 char ifn_name
[SCTP_IFNAMSIZ
];
89 /* SCTP local IFA flags */
90 #define SCTP_ADDR_VALID 0x00000001 /* its up and active */
91 #define SCTP_BEING_DELETED 0x00000002 /* being deleted, when
92 * refcount = 0. Note that it
93 * is pulled from the ifn list
94 * and ifa_p is nulled right
95 * away but it cannot be freed
97 * pointing to it is deleted. */
98 #define SCTP_ADDR_DEFER_USE 0x00000004 /* Hold off using this one */
99 #define SCTP_ADDR_IFA_UNUSEABLE 0x00000008
102 LIST_ENTRY(sctp_ifa
) next_ifa
;
103 LIST_ENTRY(sctp_ifa
) next_bucket
;
104 struct sctp_ifn
*ifn_p
; /* back pointer to parent ifn */
105 void *ifa
; /* pointer to ifa, needed for flag update for
106 * that we MUST lock appropriate locks. This
108 union sctp_sockstore address
;
109 uint32_t refcount
; /* number of folks referring to this */
111 uint32_t localifa_flags
;
112 uint32_t vrf_id
; /* vrf_id of this addr (for deleting) */
120 LIST_ENTRY(sctp_laddr
) sctp_nxt_addr
; /* next in list */
121 struct sctp_ifa
*ifa
;
122 uint32_t action
; /* Used during asconf and adding if no-zero
123 * src-addr selection will not consider this
125 struct timeval start_time
; /* time when this address was created */
128 struct sctp_block_entry
{
132 struct sctp_timewait
{
133 time_t tv_sec_at_expire
; /* the seconds from boot to expire */
134 uint32_t v_tag
; /* the vtag that can not be reused */
135 uint16_t lport
; /* the local port used in vtag */
136 uint16_t rport
; /* the remote port used in vtag */
139 struct sctp_tagblock
{
140 LIST_ENTRY(sctp_tagblock
) sctp_nxt_tagblock
;
141 struct sctp_timewait vtag_block
[SCTP_NUMBER_IN_VTAG_BLOCK
];
146 struct socket
*udp4_tun_socket
;
149 struct socket
*udp6_tun_socket
;
151 struct sctpasochead
*sctp_asochash
;
154 struct sctppcbhead
*sctp_ephash
;
158 * The TCP model represents a substantial overhead in that we get an
159 * additional hash table to keep explicit connections in. The
160 * listening TCP endpoint will exist in the usual ephash above and
161 * accept only INIT's. It will be incapable of sending off an INIT.
162 * When a dg arrives we must look in the normal ephash. If we find a
163 * TCP endpoint that will tell us to go to the specific endpoint
164 * hash and re-hash to find the right assoc/socket. If we find a UDP
165 * model socket we then must complete the lookup. If this fails,
166 * i.e. no association can be found then we must continue to see if
167 * a sctp_peeloff()'d socket is in the tcpephash (a spun off socket
168 * acts like a TCP model connected socket).
170 struct sctppcbhead
*sctp_tcpephash
;
172 uint32_t hashtblsize
;
174 struct sctp_vrflist
*sctp_vrfhash
;
177 struct sctp_ifnlist
*vrf_ifn_hash
;
178 u_long vrf_ifn_hashmark
;
180 struct sctppcbhead listhead
;
181 struct sctpladdr addr_wq
;
184 sctp_zone_t ipi_zone_ep
;
185 sctp_zone_t ipi_zone_asoc
;
186 sctp_zone_t ipi_zone_laddr
;
187 sctp_zone_t ipi_zone_net
;
188 sctp_zone_t ipi_zone_chunk
;
189 sctp_zone_t ipi_zone_readq
;
190 sctp_zone_t ipi_zone_strmoq
;
191 sctp_zone_t ipi_zone_asconf
;
192 sctp_zone_t ipi_zone_asconf_ack
;
194 struct rwlock ipi_ep_mtx
;
195 struct mtx ipi_iterator_wq_mtx
;
196 struct rwlock ipi_addr_mtx
;
197 struct mtx ipi_pktlog_mtx
;
198 struct mtx wq_addr_mtx
;
199 uint32_t ipi_count_ep
;
201 /* assoc/tcb zone info */
202 uint32_t ipi_count_asoc
;
204 /* local addrlist zone info */
205 uint32_t ipi_count_laddr
;
207 /* remote addrlist zone info */
208 uint32_t ipi_count_raddr
;
210 /* chunk structure list for output */
211 uint32_t ipi_count_chunk
;
213 /* socket queue zone info */
214 uint32_t ipi_count_readq
;
216 /* socket queue zone info */
217 uint32_t ipi_count_strmoq
;
220 uint32_t ipi_count_vrfs
;
223 uint32_t ipi_count_ifns
;
226 uint32_t ipi_count_ifas
;
228 /* system wide number of free chunks hanging around */
229 uint32_t ipi_free_chunks
;
230 uint32_t ipi_free_strmoq
;
232 struct sctpvtaghead vtag_timewait
[SCTP_STACK_VTAG_HASH_SIZE
];
234 /* address work queue handling */
235 struct sctp_timer addr_wq_timer
;
239 struct sctp_base_info
{
241 * All static structures that anchor the system must be here.
243 struct sctp_epinfo sctppcbinfo
;
244 #if defined(SMP) && defined(SCTP_USE_PERCPU_STAT)
245 struct sctpstat
*sctpstat
;
247 struct sctpstat sctpstat
;
249 struct sctp_sysctl sctpsysctl
;
251 char sctp_pcb_initialized
;
252 #if defined(SCTP_PACKET_LOGGING)
253 int packet_log_writers
;
255 uint8_t packet_log_buffer
[SCTP_PACKET_LOG_SIZE
];
257 eventhandler_tag eh_tag
;
261 * Here we have all the relevant information for each SCTP entity created. We
262 * will need to modify this as approprate. We also need to figure out how to
263 * access /dev/random.
266 time_t time_of_secret_change
; /* number of seconds from
268 uint32_t secret_key
[SCTP_HOW_MANY_SECRETS
][SCTP_NUMBER_OF_SECRETS
];
269 unsigned int size_of_a_cookie
;
271 uint32_t sctp_timeoutticks
[SCTP_NUM_TMRS
];
272 uint32_t sctp_minrto
;
273 uint32_t sctp_maxrto
;
274 uint32_t initial_rto
;
275 uint32_t initial_init_rto_max
;
277 unsigned int sctp_sack_freq
;
278 uint32_t sctp_sws_sender
;
279 uint32_t sctp_sws_receiver
;
281 uint32_t sctp_default_cc_module
;
282 uint32_t sctp_default_ss_module
;
283 /* authentication related fields */
284 struct sctp_keyhead shared_keys
;
285 sctp_auth_chklist_t
*local_auth_chunks
;
286 sctp_hmaclist_t
*local_hmacs
;
287 uint16_t default_keyid
;
288 uint32_t default_mtu
;
290 /* various thresholds */
291 /* Max times I will init at a guy */
292 uint16_t max_init_times
;
294 /* Max times I will send before we consider someone dead */
295 uint16_t max_send_times
;
297 uint16_t def_net_failure
;
299 uint16_t def_net_pf_threshold
;
301 /* number of streams to pre-open on a association */
302 uint16_t pre_open_stream_count
;
303 uint16_t max_open_streams_intome
;
305 /* random number generator */
306 uint32_t random_counter
;
307 uint8_t random_numbers
[SCTP_SIGNATURE_ALOC_SIZE
];
308 uint8_t random_store
[SCTP_SIGNATURE_ALOC_SIZE
];
311 * This timer is kept running per endpoint. When it fires it will
312 * change the secret key. The default is once a hour
314 struct sctp_timer signature_change
;
316 uint32_t def_cookie_life
;
318 uint32_t auto_close_time
;
319 uint32_t initial_sequence_debug
;
320 uint32_t adaptation_layer_indicator
;
321 uint8_t adaptation_layer_indicator_provided
;
324 uint32_t fr_max_burst
;
326 uint32_t default_flowlabel
;
328 uint8_t default_dscp
;
329 char current_secret_number
;
330 char last_secret_number
;
331 uint16_t port
; /* remote UDP encapsulation port */
334 #ifndef SCTP_ALIGNMENT
335 #define SCTP_ALIGNMENT 32
339 #define SCTP_ALIGNM1 (SCTP_ALIGNMENT-1)
342 #define sctp_lport ip_inp.inp.inp_lport
344 struct sctp_pcbtsn_rlog
{
351 #define SCTP_READ_LOG_SIZE 135 /* we choose the number to make a pcb a page */
355 * put an inpcb in front of it all, kind of a waste but we need to
356 * for compatibility with all the other stuff.
360 char align
[(sizeof(struct inpcb
) + SCTP_ALIGNM1
) &
364 /* Socket buffer lock protects read_queue and of course sb_cc */
365 struct sctp_readhead read_queue
;
367 LIST_ENTRY(sctp_inpcb
) sctp_list
; /* lists all endpoints */
368 /* hash of all endpoints for model */
369 LIST_ENTRY(sctp_inpcb
) sctp_hash
;
370 /* count of local addresses bound, 0 if bound all */
373 /* list of addrs in use by the EP, NULL if bound-all */
374 struct sctpladdr sctp_addr_list
;
376 * used for source address selection rotation when we are subset
379 struct sctp_laddr
*next_addr_touse
;
381 /* back pointer to our socket */
382 struct socket
*sctp_socket
;
383 uint64_t sctp_features
; /* Feature flags */
384 uint32_t sctp_flags
; /* INP state flag set */
385 uint32_t sctp_mobility_features
; /* Mobility Feature flags */
386 struct sctp_pcb sctp_ep
; /* SCTP ep data */
387 /* head of the hash of all associations */
388 struct sctpasochead
*sctp_tcbhash
;
389 u_long sctp_hashmark
;
390 /* head of the list of all associations */
391 struct sctpasochead sctp_asoc_list
;
392 #ifdef SCTP_TRACK_FREED_ASOCS
393 struct sctpasochead sctp_asoc_free_list
;
395 uint32_t sctp_frag_point
;
396 uint32_t partial_delivery_point
;
397 uint32_t sctp_context
;
399 uint8_t local_strreset_support
;
400 uint32_t sctp_cmt_on_off
;
401 uint8_t ecn_supported
;
402 uint8_t prsctp_supported
;
403 uint8_t auth_supported
;
404 uint8_t idata_supported
;
405 uint8_t asconf_supported
;
406 uint8_t reconfig_supported
;
407 uint8_t nrsack_supported
;
408 uint8_t pktdrop_supported
;
410 struct sctp_nonpad_sndrcvinfo def_send
;
412 * These three are here for the sosend_dgram
413 * (pkt, pkt_last and control).
414 * routine. However, I don't think anyone in
415 * the current FreeBSD kernel calls this. So
416 * they are candidates with sctp_sendm for
419 struct mbuf
*pkt
, *pkt_last
;
420 struct mbuf
*control
;
422 struct mtx inp_create_mtx
;
423 struct mtx inp_rdata_mtx
;
427 uint32_t total_sends
;
428 uint32_t total_recvs
;
429 uint32_t last_abort_code
;
430 uint32_t total_nospaces
;
431 struct sctpasochead
*sctp_asocidhash
;
432 u_long hashasocidmark
;
433 uint32_t sctp_associd_counter
;
435 #ifdef SCTP_ASOCLOG_OF_TSNS
436 struct sctp_pcbtsn_rlog readlog
[SCTP_READ_LOG_SIZE
];
437 uint32_t readlog_index
;
442 struct socket
*sctp_socket
; /* back pointer to socket */
443 struct sctp_inpcb
*sctp_ep
; /* back pointer to ep */
444 LIST_ENTRY(sctp_tcb
) sctp_tcbhash
; /* next link in hash
446 LIST_ENTRY(sctp_tcb
) sctp_tcblist
; /* list of all of the
448 LIST_ENTRY(sctp_tcb
) sctp_tcbasocidhash
; /* next link in asocid
450 LIST_ENTRY(sctp_tcb
) sctp_asocs
; /* vtag hash list */
451 struct sctp_block_entry
*block_entry
; /* pointer locked by socket
453 struct sctp_association asoc
;
455 * freed_by_sorcv_sincelast is protected by the sockbuf_lock NOT the
456 * tcb_lock. Its special in this way to help avoid extra mutex calls
457 * in the reading of data.
459 uint32_t freed_by_sorcv_sincelast
;
460 uint32_t total_sends
;
461 uint32_t total_recvs
;
462 int freed_from_where
;
463 uint16_t rport
; /* remote port in network format */
468 #include <netinet/sctp_lock_bsd.h>
470 #if defined(_KERNEL) || defined(__Userspace__)
472 /* Attention Julian, this is the extern that
473 * goes with the base info. sctp_pcb.c has
474 * the real definition.
476 VNET_DECLARE(struct sctp_base_info
, system_base_info
);
479 int SCTP6_ARE_ADDR_EQUAL(struct sockaddr_in6
*a
, struct sockaddr_in6
*b
);
482 void sctp_fill_pcbinfo(struct sctp_pcbinfo
*);
484 struct sctp_ifn
*sctp_find_ifn(void *ifn
, uint32_t ifn_index
);
486 struct sctp_vrf
*sctp_allocate_vrf(int vrfid
);
487 struct sctp_vrf
*sctp_find_vrf(uint32_t vrfid
);
488 void sctp_free_vrf(struct sctp_vrf
*vrf
);
491 sctp_add_addr_to_vrf(uint32_t vrfid
,
492 void *ifn
, uint32_t ifn_index
, uint32_t ifn_type
,
494 void *ifa
, struct sockaddr
*addr
, uint32_t ifa_flags
,
497 void sctp_free_ifa(struct sctp_ifa
*sctp_ifap
);
500 sctp_del_addr_from_vrf(uint32_t vrfid
, struct sockaddr
*addr
,
501 void *ifn
, uint32_t ifn_index
);
503 struct sctp_nets
*sctp_findnet(struct sctp_tcb
*, struct sockaddr
*);
505 struct sctp_inpcb
*sctp_pcb_findep(struct sockaddr
*, int, int, uint32_t);
508 sctp_inpcb_bind(struct socket
*, struct sockaddr
*,
509 struct sctp_ifa
*, struct thread
*);
511 sctp_inpcb_bind_locked(struct sctp_inpcb
*, struct sockaddr
*,
512 struct sctp_ifa
*, struct thread
*);
515 sctp_findassociation_addr(struct mbuf
*, int,
516 struct sockaddr
*, struct sockaddr
*,
517 struct sctphdr
*, struct sctp_chunkhdr
*, struct sctp_inpcb
**,
518 struct sctp_nets
**, uint32_t vrf_id
);
521 sctp_findassociation_addr_sa(struct sockaddr
*,
522 struct sockaddr
*, struct sctp_inpcb
**, struct sctp_nets
**, int, uint32_t);
525 sctp_move_pcb_and_assoc(struct sctp_inpcb
*, struct sctp_inpcb
*,
529 * For this call ep_addr, the to is the destination endpoint address of the
530 * peer (relative to outbound). The from field is only used if the TCP model
531 * is enabled and helps distingush amongst the subset bound (non-boundall).
532 * The TCP model MAY change the actual ep field, this is why it is passed.
535 sctp_findassociation_ep_addr(struct sctp_inpcb
**,
536 struct sockaddr
*, struct sctp_nets
**, struct sockaddr
*,
539 struct sctp_tcb
*sctp_findasoc_ep_asocid_locked(struct sctp_inpcb
*inp
, sctp_assoc_t asoc_id
, int want_lock
);
542 sctp_findassociation_ep_asocid(struct sctp_inpcb
*,
546 sctp_findassociation_ep_asconf(struct mbuf
*, int, struct sockaddr
*,
547 struct sctphdr
*, struct sctp_inpcb
**, struct sctp_nets
**, uint32_t vrf_id
);
549 int sctp_inpcb_alloc(struct socket
*so
, uint32_t vrf_id
);
551 int sctp_is_address_on_local_host(struct sockaddr
*addr
, uint32_t vrf_id
);
553 void sctp_inpcb_free(struct sctp_inpcb
*, int, int);
555 #define SCTP_DONT_INITIALIZE_AUTH_PARAMS 0
556 #define SCTP_INITIALIZE_AUTH_PARAMS 1
559 sctp_aloc_assoc(struct sctp_inpcb
*, struct sockaddr
*,
560 int *, uint32_t, uint32_t, uint32_t, uint16_t, uint16_t,
561 struct thread
*, int);
563 sctp_aloc_assoc_connected(struct sctp_inpcb
*, struct sockaddr
*,
564 int *, uint32_t, uint32_t, uint32_t, uint16_t, uint16_t,
565 struct thread
*, int);
567 int sctp_free_assoc(struct sctp_inpcb
*, struct sctp_tcb
*, int, int);
569 void sctp_add_local_addr_ep(struct sctp_inpcb
*, struct sctp_ifa
*, uint32_t);
571 void sctp_del_local_addr_ep(struct sctp_inpcb
*, struct sctp_ifa
*);
573 int sctp_add_remote_addr(struct sctp_tcb
*, struct sockaddr
*, struct sctp_nets
**, uint16_t, int, int);
575 void sctp_remove_net(struct sctp_tcb
*, struct sctp_nets
*);
577 int sctp_del_remote_addr(struct sctp_tcb
*, struct sockaddr
*);
579 void sctp_pcb_init(void);
581 void sctp_pcb_finish(void);
583 void sctp_add_local_addr_restricted(struct sctp_tcb
*, struct sctp_ifa
*);
584 void sctp_del_local_addr_restricted(struct sctp_tcb
*, struct sctp_ifa
*);
587 sctp_load_addresses_from_init(struct sctp_tcb
*, struct mbuf
*, int, int,
588 struct sockaddr
*, struct sockaddr
*, struct sockaddr
*, uint16_t);
591 sctp_set_primary_addr(struct sctp_tcb
*, struct sockaddr
*,
595 sctp_is_vtag_good(uint32_t, uint16_t lport
, uint16_t rport
, struct timeval
*);
597 int sctp_destination_is_reachable(struct sctp_tcb
*, struct sockaddr
*);
599 int sctp_swap_inpcb_for_listen(struct sctp_inpcb
*inp
);
601 void sctp_clean_up_stream(struct sctp_tcb
*stcb
, struct sctp_readhead
*rh
);
604 sctp_pcb_add_flags(struct sctp_inpcb
*, uint32_t);
607 * Null in last arg inpcb indicate run on ALL ep's. Specific inp in last arg
608 * indicates run on ONLY assoc's of the specified endpoint.
611 sctp_initiate_iterator(inp_func inpf
,
620 #if defined(SCTP_MCORE_INPUT) && defined(SMP)
622 sctp_queue_to_mcore(struct mbuf
*m
, int off
, int cpu_to_use
);
627 #endif /* !__sctp_pcb_h__ */