51#include <sys/unistd.h>
92 0,
"waiting_for_work", 0);
119sctp_gather_internal_ifa_flags(
struct sctp_ifa *ifa)
121 struct in6_ifaddr *ifa6;
123 ifa6 = (
struct in6_ifaddr *)ifa->
ifa;
124 ifa->
flags = ifa6->ia6_flags;
127 IN6_IFF_DEPRECATED) {
152 switch (ifn->if_type) {
165 case IFT_ISDNPRIMARY:
177 case IFT_PROPVIRTUAL:
178 case IFT_VIRTUALIPADDRESS:
196 struct epoch_tracker et;
202 struct in6_ifaddr *ifa6;
212 CK_STAILQ_FOREACH(ifa, &ifn->if_addrhead, ifa_link) {
213 if (ifa->ifa_addr == NULL) {
216 switch (ifa->ifa_addr->sa_family) {
219 if (((
struct sockaddr_in *)ifa->ifa_addr)->sin_addr.s_addr == 0) {
226 if (IN6_IS_ADDR_UNSPECIFIED(&((
struct sockaddr_in6 *)ifa->ifa_addr)->sin6_addr)) {
235 switch (ifa->ifa_addr->sa_family) {
243 ifa6 = (
struct in6_ifaddr *)ifa;
244 ifa_flags = ifa6->ia6_flags;
305 if ((cmd != RTM_ADD) && (cmd != RTM_DELETE)) {
310 if (ifa->ifa_addr == NULL) {
317 switch (ifa->ifa_addr->sa_family) {
320 if (((
struct sockaddr_in *)ifa->ifa_addr)->sin_addr.s_addr == 0) {
327 ifa_flags = ((
struct in6_ifaddr *)ifa)->ia6_flags;
328 if (IN6_IS_ADDR_UNSPECIFIED(&((
struct sockaddr_in6 *)ifa->ifa_addr)->sin6_addr)) {
338 if (cmd == RTM_ADD) {
340 ifa->ifa_ifp->if_index, ifa->ifa_ifp->if_type, ifa->ifa_ifp->if_xname,
341 (
void *)ifa, ifa->ifa_addr, ifa_flags, 1);
344 ifa->ifa_ifp->if_index,
345 ifa->ifa_ifp->if_xname);
362 int how,
int allonebuf,
int type)
364 struct mbuf *m = NULL;
366 m = m_getm2(NULL, space_needed, how, type, want_header ? M_PKTHDR : 0);
376 KASSERT(
SCTP_BUF_NEXT(m) == NULL, (
"%s: no chain allowed", __func__));
378#ifdef SCTP_MBUF_LOGGING
386#ifdef SCTP_PACKET_LOGGING
388sctp_packet_log(
struct mbuf *m)
395 int grabbed_lock = 0;
396 int value, newval, thisend, thisbegin;
404 total_len =
SCTP_SIZE32((length + (4 *
sizeof(
int))));
429 if (!(atomic_cmpset_int(&
SCTP_BASE_VAR(packet_log_end), value, thisend))) {
443 if (!(atomic_cmpset_int(&
SCTP_BASE_VAR(packet_log_end), value, thisend))) {
449 SCTP_PRINTF(
"Insanity stops a log thisbegin:%d thisend:%d writers:%d lock:%d end:%d\n",
466 copyto = (
void *)lenat;
467 thisone = thisend -
sizeof(int);
474 m_copydata(m, 0, length, (caddr_t)copyto);
483sctp_copy_out_packet_log(
uint8_t *target,
int length)
489 int tocopy, this_copy;
494 if (length < (
int)(2 *
sizeof(
int))) {
516 lenat = (
int *)target;
520 memcpy((
void *)lenat, (
void *)
SCTP_BASE_VAR(packet_log_buffer), this_copy);
526 return (this_copy +
sizeof(
int));
#define SCTP_MBUF_LOGGING_ENABLE
#define SCTP_PACKET_LOG_SIZE
static void sctp_iterator_thread(void *v SCTP_UNUSED)
void sctp_addr_change(struct ifaddr *ifa, int cmd)
static uint32_t sctp_is_desired_interface_type(struct ifnet *ifn)
void sctp_startup_iterator(void)
void sctp_wakeup_iterator(void)
void sctp_addr_change_event_handler(void *arg __unused, struct ifaddr *ifa, int cmd)
struct mbuf * sctp_get_mbuf_for_msg(unsigned int space_needed, int want_header, int how, int allonebuf, int type)
MALLOC_DEFINE(SCTP_M_MAP, "sctp_map", "sctp asoc map descriptor")
struct iterator_control sctp_it_ctl
static void sctp_init_ifns_for_vrf(int vrfid)
void sctp_init_vrf_list(int vrfid)
#define SCTP_KTRHEAD_NAME
#define SCTP_KTHREAD_PAGES
#define SCTP_IPI_ITERATOR_WQ_LOCK()
#define SCTP_ITERATOR_LOCK_INIT()
#define SCTP_IP_PKTLOG_LOCK()
#define SCTP_IP_PKTLOG_UNLOCK()
#define SCTP_IPI_ITERATOR_WQ_INIT()
#define MODULE_GLOBAL(__SYMBOL)
#define SCTP_PKTLOG_WRITERS_NEED_LOCK
#define SCTP_PRINTF(params...)
#define SCTP_BASE_VAR(__m)
#define SCTP_DEFAULT_VRFID
#define SCTP_HEADER_LEN(m)
#define SCTP_BASE_SYSCTL(__m)
#define sctp_get_tick_count()
struct sctp_ifa * sctp_add_addr_to_vrf(uint32_t vrf_id, void *ifn, uint32_t ifn_index, uint32_t ifn_type, const char *if_name, void *ifa, struct sockaddr *addr, uint32_t ifa_flags, int dynamic_add)
struct sctp_vrf * sctp_allocate_vrf(int vrf_id)
void sctp_del_addr_from_vrf(uint32_t vrf_id, struct sockaddr *addr, uint32_t ifn_index, const char *if_name)
#define SCTP_ADDR_IFA_UNUSEABLE
void sctp_iterator_worker(void)
struct mtx ipi_iterator_wq_mtx
SCTP_PROCESS_STRUCT thread_proc
struct sctpiterators iteratorhead
uint32_t iterator_running