4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai/*
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * CDDL HEADER START
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai *
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * The contents of this file are subject to the terms of the
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * Common Development and Distribution License (the "License").
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * You may not use this file except in compliance with the License.
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai *
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * or http://www.opensolaris.org/os/licensing.
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * See the License for the specific language governing permissions
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * and limitations under the License.
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai *
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * When distributing Covered Code, include this CDDL HEADER in each
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * If applicable, add the following below this CDDL HEADER, with the
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * fields enclosed by brackets "[]" replaced with your own identifying
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * information: Portions Copyright [yyyy] [name of copyright owner]
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai *
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * CDDL HEADER END
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai/*
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * Use is subject to license terms.
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai/*
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * This RCM module adds support to the RCM framework for Bridge links
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai#include <stdio.h>
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai#include <stdlib.h>
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai#include <string.h>
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai#include <errno.h>
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai#include <sys/types.h>
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai#include <synch.h>
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai#include <assert.h>
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai#include <strings.h>
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai#include "rcm_module.h"
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai#include <libintl.h>
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai#include <libdllink.h>
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai#include <libdlbridge.h>
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai#include <libdlpi.h>
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai/*
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * Definitions
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai#ifndef lint
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai#define _(x) gettext(x)
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai#else
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai#define _(x) x
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai#endif
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai/* Some generic well-knowns and defaults used in this module */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai#define RCM_LINK_PREFIX "SUNW_datalink" /* RCM datalink name prefix */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai#define RCM_LINK_RESOURCE_MAX (13 + LINKID_STR_WIDTH)
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai/* Bridge Cache state flags */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaitypedef enum {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai CACHE_NODE_STALE = 0x1, /* stale cached data */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai CACHE_NODE_NEW = 0x2, /* new cached nodes */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai CACHE_NODE_OFFLINED = 0x4 /* nodes offlined */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai} cache_node_state_t;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai/* Network Cache lookup options */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai#define CACHE_NO_REFRESH 0x1 /* cache refresh not needed */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai#define CACHE_REFRESH 0x2 /* refresh cache */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai/* Cache element */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaitypedef struct link_cache {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai struct link_cache *vc_next; /* next cached resource */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai struct link_cache *vc_prev; /* prev cached resource */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai char *vc_resource; /* resource name */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai datalink_id_t vc_linkid; /* linkid */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai cache_node_state_t vc_state; /* cache state flags */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai char vc_bridge[MAXLINKNAMELEN];
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai} link_cache_t;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai/*
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * Global cache for network Bridges
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaistatic link_cache_t cache_head;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaistatic link_cache_t cache_tail;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaistatic mutex_t cache_lock;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaistatic boolean_t events_registered = B_FALSE;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaistatic dladm_handle_t dld_handle = NULL;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai/*
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * RCM module interface prototypes
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaistatic int bridge_register(rcm_handle_t *);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaistatic int bridge_unregister(rcm_handle_t *);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaistatic int bridge_get_info(rcm_handle_t *, char *, id_t, uint_t,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai char **, char **, nvlist_t *, rcm_info_t **);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaistatic int bridge_suspend(rcm_handle_t *, char *, id_t,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai timespec_t *, uint_t, char **, rcm_info_t **);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaistatic int bridge_resume(rcm_handle_t *, char *, id_t, uint_t,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai char **, rcm_info_t **);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaistatic int bridge_offline(rcm_handle_t *, char *, id_t, uint_t,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai char **, rcm_info_t **);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaistatic int bridge_undo_offline(rcm_handle_t *, char *, id_t,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai uint_t, char **, rcm_info_t **);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaistatic int bridge_remove(rcm_handle_t *, char *, id_t, uint_t,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai char **, rcm_info_t **);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaistatic int bridge_notify_event(rcm_handle_t *, char *, id_t,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai uint_t, char **, nvlist_t *, rcm_info_t **);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaistatic int bridge_configure(rcm_handle_t *, datalink_id_t);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai/* Module private routines */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaistatic void cache_free(void);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaistatic int cache_update(rcm_handle_t *);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaistatic void cache_remove(link_cache_t *);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaistatic void node_free(link_cache_t *);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaistatic void cache_insert(link_cache_t *);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaistatic link_cache_t *cache_lookup(rcm_handle_t *, char *, uint_t);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaistatic char *bridge_usage(link_cache_t *);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaistatic void bridge_log_err(datalink_id_t, char **, char *);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai/* Module-Private data */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaistatic struct rcm_mod_ops bridge_ops =
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai{
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai RCM_MOD_OPS_VERSION,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai bridge_register,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai bridge_unregister,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai bridge_get_info,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai bridge_suspend,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai bridge_resume,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai bridge_offline,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai bridge_undo_offline,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai bridge_remove,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai NULL,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai NULL,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai bridge_notify_event
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai};
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai/*
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * rcm_mod_init() - Update registrations, and return the ops structure.
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaistruct rcm_mod_ops *
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaircm_mod_init(void)
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai{
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai dladm_status_t status;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai char errmsg[DLADM_STRSIZE];
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai rcm_log_message(RCM_TRACE1, "Bridge: mod_init\n");
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai cache_head.vc_next = &cache_tail;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai cache_head.vc_prev = NULL;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai cache_tail.vc_prev = &cache_head;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai cache_tail.vc_next = NULL;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) mutex_init(&cache_lock, 0, NULL);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if ((status = dladm_open(&dld_handle)) != DLADM_STATUS_OK) {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai rcm_log_message(RCM_WARNING,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai "Bridge: cannot open datalink handle: %s\n",
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai dladm_status2str(status, errmsg));
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai return (NULL);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai }
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai /* Return the ops vectors */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai return (&bridge_ops);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai}
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai/*
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * rcm_mod_info() - Return a string describing this module.
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaiconst char *
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaircm_mod_info(void)
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai{
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai rcm_log_message(RCM_TRACE1, "Bridge: mod_info\n");
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai return ("Bridge module version 1.0");
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai}
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai/*
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * rcm_mod_fini() - Destroy the network Bridge cache.
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaiint
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaircm_mod_fini(void)
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai{
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai rcm_log_message(RCM_TRACE1, "Bridge: mod_fini\n");
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai /*
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * Note that bridge_unregister() does not seem to be called anywhere,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * therefore we free the cache nodes here. In theory we should call
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * rcm_register_interest() for each node before we free it, but the
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * framework does not provide the rcm_handle to allow us to do so.
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai cache_free();
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) mutex_destroy(&cache_lock);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai dladm_close(dld_handle);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai return (RCM_SUCCESS);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai}
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai/*
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * bridge_register() - Make sure the cache is properly sync'ed, and its
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * registrations are in order.
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaistatic int
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaibridge_register(rcm_handle_t *hd)
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai{
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai int retv;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai rcm_log_message(RCM_TRACE1, "Bridge: register\n");
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if ((retv = cache_update(hd)) != RCM_SUCCESS)
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai return (retv);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai /*
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * Need to register interest in all new resources
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * getting attached, so we get attach event notifications
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if (!events_registered) {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai retv = rcm_register_event(hd, RCM_RESOURCE_LINK_NEW, 0, NULL);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if (retv != RCM_SUCCESS) {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai rcm_log_message(RCM_ERROR,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai _("Bridge: failed to register %s\n"),
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai RCM_RESOURCE_LINK_NEW);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai } else {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai rcm_log_message(RCM_DEBUG, "Bridge: registered %s\n",
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai RCM_RESOURCE_LINK_NEW);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai events_registered = B_TRUE;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai }
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai }
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai return (retv);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai}
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai/*
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * bridge_unregister() - Walk the cache, unregistering all the links.
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaistatic int
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaibridge_unregister(rcm_handle_t *hd)
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai{
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai link_cache_t *node;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai int retv = RCM_SUCCESS;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai rcm_log_message(RCM_TRACE1, "Bridge: unregister\n");
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai /* Walk the cache, unregistering everything */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) mutex_lock(&cache_lock);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai node = cache_head.vc_next;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai while (node != &cache_tail) {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai retv = rcm_unregister_interest(hd, node->vc_resource, 0);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if (retv != RCM_SUCCESS)
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai break;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai cache_remove(node);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai node_free(node);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai node = cache_head.vc_next;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai }
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) mutex_unlock(&cache_lock);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if (retv != RCM_SUCCESS) {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai rcm_log_message(RCM_ERROR,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai _("Bridge: failed to unregister %s\n"), node->vc_resource);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai return (retv);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai }
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai /*
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * Unregister interest in all new resources
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if (events_registered) {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai retv = rcm_unregister_event(hd, RCM_RESOURCE_LINK_NEW, 0);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if (retv != RCM_SUCCESS) {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai rcm_log_message(RCM_ERROR,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai _("Bridge: failed to unregister %s\n"),
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai RCM_RESOURCE_LINK_NEW);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai } else {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai rcm_log_message(RCM_DEBUG, "Bridge: unregistered %s\n",
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai RCM_RESOURCE_LINK_NEW);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai events_registered = B_FALSE;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai }
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai }
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai return (retv);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai}
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai/*
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * bridge_offline() - Offline the bridge on a specific link.
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaistatic int
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaibridge_offline(rcm_handle_t *hd, char *rsrc, id_t id, uint_t flags,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai char **errorp, rcm_info_t **info)
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai{
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai link_cache_t *node;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai dladm_status_t status;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai rcm_log_message(RCM_TRACE1, "Bridge: offline(%s)\n", rsrc);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai /* Lock the cache and lookup the resource */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) mutex_lock(&cache_lock);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai node = cache_lookup(hd, rsrc, CACHE_REFRESH);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if (node == NULL) {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai /* should not happen because the resource is registered. */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai bridge_log_err(DATALINK_INVALID_LINKID, errorp,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai "unrecognized resource");
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) mutex_unlock(&cache_lock);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai return (RCM_SUCCESS);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai }
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai /* Check if it's a query */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if (flags & RCM_QUERY) {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai rcm_log_message(RCM_TRACE1,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai "Bridge: offline query succeeded(%s)\n", rsrc);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) mutex_unlock(&cache_lock);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai return (RCM_SUCCESS);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai }
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai status = dladm_bridge_setlink(dld_handle, node->vc_linkid, "");
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if (status != DLADM_STATUS_OK) {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai bridge_log_err(node->vc_linkid, errorp, "offline failed");
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) mutex_unlock(&cache_lock);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai return (RCM_FAILURE);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai }
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai node->vc_state |= CACHE_NODE_OFFLINED;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai rcm_log_message(RCM_TRACE1, "Bridge: Offline succeeded(%s %s)\n", rsrc,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai node->vc_bridge);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) mutex_unlock(&cache_lock);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai return (RCM_SUCCESS);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai}
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai/*
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * bridge_undo_offline() - Undo offline of a previously offlined node.
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai/*ARGSUSED*/
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaistatic int
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaibridge_undo_offline(rcm_handle_t *hd, char *rsrc, id_t id, uint_t flags,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai char **errorp, rcm_info_t **info)
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai{
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai link_cache_t *node;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai dladm_status_t status;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai char errmsg[DLADM_STRSIZE];
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai rcm_log_message(RCM_TRACE1, "Bridge: online(%s)\n", rsrc);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) mutex_lock(&cache_lock);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai node = cache_lookup(hd, rsrc, CACHE_NO_REFRESH);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if (node == NULL) {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai bridge_log_err(DATALINK_INVALID_LINKID, errorp, "no such link");
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) mutex_unlock(&cache_lock);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai errno = ENOENT;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai return (RCM_FAILURE);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai }
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai /* Check if no attempt should be made to online the link here */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if (!(node->vc_state & CACHE_NODE_OFFLINED)) {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai bridge_log_err(node->vc_linkid, errorp, "link not offlined");
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) mutex_unlock(&cache_lock);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai errno = ENOTSUP;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai return (RCM_SUCCESS);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai }
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai /*
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * Try to bring on an offlined bridge link.
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai status = dladm_bridge_setlink(dld_handle, node->vc_linkid,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai node->vc_bridge);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if (status != DLADM_STATUS_OK) {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai /*
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * Print a warning message.
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai rcm_log_message(RCM_WARNING,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai _("Bridge: Bridge online failed %u %s: %s\n"),
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai node->vc_linkid, node->vc_bridge,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai dladm_status2str(status, errmsg));
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai }
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai node->vc_state &= ~CACHE_NODE_OFFLINED;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai rcm_log_message(RCM_TRACE1, "Bridge: online succeeded(%s)\n", rsrc);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) mutex_unlock(&cache_lock);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai return (RCM_SUCCESS);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai}
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai/*
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * bridge_get_info() - Gather usage information for this resource.
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai/*ARGSUSED*/
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaiint
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaibridge_get_info(rcm_handle_t *hd, char *rsrc, id_t id, uint_t flags,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai char **usagep, char **errorp, nvlist_t *props, rcm_info_t **info)
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai{
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai link_cache_t *node;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai rcm_log_message(RCM_TRACE1, "Bridge: get_info(%s)\n", rsrc);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) mutex_lock(&cache_lock);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai node = cache_lookup(hd, rsrc, CACHE_REFRESH);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if (node == NULL) {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai rcm_log_message(RCM_INFO,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai _("Bridge: get_info(%s) unrecognized resource\n"), rsrc);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) mutex_unlock(&cache_lock);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai errno = ENOENT;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai return (RCM_FAILURE);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai }
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai *usagep = bridge_usage(node);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) mutex_unlock(&cache_lock);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if (*usagep == NULL) {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai /* most likely malloc failure */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai rcm_log_message(RCM_ERROR,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai _("Bridge: get_info(%s) malloc failure\n"), rsrc);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) mutex_unlock(&cache_lock);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai errno = ENOMEM;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai return (RCM_FAILURE);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai }
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai /* Set client/role properties */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) nvlist_add_string(props, RCM_CLIENT_NAME, "Bridge");
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai rcm_log_message(RCM_TRACE1, "Bridge: get_info(%s) info = %s\n",
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai rsrc, *usagep);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai return (RCM_SUCCESS);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai}
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai/*
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * bridge_suspend() - Nothing to do, always okay
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai/*ARGSUSED*/
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaistatic int
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaibridge_suspend(rcm_handle_t *hd, char *rsrc, id_t id, timespec_t *interval,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai uint_t flags, char **errorp, rcm_info_t **info)
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai{
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai rcm_log_message(RCM_TRACE1, "Bridge: suspend(%s)\n", rsrc);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai return (RCM_SUCCESS);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai}
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai/*
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * bridge_resume() - Nothing to do, always okay
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai/*ARGSUSED*/
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaistatic int
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaibridge_resume(rcm_handle_t *hd, char *rsrc, id_t id, uint_t flags,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai char **errorp, rcm_info_t **info)
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai{
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai rcm_log_message(RCM_TRACE1, "Bridge: resume(%s)\n", rsrc);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai return (RCM_SUCCESS);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai}
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai/*
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * bridge_remove() - remove a resource from cache
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai/*ARGSUSED*/
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaistatic int
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaibridge_remove(rcm_handle_t *hd, char *rsrc, id_t id, uint_t flags,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai char **errorp, rcm_info_t **info)
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai{
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai link_cache_t *node;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai rcm_log_message(RCM_TRACE1, "Bridge: remove(%s)\n", rsrc);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) mutex_lock(&cache_lock);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai node = cache_lookup(hd, rsrc, CACHE_NO_REFRESH);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if (node == NULL) {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai rcm_log_message(RCM_INFO,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai _("Bridge: remove(%s) unrecognized resource\n"), rsrc);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) mutex_unlock(&cache_lock);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai errno = ENOENT;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai return (RCM_FAILURE);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai }
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai /* remove the cached entry for the resource */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai rcm_log_message(RCM_TRACE2,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai "Bridge: remove succeeded(%s, %s)\n", rsrc, node->vc_bridge);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai cache_remove(node);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) mutex_unlock(&cache_lock);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai node_free(node);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai return (RCM_SUCCESS);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai}
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai/*
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * bridge_notify_event - Project private implementation to receive new resource
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * events. It intercepts all new resource events. If the
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * new resource is a network resource, pass up a notify
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * for it too. The new resource need not be cached, since
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * it is done at register again.
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai/*ARGSUSED*/
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaistatic int
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaibridge_notify_event(rcm_handle_t *hd, char *rsrc, id_t id, uint_t flags,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai char **errorp, nvlist_t *nvl, rcm_info_t **info)
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai{
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai nvpair_t *nvp = NULL;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai datalink_id_t linkid;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai uint64_t id64;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai int rv, lastrv;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai rcm_log_message(RCM_TRACE1, "Bridge: notify_event(%s)\n", rsrc);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if (strcmp(rsrc, RCM_RESOURCE_LINK_NEW) != 0) {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai bridge_log_err(DATALINK_INVALID_LINKID, errorp,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai "unrecognized event");
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai errno = EINVAL;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai return (RCM_FAILURE);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai }
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai /* Update cache to reflect latest Bridges */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if ((lastrv = cache_update(hd)) != RCM_SUCCESS) {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai bridge_log_err(DATALINK_INVALID_LINKID, errorp,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai "private Cache update failed");
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai return (lastrv);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai }
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai /*
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * Try best to recover all configuration.
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai rcm_log_message(RCM_DEBUG, "Bridge: process_nvlist\n");
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai while ((nvp = nvlist_next_nvpair(nvl, nvp)) != NULL) {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if (strcmp(nvpair_name(nvp), RCM_NV_LINKID) != 0)
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai continue;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if (nvpair_value_uint64(nvp, &id64) != 0) {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai bridge_log_err(DATALINK_INVALID_LINKID, errorp,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai "cannot get linkid");
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai lastrv = RCM_FAILURE;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai continue;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai }
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai linkid = (datalink_id_t)id64;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if ((rv = bridge_configure(hd, linkid)) != RCM_SUCCESS) {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai bridge_log_err(linkid, errorp, "configuring failed");
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai lastrv = rv;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai }
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai }
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai rcm_log_message(RCM_TRACE1,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai "Bridge: notify_event: link configuration complete\n");
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai return (lastrv);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai}
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai/*
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * bridge_usage - Determine the usage of a link.
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * The returned buffer is owned by caller, and the caller
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * must free it up when done.
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaistatic char *
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaibridge_usage(link_cache_t *node)
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai{
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai char *buf;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai const char *fmt;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai char errmsg[DLADM_STRSIZE];
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai char name[MAXLINKNAMELEN];
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai char bridge[MAXLINKNAMELEN];
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai dladm_status_t status;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai rcm_log_message(RCM_TRACE2, "Bridge: usage(%s)\n", node->vc_resource);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai assert(MUTEX_HELD(&cache_lock));
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai status = dladm_datalink_id2info(dld_handle, node->vc_linkid, NULL,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai NULL, NULL, name, sizeof (name));
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if (status != DLADM_STATUS_OK) {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai rcm_log_message(RCM_ERROR,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai _("Bridge: usage(%s) get link name failure(%s)\n"),
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai node->vc_resource, dladm_status2str(status, errmsg));
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai return (NULL);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai }
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) dladm_bridge_getlink(dld_handle, node->vc_linkid, bridge,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai sizeof (bridge));
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if (node->vc_state & CACHE_NODE_OFFLINED)
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai fmt = _("%1$s offlined");
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai else if (bridge[0] == '\0')
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai fmt = _("%1$s not bridged");
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai else
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai fmt = _("%1$s bridge: %2$s");
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) asprintf(&buf, fmt, name, bridge);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai rcm_log_message(RCM_TRACE2, "Bridge: usage (%s) info = %s\n",
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai node->vc_resource, buf);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai return (buf);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai}
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai/*
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * Cache management routines, all cache management functions should be
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * be called with cache_lock held.
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai/*
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * cache_lookup() - Get a cache node for a resource.
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * Call with cache lock held.
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai *
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * This ensures that the cache is consistent with the system state and
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * returns a pointer to the cache element corresponding to the resource.
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaistatic link_cache_t *
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaicache_lookup(rcm_handle_t *hd, char *rsrc, uint_t options)
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai{
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai link_cache_t *node;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai rcm_log_message(RCM_TRACE2, "Bridge: cache lookup(%s)\n", rsrc);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai assert(MUTEX_HELD(&cache_lock));
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if (options & CACHE_REFRESH) {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai /* drop lock since update locks cache again */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) mutex_unlock(&cache_lock);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) cache_update(hd);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) mutex_lock(&cache_lock);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai }
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai node = cache_head.vc_next;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai for (; node != &cache_tail; node = node->vc_next) {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if (strcmp(rsrc, node->vc_resource) == 0) {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai rcm_log_message(RCM_TRACE2,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai "Bridge: cache lookup succeeded(%s, %s)\n", rsrc,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai node->vc_bridge);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai return (node);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai }
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai }
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai return (NULL);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai}
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai/*
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * node_free - Free a node from the cache
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaistatic void
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavainode_free(link_cache_t *node)
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai{
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if (node != NULL) {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai free(node->vc_resource);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai free(node);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai }
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai}
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai/*
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * cache_insert - Insert a resource node in cache
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaistatic void
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaicache_insert(link_cache_t *node)
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai{
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai assert(MUTEX_HELD(&cache_lock));
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai /* insert at the head for best performance */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai node->vc_next = cache_head.vc_next;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai node->vc_prev = &cache_head;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai node->vc_next->vc_prev = node;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai node->vc_prev->vc_next = node;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai}
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai/*
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * cache_remove() - Remove a resource node from cache.
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaistatic void
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaicache_remove(link_cache_t *node)
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai{
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai assert(MUTEX_HELD(&cache_lock));
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai node->vc_next->vc_prev = node->vc_prev;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai node->vc_prev->vc_next = node->vc_next;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai node->vc_next = NULL;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai node->vc_prev = NULL;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai}
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaitypedef struct bridge_update_arg_s {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai rcm_handle_t *hd;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai int retval;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai} bridge_update_arg_t;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai/*
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * bridge_update() - Update physical interface properties
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaistatic int
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaibridge_update(dladm_handle_t handle, datalink_id_t linkid, void *arg)
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai{
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai bridge_update_arg_t *bua = arg;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai rcm_handle_t *hd = bua->hd;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai link_cache_t *node;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai char *rsrc;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai dladm_status_t status;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai char errmsg[DLADM_STRSIZE];
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai char bridge[MAXLINKNAMELEN];
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai int ret = RCM_FAILURE;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai rcm_log_message(RCM_TRACE2, "Bridge: bridge_update(%u)\n", linkid);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai assert(MUTEX_HELD(&cache_lock));
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai status = dladm_bridge_getlink(dld_handle, linkid, bridge,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai sizeof (bridge));
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if (status != DLADM_STATUS_OK) {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai rcm_log_message(RCM_TRACE1,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai "Bridge: no bridge information for %u (%s)\n",
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai linkid, dladm_status2str(status, errmsg));
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai return (DLADM_WALK_CONTINUE);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai }
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) asprintf(&rsrc, "%s/%u", RCM_LINK_PREFIX, linkid);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if (rsrc == NULL) {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai rcm_log_message(RCM_ERROR,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai _("Bridge: allocation failure: %s %u: %s\n"),
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai bridge, linkid, strerror(errno));
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai goto done;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai }
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai node = cache_lookup(hd, rsrc, CACHE_NO_REFRESH);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if (node != NULL) {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai rcm_log_message(RCM_DEBUG, "Bridge: %s already registered\n",
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai rsrc);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai free(rsrc);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai node->vc_state &= ~CACHE_NODE_STALE;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai } else {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai rcm_log_message(RCM_DEBUG,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai "Bridge: %s is a new resource (bridge %s)\n",
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai rsrc, bridge);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if ((node = calloc(1, sizeof (link_cache_t))) == NULL) {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai free(rsrc);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai rcm_log_message(RCM_ERROR, _("Bridge: calloc: %s\n"),
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai strerror(errno));
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai goto done;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai }
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai node->vc_resource = rsrc;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai node->vc_linkid = linkid;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) strlcpy(node->vc_bridge, bridge,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai sizeof (node->vc_bridge));
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai node->vc_state |= CACHE_NODE_NEW;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai cache_insert(node);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai }
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai rcm_log_message(RCM_TRACE3, "Bridge: bridge_update: succeeded(%u %s)\n",
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai linkid, node->vc_bridge);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai ret = RCM_SUCCESS;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaidone:
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai bua->retval = ret;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai return (ret == RCM_SUCCESS ? DLADM_WALK_CONTINUE :
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai DLADM_WALK_TERMINATE);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai}
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai/*
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * cache_update() - Update cache with latest interface info
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaistatic int
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaicache_update(rcm_handle_t *hd)
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai{
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai link_cache_t *node, *nnode;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai int rv, lastrv;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai bridge_update_arg_t bua;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai rcm_log_message(RCM_TRACE2, "Bridge: cache_update\n");
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) mutex_lock(&cache_lock);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai /* first we walk the entire cache, marking each entry stale */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai node = cache_head.vc_next;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai for (; node != &cache_tail; node = node->vc_next)
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai node->vc_state |= CACHE_NODE_STALE;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai /* now walk the links and update all of the entries */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai bua.hd = hd;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai bua.retval = RCM_SUCCESS;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) dladm_walk_datalink_id(bridge_update, dld_handle, &bua,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai DATALINK_CLASS_AGGR | DATALINK_CLASS_PHYS |
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai DATALINK_CLASS_ETHERSTUB, DATALINK_ANY_MEDIATYPE, DLADM_OPT_ACTIVE);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai lastrv = bua.retval;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai /*
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * Continue to delete all stale nodes from the cache even if the walk
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * above failed. Unregister links that are not offlined and still in
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * the cache.
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai for (node = cache_head.vc_next; node != &cache_tail; node = nnode) {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai nnode = node->vc_next;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if (node->vc_state & CACHE_NODE_STALE) {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) rcm_unregister_interest(hd, node->vc_resource,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai 0);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai rcm_log_message(RCM_DEBUG,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai "Bridge: unregistered %s %s\n",
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai node->vc_resource, node->vc_bridge);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai cache_remove(node);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai node_free(node);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai continue;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai }
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if (!(node->vc_state & CACHE_NODE_NEW))
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai continue;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai rv = rcm_register_interest(hd, node->vc_resource, 0, NULL);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if (rv != RCM_SUCCESS) {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai rcm_log_message(RCM_ERROR,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai _("Bridge: failed to register %s\n"),
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai node->vc_resource);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai lastrv = rv;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai } else {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai rcm_log_message(RCM_DEBUG, "Bridge: registered %s\n",
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai node->vc_resource);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai node->vc_state &= ~CACHE_NODE_NEW;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai }
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai }
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) mutex_unlock(&cache_lock);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai return (lastrv);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai}
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai/*
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * cache_free() - Empty the cache
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaistatic void
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaicache_free(void)
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai{
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai link_cache_t *node;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai rcm_log_message(RCM_TRACE2, "Bridge: cache_free\n");
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) mutex_lock(&cache_lock);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai node = cache_head.vc_next;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai while (node != &cache_tail) {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai cache_remove(node);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai node_free(node);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai node = cache_head.vc_next;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai }
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) mutex_unlock(&cache_lock);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai}
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai/*
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * bridge_log_err() - RCM error log wrapper
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaistatic void
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaibridge_log_err(datalink_id_t linkid, char **errorp, char *errmsg)
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai{
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai char link[MAXLINKNAMELEN];
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai char errstr[DLADM_STRSIZE];
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai dladm_status_t status;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai char *error;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai link[0] = '\0';
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if (linkid != DATALINK_INVALID_LINKID) {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai char rsrc[RCM_LINK_RESOURCE_MAX];
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) snprintf(rsrc, sizeof (rsrc), "%s/%u",
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai RCM_LINK_PREFIX, linkid);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai rcm_log_message(RCM_ERROR, _("Bridge: %s(%s)\n"), errmsg, rsrc);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if ((status = dladm_datalink_id2info(dld_handle, linkid, NULL,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai NULL, NULL, link, sizeof (link))) != DLADM_STATUS_OK) {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai rcm_log_message(RCM_WARNING,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai _("Bridge: cannot get link name for (%s) %s\n"),
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai rsrc, dladm_status2str(status, errstr));
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai }
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai } else {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai rcm_log_message(RCM_ERROR, _("Bridge: %s\n"), errmsg);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai }
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if (link[0] != '\0')
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) asprintf(&error, _("Bridge: %s(%s)"), errmsg, link);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai else
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) asprintf(&error, _("Bridge: %s"), errmsg);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if (errorp != NULL)
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai *errorp = error;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai}
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai/*
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * bridge_configure() - Configure bridge on a physical link after it attaches
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaistatic int
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaibridge_configure(rcm_handle_t *hd, datalink_id_t linkid)
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai{
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai char rsrc[RCM_LINK_RESOURCE_MAX];
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai link_cache_t *node;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai char bridge[MAXLINKNAMELEN];
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai /* Check for the bridge links in the cache */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) snprintf(rsrc, sizeof (rsrc), "%s/%u", RCM_LINK_PREFIX, linkid);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai rcm_log_message(RCM_TRACE2, "Bridge: bridge_configure(%s)\n", rsrc);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai /* Check if the link is new or was previously offlined */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) mutex_lock(&cache_lock);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if (((node = cache_lookup(hd, rsrc, CACHE_REFRESH)) != NULL) &&
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (!(node->vc_state & CACHE_NODE_OFFLINED))) {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai rcm_log_message(RCM_TRACE2,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai "Bridge: Skipping configured interface(%s)\n", rsrc);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) mutex_unlock(&cache_lock);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai return (RCM_SUCCESS);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai }
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) mutex_unlock(&cache_lock);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai /* clear out previous bridge, if any */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if (dladm_bridge_getlink(dld_handle, linkid, bridge, sizeof (bridge)) ==
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai DLADM_STATUS_OK) {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if (bridge[0] != '\0')
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) dladm_bridge_setlink(dld_handle, linkid, "");
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai }
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai /* now set up the new one */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if (node != NULL && node->vc_bridge[0] != '\0' &&
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai dladm_bridge_setlink(dld_handle, linkid, node->vc_bridge) !=
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai DLADM_STATUS_OK)
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai return (RCM_FAILURE);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai else
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai return (RCM_SUCCESS);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai}