datalink_mod.c revision 5093e10312724e92dd76c008a15bdb59d414708a
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou/*
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou * CDDL HEADER START
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou *
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou * The contents of this file are subject to the terms of the
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou * Common Development and Distribution License (the "License").
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou * You may not use this file except in compliance with the License.
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou *
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou * or http://www.opensolaris.org/os/licensing.
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou * See the License for the specific language governing permissions
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou * and limitations under the License.
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou *
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou * When distributing Covered Code, include this CDDL HEADER in each
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou * If applicable, add the following below this CDDL HEADER, with the
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou * fields enclosed by brackets "[]" replaced with your own identifying
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou * information: Portions Copyright [yyyy] [name of copyright owner]
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou *
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou * CDDL HEADER END
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou */
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou/*
5093e10312724e92dd76c008a15bdb59d414708aCathy Zhou * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou * Use is subject to license terms.
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou */
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou/*
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou * datalink syseventd module.
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou *
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou * The purpose of this module is to identify all datalink related events,
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou * and react accordingly.
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou */
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou#include <errno.h>
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou#include <sys/sysevent/eventdefs.h>
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou#include <string.h>
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou#include <libnvpair.h>
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou#include <librcm.h>
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou#include <libsysevent.h>
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhoustatic rcm_handle_t *rcm_hdl = NULL;
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou/*ARGSUSED*/
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhoustatic int
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhoudatalink_deliver_event(sysevent_t *ev, int unused)
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou{
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou const char *class = sysevent_get_class_name(ev);
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou const char *subclass = sysevent_get_subclass_name(ev);
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou nvlist_t *nvl;
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou int err = 0;
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou if (strcmp(class, EC_DATALINK) != 0 ||
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou strcmp(subclass, ESC_DATALINK_PHYS_ADD) != 0) {
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou return (0);
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou }
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou if (sysevent_get_attr_list(ev, &nvl) != 0)
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou return (EINVAL);
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou
5093e10312724e92dd76c008a15bdb59d414708aCathy Zhou /*
5093e10312724e92dd76c008a15bdb59d414708aCathy Zhou * Send the PHYSLINK_NEW event to network_rcm to update the network
5093e10312724e92dd76c008a15bdb59d414708aCathy Zhou * devices cache accordingly.
5093e10312724e92dd76c008a15bdb59d414708aCathy Zhou */
5093e10312724e92dd76c008a15bdb59d414708aCathy Zhou if ((rcm_notify_event(rcm_hdl, RCM_RESOURCE_PHYSLINK_NEW, 0,
5093e10312724e92dd76c008a15bdb59d414708aCathy Zhou nvl, NULL) != RCM_SUCCESS)) {
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou err = EINVAL;
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou }
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou nvlist_free(nvl);
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou return (err);
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou}
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhoustatic struct slm_mod_ops datalink_mod_ops = {
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou SE_MAJOR_VERSION,
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou SE_MINOR_VERSION,
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou SE_MAX_RETRY_LIMIT,
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou datalink_deliver_event
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou};
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhoustruct slm_mod_ops *
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhouslm_init()
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou{
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou if (rcm_alloc_handle(NULL, 0, NULL, &rcm_hdl) != RCM_SUCCESS)
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou return (NULL);
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou return (&datalink_mod_ops);
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou}
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhouvoid
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhouslm_fini()
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou{
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou (void) rcm_free_handle(rcm_hdl);
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou rcm_hdl = NULL;
0dc974a9a2e66d676505db23524ebff105fb36a9Cathy Zhou}