summaryrefslogtreecommitdiff
path: root/usr/src/cmd/rcm_daemon
diff options
context:
space:
mode:
authorAnurag S. Maskey <Anurag.Maskey@Sun.COM>2008-12-24 11:14:39 -0500
committerAnurag S. Maskey <Anurag.Maskey@Sun.COM>2008-12-24 11:14:39 -0500
commit4ac67f0276a8313b5cefec38af347b94b7bfb526 (patch)
treef028fa345594682efbc023412e2255af29a6484a /usr/src/cmd/rcm_daemon
parentbf85a12b7c81d0745d5a8aff65baeff50006cde9 (diff)
downloadillumos-joyent-4ac67f0276a8313b5cefec38af347b94b7bfb526.tar.gz
6745288 libdladm is executing open() of dld control device everywhere
Diffstat (limited to 'usr/src/cmd/rcm_daemon')
-rw-r--r--usr/src/cmd/rcm_daemon/common/aggr_rcm.c55
-rw-r--r--usr/src/cmd/rcm_daemon/common/ip_rcm.c18
-rw-r--r--usr/src/cmd/rcm_daemon/common/network_rcm.c18
-rw-r--r--usr/src/cmd/rcm_daemon/common/vlan_rcm.c41
-rw-r--r--usr/src/cmd/rcm_daemon/common/vnic_rcm.c43
5 files changed, 103 insertions, 72 deletions
diff --git a/usr/src/cmd/rcm_daemon/common/aggr_rcm.c b/usr/src/cmd/rcm_daemon/common/aggr_rcm.c
index afb08c7a58..70e99932b1 100644
--- a/usr/src/cmd/rcm_daemon/common/aggr_rcm.c
+++ b/usr/src/cmd/rcm_daemon/common/aggr_rcm.c
@@ -23,8 +23,6 @@
* Use is subject to license terms.
*/
-#pragma ident "%Z%%M% %I% %E% SMI"
-
/*
* This RCM module adds support to the RCM framework for AGGR links
*/
@@ -103,6 +101,8 @@ static dl_aggr_t aggr_tail;
static mutex_t aggr_list_lock;
static int events_registered = 0;
+static dladm_handle_t dld_handle = NULL;
+
/*
* RCM module interface prototypes
*/
@@ -181,6 +181,8 @@ rcm_mod_init(void)
aggr_tail.da_next = NULL;
(void) mutex_init(&aggr_list_lock, NULL, NULL);
+ (void) dladm_open(&dld_handle);
+
/* Return the ops vectors */
return (&aggr_ops);
}
@@ -225,6 +227,7 @@ rcm_mod_fini(void)
aggr_list_free();
(void) mutex_destroy(&aggr_list_lock);
+ dladm_close(dld_handle);
return (RCM_SUCCESS);
}
@@ -491,14 +494,15 @@ aggr_offline_port(link_cache_t *node, cache_node_state_t state)
if (aggr->da_lastport == node->vc_linkid) {
rcm_log_message(RCM_TRACE2, "AGGR: delete aggregation %u\n",
aggr->da_aggrid);
- status = dladm_aggr_delete(aggr->da_aggrid, DLADM_OPT_ACTIVE);
+ status = dladm_aggr_delete(dld_handle, aggr->da_aggrid,
+ DLADM_OPT_ACTIVE);
} else {
rcm_log_message(RCM_TRACE2,
"AGGR: remove port (%s) from aggregation %u\n",
node->vc_resource, aggr->da_aggrid);
port.lp_linkid = node->vc_linkid;
- status = dladm_aggr_remove(aggr->da_aggrid, 1, &port,
- DLADM_OPT_ACTIVE);
+ status = dladm_aggr_remove(dld_handle, aggr->da_aggrid, 1,
+ &port, DLADM_OPT_ACTIVE);
}
if (status != DLADM_STATUS_OK) {
rcm_log_message(RCM_WARNING,
@@ -537,14 +541,14 @@ aggr_online_port(link_cache_t *node, boolean_t *up)
if (aggr->da_lastport == node->vc_linkid) {
rcm_log_message(RCM_TRACE2, "AGGR: delete aggregation %u\n",
aggr->da_aggrid);
- status = dladm_aggr_up(aggr->da_aggrid);
+ status = dladm_aggr_up(dld_handle, aggr->da_aggrid);
*up = B_TRUE;
} else {
rcm_log_message(RCM_TRACE2,
"AGGR: add port (%s) to aggregation %u\n",
node->vc_resource, aggr->da_aggrid);
port.lp_linkid = node->vc_linkid;
- status = dladm_aggr_add(aggr->da_aggrid, 1, &port,
+ status = dladm_aggr_add(dld_handle, aggr->da_aggrid, 1, &port,
DLADM_OPT_ACTIVE);
}
if (status != DLADM_STATUS_OK) {
@@ -766,8 +770,8 @@ aggr_usage(link_cache_t *node)
else
fmt = _("%s is part of AGGR ");
- if ((status = dladm_datalink_id2info(node->vc_linkid, NULL, NULL,
- NULL, name, sizeof (name))) != DLADM_STATUS_OK) {
+ if ((status = dladm_datalink_id2info(dld_handle, node->vc_linkid, NULL,
+ NULL, NULL, name, sizeof (name))) != DLADM_STATUS_OK) {
rcm_log_message(RCM_ERROR,
_("AGGR: usage(%s) get port name failure(%s)\n"),
node->vc_resource, dladm_status2str(status, errmsg));
@@ -791,8 +795,9 @@ aggr_usage(link_cache_t *node)
return (buf);
}
- if ((status = dladm_datalink_id2info(node->vc_aggr->da_aggrid, NULL,
- NULL, NULL, name, sizeof (name))) != DLADM_STATUS_OK) {
+ if ((status = dladm_datalink_id2info(dld_handle,
+ node->vc_aggr->da_aggrid, NULL, NULL, NULL, name,
+ sizeof (name))) != DLADM_STATUS_OK) {
rcm_log_message(RCM_ERROR,
_("AGGR: usage(%s) get aggr %u name failure(%s)\n"),
node->vc_resource, node->vc_aggr->da_aggrid,
@@ -959,7 +964,7 @@ typedef struct aggr_update_arg_s {
* aggr_update() - Update physical interface properties
*/
static int
-aggr_update(datalink_id_t aggrid, void *arg)
+aggr_update(dladm_handle_t handle, datalink_id_t aggrid, void *arg)
{
aggr_update_arg_t *aggr_update_argp = arg;
rcm_handle_t *hd = aggr_update_argp->hd;
@@ -974,7 +979,8 @@ aggr_update(datalink_id_t aggrid, void *arg)
rcm_log_message(RCM_TRACE1, "AGGR: aggr_update(%u)\n", aggrid);
assert(MUTEX_HELD(&aggr_list_lock));
- status = dladm_aggr_info(aggrid, &aggr_attr, DLADM_OPT_ACTIVE);
+ status = dladm_aggr_info(handle, aggrid, &aggr_attr,
+ DLADM_OPT_ACTIVE);
if (status != DLADM_STATUS_OK) {
rcm_log_message(RCM_TRACE1,
"AGGR: cannot get aggr information for %u error(%s)\n",
@@ -1041,8 +1047,8 @@ aggr_update_all(rcm_handle_t *hd)
assert(MUTEX_HELD(&cache_lock));
arg.hd = hd;
- (void) dladm_walk_datalink_id(aggr_update, &arg, DATALINK_CLASS_AGGR,
- DATALINK_ANY_MEDIATYPE, DLADM_OPT_ACTIVE);
+ (void) dladm_walk_datalink_id(aggr_update, dld_handle, &arg,
+ DATALINK_CLASS_AGGR, DATALINK_ANY_MEDIATYPE, DLADM_OPT_ACTIVE);
return (arg.retval);
}
@@ -1147,8 +1153,8 @@ aggr_log_err(datalink_id_t linkid, char **errorp, char *errmsg)
rcm_log_message(RCM_ERROR, _("AGGR: %s(%s)\n"), errmsg, rsrc);
- if ((status = dladm_datalink_id2info(linkid, NULL, NULL,
- NULL, link, sizeof (link))) != DLADM_STATUS_OK) {
+ if ((status = dladm_datalink_id2info(dld_handle, linkid, NULL,
+ NULL, NULL, link, sizeof (link))) != DLADM_STATUS_OK) {
rcm_log_message(RCM_WARNING,
_("AGGR: cannot get link name of (%s) %s\n"),
rsrc, dladm_status2str(status, errstr));
@@ -1349,7 +1355,7 @@ typedef struct aggr_configure_arg {
} aggr_configure_arg_t;
static int
-aggr_configure(datalink_id_t aggrid, void *arg)
+aggr_configure(dladm_handle_t handle, datalink_id_t aggrid, void *arg)
{
aggr_configure_arg_t *aggr_configure_argp = arg;
datalink_id_t portid;
@@ -1360,11 +1366,12 @@ aggr_configure(datalink_id_t aggrid, void *arg)
char errmsg[DLADM_STRSIZE];
int i;
- status = dladm_datalink_id2info(aggrid, &flags, NULL, NULL, NULL, 0);
+ status = dladm_datalink_id2info(handle, aggrid, &flags, NULL, NULL,
+ NULL, 0);
if (status != DLADM_STATUS_OK)
return (DLADM_WALK_CONTINUE);
- status = dladm_aggr_info(aggrid, &aggr_attr, DLADM_OPT_PERSIST);
+ status = dladm_aggr_info(handle, aggrid, &aggr_attr, DLADM_OPT_PERSIST);
if (status != DLADM_STATUS_OK)
return (DLADM_WALK_CONTINUE);
@@ -1390,12 +1397,12 @@ aggr_configure(datalink_id_t aggrid, void *arg)
"AGGR: aggr_configure dladm_aggr_add port %u (%u)\n",
portid, aggrid);
port_attr.lp_linkid = portid;
- status = dladm_aggr_add(aggrid, 1, &port_attr,
+ status = dladm_aggr_add(handle, aggrid, 1, &port_attr,
DLADM_OPT_ACTIVE);
} else {
rcm_log_message(RCM_TRACE3,
"AGGR: aggr_configure dladm_aggr_up (%u)\n", aggrid);
- status = dladm_aggr_up(aggrid);
+ status = dladm_aggr_up(handle, aggrid);
}
if (status != DLADM_STATUS_OK) {
@@ -1443,8 +1450,8 @@ aggr_configure_all(rcm_handle_t *hd, datalink_id_t linkid, boolean_t *up)
(void) mutex_unlock(&cache_lock);
arg.portid = linkid;
- (void) dladm_walk_datalink_id(aggr_configure, &arg, DATALINK_CLASS_AGGR,
- DATALINK_ANY_MEDIATYPE, DLADM_OPT_PERSIST);
+ (void) dladm_walk_datalink_id(aggr_configure, dld_handle, &arg,
+ DATALINK_CLASS_AGGR, DATALINK_ANY_MEDIATYPE, DLADM_OPT_PERSIST);
if (arg.retval == 0) {
*up = arg.up;
diff --git a/usr/src/cmd/rcm_daemon/common/ip_rcm.c b/usr/src/cmd/rcm_daemon/common/ip_rcm.c
index 9801c2b18c..f62b3dfc19 100644
--- a/usr/src/cmd/rcm_daemon/common/ip_rcm.c
+++ b/usr/src/cmd/rcm_daemon/common/ip_rcm.c
@@ -23,8 +23,6 @@
* Use is subject to license terms.
*/
-#pragma ident "%Z%%M% %I% %E% SMI"
-
/*
* This RCM module adds support to the RCM framework for IP managed
* interfaces.
@@ -210,6 +208,8 @@ static ip_cache_t cache_tail;
static mutex_t cache_lock;
static int events_registered = 0;
+static dladm_handle_t dld_handle = NULL;
+
/*
* RCM module interface prototypes
*/
@@ -303,6 +303,8 @@ rcm_mod_init(void)
cache_tail.ip_next = NULL;
(void) mutex_init(&cache_lock, NULL, NULL);
+ (void) dladm_open(&dld_handle);
+
/* Return the ops vectors */
return (&ip_ops);
}
@@ -328,6 +330,8 @@ rcm_mod_fini(void)
free_cache();
(void) mutex_destroy(&cache_lock);
+
+ dladm_close(dld_handle);
return (RCM_SUCCESS);
}
@@ -889,8 +893,8 @@ ip_usage(ip_cache_t *node)
return (NULL);
}
- if ((status = dladm_datalink_id2info(linkid, NULL, NULL, NULL, link,
- sizeof (link))) != DLADM_STATUS_OK) {
+ if ((status = dladm_datalink_id2info(dld_handle, linkid, NULL, NULL,
+ NULL, link, sizeof (link))) != DLADM_STATUS_OK) {
rcm_log_message(RCM_ERROR,
_("IP: usage(%s) get link name failure(%s)\n"),
node->ip_resource, dladm_status2str(status, errmsg));
@@ -1942,8 +1946,8 @@ get_link_resource(const char *link)
char *resource;
dladm_status_t status;
- if ((status = dladm_name2info(link, &linkid, &flags, NULL, NULL))
- != DLADM_STATUS_OK) {
+ if ((status = dladm_name2info(dld_handle, link, &linkid, &flags, NULL,
+ NULL)) != DLADM_STATUS_OK) {
goto fail;
}
@@ -2652,7 +2656,7 @@ if_configure(datalink_id_t linkid)
}
(void) mutex_unlock(&cache_lock);
- if (dladm_datalink_id2info(linkid, NULL, NULL, NULL, ifinst,
+ if (dladm_datalink_id2info(dld_handle, linkid, NULL, NULL, NULL, ifinst,
sizeof (ifinst)) != DLADM_STATUS_OK) {
rcm_log_message(RCM_ERROR,
_("IP: get %u link name failed\n"), linkid);
diff --git a/usr/src/cmd/rcm_daemon/common/network_rcm.c b/usr/src/cmd/rcm_daemon/common/network_rcm.c
index b3199ed936..e09969fde6 100644
--- a/usr/src/cmd/rcm_daemon/common/network_rcm.c
+++ b/usr/src/cmd/rcm_daemon/common/network_rcm.c
@@ -75,6 +75,8 @@ static net_cache_t cache_tail;
static mutex_t cache_lock;
static int events_registered = 0;
+static dladm_handle_t dld_handle = NULL;
+
/* module interface routines */
static int net_register(rcm_handle_t *);
static int net_unregister(rcm_handle_t *);
@@ -138,6 +140,8 @@ rcm_mod_init(void)
cache_tail.next = NULL;
(void) mutex_init(&cache_lock, NULL, NULL);
+ dladm_open(&dld_handle);
+
/* Return the ops vectors */
return (&net_ops);
}
@@ -163,6 +167,8 @@ rcm_mod_fini(void)
{
free_cache();
(void) mutex_destroy(&cache_lock);
+
+ dladm_close(dld_handle);
return (RCM_SUCCESS);
}
@@ -319,9 +325,9 @@ net_passthru(rcm_handle_t *hd, int op, const char *rsrc, uint_t flag,
* Delete active linkprop before this active link
* is deleted.
*/
- (void) dladm_set_linkprop(linkid, NULL, NULL, 0,
- DLADM_OPT_ACTIVE);
- (void) dladm_destroy_datalink_id(linkid,
+ (void) dladm_set_linkprop(dld_handle, linkid, NULL,
+ NULL, 0, DLADM_OPT_ACTIVE);
+ (void) dladm_destroy_datalink_id(dld_handle, linkid,
DLADM_OPT_ACTIVE);
}
break;
@@ -431,8 +437,8 @@ net_getinfo(rcm_handle_t *hd, char *rsrc, id_t id, uint_t flag,
}
len = strlen(info_fmt) + MAXLINKNAMELEN + 1;
- if ((status = dladm_datalink_id2info(node->linkid, NULL, NULL, NULL,
- link, sizeof (link))) != DLADM_STATUS_OK) {
+ if ((status = dladm_datalink_id2info(dld_handle, node->linkid, NULL,
+ NULL, NULL, link, sizeof (link))) != DLADM_STATUS_OK) {
rcm_log_message(RCM_ERROR,
_("NET: usage(%s) get link name failure(%s)\n"),
node->resource, dladm_status2str(status, errmsg));
@@ -666,7 +672,7 @@ devfs_entry(di_node_t node, di_minor_t minor, void *arg)
di_devfs_path_free(devfspath);
(void) snprintf(dev, sizeof (dev), "%s%d", drv, di_instance(node));
- if (dladm_dev2linkid(dev, &linkid) != DLADM_STATUS_OK) {
+ if (dladm_dev2linkid(dld_handle, dev, &linkid) != DLADM_STATUS_OK) {
rcm_log_message(RCM_DEBUG,
_("NET: failed to find the linkid for %s\n"), dev);
return (DI_WALK_CONTINUE);
diff --git a/usr/src/cmd/rcm_daemon/common/vlan_rcm.c b/usr/src/cmd/rcm_daemon/common/vlan_rcm.c
index a657baa2d4..16e06614bd 100644
--- a/usr/src/cmd/rcm_daemon/common/vlan_rcm.c
+++ b/usr/src/cmd/rcm_daemon/common/vlan_rcm.c
@@ -98,6 +98,8 @@ static link_cache_t cache_tail;
static mutex_t cache_lock;
static int events_registered = 0;
+static dladm_handle_t dld_handle = NULL;
+
/*
* RCM module interface prototypes
*/
@@ -169,6 +171,8 @@ rcm_mod_init(void)
cache_tail.vc_next = NULL;
(void) mutex_init(&cache_lock, 0, NULL);
+ dladm_open(&dld_handle);
+
/* Return the ops vectors */
return (&vlan_ops);
}
@@ -200,6 +204,8 @@ rcm_mod_fini(void)
*/
cache_free();
(void) mutex_destroy(&cache_lock);
+
+ dladm_close(dld_handle);
return (RCM_SUCCESS);
}
@@ -396,7 +402,7 @@ vlan_online_vlan(link_cache_t *node)
if (!(vlan->dv_flags & VLAN_OFFLINED))
continue;
- if ((status = dladm_vlan_up(vlan->dv_vlanid)) !=
+ if ((status = dladm_vlan_up(dld_handle, vlan->dv_vlanid)) !=
DLADM_STATUS_OK) {
/*
* Print a warning message and continue to online
@@ -425,7 +431,7 @@ vlan_offline_vlan(link_cache_t *node, uint32_t flags, cache_node_state_t state)
* Try to delete all explicit created VLAN
*/
for (vlan = node->vc_vlan; vlan != NULL; vlan = vlan->dv_next) {
- if ((status = dladm_vlan_delete(vlan->dv_vlanid,
+ if ((status = dladm_vlan_delete(dld_handle, vlan->dv_vlanid,
DLADM_OPT_ACTIVE)) != DLADM_STATUS_OK) {
rcm_log_message(RCM_WARNING,
_("VLAN: VLAN offline failed (%u): %s\n"),
@@ -669,8 +675,8 @@ vlan_usage(link_cache_t *node)
rcm_log_message(RCM_TRACE2, "VLAN: usage(%s)\n", node->vc_resource);
assert(MUTEX_HELD(&cache_lock));
- if ((status = dladm_datalink_id2info(node->vc_linkid, NULL, NULL, NULL,
- name, sizeof (name))) != DLADM_STATUS_OK) {
+ if ((status = dladm_datalink_id2info(dld_handle, node->vc_linkid, NULL,
+ NULL, NULL, name, sizeof (name))) != DLADM_STATUS_OK) {
rcm_log_message(RCM_ERROR,
_("VLAN: usage(%s) get link name failure(%s)\n"),
node->vc_resource, dladm_status2str(status, errmsg));
@@ -710,8 +716,9 @@ vlan_usage(link_cache_t *node)
for (vlan = node->vc_vlan; vlan != NULL; vlan = vlan->dv_next) {
rcm_log_message(RCM_DEBUG, "VLAN:= %u\n", vlan->dv_vlanid);
- if ((status = dladm_datalink_id2info(vlan->dv_vlanid, NULL,
- NULL, NULL, name, sizeof (name))) != DLADM_STATUS_OK) {
+ if ((status = dladm_datalink_id2info(dld_handle,
+ vlan->dv_vlanid, NULL, NULL, NULL, name,
+ sizeof (name))) != DLADM_STATUS_OK) {
rcm_log_message(RCM_ERROR,
_("VLAN: usage(%s) get vlan %u name failure(%s)\n"),
node->vc_resource, vlan->dv_vlanid,
@@ -827,7 +834,7 @@ typedef struct vlan_update_arg_s {
* vlan_update() - Update physical interface properties
*/
static int
-vlan_update(datalink_id_t vlanid, void *arg)
+vlan_update(dladm_handle_t handle, datalink_id_t vlanid, void *arg)
{
vlan_update_arg_t *vlan_update_argp = arg;
rcm_handle_t *hd = vlan_update_argp->hd;
@@ -843,7 +850,7 @@ vlan_update(datalink_id_t vlanid, void *arg)
rcm_log_message(RCM_TRACE2, "VLAN: vlan_update(%u)\n", vlanid);
assert(MUTEX_HELD(&cache_lock));
- status = dladm_vlan_info(vlanid, &vlan_attr, DLADM_OPT_ACTIVE);
+ status = dladm_vlan_info(handle, vlanid, &vlan_attr, DLADM_OPT_ACTIVE);
if (status != DLADM_STATUS_OK) {
rcm_log_message(RCM_TRACE1,
"VLAN: vlan_update() cannot get vlan information for "
@@ -935,8 +942,8 @@ vlan_update_all(rcm_handle_t *hd)
assert(MUTEX_HELD(&cache_lock));
arg.hd = hd;
- (void) dladm_walk_datalink_id(vlan_update, &arg, DATALINK_CLASS_VLAN,
- DATALINK_ANY_MEDIATYPE, DLADM_OPT_ACTIVE);
+ (void) dladm_walk_datalink_id(vlan_update, dld_handle, &arg,
+ DATALINK_CLASS_VLAN, DATALINK_ANY_MEDIATYPE, DLADM_OPT_ACTIVE);
return (arg.retval);
}
@@ -1061,8 +1068,8 @@ vlan_log_err(datalink_id_t linkid, char **errorp, char *errmsg)
RCM_LINK_PREFIX, linkid);
rcm_log_message(RCM_ERROR, _("VLAN: %s(%s)\n"), errmsg, rsrc);
- if ((status = dladm_datalink_id2info(linkid, NULL, NULL,
- NULL, link, sizeof (link))) != DLADM_STATUS_OK) {
+ if ((status = dladm_datalink_id2info(dld_handle, linkid, NULL,
+ NULL, NULL, link, sizeof (link))) != DLADM_STATUS_OK) {
rcm_log_message(RCM_WARNING,
_("VLAN: cannot get link name for (%s) %s\n"),
rsrc, dladm_status2str(status, errstr));
@@ -1247,14 +1254,14 @@ typedef struct vlan_up_arg_s {
} vlan_up_arg_t;
static int
-vlan_up(datalink_id_t vlanid, void *arg)
+vlan_up(dladm_handle_t handle, datalink_id_t vlanid, void *arg)
{
vlan_up_arg_t *vlan_up_argp = arg;
dladm_status_t status;
dladm_vlan_attr_t vlan_attr;
char errmsg[DLADM_STRSIZE];
- status = dladm_vlan_info(vlanid, &vlan_attr, DLADM_OPT_PERSIST);
+ status = dladm_vlan_info(handle, vlanid, &vlan_attr, DLADM_OPT_PERSIST);
if (status != DLADM_STATUS_OK) {
rcm_log_message(RCM_TRACE1,
"VLAN: vlan_up(): cannot get information for VLAN %u "
@@ -1266,7 +1273,7 @@ vlan_up(datalink_id_t vlanid, void *arg)
return (DLADM_WALK_CONTINUE);
rcm_log_message(RCM_TRACE3, "VLAN: vlan_up(%u)\n", vlanid);
- if ((status = dladm_vlan_up(vlanid)) == DLADM_STATUS_OK)
+ if ((status = dladm_vlan_up(handle, vlanid)) == DLADM_STATUS_OK)
return (DLADM_WALK_CONTINUE);
/*
@@ -1307,8 +1314,8 @@ vlan_configure(rcm_handle_t *hd, datalink_id_t linkid)
(void) mutex_unlock(&cache_lock);
arg.linkid = linkid;
- (void) dladm_walk_datalink_id(vlan_up, &arg, DATALINK_CLASS_VLAN,
- DATALINK_ANY_MEDIATYPE, DLADM_OPT_PERSIST);
+ (void) dladm_walk_datalink_id(vlan_up, dld_handle, &arg,
+ DATALINK_CLASS_VLAN, DATALINK_ANY_MEDIATYPE, DLADM_OPT_PERSIST);
if (arg.retval == 0) {
rcm_log_message(RCM_TRACE2,
diff --git a/usr/src/cmd/rcm_daemon/common/vnic_rcm.c b/usr/src/cmd/rcm_daemon/common/vnic_rcm.c
index 178d3b44a8..9472cbe61c 100644
--- a/usr/src/cmd/rcm_daemon/common/vnic_rcm.c
+++ b/usr/src/cmd/rcm_daemon/common/vnic_rcm.c
@@ -98,6 +98,8 @@ static link_cache_t cache_tail;
static mutex_t cache_lock;
static int events_registered = 0;
+static dladm_handle_t dld_handle = NULL;
+
/*
* RCM module interface prototypes
*/
@@ -169,6 +171,8 @@ rcm_mod_init(void)
cache_tail.vc_next = NULL;
(void) mutex_init(&cache_lock, 0, NULL);
+ dladm_open(&dld_handle);
+
/* Return the ops vectors */
return (&vnic_ops);
}
@@ -200,6 +204,8 @@ rcm_mod_fini(void)
*/
cache_free();
(void) mutex_destroy(&cache_lock);
+
+ dladm_close(dld_handle);
return (RCM_SUCCESS);
}
@@ -396,8 +402,8 @@ vnic_online_vnic(link_cache_t *node)
if (!(vnic->dlv_flags & VNIC_OFFLINED))
continue;
- if ((status = dladm_vnic_up(vnic->dlv_vnic_id, 0)) !=
- DLADM_STATUS_OK) {
+ if ((status = dladm_vnic_up(dld_handle, vnic->dlv_vnic_id, 0))
+ != DLADM_STATUS_OK) {
/*
* Print a warning message and continue to online
* other VNICs.
@@ -427,7 +433,7 @@ vnic_offline_vnic(link_cache_t *node, uint32_t flags, cache_node_state_t state)
*/
for (vnic = node->vc_vnic; vnic != NULL; vnic = vnic->dlv_next) {
- if ((status = dladm_vnic_delete(vnic->dlv_vnic_id,
+ if ((status = dladm_vnic_delete(dld_handle, vnic->dlv_vnic_id,
DLADM_OPT_ACTIVE)) != DLADM_STATUS_OK) {
rcm_log_message(RCM_WARNING,
_("VNIC: VNIC offline failed (%u): %s\n"),
@@ -672,8 +678,8 @@ vnic_usage(link_cache_t *node)
rcm_log_message(RCM_TRACE2, "VNIC: usage(%s)\n", node->vc_resource);
assert(MUTEX_HELD(&cache_lock));
- if ((status = dladm_datalink_id2info(node->vc_linkid, NULL, NULL, NULL,
- name, sizeof (name))) != DLADM_STATUS_OK) {
+ if ((status = dladm_datalink_id2info(dld_handle, node->vc_linkid, NULL,
+ NULL, NULL, name, sizeof (name))) != DLADM_STATUS_OK) {
rcm_log_message(RCM_ERROR,
_("VNIC: usage(%s) get link name failure(%s)\n"),
node->vc_resource, dladm_status2str(status, errmsg));
@@ -713,8 +719,9 @@ vnic_usage(link_cache_t *node)
for (vnic = node->vc_vnic; vnic != NULL; vnic = vnic->dlv_next) {
rcm_log_message(RCM_DEBUG, "VNIC:= %u\n", vnic->dlv_vnic_id);
- if ((status = dladm_datalink_id2info(vnic->dlv_vnic_id, NULL,
- NULL, NULL, name, sizeof (name))) != DLADM_STATUS_OK) {
+ if ((status = dladm_datalink_id2info(dld_handle,
+ vnic->dlv_vnic_id, NULL, NULL, NULL, name, sizeof (name)))
+ != DLADM_STATUS_OK) {
rcm_log_message(RCM_ERROR,
_("VNIC: usage(%s) get vnic %u name failure(%s)\n"),
node->vc_resource, vnic->dlv_vnic_id,
@@ -830,7 +837,7 @@ typedef struct vnic_update_arg_s {
* vnic_update() - Update physical interface properties
*/
static int
-vnic_update(datalink_id_t vnicid, void *arg)
+vnic_update(dladm_handle_t handle, datalink_id_t vnicid, void *arg)
{
vnic_update_arg_t *vnic_update_argp = arg;
rcm_handle_t *hd = vnic_update_argp->hd;
@@ -846,7 +853,7 @@ vnic_update(datalink_id_t vnicid, void *arg)
rcm_log_message(RCM_TRACE2, "VNIC: vnic_update(%u)\n", vnicid);
assert(MUTEX_HELD(&cache_lock));
- status = dladm_vnic_info(vnicid, &vnic_attr, DLADM_OPT_ACTIVE);
+ status = dladm_vnic_info(handle, vnicid, &vnic_attr, DLADM_OPT_ACTIVE);
if (status != DLADM_STATUS_OK) {
rcm_log_message(RCM_TRACE1,
"VNIC: vnic_update() cannot get vnic information for "
@@ -947,8 +954,8 @@ vnic_update_all(rcm_handle_t *hd)
assert(MUTEX_HELD(&cache_lock));
arg.hd = hd;
- (void) dladm_walk_datalink_id(vnic_update, &arg, DATALINK_CLASS_VNIC,
- DATALINK_ANY_MEDIATYPE, DLADM_OPT_ACTIVE);
+ (void) dladm_walk_datalink_id(vnic_update, dld_handle, &arg,
+ DATALINK_CLASS_VNIC, DATALINK_ANY_MEDIATYPE, DLADM_OPT_ACTIVE);
return (arg.retval);
}
@@ -1073,8 +1080,8 @@ vnic_log_err(datalink_id_t linkid, char **errorp, char *errmsg)
RCM_LINK_PREFIX, linkid);
rcm_log_message(RCM_ERROR, _("VNIC: %s(%s)\n"), errmsg, rsrc);
- if ((status = dladm_datalink_id2info(linkid, NULL, NULL,
- NULL, link, sizeof (link))) != DLADM_STATUS_OK) {
+ if ((status = dladm_datalink_id2info(dld_handle, linkid, NULL,
+ NULL, NULL, link, sizeof (link))) != DLADM_STATUS_OK) {
rcm_log_message(RCM_WARNING,
_("VNIC: cannot get link name for (%s) %s\n"),
rsrc, dladm_status2str(status, errstr));
@@ -1258,14 +1265,14 @@ typedef struct vnic_up_arg_s {
} vnic_up_arg_t;
static int
-vnic_up(datalink_id_t vnicid, void *arg)
+vnic_up(dladm_handle_t handle, datalink_id_t vnicid, void *arg)
{
vnic_up_arg_t *vnic_up_argp = arg;
dladm_status_t status;
dladm_vnic_attr_t vnic_attr;
char errmsg[DLADM_STRSIZE];
- status = dladm_vnic_info(vnicid, &vnic_attr, DLADM_OPT_PERSIST);
+ status = dladm_vnic_info(handle, vnicid, &vnic_attr, DLADM_OPT_PERSIST);
if (status != DLADM_STATUS_OK) {
rcm_log_message(RCM_TRACE1,
"VNIC: vnic_up(): cannot get information for VNIC %u "
@@ -1277,7 +1284,7 @@ vnic_up(datalink_id_t vnicid, void *arg)
return (DLADM_WALK_CONTINUE);
rcm_log_message(RCM_TRACE3, "VNIC: vnic_up(%u)\n", vnicid);
- if ((status = dladm_vnic_up(vnicid, 0)) == DLADM_STATUS_OK)
+ if ((status = dladm_vnic_up(handle, vnicid, 0)) == DLADM_STATUS_OK)
return (DLADM_WALK_CONTINUE);
/*
@@ -1318,8 +1325,8 @@ vnic_configure(rcm_handle_t *hd, datalink_id_t linkid)
(void) mutex_unlock(&cache_lock);
arg.linkid = linkid;
- (void) dladm_walk_datalink_id(vnic_up, &arg, DATALINK_CLASS_VNIC,
- DATALINK_ANY_MEDIATYPE, DLADM_OPT_PERSIST);
+ (void) dladm_walk_datalink_id(vnic_up, dld_handle, &arg,
+ DATALINK_CLASS_VNIC, DATALINK_ANY_MEDIATYPE, DLADM_OPT_PERSIST);
if (arg.retval == 0) {
rcm_log_message(RCM_TRACE2,