44#include <netinet6/sctp6_var.h>
56#include <sys/eventhandler.h>
74 sb_max_adj = (u_long)((u_quad_t)(SB_MAX) * MCLBYTES / (MSIZE + MCLBYTES));
76 (((
uint32_t)nmbclusters / 2) * MCLBYTES));
86#if defined(SCTP_PACKET_LOGGING)
99sctp_finish(
void *unused __unused)
105VNET_SYSUNINIT(sctp, SI_SUB_PROTO_DOMAIN, SI_ORDER_FOURTH, sctp_finish, NULL);
116 KASSERT(mtu < asoc->smallest_mtu,
117 (
"Currently only reducing association MTU %u supported (MTU %u)",
134 KASSERT(overhead % 4 == 0,
135 (
"overhead (%u) not a multiple of 4", overhead));
238 next_mtu -=
sizeof(
struct udphdr);
240 if (net->
mtu > next_mtu) {
275 if (sa->sa_family != AF_INET ||
279 if (PRC_IS_REDIRECT(cmd)) {
281 }
else if ((
unsigned)cmd >= PRC_NCMDS ||
inetctlerrmap[cmd] == 0) {
285 inner_ip = (
struct ip *)vip;
286 icmp = (
struct icmp *)((caddr_t)inner_ip -
287 (
sizeof(
struct icmp) - sizeof(struct
ip)));
288 outer_ip = (
struct ip *)((caddr_t)
icmp -
sizeof(
struct ip));
289 sh = (
struct sctphdr *)((caddr_t)inner_ip + (inner_ip->
ip_hl << 2));
291 src.sin_family = AF_INET;
294 src.sin_addr = inner_ip->ip_src;
296 dst.sin_family = AF_INET;
299 dst.sin_addr = inner_ip->
ip_dst;
308 (
struct sockaddr *)&src,
311 if ((stcb != NULL) &&
315 if (ntohl(sh->
v_tag) != 0) {
327 if (ntohs(outer_ip->
ip_len) >=
329 8 + (inner_ip->
ip_hl << 2) + 20) {
352 if ((stcb == NULL) && (inp != NULL)) {
381 error = priv_check(req->td, PRIV_NETINET_GETCRED);
386 error = SYSCTL_IN(req, addrs,
sizeof(addrs));
392 &inp, &net, 1, vrf_id);
393 if (stcb == NULL || inp == NULL || inp->
sctp_socket == NULL) {
394 if ((inp != NULL) && (stcb == NULL)) {
414 error = cr_canseesocket(req->td->td_ucred, inp->
sctp_socket);
421 error = SYSCTL_OUT(req, &xuc,
sizeof(
struct xucred));
427 CTLTYPE_OPAQUE | CTLFLAG_RW | CTLFLAG_NEEDGIANT,
429 "Get the ucred of a SCTP connection");
433sctp_abort(
struct socket *so)
435 struct epoch_tracker et;
445#ifdef SCTP_LOG_CLOSING
450#ifdef SCTP_LOG_CLOSING
477 struct inpcb *ip_inp;
486 if (so->so_snd.sb_hiwat == 0 || so->so_rcv.sb_hiwat == 0) {
498 inp->sctp_flags &= ~SCTP_PCB_FLAGS_BOUND_V6;
507sctp_bind(
struct socket *so,
struct sockaddr *addr,
struct thread *p)
517 if ((addr->sa_family != AF_INET) ||
530 struct epoch_tracker et;
542#ifdef SCTP_LOG_CLOSING
547 if (((so->so_options & SO_LINGER) && (so->so_linger == 0)) ||
548 (so->so_rcv.sb_cc > 0)) {
549#ifdef SCTP_LOG_CLOSING
556#ifdef SCTP_LOG_CLOSING
585sctp_sendm(
struct socket *so,
int flags,
struct mbuf *m,
struct sockaddr *addr,
586 struct mbuf *
control,
struct thread *p);
589sctp_sendm(
struct socket *so,
int flags,
struct mbuf *m,
struct sockaddr *addr,
590 struct mbuf *
control,
struct thread *p)
606 if ((addr == NULL) &&
615 error = EDESTADDRREQ;
616 }
else if (addr->sa_family != AF_INET) {
618 error = EAFNOSUPPORT;
619 }
else if (addr->sa_len !=
sizeof(
struct sockaddr_in)) {
645 inp->pkt_last =
inp->pkt = m;
649 ((flags & PRUS_MORETOCOME) == 0)
659 struct epoch_tracker et;
686 if (LIST_EMPTY(&
inp->sctp_asoc_list)) {
691 struct epoch_tracker et;
710 if (((so->so_options & SO_LINGER) &&
711 (so->so_linger == 0)) ||
712 (so->so_rcv.sb_cc > 0)) {
801 soisdisconnecting(so);
839 if ((how == PRU_FLUSH_RD) || (how == PRU_FLUSH_RDWR)) {
849 so->so_rcv.sb_cc = 0;
850 so->so_rcv.sb_mbcnt = 0;
851 so->so_rcv.sb_mb = NULL;
853 if ((how == PRU_FLUSH_WR) || (how == PRU_FLUSH_RDWR)) {
858 so->so_snd.sb_cc = 0;
859 so->so_snd.sb_mbcnt = 0;
860 so->so_snd.sb_mb = NULL;
880 SOCKBUF_LOCK(&so->so_rcv);
881 so->so_rcv.sb_state &= ~SBS_CANTRCVMORE;
882 SOCKBUF_UNLOCK(&so->so_rcv);
893 struct epoch_tracker et;
899 (SS_ISCONNECTED | SS_ISCONNECTING | SS_ISDISCONNECTING)) == 0) {
998 struct sockaddr_in6 lsa6;
1000 src = (
struct sockaddr *)sctp_recover_scope((
struct sockaddr_in6 *)src,
1003 memcpy(dst, src, src->sa_len);
1011 struct sockaddr *addr,
1019 int ipv4_local_scope, ipv4_addr_legal;
1022 int local_scope, site_scope, ipv6_addr_legal;
1047 ipv4_local_scope = 1;
1055 ipv6_addr_legal = 1;
1059 ipv4_addr_legal = 0;
1061 ipv4_addr_legal = 1;
1066 ipv6_addr_legal = 0;
1069 ipv4_addr_legal = 1;
1079 if ((loopback_scope == 0) &&
1102 if (ipv4_addr_legal) {
1118 if ((ipv4_local_scope == 0) &&
1124 if (actual +
sizeof(
struct sockaddr_in6) > limit) {
1127 in6_sin_2_v4mapsin6(sin, (
struct sockaddr_in6 *)addr);
1128 ((
struct sockaddr_in6 *)addr)->sin6_port = inp->sctp_lport;
1129 addr = (
struct sockaddr *)((caddr_t)addr +
sizeof(
struct sockaddr_in6));
1130 actual +=
sizeof(
struct sockaddr_in6);
1133 if (actual +
sizeof(
struct sockaddr_in) > limit) {
1137 ((
struct sockaddr_in *)addr)->sin_port = inp->sctp_lport;
1138 addr = (
struct sockaddr *)((caddr_t)addr +
sizeof(
struct sockaddr_in));
1150 if (ipv6_addr_legal) {
1151 struct sockaddr_in6 *sin6;
1154 if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) {
1163 &sin6->sin6_addr) != 0) {
1166 if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr)) {
1167 if (local_scope == 0)
1169 if (sin6->sin6_scope_id == 0) {
1170 if (sa6_recoverscope(sin6) != 0)
1183 if ((site_scope == 0) &&
1184 (IN6_IS_ADDR_SITELOCAL(&sin6->sin6_addr))) {
1187 if (actual +
sizeof(
struct sockaddr_in6) > limit) {
1190 memcpy(addr, sin6,
sizeof(
struct sockaddr_in6));
1191 ((
struct sockaddr_in6 *)addr)->sin6_port = inp->sctp_lport;
1192 addr = (
struct sockaddr *)((caddr_t)addr +
sizeof(
struct sockaddr_in6));
1193 actual +=
sizeof(
struct sockaddr_in6);
1216 if (actual + sa_len > limit) {
1224 ((
struct sockaddr_in *)addr)->sin_port = inp->sctp_lport;
1229 ((
struct sockaddr_in6 *)addr)->sin6_port = inp->sctp_lport;
1236 addr = (
struct sockaddr *)((caddr_t)addr + sa_len);
1247 struct sockaddr *addr)
1290 size +=
sizeof(
struct sockaddr_in6);
1300 size +=
sizeof(
struct sockaddr_in6);
1317 size +=
sizeof(
struct sockaddr_in6);
1327 size +=
sizeof(
struct sockaddr_in6);
1352 size_t optsize,
void *p,
int delay)
1355 int creat_lock_on = 0;
1357 struct sockaddr *sa;
1358 unsigned int num_v6 = 0, num_v4 = 0, *totaddrp, totaddr;
1368 return (EADDRINUSE);
1395 totaddrp = (
unsigned int *)optval;
1396 totaddr = *totaddrp;
1397 sa = (
struct sockaddr *)(totaddrp + 1);
1449 switch (sa->sa_family) {
1452 sa = (
struct sockaddr *)((caddr_t)sa +
sizeof(
struct sockaddr_in));
1457 sa = (
struct sockaddr *)((caddr_t)sa +
sizeof(
struct sockaddr_in6));
1483 if (creat_lock_on) {
1490#define SCTP_FIND_STCB(inp, stcb, assoc_id) { \
1491 if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||\
1492 (inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL)) { \
1493 SCTP_INP_RLOCK(inp); \
1494 stcb = LIST_FIRST(&inp->sctp_asoc_list); \
1496 SCTP_TCB_LOCK(stcb); \
1498 SCTP_INP_RUNLOCK(inp); \
1499 } else if (assoc_id > SCTP_ALL_ASSOC) { \
1500 stcb = sctp_findassociation_ep_asocid(inp, assoc_id, 1); \
1501 if (stcb == NULL) { \
1502 SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, ENOENT); \
1511#define SCTP_CHECK_AND_CAST(destp, srcp, type, size) {\
1512 if (size < sizeof(type)) { \
1513 SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EINVAL); \
1517 destp = (type *)srcp; \
1522sctp_getopt(
struct socket *so,
int optname,
void *optval,
size_t *optsize,
1529 if (optval == NULL) {
1585 error = ENOPROTOOPT;
1587 if (*optsize <
sizeof(val)) {
1595 *(
int *)optval = val;
1596 *optsize =
sizeof(val);
1601#ifdef SCTP_PACKET_LOGGING
1606 ret = sctp_copy_out_packet_log(target, (
int)*optsize);
1633 *value =
inp->partial_delivery_point;
2171 TAILQ_FOREACH(net, &stcb->
asoc.
nets, sctp_next) {
2177 size +=
sizeof(
struct sockaddr_in6);
2188 size +=
sizeof(
struct sockaddr_in6);
2216 struct sockaddr *addr;
2228 TAILQ_FOREACH(net, &stcb->
asoc.
nets, sctp_next) {
2234 cpsz =
sizeof(
struct sockaddr_in6);
2245 cpsz =
sizeof(
struct sockaddr_in6);
2259#if defined(INET) && defined(INET6)
2264 (
struct sockaddr_in6 *)addr);
2273 addr = (
struct sockaddr *)((caddr_t)addr + cpsz);
2291 size_t limit, actual;
2315 struct sockaddr *addr;
2316#if defined(INET) && defined(INET6)
2323#if defined(INET) && defined(INET6)
2325 struct sockaddr_in6 *sin6;
2327 sin6 = (
struct sockaddr_in6 *)&paddrp->
spp_address;
2328 if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) {
2329 in6_sin6_2_sin(&sin_store, sin6);
2330 addr = (
struct sockaddr *)&sin_store;
2357 if ((stcb != NULL) && (net == NULL)) {
2359 if (addr->sa_family == AF_INET) {
2372 if (addr->sa_family == AF_INET6) {
2373 struct sockaddr_in6 *sin6;
2375 sin6 = (
struct sockaddr_in6 *)addr;
2376 if (!IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) {
2385 error = EAFNOSUPPORT;
2425 if (net->
dscp & 0x01) {
2431 (net->flowlabel & 0x80000000)) {
2448 if (stcb->
asoc.default_flowlabel & 0x80000000) {
2485 (inp->
sctp_ep.default_flowlabel & 0x80000000)) {
2517 struct sockaddr *addr;
2518#if defined(INET) && defined(INET6)
2525#if defined(INET) && defined(INET6)
2527 struct sockaddr_in6 *sin6;
2530 if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) {
2531 in6_sin6_2_sin(&sin_store, sin6);
2532 addr = (
struct sockaddr *)&sin_store;
2560 if ((stcb != NULL) && (net != NULL)) {
2576 switch (addr->sa_family) {
2640 ((
struct sockaddr *)(&net->
ro.
_l_addr))->sa_len);
2828 switch (addr->
sa.sa_family) {
2833 in6_sin_2_v4mapsin6(&addr->
sin,
2834 (
struct sockaddr_in6 *)&ssp->
ssp_addr);
2845 memcpy(&ssp->
ssp_addr, &addr->
sin6,
sizeof(
struct sockaddr_in6));
2870 if (hmaclist == NULL) {
2872 *optsize =
sizeof(*shmac);
2877 size =
sizeof(*shmac) + (hmaclist->
num_algo *
2879 if (*optsize < size) {
2887 for (i = 0; i < hmaclist->
num_algo; i++) {
3064 if (event_type > 0) {
3090 if (*optsize <
sizeof(
int)) {
3097 *optsize =
sizeof(int);
3101 if (*optsize <
sizeof(
int)) {
3108 *optsize =
sizeof(int);
3181 struct sockaddr *addr;
3182#if defined(INET) && defined(INET6)
3189#if defined(INET) && defined(INET6)
3191 struct sockaddr_in6 *sin6;
3193 sin6 = (
struct sockaddr_in6 *)&thlds->
spt_address;
3194 if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) {
3195 in6_sin6_2_sin(&sin_store, sin6);
3196 addr = (
struct sockaddr *)&sin_store;
3223 if ((stcb != NULL) && (net == NULL)) {
3225 if (addr->sa_family == AF_INET) {
3238 if (addr->sa_family == AF_INET6) {
3239 struct sockaddr_in6 *sin6;
3241 sin6 = (
struct sockaddr_in6 *)addr;
3242 if (!IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) {
3251 error = EAFNOSUPPORT;
3295 struct sockaddr *addr;
3296#if defined(INET) && defined(INET6)
3303#if defined(INET) && defined(INET6)
3305 struct sockaddr_in6 *sin6;
3307 sin6 = (
struct sockaddr_in6 *)&encaps->
sue_address;
3308 if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) {
3309 in6_sin6_2_sin(&sin_store, sin6);
3310 addr = (
struct sockaddr *)&sin_store;
3337 if ((stcb != NULL) && (net == NULL)) {
3339 if (addr->sa_family == AF_INET) {
3352 if (addr->sa_family == AF_INET6) {
3353 struct sockaddr_in6 *sin6;
3355 sin6 = (
struct sockaddr_in6 *)addr;
3356 if (!IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) {
3365 error = EAFNOSUPPORT;
3632#if defined(SCTP_DETAILED_STR_STATS)
3633 if ((stcb != NULL) &&
3634 (sid < stcb->asoc.streamoutcnt) &&
3646 if ((stcb != NULL) &&
3647 (sid < stcb->asoc.streamoutcnt) &&
3673 if ((stcb != NULL) &&
3726 error = ENOPROTOOPT;
3736sctp_setopt(
struct socket *so,
int optname,
void *optval,
size_t optsize,
3745 if (optval == NULL) {
3754 vrf_id =
inp->def_vrf_id;
3860 inp->partial_delivery_point = *value;
3965 error = ENOPROTOOPT;
3987 TAILQ_FOREACH(net, &stcb->
asoc.
nets, sctp_next) {
4011 TAILQ_FOREACH(net, &stcb->
asoc.
nets, sctp_next) {
4286 struct sctp_keyhead *shared_keys;
4323 if (shared_key == NULL) {
4330 shared_key->
key = key;
4361 if (shared_key == NULL) {
4368 shared_key->
key = key;
4397 if (shared_key == NULL) {
4402 shared_key->
key = key;
4428 if (hmaclist == NULL) {
4440 goto sctp_set_hmac_done;
4443 for (i = 0; i < hmaclist->
num_algo; i++) {
4633 int i, send_out = 0;
4682 if ((send_in == 0) && (send_out == 0)) {
4731 send_in, 0, 0, 0, 0, 0);
4793 if ((((
int)add_o_strmcnt) + ((
int)stcb->
asoc.
streamoutcnt)) > 0x0000ffff) {
4808 cnt = add_i_strmcnt;
4810 if (cnt > 0x0000ffff) {
4884 if (optsize < (
sizeof(
int) +
sizeof(
struct sockaddr_in))) {
4892 if (optsize < (
sizeof(
int) +
sizeof(
struct sockaddr_in))) {
4901 struct sockaddr *sa;
5230 struct sockaddr *addr;
5231#if defined(INET) && defined(INET6)
5238#if defined(INET) && defined(INET6)
5240 struct sockaddr_in6 *sin6;
5242 sin6 = (
struct sockaddr_in6 *)&paddrp->
spp_address;
5243 if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) {
5244 in6_sin6_2_sin(&sin_store, sin6);
5245 addr = (
struct sockaddr *)&sin_store;
5273 if ((stcb != NULL) && (net == NULL)) {
5275 if (addr->sa_family == AF_INET) {
5288 if (addr->sa_family == AF_INET6) {
5289 struct sockaddr_in6 *sin6;
5291 sin6 = (
struct sockaddr_in6 *)addr;
5292 if (!IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) {
5301 error = EAFNOSUPPORT;
5431 net->flowlabel |= 0x80000000;
5439 TAILQ_FOREACH(net, &stcb->
asoc.
nets, sctp_next) {
5476 TAILQ_FOREACH(net, &stcb->
asoc.
nets, sctp_next) {
5492 TAILQ_FOREACH(net, &stcb->
asoc.
nets, sctp_next) {
5505 TAILQ_FOREACH(net, &stcb->
asoc.
nets, sctp_next) {
5538 TAILQ_FOREACH(net, &stcb->
asoc.
nets, sctp_next) {
5548 TAILQ_FOREACH(net, &stcb->
asoc.
nets, sctp_next) {
5557 TAILQ_FOREACH(net, &stcb->
asoc.
nets, sctp_next) {
5560 net->flowlabel |= 0x80000000;
5564 stcb->
asoc.default_flowlabel |= 0x80000000;
5620 inp->
sctp_ep.default_flowlabel |= 0x80000000;
5635 uint32_t new_init, new_min, new_max;
5653 if ((new_min <= new_init) && (new_init <= new_max)) {
5680 if ((new_min <= new_init) && (new_init <= new_max)) {
5763 struct sockaddr *addr;
5764#if defined(INET) && defined(INET6)
5771#if defined(INET) && defined(INET6)
5772 if (spa->
ssp_addr.ss_family == AF_INET6) {
5773 struct sockaddr_in6 *sin6;
5775 sin6 = (
struct sockaddr_in6 *)&spa->
ssp_addr;
5776 if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) {
5777 in6_sin6_2_sin(&sin_store, sin6);
5778 addr = (
struct sockaddr *)&sin_store;
5780 addr = (
struct sockaddr *)&spa->
ssp_addr;
5783 addr = (
struct sockaddr *)&spa->
ssp_addr;
5786 addr = (
struct sockaddr *)&spa->
ssp_addr;
5807 if ((stcb != NULL) && (net != NULL)) {
5840 error = priv_check(curthread,
5841 PRIV_NETINET_RESERVEDPORT);
5853 struct sockaddr *addr;
5854#if defined(INET) && defined(INET6)
5863#if defined(INET) && defined(INET6)
5864 if (sspp->
sspp_addr.ss_family == AF_INET6) {
5865 struct sockaddr_in6 *sin6;
5867 sin6 = (
struct sockaddr_in6 *)&sspp->
sspp_addr;
5868 if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) {
5869 in6_sin6_2_sin(&sin_store, sin6);
5870 addr = (
struct sockaddr *)&sin_store;
5872 addr = (
struct sockaddr *)&sspp->
sspp_addr;
5875 addr = (
struct sockaddr *)&sspp->
sspp_addr;
5878 addr = (
struct sockaddr *)&sspp->
sspp_addr;
5895 if (laddr->
ifa == NULL) {
5915 switch (addr->sa_family) {
5934 struct sockaddr_in6 *sin6;
5936 sin6 = (
struct sockaddr_in6 *)addr;
5938 &sin6->sin6_addr) != 0) {
5967 struct sockaddr *sa;
5970 td = (
struct thread *)p;
5973 if (sa->sa_family == AF_INET) {
5987 if (sa->sa_family == AF_INET6) {
5988 if (optsize <
sizeof(
struct sockaddr_in6)) {
5994 (error = prison_local_ip6(td->td_ucred,
5995 &(((
struct sockaddr_in6 *)sa)->sin6_addr),
6003 error = EAFNOSUPPORT;
6011 struct sockaddr *sa;
6014 td = (
struct thread *)p;
6018 if (sa->sa_family == AF_INET) {
6032 if (sa->sa_family == AF_INET6) {
6033 if (optsize <
sizeof(
struct sockaddr_in6)) {
6039 (error = prison_local_ip6(td->td_ucred,
6040 &(((
struct sockaddr_in6 *)sa)->sin6_addr),
6048 error = EAFNOSUPPORT;
6112 if (event_type > 0) {
6315 struct sockaddr *addr;
6316#if defined(INET) && defined(INET6)
6323#if defined(INET) && defined(INET6)
6325 struct sockaddr_in6 *sin6;
6327 sin6 = (
struct sockaddr_in6 *)&thlds->
spt_address;
6328 if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) {
6329 in6_sin6_2_sin(&sin_store, sin6);
6330 addr = (
struct sockaddr *)&sin_store;
6358 if ((stcb != NULL) && (net == NULL)) {
6360 if (addr->sa_family == AF_INET) {
6373 if (addr->sa_family == AF_INET6) {
6374 struct sockaddr_in6 *sin6;
6376 sin6 = (
struct sockaddr_in6 *)addr;
6377 if (!IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) {
6386 error = EAFNOSUPPORT;
6432 TAILQ_FOREACH(net, &stcb->
asoc.
nets, sctp_next) {
6487 struct sockaddr *addr;
6488#if defined(INET) && defined(INET6)
6495#if defined(INET) && defined(INET6)
6497 struct sockaddr_in6 *sin6;
6499 sin6 = (
struct sockaddr_in6 *)&encaps->
sue_address;
6500 if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) {
6501 in6_sin6_2_sin(&sin_store, sin6);
6502 addr = (
struct sockaddr *)&sin_store;
6529 if ((stcb != NULL) && (net == NULL)) {
6531 if (addr->sa_family == AF_INET) {
6544 if (addr->sa_family == AF_INET6) {
6545 struct sockaddr_in6 *sin6;
6547 sin6 = (
struct sockaddr_in6 *)addr;
6548 if (!IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) {
6557 error = EAFNOSUPPORT;
6835 TAILQ_FOREACH(net, &stcb->
asoc.
nets, sctp_next) {
6863 error = ENOPROTOOPT;
6872 struct epoch_tracker et;
6874 void *optval = NULL;
6879 if ((sopt->sopt_level == SOL_SOCKET) &&
6880 (sopt->sopt_name == SO_SETFIB)) {
6887 inp->fibnum = so->so_fibnum;
6895 error = ip6_ctloutput(so, sopt);
6897#if defined(INET) && defined(INET6)
6905 optsize = sopt->sopt_valsize;
6911 SCTP_MALLOC(optval,
void *, optsize, SCTP_M_SOCKOPT);
6912 if (optval == NULL) {
6916 error = sooptcopyin(sopt, optval, optsize, optsize);
6922 p = (
void *)sopt->sopt_td;
6923 if (sopt->sopt_dir == SOPT_SET) {
6924 NET_EPOCH_ENTER(et);
6925 error =
sctp_setopt(so, sopt->sopt_name, optval, optsize, p);
6927 }
else if (sopt->sopt_dir == SOPT_GET) {
6928 error =
sctp_getopt(so, sopt->sopt_name, optval, &optsize, p);
6933 if ((error == 0) && (optval != NULL)) {
6934 error = sooptcopyout(sopt, optval, optsize);
6936 }
else if (optval != NULL) {
6945sctp_connect(
struct socket *so,
struct sockaddr *addr,
struct thread *p)
6947 struct epoch_tracker et;
6949 int create_lock_on = 0;
6958 return (ECONNRESET);
6965 switch (addr->sa_family) {
6969 struct sockaddr_in6 *sin6;
6971 if (addr->sa_len !=
sizeof(
struct sockaddr_in6)) {
6975 sin6 = (
struct sockaddr_in6 *)addr;
6976 if (p != NULL && (error = prison_remote_ip6(p->td_ucred, &sin6->sin6_addr)) != 0) {
7002 return (EAFNOSUPPORT);
7007 NET_EPOCH_ENTER(et);
7018 (addr->sa_family == AF_INET6)) {
7088 if (create_lock_on) {
7115 return (ECONNRESET);
7127 memcpy(&store, &laddr->
ifa->
address,
sizeof(store));
7128 switch (store.
sa.sa_family) {
7136 store.
sin6.sin6_port = inp->sctp_lport;
7143 if (tinp && (tinp != inp) &&
7152 return (EADDRINUSE);
7159 memset(&store, 0,
sizeof(store));
7162 store.
sa.sa_family = AF_INET6;
7163 store.
sa.sa_len =
sizeof(
struct sockaddr_in6);
7168 store.
sa.sa_family = AF_INET;
7172 switch (store.
sa.sa_family) {
7180 store.
sin6.sin6_port = inp->sctp_lport;
7187 if (tinp && (tinp != inp) &&
7196 return (EADDRINUSE);
7204#ifdef SCTP_LOCK_LOGGING
7224 error = solisten_proto_check(so);
7232 solisten_proto_abort(so);
7240 solisten_proto_abort(so);
7246 solisten_proto(so, backlog);
7250 solisten_proto_abort(so);
7255 inp->
sctp_flags &= ~SCTP_PCB_FLAGS_ACCEPTING;
7279 return (ECONNRESET);
7285 return (EOPNOTSUPP);
7287 if (so->so_state & SS_ISDISCONNECTED) {
7290 return (ECONNABORTED);
7292 stcb = LIST_FIRST(&
inp->sctp_asoc_list);
7296 return (ECONNRESET);
7303 inp->sctp_flags &= ~SCTP_PCB_FLAGS_DONT_WAKE;
7305 inp->sctp_flags &= ~SCTP_PCB_FLAGS_WAKEOUTPUT;
7306 SOCKBUF_LOCK(&
inp->sctp_socket->so_snd);
7307 if (sowriteable(
inp->sctp_socket)) {
7308 sowwakeup_locked(
inp->sctp_socket);
7310 SOCKBUF_UNLOCK(&
inp->sctp_socket->so_snd);
7314 inp->sctp_flags &= ~SCTP_PCB_FLAGS_WAKEINPUT;
7315 SOCKBUF_LOCK(&
inp->sctp_socket->so_rcv);
7316 if (soreadable(
inp->sctp_socket)) {
7318 sorwakeup_locked(
inp->sctp_socket);
7320 SOCKBUF_UNLOCK(&
inp->sctp_socket->so_rcv);
7331 switch (store.
sa.sa_family) {
7344 *addr = (
struct sockaddr *)sin;
7351 struct sockaddr_in6 *sin6;
7356 sin6->sin6_family = AF_INET6;
7357 sin6->sin6_len =
sizeof(*sin6);
7358 sin6->sin6_port = store.
sin6.sin6_port;
7359 sin6->sin6_addr = store.
sin6.sin6_addr;
7360 if ((error = sa6_recoverscope(sin6)) != 0) {
7364 *addr = (
struct sockaddr *)sin6;
7396 return (ECONNRESET);
7414 TAILQ_FOREACH(net, &stcb->
asoc.
nets, sctp_next) {
7425 if ((!fnd) || (sin_a == NULL)) {
7470 (*addr) = (
struct sockaddr *)sin;
7492 if ((
inp == NULL) ||
7500 stcb = LIST_FIRST(&
inp->sctp_asoc_list);
7508 return (ECONNRESET);
7511 TAILQ_FOREACH(net, &stcb->
asoc.
nets, sctp_next) {
7527 (*addr) = (
struct sockaddr *)sin;
7532 .pru_abort = sctp_abort,
7534 .pru_attach = sctp_attach,
7535 .pru_bind = sctp_bind,
7536 .pru_connect = sctp_connect,
7540 .pru_sopoll = sopoll_generic,
int in_control(struct socket *so, u_long cmd, caddr_t data, struct ifnet *ifp, struct thread *td)
int prison_local_ip4(struct ucred *cred, struct in_addr *ia)
int prison_check_ip4(const struct ucred *cred, const struct in_addr *ia)
int prison_remote_ip4(struct ucred *cred, struct in_addr *ia)
#define INP_CHECK_SOCKAF(so, af)
VNET_SYSUNINIT(divert, SI_SUB_PROTO_DOMAIN, SI_ORDER_THIRD, div_destroy, NULL)
#define ICMP_UNREACH_NET_PROHIB
#define ICMP_UNREACH_HOST
#define ICMP_UNREACH_NET_UNKNOWN
#define ICMP_UNREACH_NEEDFRAG
#define ICMP_UNREACH_ISOLATED
#define ICMP_UNREACH_PROTOCOL
#define ICMP_UNREACH_HOST_UNKNOWN
#define ICMP_UNREACH_FILTER_PROHIB
#define ICMP_UNREACH_HOST_PROHIB
#define ICMP_UNREACH_PORT
int ip_ctloutput(struct socket *so, struct sockopt *sopt)
#define SCTP_PRIMARY_ADDR
#define SCTP_PCB_FLAGS_INTERLEAVE_STRMS
#define SCTP_MAX_SACK_DELAY
#define SCTP_GET_LOCAL_ADDR_SIZE
#define SCTP_PCB_FLAGS_DONT_WAKE
#define SCTP_SET_DYNAMIC_PRIMARY
#define SCTP_FLIGHT_LOGGING_ENABLE
#define SCTP_CONNECT_X_COMPLETE
#define SCTP_GET_SNDBUF_USE
#define SCTP_PCB_FLAGS_BOUND_V6
#define SCTP_DELAYED_SACK
#define SCTP_BINDX_ADD_ADDR
#define SCTP_REMOTE_UDP_ENCAPS_PORT
#define SCTP_PCB_FLAGS_TCPTYPE
#define SCTP_PCB_FLAGS_SOCKET_ALLGONE
#define SCTP_DEFAULT_SEND_PARAM
#define SCTP_GET_ASSOC_NUMBER
#define SCTP_GET_PACKET_LOG
#define SCTP_STREAM_RESET_OUTGOING
#define SCTP_MIN_COOKIE_LIFE
#define SCTP_PCB_FLAGS_UDPTYPE
#define SCTP_DEFAULT_SNDINFO
#define SCTP_PR_SUPPORTED
#define SCTP_MAX_COOKIE_LIFE
#define SCTP_PCB_FLAGS_PDAPIEVNT
#define SCTP_PCB_FLAGS_STREAM_RESETEVNT
#define SCTP_PCB_FLAGS_EXT_RCVINFO
#define SCTP_PLUGGABLE_CC
#define SCTP_PCB_FLAGS_WAKEINPUT
#define SCTP_PCB_FLAGS_UNBOUND
#define SCTP_CLR_STAT_LOG
#define SCTP_PCB_FLAGS_DONOT_HEARTBEAT
#define SCTP_RECONFIG_SUPPORTED
#define SCTP_GET_ASOC_VRF
#define SCTP_GET_ADDR_LEN
#define SCTP_PCB_FLAGS_RECVNXTINFO
#define SCTP_AUTH_ACTIVE_KEY
#define SCTP_I_WANT_MAPPED_V4_ADDR
#define SCTP_PCB_FLAGS_SOCKET_CANT_READ
#define SCTP_SS_ROUND_ROBIN_PACKET
#define SCTP_PCB_FLAGS_NODELAY
#define SCTP_PCB_FLAGS_RECVPADDREVNT
#define SCTP_PCB_FLAGS_RECVSENDFAILEVNT
#define SCTP_PCB_FLAGS_IN_TCPPOOL
#define SCTP_PR_ASSOC_STATUS
#define SCTP_BINDX_REM_ADDR
#define SCTP_PCB_FLAGS_SOCKET_GONE
#define SCTP_AUTH_SUPPORTED
#define SCTP_FRAGMENT_INTERLEAVE
#define SCTP_GET_PEER_ADDR_INFO
#define SCTP_DEFAULT_PRINFO
#define SCTP_PCB_FLAGS_RECVDATAIOEVNT
#define SCTP_ENABLE_STREAM_RESET
#define SCTP_PCB_FLAGS_EXPLICIT_EOR
#define SCTP_ASCONF_SUPPORTED
#define SCTP_ADAPTATION_LAYER
#define SCTP_STREAM_RESET_INCOMING
#define SCTP_PEER_AUTH_CHUNKS
#define SCTP_SS_FIRST_COME
#define SCTP_GET_STAT_LOG
#define SCTP_PCB_FLAGS_DRYEVNT
#define SCTP_PCB_FLAGS_ACCEPTING
#define SCTP_PKTDROP_SUPPORTED
#define SCTP_GET_LOCAL_ADDRESSES
#define SCTP_PCB_FLAGS_CONNECTED
#define SCTP_USE_EXT_RCVINFO
#define SCTP_PLUGGABLE_SS
#define SCTP_SS_FAIR_BANDWITH
#define SCTP_LOCAL_AUTH_CHUNKS
#define SCTP_PCB_FLAGS_AUTO_ASCONF
#define SCTP_GET_PEER_ADDRESSES
#define SCTP_PARTIAL_DELIVERY_POINT
#define SCTP_EXPLICIT_EOR
#define SCTP_PEER_ADDR_PARAMS
#define SCTP_SS_ROUND_ROBIN
#define SCTP_ECN_SUPPORTED
#define SCTP_LOCK_LOGGING_ENABLE
#define SCTP_PCB_FLAGS_PORTREUSE
#define SCTP_PCB_FLAGS_ASSOC_RESETEVNT
#define SCTP_PCB_FLAGS_RECVASSOCEVNT
#define SCTP_PCB_FLAGS_AUTHEVNT
#define SCTP_SET_PEER_PRIMARY_ADDR
#define SCTP_PR_STREAM_STATUS
#define SCTP_PCB_FLAGS_RECVPEERERR
#define SCTP_PEER_ADDR_THLDS
#define SCTP_NRSACK_SUPPORTED
#define SCTP_FRAG_LEVEL_1
#define SCTP_SET_INITIAL_DBG_SEQ
#define SCTP_AUTH_DELETE_KEY
#define SCTP_RESET_STREAMS
#define SCTP_PCB_FLAGS_WAKEOUTPUT
#define SCTP_INTERLEAVING_SUPPORTED
#define SCTP_CAUSE_USER_INITIATED_ABT
#define SCTP_GET_NONCE_VALUES
#define SCTP_GET_REMOTE_ADDR_SIZE
#define SCTP_MAX_HB_INTERVAL
#define SCTP_LARGEST_PMTU
#define SCTP_CONNECT_X_DELAYED
#define SCTP_PCB_FLAGS_STREAM_CHANGEEVNT
#define SCTP_GET_ASSOC_ID_LIST
#define SCTP_SMALLEST_PMTU
#define SCTP_AUTH_DEACTIVATE_KEY
#define SCTP_PCB_FLAGS_NO_FRAGMENT
#define SCTP_PCB_FLAGS_RECVRCVINFO
#define SCTP_DISABLE_FRAGMENTS
#define SCTP_FRAG_LEVEL_2
#define SCTP_PCB_FLAGS_CLOSE_IP
#define SCTP_PCB_FLAGS_NEEDS_MAPPED_V4
#define SCTP_PCB_FLAGS_RECVSHUTDOWNEVNT
#define SCTP_PCB_FLAGS_ADAPTATIONEVNT
#define SCTP_PACKET_LOG_SIZE
#define SCTP_PCB_FLAGS_RECVNSENDFAILEVNT
#define SCTP_PCB_FLAGS_BOUNDALL
#define SCTP_FRAG_LEVEL_0
#define SCTP_PCB_FLAGS_DO_NOT_PMTUD
#define SCTP_ENABLE_VALUE_MASK
#define SCTP_PCB_FLAGS_FRAG_INTERLEAVE
#define SCTP_PCB_FLAGS_AUTOCLOSE
int32_t sctp_set_primary_ip_address_sa(struct sctp_tcb *stcb, struct sockaddr *sa)
int sctp_is_addr_pending(struct sctp_tcb *stcb, struct sctp_ifa *sctp_ifa)
int sctp_serialize_auth_chunks(const sctp_auth_chklist_t *list, uint8_t *ptr)
int sctp_auth_add_hmacid(sctp_hmaclist_t *list, uint16_t hmac_id)
int sctp_auth_delete_chunk(uint8_t chunk, sctp_auth_chklist_t *list)
void sctp_free_key(sctp_key_t *key)
void sctp_free_hmaclist(sctp_hmaclist_t *list)
sctp_sharedkey_t * sctp_alloc_sharedkey(void)
int sctp_deact_sharedkey(struct sctp_tcb *stcb, uint16_t keyid)
size_t sctp_auth_get_chklist_size(const sctp_auth_chklist_t *list)
sctp_key_t * sctp_set_key(uint8_t *key, uint32_t keylen)
int sctp_auth_add_chunk(uint8_t chunk, sctp_auth_chklist_t *list)
int sctp_delete_sharedkey_ep(struct sctp_inpcb *inp, uint16_t keyid)
int sctp_delete_sharedkey(struct sctp_tcb *stcb, uint16_t keyid)
void sctp_clear_cachedkeys_ep(struct sctp_inpcb *inp, uint16_t keyid)
int sctp_auth_setactivekey_ep(struct sctp_inpcb *inp, uint16_t keyid)
int sctp_insert_sharedkey(struct sctp_keyhead *shared_keys, sctp_sharedkey_t *new_skey)
int sctp_deact_sharedkey_ep(struct sctp_inpcb *inp, uint16_t keyid)
sctp_hmaclist_t * sctp_alloc_hmaclist(uint16_t num_hmacs)
int sctp_auth_setactivekey(struct sctp_tcb *stcb, uint16_t keyid)
void sctp_clear_cachedkeys(struct sctp_tcb *stcb, uint16_t keyid)
uint32_t sctp_get_auth_chunk_len(uint16_t hmac_algo)
#define sctp_auth_is_required_chunk(chunk, list)
void sctp_addr_change_event_handler(void *arg __unused, struct ifaddr *ifa, int cmd)
#define SCTP_LOG_LOCK_SOCK
#define IN4_ISPRIVATE_ADDRESS(a)
#define SCTP_DEBUG_OUTPUT1
#define SCTP_CALLED_AFTER_CMPSET_OFCLOSE
#define SCTP_STATE_COOKIE_ECHOED
#define SCTP_NOTIFY_SENDER_DRY
#define SCTP_ADD_SUBSTATE(_stcb, _substate)
#define SCTP_OUTPUT_FROM_T3
#define SCTP_DATAGRAM_RESEND
#define SCTP_SO_NOT_LOCKED
#define SCTP_TIMER_TYPE_HEARTBEAT
#define SCTP_NOTIFY_INTERFACE_UP
#define SCTP_TIMER_TYPE_INIT
#define SCTP_FLIGHT_LOG_DOWN_PMTU
#define SCTP_ADDR_NO_PMTUD
#define SCTP_STATE_IN_ACCEPT_QUEUE
#define SCTP_STATE_SHUTDOWN_PENDING
#define SCTP_ADDR_UNCONFIRMED
#define SCTP_OUTPUT_FROM_SOCKOPT
#define SCTP_CLEAR_SUBSTATE(_stcb, _substate)
#define SCTP_STATE_SHUTDOWN_ACK_SENT
#define SCTP_TIMER_TYPE_SHUTDOWNGUARD
#define SCTP_GET_STATE(_stcb)
#define SCTP_GETTIME_TIMEVAL(x)
#define SCTP_OUTPUT_FROM_STRRST_REQ
#define SCTP_TIMER_TYPE_PATHMTURAISE
#define SCTP_SOCKET_OPTION_LIMIT
#define SCTP_ASOC_MAX_CHUNKS_ON_QUEUE
#define SCTP_STATE_COOKIE_WAIT
#define SCTP_TIMER_TYPE_SHUTDOWN
#define SCTP_STATE_SHUTDOWN_SENT
#define SCTP_STATE_SHUTDOWN_RECEIVED
#define SCTP_FREE_SHOULD_USE_GRACEFUL_CLOSE
#define SCTP_STATE_ABOUT_TO_BE_FREED
#define SCTP_ADDR_REACHABLE
#define SCTP_NOTIFY_INTERFACE_DOWN
#define SCTP_SET_STATE(_stcb, _state)
#define SCTP_TIMER_HEARTBEAT
#define SCTP_OUTPUT_FROM_CLOSING
#define SCTP_FREE_SHOULD_USE_ABORT
#define SCTP_ADDR_NOT_LOCKED
#define SCTP_FROM_SCTP_USRREQ
#define SCTP_STATE_PARTIAL_MSG_LEFT
#define SCTP_TCB_LOCK(_tcb)
#define SCTP_INP_INFO_WLOCK()
#define SCTP_IPI_ADDR_RLOCK()
#define SCTP_INP_RLOCK(_inp)
#define SCTP_ASOC_CREATE_UNLOCK(_inp)
#define SCTP_INP_READ_UNLOCK(_inp)
#define SCTP_IPI_ADDR_RUNLOCK()
#define SCTP_INP_WUNLOCK(_inp)
#define SCTP_TCB_SEND_UNLOCK(_tcb)
#define SCTP_IPI_ADDR_LOCK_ASSERT()
#define SCTP_INP_DECR_REF(_inp)
#define SCTP_INP_WLOCK(_inp)
#define SCTP_INP_INCR_REF(_inp)
#define SCTP_TCB_UNLOCK(_tcb)
#define SCTP_ASOC_CREATE_LOCK(_inp)
#define SCTP_INP_INFO_WUNLOCK()
#define SCTP_TCB_SEND_LOCK(_tcb)
#define SCTP_INP_READ_LOCK(_inp)
#define SCTP_INP_RUNLOCK(_inp)
#define SCTP_SB_CLEAR(sb)
#define SCTP_LTRACE_ERR_RET(inp, stcb, net, file, err)
#define SCTP_LTRACE_ERR_RET_PKT(m, inp, stcb, net, file, err)
#define SCTP_IFN_IS_IFT_LOOP(ifn)
#define SCTP_SORESERVE(so, send, recv)
#define MODULE_GLOBAL(__SYMBOL)
#define SCTP_OS_TIMER_PENDING
struct route sctp_route_t
#define SCTP_MALLOC(var, type, size, name)
#define SCTP_IPV6_V6ONLY(sctp_inpcb)
#define SCTP_MALLOC_SONAME(var, type, size)
#define SCTP_BASE_VAR(__m)
#define SCTP_FREE(var, type)
#define SCTP_FREE_SONAME(var)
#define SCTP_DEFAULT_VRFID
#define SCTPDBG(level, params...)
#define SCTP_IS_LISTENING(inp)
#define SCTP_BASE_SYSCTL(__m)
#define SCTP_SB_LIMIT_RCV(so)
int sctp_is_addr_restricted(struct sctp_tcb *stcb, struct sctp_ifa *ifa)
uint32_t sctp_get_frag_point(struct sctp_tcb *stcb)
int sctp_output(struct sctp_inpcb *inp, struct mbuf *m, struct sockaddr *addr, struct mbuf *control, struct thread *p, int flags)
struct sctp_ifa * sctp_source_address_selection(struct sctp_inpcb *inp, struct sctp_tcb *stcb, sctp_route_t *ro, struct sctp_nets *net, int non_asoc_addr_ok, uint32_t vrf_id)
int sctp_send_str_reset_req(struct sctp_tcb *stcb, uint16_t number_entries, uint16_t *list, uint8_t send_in_req, uint8_t send_tsn_req, uint8_t add_stream, uint16_t adding_o, uint16_t adding_i, uint8_t peer_asked)
void sctp_send_hb(struct sctp_tcb *stcb, struct sctp_nets *net, int so_locked)
void sctp_send_initiate(struct sctp_inpcb *inp, struct sctp_tcb *stcb, int so_locked)
int sctp_sosend(struct socket *so, struct sockaddr *addr, struct uio *uio, struct mbuf *top, struct mbuf *control, int flags, struct thread *p)
void sctp_send_abort_tcb(struct sctp_tcb *stcb, struct mbuf *operr, int so_locked)
void sctp_send_shutdown(struct sctp_tcb *stcb, struct sctp_nets *net)
int sctp_send_stream_reset_out_if_possible(struct sctp_tcb *stcb, int so_locked)
void sctp_chunk_output(struct sctp_inpcb *inp, struct sctp_tcb *stcb, int from_where, int so_locked)
int sctp_inpcb_alloc(struct socket *so, uint32_t vrf_id)
void sctp_pcb_finish(void)
struct sctp_tcb * sctp_aloc_assoc_connected(struct sctp_inpcb *inp, struct sockaddr *firstaddr, int *error, uint32_t override_tag, uint32_t initial_tsn, uint32_t vrf_id, uint16_t o_streams, uint16_t port, struct thread *p, int initialize_auth_params)
void sctp_free_ifa(struct sctp_ifa *sctp_ifap)
void sctp_fill_pcbinfo(struct sctp_pcbinfo *spcb)
int sctp_inpcb_bind_locked(struct sctp_inpcb *inp, struct sockaddr *addr, struct sctp_ifa *sctp_ifap, struct thread *td)
struct sctp_tcb * sctp_findassociation_addr_sa(struct sockaddr *from, struct sockaddr *to, struct sctp_inpcb **inp_p, struct sctp_nets **netp, int find_tcp_pool, uint32_t vrf_id)
int sctp_inpcb_bind(struct socket *so, struct sockaddr *addr, struct sctp_ifa *sctp_ifap, struct thread *td)
struct sctp_inpcb * sctp_pcb_findep(struct sockaddr *nam, int find_tcp_pool, int have_lock, uint32_t vrf_id)
int sctp_swap_inpcb_for_listen(struct sctp_inpcb *inp)
void sctp_inpcb_free(struct sctp_inpcb *inp, int immediate, int from)
struct sctp_nets * sctp_findnet(struct sctp_tcb *stcb, struct sockaddr *addr)
int sctp_free_assoc(struct sctp_inpcb *inp, struct sctp_tcb *stcb, int from_inpcbfree, int from_location)
struct sctp_tcb * sctp_findassociation_ep_addr(struct sctp_inpcb **inp_p, struct sockaddr *remote, struct sctp_nets **netp, struct sockaddr *local, struct sctp_tcb *locked_tcb)
int sctp_set_primary_addr(struct sctp_tcb *stcb, struct sockaddr *sa, struct sctp_nets *net)
struct sctp_vrf * sctp_find_vrf(uint32_t vrf_id)
#define SCTP_INITIALIZE_AUTH_PARAMS
#define CHUNK_FLAGS_FRAGMENT_OK
#define SCTP_MAX_STREAMS_AT_ONCE_RESET
#define SCTP_STREAM_RESET_PENDING
#define SCTP_ASSOC_RESET_EVENT
#define SCTP_AUTH_HMAC_ID_SHA1
#define SCTP_CURRENT_ASSOC
#define SCTP_ASSOC_CHANGE
#define SCTP_FUTURE_ASSOC
#define SCTP_PEER_ADDR_CHANGE
#define SCTP_REMOTE_ERROR
#define SPP_IPV6_FLOWLABEL
#define SCTP_STAT_INCR_COUNTER32(_x)
#define SCTP_SHUTDOWN_EVENT
#define SCTP_NOTIFICATIONS_STOPPED_EVENT
#define SCTP_SEND_FAILED_EVENT
#define SCTP_STREAM_RESET_EVENT
#define SPP_HB_TIME_IS_ZERO
#define SPP_PMTUD_DISABLE
#define SCTP_ADAPTATION_INDICATION
#define SCTP_AUTHENTICATION_EVENT
#define SCTP_PR_SCTP_NONE
#define PR_SCTP_POLICY(x)
#define SCTP_SENDER_DRY_EVENT
#define SCTP_STREAM_CHANGE_EVENT
#define SCTP_STAT_DECR_GAUGE32(_x)
#define SCTP_PARTIAL_DELIVERY_EVENT
int sctp_accept(struct socket *so, struct sockaddr **addr)
static uint32_t sctp_fill_user_address(struct sockaddr *dst, struct sockaddr *src)
static size_t sctp_max_size_addresses(struct sctp_inpcb *inp)
int sctp_sendm(struct socket *so, int flags, struct mbuf *m, struct sockaddr *addr, struct mbuf *control, struct thread *p)
void sctp_pathmtu_adjustment(struct sctp_tcb *stcb, uint32_t mtu, bool resend)
int sctp_flush(struct socket *so, int how)
static size_t sctp_max_size_addresses_vrf(struct sctp_inpcb *inp, uint32_t vrf_id)
int sctp_ctloutput(struct socket *so, struct sockopt *sopt)
static int sctp_getopt(struct socket *so, int optname, void *optval, size_t *optsize, void *p)
int sctp_disconnect(struct socket *so)
int sctp_listen(struct socket *so, int backlog, struct thread *p)
VNET_SYSINIT(sctp_init, SI_SUB_PROTO_DOMAIN, SI_ORDER_THIRD, sctp_init, NULL)
SYSCTL_PROC(_net_inet_sctp, OID_AUTO, getcred, CTLTYPE_OPAQUE|CTLFLAG_RW|CTLFLAG_NEEDGIANT, 0, 0, sctp_getcred, "S,ucred", "Get the ucred of a SCTP connection")
#define SCTP_FIND_STCB(inp, stcb, assoc_id)
static int sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize, void *p)
static int sctp_defered_wakeup_cnt
int sctp_shutdown(struct socket *so)
static int sctp_do_connect_x(struct socket *so, struct sctp_inpcb *inp, void *optval, size_t optsize, void *p, int delay)
void sctp_close(struct socket *so)
static void sctp_init(void *arg SCTP_UNUSED)
#define SCTP_CHECK_AND_CAST(destp, srcp, type, size)
static size_t sctp_fill_up_addresses(struct sctp_inpcb *inp, struct sctp_tcb *stcb, size_t limit, struct sockaddr *addr)
static size_t sctp_fill_up_addresses_vrf(struct sctp_inpcb *inp, struct sctp_tcb *stcb, size_t limit, struct sockaddr *addr, uint32_t vrf_id)
static int sctp_getcred(SYSCTL_HANDLER_ARGS)
#define sctp_flight_size_decrease(tp1)
#define sctp_stcb_feature_off(inp, stcb, feature)
#define sctp_feature_on(inp, feature)
#define sctp_total_flight_decrease(stcb, tp1)
#define sctp_is_feature_on(inp, feature)
#define sctp_is_feature_off(inp, feature)
void sctp_notify(struct sctp_inpcb *, struct sctp_tcb *, struct sctp_nets *, uint8_t, uint8_t, uint16_t, uint32_t)
#define sctp_feature_off(inp, feature)
#define sctp_stcb_feature_on(inp, stcb, feature)
#define sctp_free_remote_addr(__net)
#define sctp_stcb_is_feature_on(inp, stcb, feature)
#define sctp_ucount_incr(val)
int sctp_peeraddr(struct socket *, struct sockaddr **)
void sctp_ctlinput(int, struct sockaddr *, void *)
struct pr_usrreqs sctp_usrreqs
int sctp_ingetaddr(struct socket *, struct sockaddr **)
int32_t sctp_map_assoc_state(int kernel_state)
void sctp_misc_ints(uint8_t from, uint32_t a, uint32_t b, uint32_t c, uint32_t d)
void sctp_timer_stop(int t_type, struct sctp_inpcb *inp, struct sctp_tcb *stcb, struct sctp_nets *net, uint32_t from)
void sctp_timer_start(int t_type, struct sctp_inpcb *inp, struct sctp_tcb *stcb, struct sctp_nets *net)
struct mbuf * sctp_generate_cause(uint16_t code, char *info)
int sctp_fill_stat_log(void *optval SCTP_UNUSED, size_t *optsize SCTP_UNUSED)
void sctp_ulp_notify(uint32_t notification, struct sctp_tcb *stcb, uint32_t error, void *data, int so_locked)
void sctp_bindx_add_address(struct socket *so, struct sctp_inpcb *inp, struct sockaddr *sa, uint32_t vrf_id, int *error, void *p)
struct sctp_ifa * sctp_find_ifa_by_addr(struct sockaddr *addr, uint32_t vrf_id, int holds_lock)
void sctp_abort_an_association(struct sctp_inpcb *inp, struct sctp_tcb *stcb, struct mbuf *op_err, bool timedout, int so_locked)
int sctp_connectx_helper_find(struct sctp_inpcb *inp, struct sockaddr *addr, unsigned int totaddr, unsigned int *num_v4, unsigned int *num_v6, unsigned int limit)
uint32_t sctp_get_prev_mtu(uint32_t val)
int sctp_dynamic_set_primary(struct sockaddr *sa, uint32_t vrf_id)
uint32_t sctp_ticks_to_secs(uint32_t ticks)
void sctp_bindx_delete_address(struct sctp_inpcb *inp, struct sockaddr *sa, uint32_t vrf_id, int *error)
void sctp_log_lock(struct sctp_inpcb *inp, struct sctp_tcb *stcb, uint8_t from)
void sctp_hc_set_mtu(union sctp_sockstore *addr, uint16_t fibnum, uint32_t mtu)
int sctp_soreceive(struct socket *so, struct sockaddr **psa, struct uio *uio, struct mbuf **mp0, struct mbuf **controlp, int *flagsp)
void sctp_log_closing(struct sctp_inpcb *inp, struct sctp_tcb *stcb, int16_t loc)
uint32_t sctp_secs_to_ticks(uint32_t secs)
uint32_t sctp_msecs_to_ticks(uint32_t msecs)
uint32_t sctp_ticks_to_msecs(uint32_t ticks)
int sctp_connectx_helper_add(struct sctp_tcb *stcb, struct sockaddr *addr, int totaddr, int *error)
void sctp_abort_notification(struct sctp_tcb *stcb, bool from_peer, bool timeout, uint16_t error, struct sctp_abort_chunk *abort, int so_locked)
void sctp_stop_timers_for_shutdown(struct sctp_tcb *stcb)
#define sctp_get_associd(stcb)
struct in_addr ip_src ip_dst
sctp_assoc_t sas_assoc_id
sctp_assoc_t gaids_assoc_id[]
uint32_t gaids_number_of_ids
struct timeval time_entered
uint32_t total_output_queue_size
unsigned int sent_queue_retran_cnt
sctp_auth_chklist_t * local_auth_chunks
struct sctp_nets * alternate
struct sctpchunk_listhead send_queue
struct sctp_stream_out * strmout
struct sctp_keyhead shared_keys
struct sctpnetlisthead nets
uint8_t reconfig_supported
uint8_t delayed_connection
unsigned int cnt_on_all_streams
unsigned int stream_queue_cnt
struct sctp_ss_functions ss_functions
unsigned int size_on_all_streams
unsigned int max_inbound_streams
uint16_t def_net_pf_threshold
uint64_t abandoned_unsent[SCTP_PR_SCTP_MAX+1]
uint32_t congestion_control_module
struct sctp_scoping scope
uint8_t pktdrop_supported
unsigned int cnt_on_reasm_queue
uint64_t abandoned_sent[SCTP_PR_SCTP_MAX+1]
struct sctp_nonpad_sndrcvinfo def_send
uint32_t heart_beat_delay
struct sctp_nets * primary_destination
uint32_t stream_scheduling_module
struct sctp_cc_functions cc_functions
struct sctpchunk_listhead sent_queue
sctp_auth_chklist_t * peer_auth_chunks
unsigned int size_on_reasm_queue
uint8_t stream_reset_outstanding
uint8_t local_strreset_support
unsigned int sent_queue_cnt
uint16_t sasoc_asocmaxrxt
uint32_t sasoc_cookie_life
uint32_t sasoc_local_rwnd
uint16_t sasoc_number_peer_destinations
sctp_assoc_t sasoc_assoc_id
sctp_assoc_t gauth_assoc_id
uint32_t gauth_number_of_chunks
sctp_assoc_t sca_assoc_id
sctp_assoc_t scact_assoc_id
void(* sctp_set_initial_cc_param)(struct sctp_tcb *stcb, struct sctp_nets *net)
int(* sctp_cwnd_socket_option)(struct sctp_tcb *stcb, int set, struct sctp_cc_option *)
struct sctp_assoc_value aid_value
uint8_t doing_fast_retransmit
uint8_t sctp_shutdown_event
uint8_t sctp_send_failure_event
uint8_t sctp_stream_reset_event
uint8_t sctp_peer_error_event
uint8_t sctp_address_event
uint8_t sctp_partial_delivery_event
uint8_t sctp_adaptation_layer_event
uint8_t sctp_association_event
uint8_t sctp_sender_dry_event
uint8_t sctp_authentication_event
uint8_t sctp_data_io_event
sctp_assoc_t sget_assoc_id
union sctp_sockstore addr[]
uint32_t shmac_number_of_idents
union sctp_sockstore address
struct sctp_ifalist ifalist
uint16_t sinit_max_instreams
uint16_t sinit_max_attempts
uint16_t sinit_max_init_timeo
uint16_t sinit_num_ostreams
struct socket * sctp_socket
union sctp_inpcb::@33 ip_inp
struct sctpasochead sctp_asoc_list
uint8_t reconfig_supported
struct sctp_nonpad_sndrcvinfo def_send
struct sctpladdr sctp_addr_list
uint8_t pktdrop_supported
uint8_t local_strreset_support
union sctp_sockstore _l_addr
uint16_t failure_threshold
struct sctp_timer pmtu_timer
uint32_t heart_beat_delay
uint32_t sinfo_timetolive
struct sockaddr_storage spinfo_address
sctp_assoc_t spinfo_assoc_id
struct sockaddr_storage spp_address
sctp_assoc_t spp_assoc_id
uint32_t spp_ipv6_flowlabel
struct sockaddr_storage spt_address
sctp_assoc_t spt_assoc_id
uint32_t initial_init_rto_max
uint32_t sctp_default_ss_module
struct sctp_keyhead shared_keys
uint32_t initial_sequence_debug
sctp_auth_chklist_t * local_auth_chunks
uint16_t pre_open_stream_count
unsigned int sctp_sack_freq
uint16_t def_net_pf_threshold
uint32_t adaptation_layer_indicator
sctp_hmaclist_t * local_hmacs
uint16_t max_open_streams_intome
uint32_t sctp_default_cc_module
uint32_t sctp_timeoutticks[SCTP_NUM_TMRS]
uint8_t adaptation_layer_indicator_provided
uint64_t sprstat_abandoned_unsent
sctp_assoc_t sprstat_assoc_id
uint64_t sprstat_abandoned_sent
sctp_assoc_t srs_assoc_id
uint16_t srs_number_streams
uint16_t srs_stream_list[]
sctp_assoc_t srto_assoc_id
sctp_assoc_t sack_assoc_id
uint32_t ssb_adaptation_ind
sctp_assoc_t sspp_assoc_id
struct sockaddr_storage sspp_addr
sctp_assoc_t ssp_assoc_id
struct sockaddr_storage ssp_addr
sctp_assoc_t snd_assoc_id
sctp_assoc_t sinfo_assoc_id
uint32_t ss_total_recv_buf
void(* sctp_ss_clear)(struct sctp_tcb *stcb, struct sctp_association *asoc, bool clear_values)
int(* sctp_ss_get_value)(struct sctp_tcb *stcb, struct sctp_association *asoc, struct sctp_stream_out *strq, uint16_t *value)
bool(* sctp_ss_is_user_msgs_incomplete)(struct sctp_tcb *stcb, struct sctp_association *asoc)
int(* sctp_ss_set_value)(struct sctp_tcb *stcb, struct sctp_association *asoc, struct sctp_stream_out *strq, uint16_t value)
void(* sctp_ss_init)(struct sctp_tcb *stcb, struct sctp_association *asoc)
struct sctp_paddrinfo sstat_primary
uint32_t sstat_fragmentation_point
sctp_assoc_t sstat_assoc_id
uint32_t abandoned_unsent[1]
struct sctp_streamhead outqueue
uint32_t abandoned_sent[1]
struct sctp_association asoc
struct sctp_inpcb * sctp_ep
sctp_assoc_t stimo_assoc_id
uint32_t stimo_shutdownack
union sctp_tmit_chunk::@34 rec
struct sctp_data_chunkrec data
struct sctp_association * asoc
sctp_assoc_t sue_assoc_id
struct sockaddr_storage sue_address
struct sctp_ifnlist ifnlist