d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck/*
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck * CDDL HEADER START
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck *
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck * The contents of this file are subject to the terms of the
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck * Common Development and Distribution License (the "License").
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck * You may not use this file except in compliance with the License.
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck *
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck * or http://www.opensolaris.org/os/licensing.
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck * See the License for the specific language governing permissions
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck * and limitations under the License.
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck *
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck * When distributing Covered Code, include this CDDL HEADER in each
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck * If applicable, add the following below this CDDL HEADER, with the
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck * fields enclosed by brackets "[]" replaced with your own identifying
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck * information: Portions Copyright [yyyy] [name of copyright owner]
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck *
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck * CDDL HEADER END
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck */
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck/*
f6da83d4178694e7113b71d1e452f15b296f73d8Anurag S. Maskey * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck */
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include <atomic.h>
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck#include <errno.h>
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include <execinfo.h>
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include <libuutil.h>
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck#include <pthread.h>
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include <signal.h>
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck#include <stdlib.h>
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck#include <string.h>
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include <strings.h>
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck#include <syslog.h>
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include <sys/time.h>
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck#include <unistd.h>
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include "conditions.h"
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include "events.h"
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include "objects.h"
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include "util.h"
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * events.c - contains routines which create/destroy event sources,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * handle the event queue and process events from that queue.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/* Add new event sources here. */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeystruct nwamd_event_source {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey char *name;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey void (*events_init)(void);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey void (*events_fini)(void);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey} event_sources[] = {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey { "routing_events",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_routing_events_init, nwamd_routing_events_fini },
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey { "sysevent_events",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_sysevent_events_init, nwamd_sysevent_events_fini },
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey};
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/* Counter for event ids */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeystatic uint64_t event_id_counter = 0;
b00044a2eb43864b8718585d21949611a2ee59efJames Carlson
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeystatic uu_list_pool_t *event_pool = NULL;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeystatic uu_list_t *event_queue = NULL;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeystatic pthread_mutex_t event_queue_mutex = PTHREAD_MUTEX_INITIALIZER;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeystatic pthread_cond_t event_queue_cond = PTHREAD_COND_INITIALIZER;
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeystatic int nwamd_event_compare(const void *, const void *, void *);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeystatic const char *
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwamd_event_name(int event_type)
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (event_type <= NWAM_EVENT_MAX)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (nwam_event_type_to_string(event_type));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey switch (event_type) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_EVENT_TYPE_OBJECT_INIT:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return ("OBJECT_INIT");
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_EVENT_TYPE_OBJECT_FINI:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return ("OBJECT_FINI");
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_EVENT_TYPE_TIMED_CHECK_CONDITIONS:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return ("TIMED_CHECK_CONDITIONS");
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_EVENT_TYPE_TRIGGERED_CHECK_CONDITIONS:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return ("TRIGGERED_CHECK_CONDITIONS");
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_EVENT_TYPE_NCU_CHECK:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return ("NCU_CHECK");
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_EVENT_TYPE_TIMER:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return ("TIMER");
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_EVENT_TYPE_UPGRADE:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return ("UPGRADE");
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_EVENT_TYPE_PERIODIC_SCAN:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return ("PERIODIC_SCAN");
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_EVENT_TYPE_QUEUE_QUIET:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return ("QUEUE_QUIET");
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey default:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return ("N/A");
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeckvoid
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwamd_event_sources_init(void)
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey int i;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Now we can safely initialize event sources.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey for (i = 0;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey i < sizeof (event_sources) / sizeof (struct nwamd_event_source);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey i++) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (event_sources[i].events_init != NULL)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event_sources[i].events_init();
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck}
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeyvoid
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwamd_event_sources_fini(void)
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey int i;
b00044a2eb43864b8718585d21949611a2ee59efJames Carlson
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey for (i = 0;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey i < sizeof (event_sources) / sizeof (struct nwamd_event_source);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey i++) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (event_sources[i].events_init != NULL)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event_sources[i].events_fini();
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck }
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck}
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck/*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Comparison function for events, passed in as callback to
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * uu_list_pool_create(). Compare by time, so that timer
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * event queue can be sorted by nearest time to present.
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/* ARGSUSED */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeystatic int
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwamd_event_compare(const void *l_arg, const void *r_arg, void *private)
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_event_t l = (nwamd_event_t)l_arg;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_event_t r = (nwamd_event_t)r_arg;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey int rv;
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey rv = l->event_time.tv_sec - r->event_time.tv_sec;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (rv == 0)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey rv = l->event_time.tv_nsec - r->event_time.tv_nsec;
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck return (rv);
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck}
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeyvoid
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwamd_event_queue_init(void)
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event_pool = uu_list_pool_create("event_queue_pool",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey sizeof (struct nwamd_event),
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey offsetof(struct nwamd_event, event_node),
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_event_compare, UU_LIST_POOL_DEBUG);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (event_pool == NULL)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey pfail("uu_list_pool_create failed with error %d", uu_error());
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event_queue = uu_list_create(event_pool, NULL, UU_LIST_SORTED);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (event_queue == NULL)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey pfail("uu_list_create failed with error %d", uu_error());
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck}
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeyvoid
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwamd_event_queue_fini(void)
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey void *cookie = NULL;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_event_t event;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey while ((event = uu_list_teardown(event_queue, &cookie)) != NULL)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_event_fini(event);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey uu_list_destroy(event_queue);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (event_pool != NULL)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey uu_list_pool_destroy(event_pool);
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck}
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwamd_event_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwamd_event_init(int32_t type, nwam_object_type_t object_type,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey size_t size, const char *object_name)
b00044a2eb43864b8718585d21949611a2ee59efJames Carlson{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_event_t event;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event = calloc(1, sizeof (struct nwamd_event));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (event == NULL) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_ERR, "nwamd_event_init: could not create %s event for "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "object %s", nwamd_event_name(type),
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey object_name != NULL ? object_name : "<no object>");
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NULL);
b00044a2eb43864b8718585d21949611a2ee59efJames Carlson }
b00044a2eb43864b8718585d21949611a2ee59efJames Carlson
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* Is this an externally-visible event? */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (type <= NWAM_EVENT_MAX) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event->event_send = B_TRUE;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event->event_msg = calloc(1, sizeof (struct nwam_event) + size);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (event->event_msg == NULL) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_ERR,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "nwamd_event_init: could not create %s event",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_event_name(type));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey free(event);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NULL);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event->event_msg->nwe_type = type;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event->event_msg->nwe_size = sizeof (struct nwam_event) + size;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey } else {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event->event_send = B_FALSE;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event->event_msg = NULL;
b00044a2eb43864b8718585d21949611a2ee59efJames Carlson }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event->event_type = type;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (object_name != NULL) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (void) strlcpy(event->event_object, object_name,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_MAX_NAME_LEN);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event->event_object_type = object_type;
b00044a2eb43864b8718585d21949611a2ee59efJames Carlson } else {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event->event_object[0] = '\0';
b00044a2eb43864b8718585d21949611a2ee59efJames Carlson }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* Set event id */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event->event_id = atomic_add_64_nv(&event_id_counter, 1);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (void) clock_gettime(CLOCK_REALTIME, &event->event_time);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (event);
b00044a2eb43864b8718585d21949611a2ee59efJames Carlson}
b00044a2eb43864b8718585d21949611a2ee59efJames Carlson
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeyvoid
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwamd_event_do_not_send(nwamd_event_t event)
b00044a2eb43864b8718585d21949611a2ee59efJames Carlson{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_DEBUG, "nwamd_event_do_not_send: cancelling delivery of "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "event %s for object %s", nwamd_event_name(event->event_type),
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event->event_object[0] != '\0' ?
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event->event_object : "<no object>");
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event->event_send = B_FALSE;
b00044a2eb43864b8718585d21949611a2ee59efJames Carlson}
b00044a2eb43864b8718585d21949611a2ee59efJames Carlson
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeyvoid
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwamd_event_fini(nwamd_event_t event)
b00044a2eb43864b8718585d21949611a2ee59efJames Carlson{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (event != NULL) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey free(event->event_msg);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey free(event);
b00044a2eb43864b8718585d21949611a2ee59efJames Carlson }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwamd_event_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwamd_event_init_object_action(nwam_object_type_t object_type,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey const char *object_name, const char *parent_name,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_action_t object_action)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_event_t event;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event = nwamd_event_init(NWAM_EVENT_TYPE_OBJECT_ACTION,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey object_type, 0, object_name);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (event == NULL)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NULL);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event->event_msg->nwe_data.nwe_object_action.nwe_action = object_action;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event->event_msg->nwe_data.nwe_object_action.nwe_object_type =
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey object_type;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (void) strlcpy(event->event_msg->nwe_data.nwe_object_action.nwe_name,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey object_name,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey sizeof (event->event_msg->nwe_data.nwe_object_action.nwe_name));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (parent_name == NULL) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event->event_msg->nwe_data.nwe_object_action.nwe_parent[0] =
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey '\0';
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (event);
b00044a2eb43864b8718585d21949611a2ee59efJames Carlson }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (void) strlcpy
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (event->event_msg->nwe_data.nwe_object_action.nwe_parent,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey parent_name,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey sizeof (event->event_msg->nwe_data.nwe_object_action.nwe_parent));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (event);
b00044a2eb43864b8718585d21949611a2ee59efJames Carlson}
b00044a2eb43864b8718585d21949611a2ee59efJames Carlson
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwamd_event_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwamd_event_init_object_state(nwam_object_type_t object_type,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey const char *object_name, nwam_state_t state, nwam_aux_state_t aux_state)
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_event_t event;
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event = nwamd_event_init(NWAM_EVENT_TYPE_OBJECT_STATE,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey object_type, 0, object_name);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (event == NULL)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NULL);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event->event_msg->nwe_data.nwe_object_state.nwe_state = state;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event->event_msg->nwe_data.nwe_object_state.nwe_aux_state = aux_state;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event->event_msg->nwe_data.nwe_object_state.nwe_object_type =
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey object_type;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (void) strlcpy(event->event_msg->nwe_data.nwe_object_state.nwe_name,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey object_name,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey sizeof (event->event_msg->nwe_data.nwe_object_state.nwe_name));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (event);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwamd_event_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwamd_event_init_priority_group_change(int64_t priority)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_event_t event;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event = nwamd_event_init(NWAM_EVENT_TYPE_PRIORITY_GROUP,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_OBJECT_TYPE_UNKNOWN, 0, NULL);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (event == NULL)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NULL);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event->event_msg->nwe_data.nwe_priority_group_info.nwe_priority =
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey priority;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (event);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwamd_event_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwamd_event_init_link_action(const char *name, nwam_action_t link_action)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_event_t event;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_error_t err;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey char *object_name;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_ncu_name_to_typed_name(name, NWAM_NCU_TYPE_LINK,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey &object_name)) != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_ERR, "nwamd_event_init_link_action: "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "nwam_ncu_name_to_typed_name: %s",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_strerror(err));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NULL);
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event = nwamd_event_init(NWAM_EVENT_TYPE_LINK_ACTION,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_OBJECT_TYPE_NCU, 0, object_name);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey free(object_name);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (event == NULL)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NULL);
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (void) strlcpy(event->event_msg->nwe_data.nwe_link_action.nwe_name,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey name,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey sizeof (event->event_msg->nwe_data.nwe_link_action.nwe_name));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event->event_msg->nwe_data.nwe_link_action.nwe_action = link_action;
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (event);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwamd_event_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwamd_event_init_link_state(const char *name, boolean_t up)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_event_t event;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_error_t err;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey char *object_name;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_ncu_name_to_typed_name(name, NWAM_NCU_TYPE_LINK,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey &object_name)) != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_ERR, "nwamd_event_init_link_state: "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "nwam_ncu_name_to_typed_name: %s",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_strerror(err));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NULL);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event = nwamd_event_init(NWAM_EVENT_TYPE_LINK_STATE,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_OBJECT_TYPE_NCU, 0, object_name);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey free(object_name);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (event == NULL)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NULL);
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (void) strlcpy(event->event_msg->nwe_data.nwe_link_state.nwe_name, name,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey sizeof (event->event_msg->nwe_data.nwe_link_state.nwe_name));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event->event_msg->nwe_data.nwe_link_state.nwe_link_up = up;
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (event);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwamd_event_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwamd_event_init_if_state(const char *linkname, uint32_t flags,
f6da83d4178694e7113b71d1e452f15b296f73d8Anurag S. Maskey uint32_t addr_added, struct sockaddr *addr, struct sockaddr *netmask)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_event_t event;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_error_t err;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey char *object_name;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* linkname does not contain the lifnum */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_ncu_name_to_typed_name(linkname,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_NCU_TYPE_INTERFACE, &object_name)) != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_ERR, "nwamd_event_init_if_state: "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "nwam_ncu_name_to_typed_name: %s",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_strerror(err));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NULL);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
b00044a2eb43864b8718585d21949611a2ee59efJames Carlson
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event = nwamd_event_init(NWAM_EVENT_TYPE_IF_STATE,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_OBJECT_TYPE_NCU, 0, object_name);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey free(object_name);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (event == NULL)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NULL);
b00044a2eb43864b8718585d21949611a2ee59efJames Carlson
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (void) strlcpy(event->event_msg->nwe_data.nwe_if_state.nwe_name,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey linkname,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey sizeof (event->event_msg->nwe_data.nwe_if_state.nwe_name));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event->event_msg->nwe_data.nwe_if_state.nwe_flags = flags;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event->event_msg->nwe_data.nwe_if_state.nwe_addr_added = addr_added;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event->event_msg->nwe_data.nwe_if_state.nwe_addr_valid = (addr != NULL);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (addr != NULL) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey bcopy(addr, &(event->event_msg->nwe_data.nwe_if_state.nwe_addr),
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey addr->sa_family == AF_INET ? sizeof (struct sockaddr_in) :
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey sizeof (struct sockaddr_in6));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
f6da83d4178694e7113b71d1e452f15b296f73d8Anurag S. Maskey if (netmask != NULL) {
f6da83d4178694e7113b71d1e452f15b296f73d8Anurag S. Maskey bcopy(netmask,
f6da83d4178694e7113b71d1e452f15b296f73d8Anurag S. Maskey &(event->event_msg->nwe_data.nwe_if_state.nwe_netmask),
f6da83d4178694e7113b71d1e452f15b296f73d8Anurag S. Maskey netmask->sa_family == AF_INET ?
f6da83d4178694e7113b71d1e452f15b296f73d8Anurag S. Maskey sizeof (struct sockaddr_in) : sizeof (struct sockaddr_in6));
f6da83d4178694e7113b71d1e452f15b296f73d8Anurag S. Maskey }
b00044a2eb43864b8718585d21949611a2ee59efJames Carlson
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (event);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
b00044a2eb43864b8718585d21949611a2ee59efJames Carlson
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwamd_event_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwamd_event_init_wlan(const char *name, int32_t type, boolean_t connected,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_wlan_t *wlans, uint_t num_wlans)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey size_t size = 0;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey char *object_name;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_event_t event;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_error_t err;
b00044a2eb43864b8718585d21949611a2ee59efJames Carlson
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey switch (type) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_EVENT_TYPE_WLAN_SCAN_REPORT:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_EVENT_TYPE_WLAN_NEED_CHOICE:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey size = sizeof (nwam_wlan_t) * (num_wlans - 1);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey break;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_EVENT_TYPE_WLAN_NEED_KEY:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_EVENT_TYPE_WLAN_CONNECTION_REPORT:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey break;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey default:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_ERR, "nwamd_event_init_wlan: unexpected "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "event type %s (%d)", nwamd_event_name(type), type);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NULL);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_ncu_name_to_typed_name(name, NWAM_NCU_TYPE_LINK,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey &object_name)) != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_ERR, "nwamd_event_init_wlan: "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "nwam_ncu_name_to_typed_name: %s",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_strerror(err));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NULL);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
b00044a2eb43864b8718585d21949611a2ee59efJames Carlson
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event = nwamd_event_init(type, NWAM_OBJECT_TYPE_NCU, size, object_name);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey free(object_name);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (event == NULL)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NULL);
b00044a2eb43864b8718585d21949611a2ee59efJames Carlson
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (void) strlcpy(event->event_msg->nwe_data.nwe_wlan_info.nwe_name, name,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey sizeof (event->event_msg->nwe_data.nwe_wlan_info.nwe_name));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event->event_msg->nwe_data.nwe_wlan_info.nwe_connected = connected;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event->event_msg->nwe_data.nwe_wlan_info.nwe_num_wlans = num_wlans;
b00044a2eb43864b8718585d21949611a2ee59efJames Carlson
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* copy the wlans */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (void) memcpy(event->event_msg->nwe_data.nwe_wlan_info.nwe_wlans, wlans,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey num_wlans * sizeof (nwam_wlan_t));
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (event);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwamd_event_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwamd_event_init_ncu_check(void)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (nwamd_event_init(NWAM_EVENT_TYPE_NCU_CHECK,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_OBJECT_TYPE_NCP, 0, NULL));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
b00044a2eb43864b8718585d21949611a2ee59efJames Carlson
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwamd_event_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwamd_event_init_init(void)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (nwamd_event_init(NWAM_EVENT_TYPE_INIT,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_OBJECT_TYPE_UNKNOWN, 0, NULL));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwamd_event_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwamd_event_init_shutdown(void)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (nwamd_event_init(NWAM_EVENT_TYPE_SHUTDOWN,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_OBJECT_TYPE_UNKNOWN, 0, NULL));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
b00044a2eb43864b8718585d21949611a2ee59efJames Carlson
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Add event to the event list.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeyvoid
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwamd_event_enqueue(nwamd_event_t event)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_event_enqueue_timed(event, 0);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Schedule an event to be added to the event list for future processing.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * The event will be scheduled in delta_seconds seconds mod schedule delay and
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * time resolution.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeyvoid
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwamd_event_enqueue_timed(nwamd_event_t event, int delta_seconds)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey uu_list_index_t idx;
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_DEBUG, "enqueueing event %lld %d (%s) for object %s in %ds",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event->event_id, event->event_type,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_event_name(event->event_type),
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event->event_object[0] != 0 ? event->event_object : "none",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey delta_seconds);
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (void) clock_gettime(CLOCK_REALTIME, &event->event_time);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event->event_time.tv_sec += delta_seconds;
b00044a2eb43864b8718585d21949611a2ee59efJames Carlson
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey uu_list_node_init(event, &event->event_node, event_pool);
b00044a2eb43864b8718585d21949611a2ee59efJames Carlson
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (void) pthread_mutex_lock(&event_queue_mutex);
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Find appropriate location to insert the event based on time.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (void) uu_list_find(event_queue, event, NULL, &idx);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (void) uu_list_insert(event_queue, event, idx);
b00044a2eb43864b8718585d21949611a2ee59efJames Carlson
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (void) pthread_cond_signal(&event_queue_cond);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (void) pthread_mutex_unlock(&event_queue_mutex);
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck}
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Is the specified event enqueued on the event (or pending event queue)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * for execution in when seconds? An object may be specified also.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeyboolean_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwamd_event_enqueued(int32_t event_type, nwam_object_type_t object_type,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey const char *object)
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_event_t event;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (void) pthread_mutex_lock(&event_queue_mutex);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey for (event = uu_list_first(event_queue);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event != NULL;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event = uu_list_next(event_queue, event)) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (event->event_type != event_type)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey continue;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (object_type != NWAM_OBJECT_TYPE_UNKNOWN &&
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event->event_object_type != object_type)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey continue;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (object != NULL && strcmp(object, event->event_object) != 0)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey continue;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (void) pthread_mutex_unlock(&event_queue_mutex);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (B_TRUE);
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (void) pthread_mutex_unlock(&event_queue_mutex);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (B_FALSE);
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck}
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Is the time in the past.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeystatic boolean_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeyin_past(struct timespec t)
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey struct timespec now;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (void) clock_gettime(CLOCK_REALTIME, &now);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (t.tv_sec < now.tv_sec)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (B_TRUE);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (t.tv_sec > now.tv_sec)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (B_FALSE);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (t.tv_nsec < now.tv_nsec)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (B_TRUE);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (B_FALSE);
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck}
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Remove event at head of event list for processing. This takes a number of
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * nanoseconds to wait. If the number is 0 then it blocks. If there is
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * nothing on the queue then it returns an event which says that the queue
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * is quiet.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeystatic nwamd_event_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwamd_event_dequeue(long nsec)
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_event_t event;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (void) pthread_mutex_lock(&event_queue_mutex);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event = uu_list_first(event_queue);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (event == NULL && nsec == 0) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey do {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (void) pthread_cond_wait(&event_queue_cond,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey &event_queue_mutex);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey } while ((event = uu_list_first(event_queue)) == NULL);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey } else {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey struct timespec waitcap;
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (nsec != 0) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (void) clock_gettime(CLOCK_REALTIME, &waitcap);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey waitcap.tv_nsec += nsec;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey waitcap.tv_sec += NSEC_TO_SEC(waitcap.tv_nsec);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey waitcap.tv_nsec = NSEC_TO_FRACNSEC(waitcap.tv_nsec);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Keep going as long as the first event hasn't matured and
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * we havn't passed our maximum wait time.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey while ((event == NULL || !in_past(event->event_time)) &&
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (nsec == 0 || !in_past(waitcap))) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey struct timespec eventwait;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Three cases:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * no maximum waittime - just use the event
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * both an event and cap - take the least one
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * just a maximum waittime - use it
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (nsec == 0) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey eventwait = event->event_time;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey } else if (event != NULL) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey uint64_t diff;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey diff = SEC_TO_NSEC(event->event_time.tv_sec -
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey waitcap.tv_sec) +
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event->event_time.tv_nsec - waitcap.tv_nsec;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (diff > 0)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey eventwait = waitcap;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey else
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey eventwait = event->event_time;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey } else {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Note that if the event is NULL then nsec is
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * nonzero and waitcap is valid.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey eventwait = waitcap;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (void) pthread_cond_timedwait(&event_queue_cond,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey &event_queue_mutex, &eventwait);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event = uu_list_first(event_queue);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * At this point we've met the guard contition of the while loop.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * The event at the top of the queue might be mature in which case
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * we use it. Otherwise we hit our cap and we need to enqueue a
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * quiesced queue event.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (event != NULL && in_past(event->event_time)) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey uu_list_remove(event_queue, event);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey uu_list_node_fini(event, &event->event_node, event_pool);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey } else {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event = nwamd_event_init(NWAM_EVENT_TYPE_QUEUE_QUIET,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_OBJECT_TYPE_UNKNOWN, 0, NULL);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (event != NULL)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_DEBUG,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "dequeueing event %lld of type %d (%s) for object %s",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event->event_id, event->event_type,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_event_name(event->event_type),
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event->event_object[0] != 0 ? event->event_object :
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "none");
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (void) pthread_mutex_unlock(&event_queue_mutex);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (event);
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck}
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeyvoid
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwamd_event_send(nwam_event_t event_msg)
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_error_t err;
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (shutting_down && event_msg->nwe_type != NWAM_EVENT_TYPE_SHUTDOWN) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_DEBUG, "nwamd_event_send: tossing event as nwamd "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "is shutting down");
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey err = nwam_event_send(event_msg);
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (err != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_ERR, "nwamd_event_send: nwam_event_send: %s",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_strerror(err));
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck }
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck}
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Run state machine for object. Method is run if
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * - event method is non-null
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * - event method is valid for current object state (determined by
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * ORing the current state against the set of valid states for the method).
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey *
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * If these criteria are met, the method is run.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeystatic void
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwamd_event_run_method(nwamd_event_t event)
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_event_method_t *event_methods;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey int i;
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event_methods = nwamd_object_event_methods(event->event_object_type);
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* If we're shutting down, only fini events are accepted for objects */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (shutting_down && event->event_type != NWAM_EVENT_TYPE_OBJECT_FINI) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_DEBUG, "nwamd_event_run_method: tossing non-fini "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "event %s for object %s",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_event_name(event->event_type), event->event_object);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return;
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck }
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey for (i = 0;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event_methods[i].event_type != NWAM_EVENT_TYPE_NOOP;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey i++) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (event_methods[i].event_type ==
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event->event_type &&
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event_methods[i].event_method != NULL) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_DEBUG,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "(%p) %s: running method for event %s",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (void *)event, event->event_object,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_event_name(event->event_type));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* run method */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event_methods[i].event_method(event);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return;
ab32bdf2f746488f918233b2d8cabd5835efe9f3James Carlson }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_DEBUG, "(%p) %s: no matching method for event %d (%s)",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (void *)event, event->event_object, event->event_type,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_event_name(event->event_type));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Called when we are checking to see what should be activated. First activate
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * all of the manual NCUs. Then see if we can find a valid priority group.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * If we can, activate it. Otherwise try all the priority groups starting
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * with the lowest one that makes sense.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeystatic void
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwamd_activate_ncus(void) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey int64_t prio = INVALID_PRIORITY_GROUP;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey boolean_t selected;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_ncp_activate_manual_ncus();
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey selected = nwamd_ncp_check_priority_group(&prio);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (selected) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Activate chosen priority group and stop anything going on in
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * lesser priority groups.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_ncp_activate_priority_group(prio);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_ncp_deactivate_priority_group_all(prio + 1);
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck } else {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Nothing unique could be started so try them all. Once one
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * of them gets into a reasonable state then we will prune
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * everything below it (see first part of this conditional).
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey int64_t oldprio = INVALID_PRIORITY_GROUP;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey while (nwamd_ncp_find_next_priority_group(++oldprio, &prio)) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_ncp_activate_priority_group(prio);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey oldprio = prio;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Event handler thread
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey *
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * The complexity in this code comes about from wanting to delay the decision
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * making process until after bursts of events. Keep roughly polling (waiting
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * for .1s) until we see the queue quiet event and then block.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeyvoid
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwamd_event_handler(void)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey boolean_t got_shutdown_event = B_FALSE;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey boolean_t check_conditions = B_FALSE;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey boolean_t ncu_check = B_FALSE;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey int queue_quiet_time = 0;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_event_t event;
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck
b00044a2eb43864b8718585d21949611a2ee59efJames Carlson /*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Dequeue events and process them. In most cases, events have
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * an assocated object type, and we use this to retrieve
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * the function that will process the event.
b00044a2eb43864b8718585d21949611a2ee59efJames Carlson */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey while (!got_shutdown_event) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event = nwamd_event_dequeue(queue_quiet_time);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* keep pulling events as long as they are close together */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey queue_quiet_time = SEC_TO_NSEC(1)/10;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * This is an event with no associated object.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (event->event_object[0] == '\0') {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey switch (event->event_type) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_EVENT_TYPE_NOOP:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_EVENT_TYPE_INIT:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * The only action for an INIT event
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * is to relay it to event listeners,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * which is done below.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey break;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_EVENT_TYPE_PRIORITY_GROUP:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (void) pthread_mutex_lock(&active_ncp_mutex);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey current_ncu_priority_group =
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event->event_msg->nwe_data.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwe_priority_group_info.nwe_priority;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (void) pthread_mutex_unlock(&active_ncp_mutex);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey break;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_EVENT_TYPE_TIMED_CHECK_CONDITIONS:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (!shutting_down) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_set_timed_check_all_conditions();
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey check_conditions = B_TRUE;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey break;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_EVENT_TYPE_TRIGGERED_CHECK_CONDITIONS:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (!shutting_down)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey check_conditions = B_TRUE;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey break;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_EVENT_TYPE_NCU_CHECK:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (!shutting_down)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey ncu_check = B_TRUE;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey break;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_EVENT_TYPE_UPGRADE:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (!shutting_down) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Upgrade events have no associated
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * object.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_event_run_method(event);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey break;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_EVENT_TYPE_SHUTDOWN:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey got_shutdown_event = B_TRUE;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey break;
b00044a2eb43864b8718585d21949611a2ee59efJames Carlson
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * We want to delay processing of condition and ncu
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * checking until after short bursts of events. So we
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * keep track of times we've scheduled checking and
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * wait for the queue to quiesce.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_EVENT_TYPE_QUEUE_QUIET:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey queue_quiet_time = 0; /* now we can block */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (!shutting_down && check_conditions) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_check_all_conditions();
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey check_conditions = B_FALSE;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (!shutting_down && ncu_check) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_activate_ncus();
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey ncu_check = B_FALSE;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey break;
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey default:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_ERR,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "event %d (%s)had no object associated "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "with it", event->event_type,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_event_name(event->event_type));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey break;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey } else {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Event has an associated object - run event method
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * for that object type (if any).
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_event_run_method(event);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Send associated message to listeners if event type is
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * externally visible.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (event->event_send)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_event_send(event->event_msg);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_event_fini(event);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* If we get here, we got a shutdown event. */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_event_queue_fini();
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_object_lists_fini();
d71dbb732372504daff1f1783bc0d8864ce9bd50jbeck}