80 struct mbuf *m_reply = NULL;
84 0, M_NOWAIT, 1, MT_DATA);
85 if (m_reply == NULL) {
87 "asconf_success_response: couldn't get mbuf!\n");
104 struct mbuf *m_reply = NULL;
108 uint16_t i, param_length, cause_length, padding_length;
111 if (error_tlv == NULL) {
116 padding_length = tlv_length % 4;
117 if (padding_length != 0) {
118 padding_length = 4 - padding_length;
120 buf_len = param_length + padding_length;
121 if (buf_len > MLEN) {
123 "asconf_error_response: tlv_length (%xh) too big\n",
128 if (m_reply == NULL) {
130 "asconf_error_response: couldn't get mbuf!\n");
138 error->
code = htons(cause);
139 error->
length = htons(cause_length);
140 if (error_tlv != NULL) {
142 memcpy(tlv, error_tlv, tlv_length);
143 for (i = 0; i < padding_length; i++) {
144 tlv[tlv_length + i] = 0;
153 struct sctp_tcb *stcb,
int send_hb,
int response_required)
156 struct mbuf *m_reply = NULL;
160#if defined(INET) || defined(INET6)
164 int zero_address = 0;
171 struct sockaddr_in6 *sin6;
181#if defined(INET) || defined(INET6)
197 memset(sin, 0,
sizeof(*sin));
220 memset(sin6, 0,
sizeof(*sin6));
221 sin6->sin6_family = AF_INET6;
222 sin6->sin6_len =
sizeof(
struct sockaddr_in6);
223 sin6->sin6_port = stcb->
rport;
224 memcpy((caddr_t)&sin6->sin6_addr, v6addr->
addr,
225 sizeof(
struct in6_addr));
226 if (IN6_IS_ADDR_MULTICAST(&sin6->sin6_addr)) {
229 if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr))
246 "process_asconf_add_ip: using source addr ");
259 "process_asconf_add_ip: error adding address\n");
264 if (response_required) {
289 if (src_net == NULL) {
295 TAILQ_FOREACH_SAFE(net, &stcb->
asoc.
nets, sctp_next, nnet) {
296 if (net != src_net) {
299 "asconf_del_remote_addrs_except: deleting ");
314 struct sctp_tcb *stcb,
int response_required)
316 struct mbuf *m_reply = NULL;
320#if defined(INET) || defined(INET6)
324 int zero_address = 0;
331 struct sockaddr_in6 *sin6;
341#if defined(INET) || defined(INET6)
357 memset(sin, 0,
sizeof(*sin));
365 "process_asconf_delete_ip: deleting ");
377 memset(sin6, 0,
sizeof(*sin6));
378 sin6->sin6_family = AF_INET6;
379 sin6->sin6_len =
sizeof(
struct sockaddr_in6);
380 sin6->sin6_port = stcb->
rport;
381 memcpy(&sin6->sin6_addr, v6addr->
addr,
382 sizeof(
struct in6_addr));
383 if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr))
386 "process_asconf_delete_ip: deleting ");
419 }
else if (response_required) {
440 if (response_required) {
452 struct sctp_tcb *stcb,
int response_required)
454 struct mbuf *m_reply = NULL;
458#if defined(INET) || defined(INET6)
462 int zero_address = 0;
468 struct sockaddr_in6 *sin6;
478#if defined(INET) || defined(INET6)
494 memset(sin, 0,
sizeof(*sin));
512 memset(sin6, 0,
sizeof(*sin6));
513 sin6->sin6_family = AF_INET6;
514 sin6->sin6_len =
sizeof(
struct sockaddr_in6);
515 memcpy((caddr_t)&sin6->sin6_addr, v6addr->
addr,
516 sizeof(
struct in6_addr));
517 if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr))
534 "process_asconf_set_primary: using source addr ");
540 "process_asconf_set_primary: primary address set\n");
549 if (response_required) {
591 "process_asconf_set_primary: set primary failed!\n");
607 struct sockaddr *src,
613 struct mbuf *n, *m_ack, *m_result, *m_tail;
617 unsigned int asconf_limit, cnt;
627 "handle_asconf: chunk too small = %xh\n",
637 "handle_asconf: got duplicate serial number = %xh\n",
651 "handle_asconf: asconf_limit=%u, sequence=%xh\n",
652 asconf_limit, serial_num);
664 if (ack->
data != NULL) {
672 M_NOWAIT, 1, MT_DATA);
675 "handle_asconf: couldn't get mbuf!\n");
692 if (p_addr == NULL) {
694 "handle_asconf: couldn't get lookup addr!\n");
709 while (aph != NULL) {
710 unsigned int param_length, param_type;
714 if (offset + param_length > asconf_limit) {
721 if (param_length >
sizeof(aparam_buf)) {
738 switch (param_type) {
765 if ((param_type & 0x8000) == 0) {
767 asconf_limit = offset;
782 if (m_result != NULL) {
791 if (offset >= asconf_limit) {
849 switch (sa->sa_family) {
854 struct sockaddr_in6 *sin6 = (
struct sockaddr_in6 *)sa;
858 sizeof(
struct in6_addr)) == 0)) {
871 sizeof(
struct in_addr)) == 0)) {
889#if defined(INET) || defined(INET6)
895 switch (sa->sa_family) {
900 struct sockaddr_in6 *sin6 = (
struct sockaddr_in6 *)sa;
906 (memcmp(&v6addr->
addr, &sin6->sin6_addr,
907 sizeof(
struct in6_addr)) == 0)) {
923 sizeof(
struct in_addr)) == 0)) {
970 TAILQ_FOREACH(net, &stcb->
asoc.
nets, sctp_next) {
1024#ifdef SCTP_AUDITING_ENABLED
1033 if (chk->
whoTo != NULL) {
1059 if (chk->
whoTo == net) {
1079 int addrnum, changed;
1092 TAILQ_FOREACH(net, &stcb->
asoc.
nets, sctp_next) {
1094 RO_NHFREE(&net->
ro);
1111 TAILQ_FOREACH(net, &stcb->
asoc.
nets, sctp_next) {
1113 RO_NHFREE(&net->
ro);
1280 struct sockaddr_in6 *sin6;
1288 sizeof(
struct in6_addr));
1319 SCTP_PRINTF(
"asconf_queue_mgmt: inserted asconf ADD_IP_ADDRESS: ");
1322 SCTP_PRINTF(
"asconf_queue_mgmt: appended asconf DEL_IP_ADDRESS: ");
1325 SCTP_PRINTF(
"asconf_queue_mgmt: appended asconf SET_PRIM_ADDR: ");
1345 int pending_delete_queued = 0;
1369 "asconf_queue_add: mark delete last address pending\n");
1388 pending_delete_queued = 1;
1396 if (pending_delete_queued) {
1406 TAILQ_FOREACH(net, &stcb->
asoc.
nets, sctp_next) {
1482 "sctp_asconf_queue_sa_delete: failed to get memory!\n");
1493 switch (sa->sa_family) {
1498 struct sockaddr_in6 *sin6;
1500 sin6 = (
struct sockaddr_in6 *)sa;
1505 sizeof(
struct in6_addr));
1575 htons(aph->ph.param_length)) {
1578 "asconf_process_error: cause element too long\n");
1585 "asconf_process_error: included TLV too long\n");
1589 error_code = ntohs(eh->
code);
1592 switch (error_code) {
1598 switch (param_type) {
1622 switch (param_type) {
1625 "process_param_ack: added IP address\n");
1630 "process_param_ack: deleted IP address\n");
1635 "process_param_ack: set primary IP address\n");
1664 struct sctp_nets *net,
int *abort_no_unlock)
1681 "handle_asconf_ack: chunk too small = %xh\n",
1701 struct mbuf *op_err;
1705 SCTP_SNPRINTF(msg,
sizeof(msg),
"Never sent serial number %8.8x", serial_num);
1708 *abort_no_unlock = 1;
1730 unsigned int param_length, param_type;
1742 if (param_length > ack_length) {
1751 if (param_length >
sizeof(aparam_buf)) {
1753 "param length (%u) larger than buffer size!\n", param_length);
1765 switch (param_type) {
1811 if (last_error_id == 0)
1814 if (aa->
sent == 1) {
1839#ifdef SCTP_TIMER_BASED_ASCONF
1852sctp_is_scopeid_in_nets(
struct sctp_tcb *stcb,
struct sockaddr *sa)
1854 struct sockaddr_in6 *sin6, *net6;
1857 if (sa->sa_family != AF_INET6) {
1861 sin6 = (
struct sockaddr_in6 *)sa;
1862 if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr) == 0) {
1867 TAILQ_FOREACH(net, &stcb->
asoc.
nets, sctp_next) {
1868 if (((
struct sockaddr *)(&net->
ro.
_l_addr))->sa_family !=
1871 net6 = (
struct sockaddr_in6 *)&net->
ro.
_l_addr;
1872 if (IN6_IS_ADDR_LINKLOCAL(&net6->sin6_addr) == 0)
1874 if (sctp_is_same_scope(sin6, net6)) {
1926 if (ifa->
address.
sa.sa_family == AF_INET6) {
1947 struct sockaddr_in6 *sin6;
1950 if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) {
1954 if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr)) {
1959 if (sctp_is_scopeid_in_nets(stcb, &ifa->
address.
sa) == 0) {
1964 IN6_IS_ADDR_SITELOCAL(&sin6->sin6_addr)) {
2012#ifdef SCTP_TIMER_BASED_ASCONF
2029 int cnt_invalid = 0;
2040 if (asc->
cnt == cnt_invalid)
2052 if (asc->
cnt == cnt_invalid)
2061 if (asc->
cnt == cnt_invalid)
2082 if (laddr->
ifa == ifa) {
2088 LIST_FOREACH_SAFE(laddr, &inp->
sctp_addr_list, sctp_nxt_addr, nladdr) {
2090 if (laddr->
ifa == ifa) {
2106 int cnt_invalid = 0;
2126 struct sockaddr_in6 *sin6;
2130 if (asc->
cnt == cnt_invalid)
2136 if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) {
2141 &sin6->sin6_addr) != 0) {
2144 if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr)) {
2149 if (sctp_is_scopeid_in_nets(stcb, &ifa->
address.
sa) == 0) {
2183 if (asc->
cnt == cnt_invalid)
2194 if (asc->
cnt == cnt_invalid)
2206 TAILQ_FOREACH(net, &stcb->
asoc.
nets, sctp_next) {
2212 RO_NHFREE(&net->
ro);
2257 if (num_queued > 0) {
2270 LIST_FOREACH_SAFE(l, &asc->
list_of_work, sctp_nxt_addr, nl) {
2305 "set_primary_ip_address_sa: queued on tcb=%p, ",
2310#ifdef SCTP_TIMER_BASED_ASCONF
2312 stcb->sctp_ep, stcb,
2313 stcb->asoc.primary_destination);
2331 unsigned int offset, asconf_limit;
2336 int add_cnt, del_cnt;
2339 add_cnt = del_cnt = 0;
2340 last_param_type = 0;
2342 if (chk->
data == NULL) {
2362 while (aph != NULL) {
2363 unsigned int param_length, param_type;
2367 if (offset + param_length > asconf_limit) {
2371 if (param_length >
sizeof(aparam_buf)) {
2402 if (offset >= asconf_limit) {
2415 if (add_cnt > del_cnt ||
2422static struct sockaddr *
2479 struct sockaddr_in6 *sin6;
2486 if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) {
2494 &sin6->sin6_addr) != 0) {
2498 IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr))
2501 IN6_IS_ADDR_SITELOCAL(&sin6->sin6_addr))
2528static struct sockaddr *
2534 if (laddr->
ifa == NULL) {
2556 struct mbuf *m_asconf, *m_asconf_chk;
2563 caddr_t ptr, lookup_ptr;
2580 if (m_asconf_chk == NULL) {
2583 "sctp_compose_asconf: couldn't get chunk mbuf!\n");
2587 if (m_asconf == NULL) {
2590 "sctp_compose_asconf: couldn't get mbuf!\n");
2599 lookup_ptr = (caddr_t)(acp + 1);
2600 ptr = mtod(m_asconf, caddr_t);
2630 if (lookup_used == 0 &&
2642 addr_size =
sizeof(
struct in6_addr);
2646 addr_size =
sizeof(
struct in_addr);
2654 memcpy(ptr, &aa->
ap, p_length);
2675 if (lookup_used == 0) {
2680 struct sockaddr *found_addr;
2690 if (found_addr != NULL) {
2691 switch (found_addr->sa_family) {
2698 addr_size =
sizeof(
struct in6_addr);
2699 addr_ptr = (caddr_t)&((
struct sockaddr_in6 *)
2700 found_addr)->sin6_addr;
2709 addr_size =
sizeof(
struct in_addr);
2711 found_addr)->sin_addr;
2716 "sctp_compose_asconf: no usable lookup addr (family = %d)!\n",
2717 found_addr->sa_family);
2723 memcpy(lookup->
addr, addr_ptr, addr_size);
2728 "sctp_compose_asconf: no lookup addr!\n");
2739 return (m_asconf_chk);
2752 unsigned int offset,
unsigned int length)
2779 while (ph != NULL) {
2798 store.
sin6.sin6_family = AF_INET6;
2799 store.
sin6.sin6_len =
sizeof(
struct sockaddr_in6);
2801 memcpy(&store.
sin6.sin6_addr, a6p->
addr,
sizeof(
struct in6_addr));
2849#ifdef SCTP_TIMER_BASED_ASCONF
2866 SCTP_PRINTF(
"process_initack_addrs: bad len (%d) type=%xh\n",
2895 struct sockaddr_in6 *sin6;
2898 struct sockaddr_in6 sin6_tmp;
2901 switch (sa->sa_family) {
2921 "find_initack_addr: invalid offset?\n");
2927 while (ph != NULL) {
2933 if (sa->sa_family == AF_INET6) {
2946 sin6 = (
struct sockaddr_in6 *)sa;
2947 if (IN6_IS_SCOPE_LINKLOCAL(&sin6->sin6_addr)) {
2949 memcpy(&sin6_tmp, sin6,
2950 sizeof(
struct sockaddr_in6));
2952 in6_clearscope(&sin6->sin6_addr);
2954 if (memcmp(&sin6->sin6_addr, a6p->
addr,
2955 sizeof(
struct in6_addr)) == 0) {
2964 if (sa->sa_family == AF_INET) {
3007 int length,
struct sockaddr *init_addr)
3014 if (laddr->
ifa == NULL) {
3016 "check_addr_list_ep: laddr->ifa is NULL");
3038 int length,
struct sockaddr *init_addr,
3050 struct sockaddr_in6 *sin6;
3084 if ((ipv4_scope == 0) &&
3095 &sin6->sin6_addr) != 0) {
3098 if ((local_scope == 0) &&
3099 (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr))) {
3102 if ((site_scope == 0) &&
3103 (IN6_IS_ADDR_SITELOCAL(&sin6->sin6_addr))) {
3133 int length,
struct sockaddr *init_addr,
3143 local_scope, site_scope, ipv4_scope, loopback_scope);
3166 if (sa->sa_len == 0) {
3202 LIST_FOREACH_SAFE(laddr, &inp->
sctp_addr_list, sctp_nxt_addr, nladdr) {
3232 LIST_INSERT_HEAD(&asc->
list_of_work, wi, sctp_nxt_addr);
3242 SCTP_PRINTF(
"Failed to initiate iterator for addr_mgmt_ep_sa\n");
3252 return (EADDRNOTAVAIL);
3266 struct sockaddr_in6 *to6;
3285 if ((aa_vtag == NULL) || (aa_add == NULL) || (aa_del == NULL)) {
3289 if (aa_vtag != NULL) {
3292 if (aa_add != NULL) {
3295 if (aa_del != NULL) {
3304 aa_vtag->
ifa = NULL;
3345 "sctp_asconf_send_nat_state_update: unknown address family %d\n",
3366 LIST_FOREACH(sctp_ifnp, &
vrf->
ifnlist, next_ifn) {
3367 LIST_FOREACH(sctp_ifap, &sctp_ifnp->
ifalist, next_ifa) {
3368 switch (sctp_ifap->
address.
sa.sa_family) {
3388 &to6->sin6_addr) != 0) {
3391 if (IN6_IS_ADDR_LOOPBACK(&to6->sin6_addr)) {
3394 if (IN6_IS_ADDR_LINKLOCAL(&to6->sin6_addr)) {
3410 if (laddr->
ifa == NULL) {
3426 sctp_ifap = laddr->
ifa;
3427 switch (sctp_ifap->
address.
sa.sa_family) {
3442 if (IN6_IS_ADDR_LOOPBACK(&to6->sin6_addr)) {
3445 if (IN6_IS_ADDR_LINKLOCAL(&to6->sin6_addr)) {
int prison_check_ip4(const struct ucred *cred, const struct in_addr *ia)
#define SCTP_PCB_FLAGS_BOUND_V6
#define SCTP_CAUSE_DELETING_LAST_ADDR
#define SCTP_THRESHOLD_LOGGING
#define SCTP_MOBILITY_BASE
#define SCTP_CAUSE_RESOURCE_SHORTAGE
#define SCTP_CAUSE_UNRESOLVABLE_ADDR
#define SCTP_PCB_FLAGS_DO_ASCONF
#define SCTP_CAUSE_PROTOCOL_VIOLATION
#define SCTP_CAUSE_DELETING_SRC_ADDR
#define SCTP_CAUSE_REQUEST_REFUSED
#define SCTP_MOBILITY_FASTHANDOFF
#define SCTP_PCB_FLAGS_BOUNDALL
#define SCTP_CAUSE_INVALID_PARAM
#define SCTP_MOBILITY_PRIM_DELETED
static void sctp_asconf_addr_mgmt_ack(struct sctp_tcb *stcb, struct sctp_ifa *addr, uint32_t flag)
static struct mbuf * sctp_asconf_success_response(uint32_t id)
static void sctp_asconf_ack_clear(struct sctp_tcb *stcb SCTP_UNUSED)
static void sctp_path_check_and_react(struct sctp_tcb *stcb, struct sctp_ifa *newifa)
void sctp_handle_asconf(struct mbuf *m, unsigned int offset, struct sockaddr *src, struct sctp_asconf_chunk *cp, struct sctp_tcb *stcb, int first)
void sctp_net_immediate_retrans(struct sctp_tcb *stcb, struct sctp_nets *net)
uint32_t sctp_addr_mgmt_ep_sa(struct sctp_inpcb *inp, struct sockaddr *sa, uint32_t type, uint32_t vrf_id)
static struct sctp_asconf_addr * sctp_asconf_find_param(struct sctp_tcb *stcb, uint32_t correlation_id)
static struct mbuf * sctp_process_asconf_set_primary(struct sockaddr *src, struct sctp_asconf_paramhdr *aph, struct sctp_tcb *stcb, int response_required)
int32_t sctp_set_primary_ip_address_sa(struct sctp_tcb *stcb, struct sockaddr *sa)
static void sctp_asconf_nets_cleanup(struct sctp_tcb *stcb, struct sctp_ifn *ifn)
void sctp_assoc_immediate_retrans(struct sctp_tcb *stcb, struct sctp_nets *dstnet)
static void sctp_asconf_process_param_ack(struct sctp_tcb *stcb, struct sctp_asconf_addr *aparam, uint32_t flag)
int sctp_asconf_iterator_ep(struct sctp_inpcb *inp, void *ptr, uint32_t val SCTP_UNUSED)
void sctp_asconf_send_nat_state_update(struct sctp_tcb *stcb, struct sctp_nets *net)
static uint32_t sctp_addr_in_initack(struct mbuf *m, uint32_t offset, uint32_t length, struct sockaddr *sa)
void sctp_check_address_list(struct sctp_tcb *stcb, struct mbuf *m, int offset, int length, struct sockaddr *init_addr, uint16_t local_scope, uint16_t site_scope, uint16_t ipv4_scope, uint16_t loopback_scope)
static int sctp_asconf_iterator_ep_end(struct sctp_inpcb *inp, void *ptr, uint32_t val SCTP_UNUSED)
static void sctp_addr_mgmt_assoc(struct sctp_inpcb *inp, struct sctp_tcb *stcb, struct sctp_ifa *ifa, uint16_t type, int addr_locked)
static struct sockaddr * sctp_find_valid_localaddr(struct sctp_tcb *stcb, int addr_locked)
static int sctp_asconf_queue_mgmt(struct sctp_tcb *, struct sctp_ifa *, uint16_t)
void sctp_asconf_cleanup(struct sctp_tcb *stcb)
static void sctp_asconf_process_error(struct sctp_tcb *stcb SCTP_UNUSED, struct sctp_asconf_paramhdr *aph)
static uint32_t sctp_addr_match(struct sctp_paramhdr *ph, struct sockaddr *sa)
static int sctp_asconf_del_remote_addrs_except(struct sctp_tcb *stcb, struct sockaddr *src)
int sctp_is_addr_pending(struct sctp_tcb *stcb, struct sctp_ifa *sctp_ifa)
static void sctp_process_initack_addresses(struct sctp_tcb *stcb, struct mbuf *m, unsigned int offset, unsigned int length)
void sctp_handle_asconf_ack(struct mbuf *m, int offset, struct sctp_asconf_ack_chunk *cp, struct sctp_tcb *stcb, struct sctp_nets *net, int *abort_no_unlock)
void sctp_asconf_iterator_end(void *ptr, uint32_t val SCTP_UNUSED)
static struct mbuf * sctp_process_asconf_add_ip(struct sockaddr *src, struct sctp_asconf_paramhdr *aph, struct sctp_tcb *stcb, int send_hb, int response_required)
struct mbuf * sctp_compose_asconf(struct sctp_tcb *stcb, int *retlen, int addr_locked)
static int sctp_asconf_queue_sa_delete(struct sctp_tcb *stcb, struct sockaddr *sa)
static int sctp_asconf_queue_add(struct sctp_tcb *stcb, struct sctp_ifa *ifa, uint16_t type)
void sctp_asconf_iterator_stcb(struct sctp_inpcb *inp, struct sctp_tcb *stcb, void *ptr, uint32_t val SCTP_UNUSED)
static struct sockaddr * sctp_find_valid_localaddr_ep(struct sctp_tcb *stcb)
static uint32_t sctp_asconf_addr_match(struct sctp_asconf_addr *aa, struct sockaddr *sa)
static void sctp_check_address_list_all(struct sctp_tcb *stcb, struct mbuf *m, int offset, int length, struct sockaddr *init_addr, uint16_t local_scope, uint16_t site_scope, uint16_t ipv4_scope, uint16_t loopback_scope)
static void sctp_check_address_list_ep(struct sctp_tcb *stcb, struct mbuf *m, int offset, int length, struct sockaddr *init_addr)
static struct mbuf * sctp_process_asconf_delete_ip(struct sockaddr *src, struct sctp_asconf_paramhdr *aph, struct sctp_tcb *stcb, int response_required)
static struct mbuf * sctp_asconf_error_response(uint32_t id, uint16_t cause, uint8_t *error_tlv, uint16_t tlv_length)
struct mbuf * sctp_get_mbuf_for_msg(unsigned int space_needed, int want_header, int how, int allonebuf, int type)
#define SCTP_NOTIFY_ASCONF_DELETE_IP
#define IN4_ISPRIVATE_ADDRESS(a)
#define SCTP_DIAG_INFO_LEN
#define SCTP_PARAM_BUFFER_SIZE
#define SCTP_ADD_IP_ADDRESS
#define SCTP_ULP_ADAPTATION
#define SCTP_OUTPUT_FROM_T3
#define SCTP_DATAGRAM_RESEND
#define SCTP_SUCCESS_REPORT
#define SCTP_SO_NOT_LOCKED
#define SCTP_TIMER_TYPE_HEARTBEAT
#define SCTP_DEL_IP_ADDRESS
#define IN4_ISLOOPBACK_ADDRESS(a)
#define SCTP_DEBUG_ASCONF2
#define SCTP_TIMER_TYPE_PRIM_DELETED
#define SCTP_ADDR_UNCONFIRMED
#define SCTP_DONOT_SETSCOPE
#define SCTP_NOTIFY_ASCONF_ADD_IP
#define SCTP_TSN_GE(a, b)
#define SCTP_GET_STATE(_stcb)
#define SCTP_THRESHOLD_CLEAR
#define SCTP_TIMER_TYPE_PATHMTURAISE
#define SCTP_IPV4_ADDRESS
#define SCTP_DEBUG_ASCONF1
#define SCTP_STATE_SHUTDOWN_RECEIVED
#define SCTP_SET_PRIM_ADDR
#define SCTP_ADDR_DYNAMIC_ADDED
#define SCTP_IPV6_ADDRESS
#define SCTP_ADDR_REACHABLE
#define SCTP_TIMER_TYPE_ASCONF
#define SCTP_ERROR_CAUSE_IND
#define SCTP_NOTIFY_ASCONF_SET_PRIMARY
#define SCTP_FROM_SCTP_ASCONF
#define SCTP_TIMER_TYPE_SEND
#define SCTP_ADDR_NOT_LOCKED
#define SCTP_IPI_ADDR_RLOCK()
#define SCTP_DECR_LADDR_COUNT()
#define SCTP_IPI_ADDR_RUNLOCK()
#define SCTP_INCR_LADDR_COUNT()
#define SCTP_INP_DECR_REF(_inp)
#define SCTP_TCB_LOCK_ASSERT(_tcb)
#define SCTP_LTRACE_ERR_RET(inp, stcb, net, file, err)
#define SCTP_ZONE_GET(zone, type)
#define SCTP_IFN_IS_IFT_LOOP(ifn)
#define SCTP_SNPRINTF(...)
struct route sctp_route_t
#define SCTP_GET_IF_INDEX_FROM_ROUTE(ro)
#define SCTP_MALLOC(var, type, size, name)
#define SCTP_BASE_INFO(__m)
#define SCTP_IPV6_V6ONLY(sctp_inpcb)
#define SCTP_PRINTF(params...)
#define SCTP_RTALLOC(ro, vrf_id, fibnum)
#define SCTP_FREE(var, type)
#define SCTPDBG(level, params...)
#define SCTP_ZONE_FREE(zone, element)
#define SCTP_BASE_SYSCTL(__m)
#define SCTP_ROUTE_HAS_VALID_IFN(ro)
#define SCTPDBG_ADDR(level, addr)
int sctp_is_addr_restricted(struct sctp_tcb *stcb, struct sctp_ifa *ifa)
int sctp_v4src_match_nexthop(struct sctp_ifa *sifa, sctp_route_t *ro)
int sctp_is_address_in_scope(struct sctp_ifa *ifa, struct sctp_scoping *scope, int do_update)
void sctp_send_hb(struct sctp_tcb *stcb, struct sctp_nets *net, int so_locked)
void sctp_send_asconf(struct sctp_tcb *stcb, struct sctp_nets *net, int addr_locked)
void sctp_toss_old_asconf(struct sctp_tcb *stcb)
void sctp_move_chunks_from_net(struct sctp_tcb *stcb, struct sctp_nets *net)
int sctp_is_addr_in_ep(struct sctp_inpcb *inp, struct sctp_ifa *ifa)
void sctp_chunk_output(struct sctp_inpcb *inp, struct sctp_tcb *stcb, int from_where, int so_locked)
int sctp_v6src_match_nexthop(struct sockaddr_in6 *src6, sctp_route_t *ro)
void sctp_add_local_addr_ep(struct sctp_inpcb *inp, struct sctp_ifa *ifa, uint32_t action)
int sctp_del_remote_addr(struct sctp_tcb *stcb, struct sockaddr *remaddr)
void sctp_del_local_addr_ep(struct sctp_inpcb *inp, struct sctp_ifa *ifa)
void sctp_del_local_addr_restricted(struct sctp_tcb *stcb, struct sctp_ifa *ifa)
void sctp_free_ifa(struct sctp_ifa *sctp_ifap)
void sctp_remove_net(struct sctp_tcb *stcb, struct sctp_nets *net)
int sctp_add_remote_addr(struct sctp_tcb *stcb, struct sockaddr *newaddr, struct sctp_nets **netp, uint16_t port, int set_scope, int from)
int sctp_initiate_iterator(inp_func inpf, asoc_func af, inp_func inpe, uint32_t pcb_state, uint32_t pcb_features, uint32_t asoc_state, void *argp, uint32_t argi, end_func ef, struct sctp_inpcb *s_inp, uint8_t chunk_output_off)
struct sctp_nets * sctp_findnet(struct sctp_tcb *stcb, struct sockaddr *addr)
void sctp_add_local_addr_restricted(struct sctp_tcb *stcb, struct sctp_ifa *ifa)
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_ADDR_IFA_UNUSEABLE
#define SCTP_BEING_DELETED
#define SCTP_PCB_ANY_FLAGS
#define SCTP_ASOC_ANY_STATE
#define SCTP_PCB_ANY_FEATURES
void sctp_delete_prim_timer(struct sctp_inpcb *inp, struct sctp_tcb *stcb)
int sctp_t3rxt_timer(struct sctp_inpcb *inp, struct sctp_tcb *stcb, struct sctp_nets *net)
#define sctp_flight_size_decrease(tp1)
#define sctp_total_flight_decrease(stcb, tp1)
#define sctp_is_feature_on(inp, feature)
#define sctp_is_feature_off(inp, feature)
#define sctp_is_mobility_feature_on(inp, feature)
#define sctp_free_remote_addr(__net)
#define sctp_ucount_incr(val)
struct sctp_ifa * sctp_find_ifa_in_ep(struct sctp_inpcb *inp, struct sockaddr *addr, int holds_lock)
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)
int sctp_local_addr_count(struct sctp_tcb *stcb)
struct mbuf * sctp_generate_cause(uint16_t code, char *info)
void sctp_ulp_notify(uint32_t notification, struct sctp_tcb *stcb, uint32_t error, void *data, int so_locked)
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_cmpaddr(struct sockaddr *sa1, struct sockaddr *sa2)
caddr_t sctp_m_getptr(struct mbuf *m, int off, int len, uint8_t *in_ptr)
struct sctp_nets * last_sent_to
struct sctp_ipv6addr_param addrp
struct sctp_asconf_paramhdr aph
struct sctp_asconf_addr_param ap
struct sctpladdr list_of_work
struct sctp_asconf_paramhdr aph
int16_t num_send_timers_up
unsigned int sent_queue_retran_cnt
uint8_t asconf_del_pending
struct sctp_nets * alternate
struct sctpnetlisthead nets
struct sctp_nets * last_control_chunk_from
struct sctp_nets * deleted_primary
uint32_t asconf_seq_out_acked
struct sctp_asconf_ackhead asconf_ack_sent
struct sctp_asconf_addrhead asconf_queue
struct sctpchunk_listhead asconf_send_queue
struct sctp_scoping scope
struct sctp_nets * primary_destination
struct sctp_cc_functions cc_functions
unsigned int overall_error_count
struct sctpchunk_listhead sent_queue
struct sctp_ifa * asconf_addr_del_pending
unsigned int sent_queue_cnt
void(* sctp_set_initial_cc_param)(struct sctp_tcb *stcb, struct sctp_nets *net)
union sctp_sockstore address
struct sctp_ifalist ifalist
union sctp_inpcb::@33 ip_inp
struct sctpasochead sctp_asoc_list
struct sctpladdr sctp_addr_list
uint8_t addr[SCTP_V6_ADDR_BYTES]
struct nhop_object * ro_nh
union sctp_sockstore _l_addr
struct sctp_ifa * _s_addr
uint8_t src_addr_selected
struct sctp_association asoc
struct sctp_inpcb * sctp_ep
struct sctp_data_chunkrec data
struct sctp_ifnlist ifnlist