/*
- * Copyright (c) 2012 Apple Inc. All rights reserved.
+ * Copyright (c) 2012-2017 Apple Inc. All rights reserved.
*
* @APPLE_OSREFERENCE_LICENSE_HEADER_START@
*
#include <net/flowadv.h>
/* Lock group and attribute for fadv_lock */
-static lck_grp_t *fadv_lock_grp;
-static lck_grp_attr_t *fadv_lock_grp_attr;
+static lck_grp_t *fadv_lock_grp;
+static lck_grp_attr_t *fadv_lock_grp_attr;
decl_lck_mtx_data(static, fadv_lock);
/* protected by fadv_lock */
static thread_t fadv_thread = THREAD_NULL;
static uint32_t fadv_active;
-static unsigned int fadv_zone_size; /* size of flowadv_fcentry */
-static struct zone *fadv_zone; /* zone for flowadv_fcentry */
+static unsigned int fadv_zone_size; /* size of flowadv_fcentry */
+static struct zone *fadv_zone; /* zone for flowadv_fcentry */
-#define FADV_ZONE_MAX 32 /* maximum elements in zone */
-#define FADV_ZONE_NAME "fadv_zone" /* zone name */
+#define FADV_ZONE_MAX 32 /* maximum elements in zone */
+#define FADV_ZONE_NAME "fadv_zone" /* zone name */
static int flowadv_thread_cont(int);
static void flowadv_thread_func(void *, wait_result_t);
fadv_lock_grp = lck_grp_alloc_init("fadv_lock", fadv_lock_grp_attr);
lck_mtx_init(&fadv_lock, fadv_lock_grp, NULL);
- fadv_zone_size = P2ROUNDUP(sizeof (struct flowadv_fcentry),
- sizeof (u_int64_t));
+ fadv_zone_size = P2ROUNDUP(sizeof(struct flowadv_fcentry),
+ sizeof(u_int64_t));
fadv_zone = zinit(fadv_zone_size,
FADV_ZONE_MAX * fadv_zone_size, 0, FADV_ZONE_NAME);
if (fadv_zone == NULL) {
struct flowadv_fcentry *fce;
fce = (how == M_WAITOK) ? zalloc(fadv_zone) : zalloc_noblock(fadv_zone);
- if (fce != NULL)
+ if (fce != NULL) {
bzero(fce, fadv_zone_size);
+ }
- return (fce);
+ return fce;
}
void
void
flowadv_add(struct flowadv_fclist *fcl)
{
- if (STAILQ_EMPTY(fcl))
+ if (STAILQ_EMPTY(fcl)) {
return;
+ }
lck_mtx_lock_spin(&fadv_lock);
STAILQ_CONCAT(&fadv_list, fcl);
VERIFY(!STAILQ_EMPTY(&fadv_list));
- if (!fadv_active && fadv_thread != THREAD_NULL)
+ if (!fadv_active && fadv_thread != THREAD_NULL) {
+ wakeup_one((caddr_t)&fadv_list);
+ }
+
+ lck_mtx_unlock(&fadv_lock);
+}
+
+void
+flowadv_add_entry(struct flowadv_fcentry *fce)
+{
+ lck_mtx_lock_spin(&fadv_lock);
+ STAILQ_INSERT_HEAD(&fadv_list, fce, fce_link);
+ VERIFY(!STAILQ_EMPTY(&fadv_list));
+
+ if (!fadv_active && fadv_thread != THREAD_NULL) {
wakeup_one((caddr_t)&fadv_list);
+ }
lck_mtx_unlock(&fadv_lock);
}
{
#pragma unused(err)
for (;;) {
- lck_mtx_assert(&fadv_lock, LCK_MTX_ASSERT_OWNED);
+ LCK_MTX_ASSERT(&fadv_lock, LCK_MTX_ASSERT_OWNED);
while (STAILQ_EMPTY(&fadv_list)) {
VERIFY(!fadv_active);
(void) msleep0(&fadv_list, &fadv_lock, (PSOCK | PSPIN),
STAILQ_NEXT(fce, fce_link) = NULL;
lck_mtx_unlock(&fadv_lock);
- switch (fce->fce_flowsrc) {
+ switch (fce->fce_flowsrc_type) {
case FLOWSRC_INPCB:
inp_flowadv(fce->fce_flowid);
break;
ifnet_flowadv(fce->fce_flowid);
break;
+
case FLOWSRC_PF:
default:
break;
lck_mtx_lock_spin(&fadv_lock);
/* if there's no pending request, we're done */
- if (STAILQ_EMPTY(&fadv_list))
+ if (STAILQ_EMPTY(&fadv_list)) {
break;
+ }
}
fadv_active = 0;
}
}
+__dead2
static void
flowadv_thread_func(void *v, wait_result_t w)
{