diff options
Diffstat (limited to 'usr')
57 files changed, 2256 insertions, 1830 deletions
diff --git a/usr/src/cmd/acctadm/aconf.c b/usr/src/cmd/acctadm/aconf.c index 8453a4fa8f..cfb4a2e54a 100644 --- a/usr/src/cmd/acctadm/aconf.c +++ b/usr/src/cmd/acctadm/aconf.c @@ -218,9 +218,9 @@ aconf_setup(const char *fmri) */ (void) priv_set(PRIV_ON, PRIV_EFFECTIVE, PRIV_SYS_DL_CONFIG, NULL); - (void) dladm_start_usagelog(strncmp(tracked, "basic", - strlen("basic")) == 0 ? DLADM_LOGTYPE_LINK : - DLADM_LOGTYPE_FLOW, 20); + (void) dladm_start_usagelog(dld_handle, + strncmp(tracked, "basic", strlen("basic")) == 0 ? + DLADM_LOGTYPE_LINK : DLADM_LOGTYPE_FLOW, 20); (void) priv_set(PRIV_OFF, PRIV_EFFECTIVE, PRIV_SYS_DL_CONFIG, NULL); } diff --git a/usr/src/cmd/acctadm/main.c b/usr/src/cmd/acctadm/main.c index 484caf8988..580012ccc8 100644 --- a/usr/src/cmd/acctadm/main.c +++ b/usr/src/cmd/acctadm/main.c @@ -52,6 +52,8 @@ Usage:\n\ static const char OPTS[] = "rsxf:e:d:ED"; +dladm_handle_t dld_handle = NULL; + static void usage() { @@ -256,16 +258,22 @@ main(int argc, char *argv[]) return (E_SUCCESS); } + /* Open the libdladm handle */ + if (dladm_open(&dld_handle) != DLADM_STATUS_OK) + die(gettext("failed to open dladm handle\n")); + /* * smf(5) start method. The FMRI to operate on is retrieved from the * SMF_FMRI environment variable that the restarter provides. */ if (sflg) { - if ((fmri = getenv("SMF_FMRI")) != NULL) - return (aconf_setup(fmri)); + if ((fmri = getenv("SMF_FMRI")) != NULL) { + int ret = aconf_setup(fmri); + dladm_close(dld_handle); + return (ret); + } - warn(gettext("-s option should only be invoked by smf(5)\n")); - return (E_ERROR); + die(gettext("-s option should only be invoked by smf(5)\n")); } assert(type == AC_PROC || type == AC_TASK || type == AC_FLOW || @@ -301,7 +309,8 @@ main(int argc, char *argv[]) if (type & AC_NET) { (void) priv_set(PRIV_ON, PRIV_EFFECTIVE, PRIV_SYS_DL_CONFIG, NULL); - (void) dladm_stop_usagelog(DLADM_LOGTYPE_FLOW); + (void) dladm_stop_usagelog(dld_handle, + DLADM_LOGTYPE_FLOW); (void) priv_set(PRIV_OFF, PRIV_EFFECTIVE, PRIV_SYS_DL_CONFIG, NULL); } @@ -347,9 +356,10 @@ main(int argc, char *argv[]) if (type & AC_NET) { (void) priv_set(PRIV_ON, PRIV_EFFECTIVE, PRIV_SYS_DL_CONFIG, NULL); - (void) dladm_stop_usagelog(strncmp(disabled, - "basic", strlen("basic")) == 0 ? - DLADM_LOGTYPE_LINK : DLADM_LOGTYPE_FLOW); + (void) dladm_stop_usagelog(dld_handle, + strncmp(disabled, "basic", strlen("basic")) + == 0 ? DLADM_LOGTYPE_LINK : + DLADM_LOGTYPE_FLOW); (void) priv_set(PRIV_OFF, PRIV_EFFECTIVE, PRIV_SYS_DL_CONFIG, NULL); } @@ -386,9 +396,9 @@ main(int argc, char *argv[]) */ (void) priv_set(PRIV_ON, PRIV_EFFECTIVE, PRIV_SYS_DL_CONFIG, NULL); - (void) dladm_start_usagelog(strncmp(enabled, "basic", - strlen("basic")) == 0 ? DLADM_LOGTYPE_LINK : - DLADM_LOGTYPE_FLOW, 20); + (void) dladm_start_usagelog(dld_handle, + strncmp(enabled, "basic", strlen("basic")) == 0 ? + DLADM_LOGTYPE_LINK : DLADM_LOGTYPE_FLOW, 20); (void) priv_set(PRIV_OFF, PRIV_EFFECTIVE, PRIV_SYS_DL_CONFIG, NULL); } @@ -403,8 +413,10 @@ main(int argc, char *argv[]) * Open new accounting file */ (void) priv_set(PRIV_ON, PRIV_EFFECTIVE, PRIV_SYS_ACCT, NULL); - if (open_exacct_file(file, type) == -1) + if (open_exacct_file(file, type) == -1) { + dladm_close(dld_handle); exit(E_ERROR); + } if (aconf_set_string(AC_PROP_FILE, file) == -1) die(gettext("cannot update %s property\n"), AC_PROP_FILE); @@ -433,7 +445,8 @@ main(int argc, char *argv[]) if (type & AC_NET) { (void) priv_set(PRIV_ON, PRIV_EFFECTIVE, PRIV_SYS_DL_CONFIG, NULL); - (void) dladm_stop_usagelog(DLADM_LOGTYPE_FLOW); + (void) dladm_stop_usagelog(dld_handle, + DLADM_LOGTYPE_FLOW); (void) priv_set(PRIV_OFF, PRIV_EFFECTIVE, PRIV_SYS_DL_CONFIG, NULL); } @@ -474,7 +487,8 @@ main(int argc, char *argv[]) */ (void) priv_set(PRIV_ON, PRIV_EFFECTIVE, PRIV_SYS_DL_CONFIG, NULL); - (void) dladm_start_usagelog(DLADM_LOGTYPE_FLOW, 20); + (void) dladm_start_usagelog(dld_handle, + DLADM_LOGTYPE_FLOW, 20); (void) priv_set(PRIV_OFF, PRIV_EFFECTIVE, PRIV_SYS_DL_CONFIG, NULL); } @@ -513,5 +527,6 @@ main(int argc, char *argv[]) free(smf_state); } aconf_scf_fini(); + dladm_close(dld_handle); return (E_SUCCESS); } diff --git a/usr/src/cmd/acctadm/utils.c b/usr/src/cmd/acctadm/utils.c index bbee653eeb..53afbce282 100644 --- a/usr/src/cmd/acctadm/utils.c +++ b/usr/src/cmd/acctadm/utils.c @@ -76,6 +76,11 @@ die(char *format, ...) va_end(alist); if (strchr(format, '\n') == NULL) (void) fprintf(stderr, gettext(ERRNO_FMT), strerror(err)); + + /* close the libdladm handle if it was opened */ + if (dld_handle != NULL) + dladm_close(dld_handle); + exit(E_ERROR); } diff --git a/usr/src/cmd/acctadm/utils.h b/usr/src/cmd/acctadm/utils.h index acf93b808d..66a1aab6a1 100644 --- a/usr/src/cmd/acctadm/utils.h +++ b/usr/src/cmd/acctadm/utils.h @@ -26,9 +26,8 @@ #ifndef _UTILS_H #define _UTILS_H -#pragma ident "%Z%%M% %I% %E% SMI" - #include <libintl.h> +#include <libdllink.h> #ifdef __cplusplus extern "C" { @@ -38,6 +37,9 @@ extern "C" { #define E_ERROR 1 /* Exit status for error */ #define E_USAGE 2 /* Exit status for usage error */ +/* handle for libdladm calls */ +extern dladm_handle_t dld_handle; + extern void warn(const char *, ...); extern void die(char *, ...); extern char *setprogname(char *); diff --git a/usr/src/cmd/cmd-inet/lib/nwamd/interface.c b/usr/src/cmd/cmd-inet/lib/nwamd/interface.c index 877a07b1e0..4f9c78e784 100644 --- a/usr/src/cmd/cmd-inet/lib/nwamd/interface.c +++ b/usr/src/cmd/cmd-inet/lib/nwamd/interface.c @@ -1108,7 +1108,7 @@ initialize_interfaces(void) wait_time = NWAM_IF_WAIT_DELTA_MAX; } - (void) dladm_init_linkprop(DATALINK_ALL_LINKID, B_FALSE); + (void) dladm_init_linkprop(dld_handle, DATALINK_ALL_LINKID, B_FALSE); (void) icfg_iterate_if(AF_INET, ICFG_PLUMBED, NULL, do_add_interface); @@ -1203,7 +1203,7 @@ find_if_type(const char *name) } type = IF_WIRED; - if (dladm_name2info(name, NULL, NULL, NULL, &media) != + if (dladm_name2info(dld_handle, name, NULL, NULL, NULL, &media) != DLADM_STATUS_OK) { if (strncmp(name, "ip.tun", 6) == 0 || strncmp(name, "ip6.tun", 7) == 0 || diff --git a/usr/src/cmd/cmd-inet/lib/nwamd/main.c b/usr/src/cmd/cmd-inet/lib/nwamd/main.c index ccc110ce09..dc4dfc1b35 100644 --- a/usr/src/cmd/cmd-inet/lib/nwamd/main.c +++ b/usr/src/cmd/cmd-inet/lib/nwamd/main.c @@ -61,6 +61,7 @@ boolean_t shutting_down; sigset_t original_sigmask; char zonename[ZONENAME_MAX]; pthread_mutex_t machine_lock = PTHREAD_MUTEX_INITIALIZER; +dladm_handle_t dld_handle = NULL; /* * nwamd @@ -424,6 +425,12 @@ main(int argc, char *argv[]) init_machine_mutex(); + /* open the dladm handle */ + if (dladm_open(&dld_handle) != DLADM_STATUS_OK) { + syslog(LOG_ERR, "failed to open dladm handle"); + exit(EXIT_FAILURE); + } + initialize_interfaces(); llp_parse_config(); @@ -455,6 +462,7 @@ main(int argc, char *argv[]) (void) pthread_cancel(scan); (void) pthread_join(scan, NULL); } + dladm_close(dld_handle); syslog(LOG_INFO, "nwamd shutting down"); return (EXIT_SUCCESS); } diff --git a/usr/src/cmd/cmd-inet/lib/nwamd/variables.h b/usr/src/cmd/cmd-inet/lib/nwamd/variables.h index 6e3d3a366f..dfb2427830 100644 --- a/usr/src/cmd/cmd-inet/lib/nwamd/variables.h +++ b/usr/src/cmd/cmd-inet/lib/nwamd/variables.h @@ -59,4 +59,10 @@ extern boolean_t debug; extern char zonename[ZONENAME_MAX]; +/* + * This dladm handle is opened before interfaces are initialized and + * closed only when nwamd shuts down. + */ +extern dladm_handle_t dld_handle; + #endif /* _VARIABLES_H */ diff --git a/usr/src/cmd/cmd-inet/lib/nwamd/wireless.c b/usr/src/cmd/cmd-inet/lib/nwamd/wireless.c index 1072f43dce..2438c9d67a 100644 --- a/usr/src/cmd/cmd-inet/lib/nwamd/wireless.c +++ b/usr/src/cmd/cmd-inet/lib/nwamd/wireless.c @@ -198,8 +198,8 @@ add_wireless_if(const char *ifname) if ((wip = calloc(1, sizeof (*wip))) != NULL) { (void) strlcpy(wip->wi_name, ifname, sizeof (wip->wi_name)); - (void) dladm_name2info(ifname, &wip->wi_linkid, NULL, NULL, - NULL); + (void) dladm_name2info(dld_handle, ifname, &wip->wi_linkid, + NULL, NULL, NULL); if (pthread_mutex_lock(&wifi_mutex) == 0) { insque(&wip->wi_links, wi_list.q_back); wi_link_count++; @@ -409,7 +409,7 @@ check_wlan(const wireless_if_t *wip, const char *exp_essid, char cur_bssid[DLADM_STRSIZE]; char errmsg[DLADM_STRSIZE]; - status = dladm_wlan_get_linkattr(wip->wi_linkid, &attr); + status = dladm_wlan_get_linkattr(dld_handle, wip->wi_linkid, &attr); if (status != DLADM_STATUS_OK) { dprintf("check_wlan: dladm_wlan_get_linkattr() for %s " "failed: %s", wip->wi_name, @@ -444,7 +444,7 @@ unexpected: if (sendevent) { /* If not, then shut the interface down normally */ (void) np_queue_add_event(EV_TAKEDOWN, wip->wi_name); - (void) dladm_wlan_disconnect(wip->wi_linkid); + (void) dladm_wlan_disconnect(dld_handle, wip->wi_linkid); } return (B_FALSE); } @@ -464,7 +464,8 @@ update_connected_wlan(wireless_if_t *wip, struct wireless_lan *exp_wlan) char bssid[DLADM_STRSIZE]; boolean_t connected, wasconn; - if (dladm_wlan_get_linkattr(wip->wi_linkid, &attr) != DLADM_STATUS_OK) + if (dladm_wlan_get_linkattr(dld_handle, wip->wi_linkid, &attr) != + DLADM_STATUS_OK) attr.la_status = DLADM_WLAN_LINK_DISCONNECTED; if (attr.la_status == DLADM_WLAN_LINK_CONNECTED) { (void) dladm_wlan_essid2str(&attr.la_wlan_attr.wa_essid, essid); @@ -491,7 +492,8 @@ update_connected_wlan(wireless_if_t *wip, struct wireless_lan *exp_wlan) dprintf("update: wrong AP on %s; expected %s %s", exp_wlan->wl_if_name, exp_wlan->essid, exp_wlan->bssid); - (void) dladm_wlan_disconnect(wip->wi_linkid); + (void) dladm_wlan_disconnect(dld_handle, + wip->wi_linkid); connected = B_FALSE; } /* If we're not in the expected state, then report disconnect */ @@ -500,7 +502,8 @@ update_connected_wlan(wireless_if_t *wip, struct wireless_lan *exp_wlan) if (connected) { dprintf("update: unexpected connection to %s " "%s; clearing", essid, bssid); - (void) dladm_wlan_disconnect(wip->wi_linkid); + (void) dladm_wlan_disconnect(dld_handle, + wip->wi_linkid); } else { dprintf("update: not connected to %s %s as " "expected", exp_wlan->essid, @@ -668,7 +671,8 @@ scan_wireless_nets(const char *ifname) wlans[i].scanned = B_FALSE; new_ap_found = B_FALSE; dprintf("starting scan on %s", ifname); - status = dladm_wlan_scan(linkid, (char *)ifname, get_scan_results); + status = dladm_wlan_scan(dld_handle, linkid, (char *)ifname, + get_scan_results); if (status == DLADM_STATUS_OK) { dropped = clear_unscanned_entries(ifname); } else { @@ -705,8 +709,8 @@ scan_end: * make sure it's really down. */ while (retries++ < 4) { - if (dladm_wlan_get_linkattr(wip->wi_linkid, - &attr) != DLADM_STATUS_OK) + if (dladm_wlan_get_linkattr(dld_handle, + wip->wi_linkid, &attr) != DLADM_STATUS_OK) attr.la_status = DLADM_WLAN_LINK_DISCONNECTED; else if (attr.la_status == @@ -740,7 +744,7 @@ scan_end: */ if (!connected || !wlan->connected) (void) dladm_wlan_disconnect( - linkid); + dld_handle, linkid); break; } } @@ -957,9 +961,10 @@ wireless_verify(const char *ifname) /* * If these calls fail, it means that the wireless link is down. */ - if (dladm_name2info(ifname, &linkid, NULL, NULL, NULL) != + if (dladm_name2info(dld_handle, ifname, &linkid, NULL, NULL, NULL) != DLADM_STATUS_OK || - dladm_wlan_get_linkattr(linkid, &attr) != DLADM_STATUS_OK) { + dladm_wlan_get_linkattr(dld_handle, linkid, &attr) != + DLADM_STATUS_OK) { attr.la_status = DLADM_WLAN_LINK_DISCONNECTED; } @@ -1002,7 +1007,7 @@ wireless_verify(const char *ifname) } if (is_failure) { dprintf("wireless check indicates disconnect"); - (void) dladm_wlan_disconnect(linkid); + (void) dladm_wlan_disconnect(dld_handle, linkid); (void) np_queue_add_event(EV_LINKDISC, ifname); } } @@ -1067,10 +1072,10 @@ periodic_wireless_scan(void *arg) * If these things fail, it means that our wireless * link isn't viable. Proceed in that way. */ - if (dladm_name2info(ifname, &linkid, NULL, NULL, - NULL) != DLADM_STATUS_OK || - dladm_wlan_get_linkattr(linkid, &attr) != - DLADM_STATUS_OK) { + if (dladm_name2info(dld_handle, ifname, &linkid, NULL, + NULL, NULL) != DLADM_STATUS_OK || + dladm_wlan_get_linkattr(dld_handle, linkid, + &attr) != DLADM_STATUS_OK) { attr.la_status = DLADM_WLAN_LINK_DISCONNECTED; attr.la_wlan_attr.wa_strength = 0; } @@ -1138,7 +1143,7 @@ periodic_wireless_scan(void *arg) * says we're disconnected, then tell it to disconnect * for sure. */ - (void) dladm_wlan_disconnect(linkid); + (void) dladm_wlan_disconnect(dld_handle, linkid); /* * Tell the state machine that we've lost this link so @@ -1303,7 +1308,7 @@ store_key(struct wireless_lan *wlan) } /* we've validated the new key, so remove the old one */ - status = dladm_unset_secobj(obj_name, + status = dladm_unset_secobj(dld_handle, obj_name, DLADM_OPT_ACTIVE | DLADM_OPT_PERSIST); if (status != DLADM_STATUS_OK && status != DLADM_STATUS_NOTFOUND) { syslog(LOG_ERR, "store_key: could not remove old secure object " @@ -1316,7 +1321,7 @@ store_key(struct wireless_lan *wlan) if (wlan->raw_key[0] == '\0') return (0); - status = dladm_set_secobj(obj_name, class, + status = dladm_set_secobj(dld_handle, obj_name, class, obj_val, obj_len, DLADM_OPT_CREATE | DLADM_OPT_PERSIST | DLADM_OPT_ACTIVE); if (status != DLADM_STATUS_OK) { @@ -1374,14 +1379,14 @@ retrieve_key(const char *essid, const char *bssid, dladm_secobj_class_t req) cooked_key->wk_idx = 1; /* Try the kernel first, then fall back to persistent storage. */ - status = dladm_get_secobj(cooked_key->wk_name, &class, + status = dladm_get_secobj(dld_handle, cooked_key->wk_name, &class, cooked_key->wk_val, &cooked_key->wk_len, DLADM_OPT_ACTIVE); if (status != DLADM_STATUS_OK) { dprintf("retrieve_key: dladm_get_secobj(TEMP) failed: %s", dladm_status2str(status, errmsg)); - status = dladm_get_secobj(cooked_key->wk_name, &class, - cooked_key->wk_val, &cooked_key->wk_len, + status = dladm_get_secobj(dld_handle, cooked_key->wk_name, + &class, cooked_key->wk_val, &cooked_key->wk_len, DLADM_OPT_PERSIST); } @@ -1636,8 +1641,8 @@ extract_known_aps(FILE *fp, libnwam_known_ap_t *kap, char *sbuf, size_t *totstr) sbuf += strlen(sbuf) + 1; set_key_name(tok[ESSID], tok[BSSID], key, sizeof (key)); keylen = sizeof (keyval); - if (dladm_get_secobj(key, &class, keyval, &keylen, - DLADM_OPT_ACTIVE) == DLADM_STATUS_OK) + if (dladm_get_secobj(dld_handle, key, &class, keyval, + &keylen, DLADM_OPT_ACTIVE) == DLADM_STATUS_OK) kap->ka_haskey = B_TRUE; else kap->ka_haskey = B_FALSE; @@ -1756,8 +1761,8 @@ delete_known_ap(const char *essid, const char *bssid) if (wip != NULL) { wip->wi_wireless_done = B_FALSE; wip->wi_need_key = B_FALSE; - (void) dladm_wlan_disconnect(wip-> - wi_linkid); + (void) dladm_wlan_disconnect(dld_handle, + wip->wi_linkid); } (void) np_queue_add_event(EV_RESELECT, wlan->wl_if_name); @@ -1842,8 +1847,8 @@ connect_chosen_lan(struct wireless_lan *reqlan, wireless_if_t *wip) * try a second time with just the ESSID. */ - status = dladm_wlan_connect(wip->wi_linkid, &attr, timeout, key, - keycount, flags); + status = dladm_wlan_connect(dld_handle, wip->wi_linkid, &attr, timeout, + key, keycount, flags); dprintf("connect_chosen_lan: dladm_wlan_connect returned %s", dladm_status2str(status, errmsg)); /* @@ -1856,8 +1861,8 @@ connect_chosen_lan(struct wireless_lan *reqlan, wireless_if_t *wip) reqlan->essid, reqlan->bssid, reqlan->essid); attr.wa_valid &= ~DLADM_WLAN_ATTR_BSSID; flags = 0; - status = dladm_wlan_connect(wip->wi_linkid, &attr, timeout, - key, keycount, flags); + status = dladm_wlan_connect(dld_handle, wip->wi_linkid, &attr, + timeout, key, keycount, flags); } #endif /* CR6772510_FIXED */ if (status == DLADM_STATUS_OK) { @@ -1954,7 +1959,8 @@ connect_thread(void *arg) * the actual BSSID we connect to is arbitrary. Nothing we can * do about that; just get the new value and live with it. */ - status = dladm_wlan_get_linkattr(wip->wi_linkid, &attr); + status = dladm_wlan_get_linkattr(dld_handle, wip->wi_linkid, + &attr); if (status != DLADM_STATUS_OK) { dprintf("failed to get linkattr on %s after connecting " "to %s: %s", wlan->wl_if_name, wlan->essid, @@ -2013,7 +2019,7 @@ failure: if (wip != NULL) { wip->wi_need_key = B_FALSE; wip->wi_wireless_done = B_FALSE; - (void) dladm_wlan_disconnect(wip->wi_linkid); + (void) dladm_wlan_disconnect(dld_handle, wip->wi_linkid); } if (wlan != NULL) wlan->rescan = B_TRUE; @@ -2167,7 +2173,7 @@ wlan_autoconf(const wireless_if_t *wip) * to cycle through WLANs detected in priority order, attempting * to connect. */ - status = dladm_wlan_connect(wip->wi_linkid, NULL, + status = dladm_wlan_connect(dld_handle, wip->wi_linkid, NULL, DLADM_WLAN_CONNECT_TIMEOUT_DEFAULT, NULL, 0, 0); if (status != DLADM_STATUS_OK) { char errmsg[DLADM_STRSIZE]; @@ -2277,7 +2283,7 @@ handle_wireless_lan(const char *ifname) } else if (cur_wlan->attrs.wa_strength > most_recent->attrs.wa_strength) { if (most_recent->connected) { - (void) dladm_wlan_disconnect( + (void) dladm_wlan_disconnect(dld_handle, wip->wi_linkid); most_recent->connected = B_FALSE; report_wlan_disconnect(most_recent); @@ -2351,7 +2357,8 @@ disconnect_wlan(const char *ifname) if ((wip = find_wireless_if(ifname)) != NULL) { wip->wi_wireless_done = B_FALSE; wip->wi_need_key = B_FALSE; - (void) dladm_wlan_disconnect(wip->wi_linkid); + (void) dladm_wlan_disconnect(dld_handle, + wip->wi_linkid); } for (wlan = wlans; wlan < wlans + wireless_lan_used; wlan++) { if (strcmp(ifname, wlan->wl_if_name) == 0 && diff --git a/usr/src/cmd/cmd-inet/usr.lib/wpad/driver.h b/usr/src/cmd/cmd-inet/usr.lib/wpad/driver.h index 1169c82263..50fa90b867 100644 --- a/usr/src/cmd/cmd-inet/usr.lib/wpad/driver.h +++ b/usr/src/cmd/cmd-inet/usr.lib/wpad/driver.h @@ -11,8 +11,6 @@ #ifndef __DRIVER_H #define __DRIVER_H -#pragma ident "%Z%%M% %I% %E% SMI" - #include <libdlwlan.h> #include <libdllink.h> @@ -26,15 +24,17 @@ typedef enum { CIPHER_NONE, CIPHER_WEP40, CIPHER_TKIP, CIPHER_CCMP, typedef enum { KEY_MGMT_802_1X, KEY_MGMT_PSK, KEY_MGMT_NONE } wpa_key_mgmt; struct wpa_driver_ops { - int (*get_bssid)(datalink_id_t, char *); - int (*get_ssid)(datalink_id_t, char *); - int (*set_wpa)(datalink_id_t, boolean_t); - int (*set_key)(datalink_id_t, wpa_alg, uint8_t *, + int (*get_bssid)(dladm_handle_t, datalink_id_t, char *); + int (*get_ssid)(dladm_handle_t, datalink_id_t, char *); + int (*set_wpa)(dladm_handle_t, datalink_id_t, boolean_t); + int (*set_key)(dladm_handle_t, datalink_id_t, wpa_alg, uint8_t *, int, boolean_t, uint8_t *, uint32_t, uint8_t *, uint32_t); - int (*scan)(datalink_id_t); - int (*get_scan_results)(datalink_id_t, dladm_wlan_ess_t *, uint32_t); - int (*disassociate)(datalink_id_t, int); - int (*associate)(datalink_id_t, const char *, uint8_t *, uint32_t); + int (*scan)(dladm_handle_t, datalink_id_t); + int (*get_scan_results)(dladm_handle_t, datalink_id_t, + dladm_wlan_ess_t *, uint32_t); + int (*disassociate)(dladm_handle_t, datalink_id_t, int); + int (*associate)(dladm_handle_t, datalink_id_t, const char *, uint8_t *, + uint32_t); }; #ifdef __cplusplus diff --git a/usr/src/cmd/cmd-inet/usr.lib/wpad/driver_wifi.c b/usr/src/cmd/cmd-inet/usr.lib/wpad/driver_wifi.c index 15eaa19374..a7722fcb3a 100644 --- a/usr/src/cmd/cmd-inet/usr.lib/wpad/driver_wifi.c +++ b/usr/src/cmd/cmd-inet/usr.lib/wpad/driver_wifi.c @@ -9,8 +9,6 @@ * See README for more details. */ -#pragma ident "%Z%%M% %I% %E% SMI" - #include <stdio.h> #include <stdlib.h> #include <errno.h> @@ -38,13 +36,14 @@ * associated. */ int -wpa_driver_wifi_get_bssid(datalink_id_t linkid, char *bssid) +wpa_driver_wifi_get_bssid(dladm_handle_t handle, datalink_id_t linkid, + char *bssid) { dladm_status_t status; dladm_wlan_linkattr_t attr; dladm_wlan_attr_t *wl_attrp; - status = dladm_wlan_get_linkattr(linkid, &attr); + status = dladm_wlan_get_linkattr(handle, linkid, &attr); if (status != DLADM_STATUS_OK) return (-1); @@ -72,14 +71,15 @@ wpa_driver_wifi_get_bssid(datalink_id_t linkid, char *bssid) * Returning zero is recommended if the STA is not associated. */ int -wpa_driver_wifi_get_ssid(datalink_id_t linkid, char *ssid) +wpa_driver_wifi_get_ssid(dladm_handle_t handle, datalink_id_t linkid, + char *ssid) { int ret; dladm_status_t status; dladm_wlan_linkattr_t attr; dladm_wlan_attr_t *wl_attrp; - status = dladm_wlan_get_linkattr(linkid, &attr); + status = dladm_wlan_get_linkattr(handle, linkid, &attr); if (status != DLADM_STATUS_OK) return (-1); @@ -98,13 +98,13 @@ wpa_driver_wifi_get_ssid(datalink_id_t linkid, char *ssid) } static int -wpa_driver_wifi_set_wpa_ie(datalink_id_t linkid, uint8_t *wpa_ie, - uint32_t wpa_ie_len) +wpa_driver_wifi_set_wpa_ie(dladm_handle_t handle, datalink_id_t linkid, + uint8_t *wpa_ie, uint32_t wpa_ie_len) { dladm_status_t status; wpa_printf(MSG_DEBUG, "%s", "wpa_driver_wifi_set_wpa_ie"); - status = dladm_wlan_wpa_set_ie(linkid, wpa_ie, wpa_ie_len); + status = dladm_wlan_wpa_set_ie(handle, linkid, wpa_ie, wpa_ie_len); return (WPA_STATUS(status)); } @@ -123,22 +123,24 @@ wpa_driver_wifi_set_wpa_ie(datalink_id_t linkid, uint8_t *wpa_ie, * allow wpa_supplicant to control roaming). */ static int -wpa_driver_wifi_set_wpa(datalink_id_t linkid, boolean_t enabled) +wpa_driver_wifi_set_wpa(dladm_handle_t handle, datalink_id_t linkid, + boolean_t enabled) { dladm_status_t status; wpa_printf(MSG_DEBUG, "wpa_driver_wifi_set_wpa: enable=%d", enabled); - if (!enabled && wpa_driver_wifi_set_wpa_ie(linkid, NULL, 0) < 0) + if (!enabled && wpa_driver_wifi_set_wpa_ie(handle, linkid, NULL, 0) < 0) return (-1); - status = dladm_wlan_wpa_set_wpa(linkid, enabled); + status = dladm_wlan_wpa_set_wpa(handle, linkid, enabled); return (WPA_STATUS(status)); } static int -wpa_driver_wifi_del_key(datalink_id_t linkid, int key_idx, unsigned char *addr) +wpa_driver_wifi_del_key(dladm_handle_t handle, datalink_id_t linkid, + int key_idx, unsigned char *addr) { dladm_status_t status; dladm_wlan_bssid_t bss; @@ -147,7 +149,7 @@ wpa_driver_wifi_del_key(datalink_id_t linkid, int key_idx, unsigned char *addr) key_idx); (void) memcpy(bss.wb_bytes, addr, DLADM_WLAN_BSSID_LEN); - status = dladm_wlan_wpa_del_key(linkid, key_idx, &bss); + status = dladm_wlan_wpa_del_key(handle, linkid, key_idx, &bss); return (WPA_STATUS(status)); } @@ -186,9 +188,9 @@ wpa_driver_wifi_del_key(datalink_id_t linkid, int key_idx, unsigned char *addr) * configuration. */ static int -wpa_driver_wifi_set_key(datalink_id_t linkid, wpa_alg alg, - unsigned char *addr, int key_idx, boolean_t set_tx, uint8_t *seq, - uint32_t seq_len, uint8_t *key, uint32_t key_len) +wpa_driver_wifi_set_key(dladm_handle_t handle, datalink_id_t linkid, + wpa_alg alg, unsigned char *addr, int key_idx, boolean_t set_tx, + uint8_t *seq, uint32_t seq_len, uint8_t *key, uint32_t key_len) { char *alg_name; dladm_wlan_cipher_t cipher; @@ -197,7 +199,7 @@ wpa_driver_wifi_set_key(datalink_id_t linkid, wpa_alg alg, wpa_printf(MSG_DEBUG, "%s", "wpa_driver_wifi_set_key"); if (alg == WPA_ALG_NONE) - return (wpa_driver_wifi_del_key(linkid, key_idx, addr)); + return (wpa_driver_wifi_del_key(handle, linkid, key_idx, addr)); switch (alg) { case WPA_ALG_WEP: @@ -230,7 +232,7 @@ wpa_driver_wifi_set_key(datalink_id_t linkid, wpa_alg alg, } (void) memcpy(bss.wb_bytes, addr, DLADM_WLAN_BSSID_LEN); - status = dladm_wlan_wpa_set_key(linkid, cipher, &bss, set_tx, + status = dladm_wlan_wpa_set_key(handle, linkid, cipher, &bss, set_tx, *(uint64_t *)(uintptr_t)seq, key_idx, key, key_len); return (WPA_STATUS(status)); @@ -245,14 +247,15 @@ wpa_driver_wifi_set_key(datalink_id_t linkid, wpa_alg alg, * Return: 0 on success, -1 on failure */ static int -wpa_driver_wifi_disassociate(datalink_id_t linkid, int reason_code) +wpa_driver_wifi_disassociate(dladm_handle_t handle, datalink_id_t linkid, + int reason_code) { dladm_status_t status; wpa_printf(MSG_DEBUG, "wpa_driver_wifi_disassociate"); - status = dladm_wlan_wpa_set_mlme(linkid, DLADM_WLAN_MLME_DISASSOC, - reason_code, NULL); + status = dladm_wlan_wpa_set_mlme(handle, linkid, + DLADM_WLAN_MLME_DISASSOC, reason_code, NULL); return (WPA_STATUS(status)); } @@ -277,8 +280,8 @@ wpa_driver_wifi_disassociate(datalink_id_t linkid, int reason_code) * Return: 0 on success, -1 on failure */ static int -wpa_driver_wifi_associate(datalink_id_t linkid, const char *bssid, - uint8_t *wpa_ie, uint32_t wpa_ie_len) +wpa_driver_wifi_associate(dladm_handle_t handle, datalink_id_t linkid, + const char *bssid, uint8_t *wpa_ie, uint32_t wpa_ie_len) { dladm_status_t status; dladm_wlan_bssid_t bss; @@ -291,11 +294,11 @@ wpa_driver_wifi_associate(datalink_id_t linkid, const char *bssid, * this is implied by the bssid which is used to locate * the scanned node state which holds it. */ - if (wpa_driver_wifi_set_wpa_ie(linkid, wpa_ie, wpa_ie_len) < 0) + if (wpa_driver_wifi_set_wpa_ie(handle, linkid, wpa_ie, wpa_ie_len) < 0) return (-1); (void) memcpy(bss.wb_bytes, bssid, DLADM_WLAN_BSSID_LEN); - status = dladm_wlan_wpa_set_mlme(linkid, DLADM_WLAN_MLME_ASSOC, + status = dladm_wlan_wpa_set_mlme(handle, linkid, DLADM_WLAN_MLME_ASSOC, 0, &bss); return (WPA_STATUS(status)); @@ -312,7 +315,7 @@ wpa_driver_wifi_associate(datalink_id_t linkid, const char *bssid, * results with wpa_driver_get_scan_results(). */ static int -wpa_driver_wifi_scan(datalink_id_t linkid) +wpa_driver_wifi_scan(dladm_handle_t handle, datalink_id_t linkid) { dladm_status_t status; @@ -322,10 +325,10 @@ wpa_driver_wifi_scan(datalink_id_t linkid) * to get ieee80211_begin_scan called. We really want to scan w/o * altering the current state but that's not possible right now. */ - (void) wpa_driver_wifi_disassociate(linkid, + (void) wpa_driver_wifi_disassociate(handle, linkid, DLADM_WLAN_REASON_DISASSOC_LEAVING); - status = dladm_wlan_scan(linkid, NULL, NULL); + status = dladm_wlan_scan(handle, linkid, NULL, NULL); wpa_printf(MSG_DEBUG, "%s: return", "wpa_driver_wifi_scan"); return (WPA_STATUS(status)); @@ -344,7 +347,7 @@ wpa_driver_wifi_scan(datalink_id_t linkid) * buffer. */ int -wpa_driver_wifi_get_scan_results(datalink_id_t linkid, +wpa_driver_wifi_get_scan_results(dladm_handle_t handle, datalink_id_t linkid, dladm_wlan_ess_t *results, uint32_t max_size) { uint_t ret; @@ -352,7 +355,7 @@ wpa_driver_wifi_get_scan_results(datalink_id_t linkid, wpa_printf(MSG_DEBUG, "%s: max size=%d\n", "wpa_driver_wifi_get_scan_results", max_size); - if (dladm_wlan_wpa_get_sr(linkid, results, max_size, &ret) + if (dladm_wlan_wpa_get_sr(handle, linkid, results, max_size, &ret) != DLADM_STATUS_OK) { return (-1); } diff --git a/usr/src/cmd/cmd-inet/usr.lib/wpad/wpa.c b/usr/src/cmd/cmd-inet/usr.lib/wpad/wpa.c index 75fff828e2..917faf51a8 100644 --- a/usr/src/cmd/cmd-inet/usr.lib/wpad/wpa.c +++ b/usr/src/cmd/cmd-inet/usr.lib/wpad/wpa.c @@ -9,8 +9,6 @@ * See README for more details. */ -#pragma ident "%Z%%M% %I% %E% SMI" - #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -759,13 +757,15 @@ wpa_supplicant_get_ssid(struct wpa_supplicant *wpa_s) uint8_t bssid[IEEE80211_ADDR_LEN]; (void) memset(ssid, 0, MAX_ESSID_LENGTH); - ssid_len = wpa_s->driver->get_ssid(wpa_s->linkid, (char *)ssid); + ssid_len = wpa_s->driver->get_ssid(wpa_s->handle, wpa_s->linkid, + (char *)ssid); if (ssid_len < 0) { wpa_printf(MSG_WARNING, "Could not read SSID from driver."); return (NULL); } - if (wpa_s->driver->get_bssid(wpa_s->linkid, (char *)bssid) < 0) { + if (wpa_s->driver->get_bssid(wpa_s->handle, wpa_s->linkid, + (char *)bssid) < 0) { wpa_printf(MSG_WARNING, "Could not read BSSID from driver."); return (NULL); } @@ -813,7 +813,8 @@ wpa_supplicant_key_request(struct wpa_supplicant *wpa_s, else ver = WPA_KEY_INFO_TYPE_HMAC_MD5_RC4; - if (wpa_s->driver->get_bssid(wpa_s->linkid, (char *)bssid) < 0) { + if (wpa_s->driver->get_bssid(wpa_s->handle, wpa_s->linkid, + (char *)bssid) < 0) { wpa_printf(MSG_WARNING, "Failed to read BSSID for EAPOL-Key " "request"); return; @@ -1078,13 +1079,13 @@ wpa_supplicant_process_3_of_4_gtk(struct wpa_supplicant *wpa_s, (void) memcpy(gtk + 24, tmpbuf, 8); } if (wpa_s->pairwise_cipher == WPA_CIPHER_NONE) { - if (wpa_s->driver->set_key(wpa_s->linkid, alg, + if (wpa_s->driver->set_key(wpa_s->handle, wpa_s->linkid, alg, (uint8_t *)"\xff\xff\xff\xff\xff\xff", keyidx, 1, key->key_rsc, key_rsc_len, gtk, gtk_len) < 0) wpa_printf(MSG_WARNING, "WPA: Failed to set " "GTK to the driver (Group only)."); - } else if (wpa_s->driver->set_key(wpa_s->linkid, alg, + } else if (wpa_s->driver->set_key(wpa_s->handle, wpa_s->linkid, alg, (uint8_t *)"\xff\xff\xff\xff\xff\xff", keyidx, tx, key->key_rsc, key_rsc_len, gtk, gtk_len) < 0) { wpa_printf(MSG_WARNING, "WPA: Failed to set GTK to " @@ -1274,8 +1275,8 @@ wpa_supplicant_process_3_of_4(struct wpa_supplicant *wpa_s, wpa_hexdump(MSG_DEBUG, "WPA: RSC", key_rsc, rsclen); } - if (wpa_s->driver->set_key(wpa_s->linkid, alg, src_addr, - 0, 1, key_rsc, rsclen, + if (wpa_s->driver->set_key(wpa_s->handle, wpa_s->linkid, alg, + src_addr, 0, 1, key_rsc, rsclen, (uint8_t *)&wpa_s->ptk.tk1, keylen) < 0) { wpa_printf(MSG_WARNING, "WPA: Failed to set PTK to the" " driver."); @@ -1465,13 +1466,13 @@ wpa_supplicant_process_1_of_2(struct wpa_supplicant *wpa_s, (void) memcpy(gtk + 24, tmpbuf, 8); } if (wpa_s->pairwise_cipher == WPA_CIPHER_NONE) { - if (wpa_s->driver->set_key(wpa_s->linkid, alg, + if (wpa_s->driver->set_key(wpa_s->handle, wpa_s->linkid, alg, (uint8_t *)"\xff\xff\xff\xff\xff\xff", keyidx, 1, key->key_rsc, key_rsc_len, gtk, keylen) < 0) wpa_printf(MSG_WARNING, "WPA: Failed to set GTK to the" " driver (Group only)."); - } else if (wpa_s->driver->set_key(wpa_s->linkid, alg, + } else if (wpa_s->driver->set_key(wpa_s->handle, wpa_s->linkid, alg, (uint8_t *)"\xff\xff\xff\xff\xff\xff", keyidx, tx, key->key_rsc, key_rsc_len, diff --git a/usr/src/cmd/cmd-inet/usr.lib/wpad/wpa_impl.h b/usr/src/cmd/cmd-inet/usr.lib/wpad/wpa_impl.h index 2e043e6a37..4e82817c7c 100644 --- a/usr/src/cmd/cmd-inet/usr.lib/wpad/wpa_impl.h +++ b/usr/src/cmd/cmd-inet/usr.lib/wpad/wpa_impl.h @@ -11,8 +11,6 @@ #ifndef __WPA_IMPL_H #define __WPA_IMPL_H -#pragma ident "%Z%%M% %I% %E% SMI" - #include <net/wpa.h> #include <libdladm.h> #include <libdllink.h> @@ -166,6 +164,9 @@ struct wpa_supplicant { struct l2_packet_data *l2; unsigned char own_addr[IEEE80211_ADDR_LEN]; + /* The handle required for libdladm calls */ + dladm_handle_t handle; + datalink_id_t linkid; char kname[DLADM_SECOBJ_NAME_MAX]; diff --git a/usr/src/cmd/cmd-inet/usr.lib/wpad/wpa_supplicant.c b/usr/src/cmd/cmd-inet/usr.lib/wpad/wpa_supplicant.c index 8995fe7f92..4e3071debd 100644 --- a/usr/src/cmd/cmd-inet/usr.lib/wpad/wpa_supplicant.c +++ b/usr/src/cmd/cmd-inet/usr.lib/wpad/wpa_supplicant.c @@ -137,7 +137,7 @@ wpa_supplicant_scan(void *eloop_ctx, void *timeout_ctx) wpa_printf(MSG_DEBUG, "Scan SSID: %s", ssid->ssid); } - if (wpa_s->driver->scan(wpa_s->linkid)) { + if (wpa_s->driver->scan(wpa_s->handle, wpa_s->linkid)) { wpa_printf(MSG_WARNING, "Failed to initiate AP scan."); } } @@ -201,6 +201,7 @@ wpa_supplicant_cleanup(struct wpa_supplicant *wpa_s) wpa_s->conf = NULL; } + dladm_close(wpa_s->handle); free(wpa_s->ap_wpa_ie); pmksa_candidate_free(wpa_s); pmksa_cache_free(wpa_s); @@ -209,17 +210,17 @@ wpa_supplicant_cleanup(struct wpa_supplicant *wpa_s) static void wpa_clear_keys(struct wpa_supplicant *wpa_s, uint8_t *addr) { - wpa_s->driver->set_key(wpa_s->linkid, WPA_ALG_NONE, + wpa_s->driver->set_key(wpa_s->handle, wpa_s->linkid, WPA_ALG_NONE, (uint8_t *)"\xff\xff\xff\xff\xff\xff", 0, 0, NULL, 0, NULL, 0); - wpa_s->driver->set_key(wpa_s->linkid, WPA_ALG_NONE, + wpa_s->driver->set_key(wpa_s->handle, wpa_s->linkid, WPA_ALG_NONE, (uint8_t *)"\xff\xff\xff\xff\xff\xff", 1, 0, NULL, 0, NULL, 0); - wpa_s->driver->set_key(wpa_s->linkid, WPA_ALG_NONE, + wpa_s->driver->set_key(wpa_s->handle, wpa_s->linkid, WPA_ALG_NONE, (uint8_t *)"\xff\xff\xff\xff\xff\xff", 2, 0, NULL, 0, NULL, 0); - wpa_s->driver->set_key(wpa_s->linkid, WPA_ALG_NONE, + wpa_s->driver->set_key(wpa_s->handle, wpa_s->linkid, WPA_ALG_NONE, (uint8_t *)"\xff\xff\xff\xff\xff\xff", 3, 0, NULL, 0, NULL, 0); if (addr) { - wpa_s->driver->set_key(wpa_s->linkid, WPA_ALG_NONE, addr, - 0, 0, NULL, 0, NULL, 0); + wpa_s->driver->set_key(wpa_s->handle, wpa_s->linkid, + WPA_ALG_NONE, addr, 0, 0, NULL, 0, NULL, 0); } } @@ -353,7 +354,7 @@ static void wpa_supplicant_associate(struct wpa_supplicant *wpa_s, wpa_clear_keys(wpa_s, bss->we_bssid.wb_bytes); wpa_s->wpa_state = WPA_ASSOCIATING; - wpa_s->driver->associate(wpa_s->linkid, + wpa_s->driver->associate(wpa_s->handle, wpa_s->linkid, (const char *)bss->we_bssid.wb_bytes, wpa_ie, wpa_ie_len); /* Timeout for IEEE 802.11 authentication and association */ @@ -367,7 +368,8 @@ wpa_supplicant_disassociate(struct wpa_supplicant *wpa_s, int reason_code) wpa_s->wpa_state = WPA_DISCONNECTED; if (memcmp(wpa_s->bssid, "\x00\x00\x00\x00\x00\x00", IEEE80211_ADDR_LEN) != 0) { - wpa_s->driver->disassociate(wpa_s->linkid, reason_code); + wpa_s->driver->disassociate(wpa_s->handle, wpa_s->linkid, + reason_code); addr = wpa_s->bssid; } wpa_clear_keys(wpa_s, addr); @@ -449,8 +451,8 @@ wpa_supplicant_scan_results(struct wpa_supplicant *wpa_s) struct wpa_ssid *ssid; (void) memset(results, 0, sizeof (dladm_wlan_ess_t) * MAX_SCANRESULTS); - num = wpa_s->driver->get_scan_results(wpa_s->linkid, results, - MAX_SCANRESULTS); + num = wpa_s->driver->get_scan_results(wpa_s->handle, wpa_s->linkid, + results, MAX_SCANRESULTS); wpa_printf(MSG_DEBUG, "Scan results: %d", num); if (num < 0) return; @@ -550,7 +552,7 @@ wpa_supplicant_driver_init(const char *link, struct wpa_supplicant *wpa_s) return (-1); } - if (wpa_s->driver->set_wpa(wpa_s->linkid, 1) < 0) { + if (wpa_s->driver->set_wpa(wpa_s->handle, wpa_s->linkid, 1) < 0) { wpa_printf(MSG_ERROR, "Failed to enable WPA in the driver."); return (-1); } @@ -693,13 +695,13 @@ wpa_config_read_network(struct wpa_supplicant *wpa_s) ssid->key_mgmt = WPA_KEY_MGMT_PSK; /* | WPA_KEY_MGMT_IEEE8021X; */ (void) memset(buf, 0, MAX_ESSID_LENGTH + 1); - wpa_s->driver->get_ssid(wpa_s->linkid, (char *)buf); + wpa_s->driver->get_ssid(wpa_s->handle, wpa_s->linkid, (char *)buf); (void) wpa_config_parse_ssid(ssid, 0, buf); key_len = sizeof (psk); - (void) dladm_get_secobj((const char *)wpa_s->kname, &cl, psk, &key_len, - DLADM_OPT_ACTIVE); + (void) dladm_get_secobj(wpa_s->handle, (const char *)wpa_s->kname, &cl, + psk, &key_len, DLADM_OPT_ACTIVE); psk[key_len] = '\0'; ssid->passphrase = strdup((const char *)psk); @@ -812,6 +814,7 @@ main(int argc, char *argv[]) int c; int exitcode; char door_file[MAXPATHLEN]; + dladm_handle_t handle; if (!is_smf_context()) { (void) fprintf(stderr, @@ -862,9 +865,17 @@ main(int argc, char *argv[]) return (-1); } - if (dladm_name2info(link, &linkid, NULL, NULL, NULL) != + /* This handle is stored in wpa_s when that struct is filled. */ + if (dladm_open(&handle) != DLADM_STATUS_OK) { + wpa_printf(MSG_ERROR, "Failed to open dladm handle"); + dlpi_close(dh); + return (-1); + } + + if (dladm_name2info(handle, link, &linkid, NULL, NULL, NULL) != DLADM_STATUS_OK) { wpa_printf(MSG_ERROR, "Invalid link name '%s'.", link); + dladm_close(handle); dlpi_close(dh); return (-1); } @@ -874,10 +885,11 @@ main(int argc, char *argv[]) * file name used to communicate with the driver. Note that different * links use different doors. */ - if (dladm_phys_info(linkid, &dpa, DLADM_OPT_ACTIVE) != + if (dladm_phys_info(handle, linkid, &dpa, DLADM_OPT_ACTIVE) != DLADM_STATUS_OK) { wpa_printf(MSG_ERROR, "Failed to get device name of link '%s'.", link); + dladm_close(handle); dlpi_close(dh); return (-1); } @@ -885,6 +897,7 @@ main(int argc, char *argv[]) (void) memset(&wpa_s, 0, sizeof (wpa_s)); wpa_s.driver = &wpa_driver_wifi_ops; + wpa_s.handle = handle; wpa_s.linkid = linkid; (void) strlcpy(wpa_s.kname, key, sizeof (wpa_s.kname)); eloop_init(&wpa_s); @@ -935,12 +948,13 @@ main(int argc, char *argv[]) wpa_printf(MSG_DEBUG, "<= eloop_run()"); wpa_supplicant_disassociate(&wpa_s, REASON_DEAUTH_LEAVING); - if (wpa_s.driver->set_wpa(wpa_s.linkid, 0) < 0) { + if (wpa_s.driver->set_wpa(wpa_s.handle, wpa_s.linkid, 0) < 0) { wpa_printf(MSG_ERROR, "Failed to disable WPA in the driver.\n"); } cleanup: wpa_supplicant_door_destroy(door_file); + /* The libdladm handle is closed in the following method */ wpa_supplicant_cleanup(&wpa_s); eloop_destroy(); diff --git a/usr/src/cmd/cmd-inet/usr.sbin/ifconfig/ifconfig.c b/usr/src/cmd/cmd-inet/usr.sbin/ifconfig/ifconfig.c index 79e2991164..f49fca249c 100644 --- a/usr/src/cmd/cmd-inet/usr.sbin/ifconfig/ifconfig.c +++ b/usr/src/cmd/cmd-inet/usr.sbin/ifconfig/ifconfig.c @@ -4500,9 +4500,15 @@ static boolean_t ni_entry(const char *linkname, void *arg) { dlpi_handle_t dh; + dladm_handle_t dld_handle; datalink_class_t class; - (void) dladm_name2info(linkname, NULL, NULL, &class, NULL); + if (dladm_open(&dld_handle) != DLADM_STATUS_OK) + return (_B_FALSE); + + (void) dladm_name2info(dld_handle, linkname, NULL, NULL, &class, NULL); + dladm_close(dld_handle); + if (class == DATALINK_CLASS_ETHERSTUB) return (_B_FALSE); if (dlpi_open(linkname, &dh, 0) != DLPI_SUCCESS) diff --git a/usr/src/cmd/cmd-inet/usr.sbin/ndd.c b/usr/src/cmd/cmd-inet/usr.sbin/ndd.c index 0d1af3281e..b8b5089505 100644 --- a/usr/src/cmd/cmd-inet/usr.sbin/ndd.c +++ b/usr/src/cmd/cmd-inet/usr.sbin/ndd.c @@ -46,7 +46,7 @@ static boolean_t do_getset(int fd, int cmd, char *buf, int buf_len); static int get_value(char *msg, char *buf, int buf_len); static void name_print(char *buf); static void getset_interactive(int fd); -static int open_device(void); +static int open_device(dladm_handle_t); static char *errmsg(int err); static void fatal(char *fmt, ...); static void printe(boolean_t print_errno, char *fmt, ...); @@ -62,7 +62,7 @@ static char usage_str[] = "usage: ndd -set device_name name value\n" * to test for support of the flowctrl property. */ static void -gldv3_warning(char *module) +gldv3_warning(dladm_handle_t handle, char *module) { datalink_id_t linkid; dladm_status_t status; @@ -73,12 +73,12 @@ gldv3_warning(char *module) link = strrchr(module, '/'); if (link == NULL) return; - status = dladm_name2info(++link, &linkid, NULL, NULL, NULL); + status = dladm_name2info(handle, ++link, &linkid, NULL, NULL, NULL); if (status != DLADM_STATUS_OK) return; cp = buf; - status = dladm_get_linkprop(linkid, DLADM_PROP_VAL_CURRENT, "flowctrl", - &cp, &cnt); + status = dladm_get_linkprop(handle, linkid, DLADM_PROP_VAL_CURRENT, + "flowctrl", &cp, &cnt); if (status != DLADM_STATUS_OK) return; (void) fprintf(stderr, gettext( @@ -94,10 +94,14 @@ main(int argc, char **argv) char *cp, *value; int cmd; int fd; + dladm_handle_t handle; + if (dladm_open(&handle) != DLADM_STATUS_OK) + fatal("failed to open dladm handle"); if (!(cp = *++argv)) { - while ((fd = open_device()) != -1) { + /* open_device() calls gldv3_warning() which needs handle */ + while ((fd = open_device(handle)) != -1) { getset_interactive(fd); (void) close(fd); } @@ -113,7 +117,9 @@ main(int argc, char **argv) if (!(cp = *++argv)) fatal(usage_str); } - gldv3_warning(cp); + gldv3_warning(handle, cp); + dladm_close(handle); + if ((fd = open(cp, O_RDWR)) == -1) fatal("open of %s failed: %s", cp, errmsg(errno)); @@ -287,7 +293,7 @@ printe(boolean_t print_errno, char *fmt, ...) static int -open_device(void) +open_device(dladm_handle_t handle) { char name[80]; int fd, len; @@ -303,7 +309,7 @@ open_device(void) continue; } - gldv3_warning(name); + gldv3_warning(handle, name); if (isastream(fd)) return (fd); diff --git a/usr/src/cmd/dladm/dladm.c b/usr/src/cmd/dladm/dladm.c index 5d2aea069a..211a64a980 100644 --- a/usr/src/cmd/dladm/dladm.c +++ b/usr/src/cmd/dladm/dladm.c @@ -192,7 +192,7 @@ static void dladm_print_output(print_state_t *, boolean_t, /* * helper function that, when invoked as dladm_print_field(pf, buf) - * prints string which is offset by pf->pf_offset within buf + * prints string which is offset by pf->pf_offset within buf. */ static char *dladm_print_field(print_field_t *, void *); @@ -276,7 +276,7 @@ static cmdfunc_t do_show_usage; static void do_up_vnic_common(int, char **, const char *, boolean_t); static void altroot_cmd(char *, int, char **); -static int show_linkprop_onelink(datalink_id_t, void *); +static int show_linkprop_onelink(dladm_handle_t, datalink_id_t, void *); static void link_stats(datalink_id_t, uint_t, char *, show_state_t *); static void aggr_stats(datalink_id_t, show_grp_state_t *, uint_t); @@ -290,7 +290,7 @@ static uint64_t get_ifspeed(const char *, boolean_t); static const char *get_linkstate(const char *, boolean_t, char *); static const char *get_linkduplex(const char *, boolean_t, char *); -static int show_etherprop(datalink_id_t, void *); +static int show_etherprop(dladm_handle_t, datalink_id_t, void *); static void show_ether_xprop(void *, dladm_ether_info_t *); static boolean_t link_is_ether(const char *, datalink_id_t *); @@ -368,7 +368,7 @@ static cmd_t cmds[] = { { "delete-phys", do_delete_phys, "\tdelete-phys\t<link>" }, { "show-phys", do_show_phys, - "\tshow-phys\t[-pP] [-o <field>,..] [-H] [<link>]" }, + "\tshow-phys\t[-pP] [-o <field>,..] [-H] [<link>]" }, { "init-phys", do_init_phys, NULL }, { "show-linkmap", do_show_linkmap, NULL }, { "create-vnic", do_create_vnic, @@ -381,7 +381,7 @@ static cmd_t cmds[] = { { "delete-vnic", do_delete_vnic, "\tdelete-vnic [-t] [-R <root-dir>] <vnic-link>\n" }, { "show-vnic", do_show_vnic, - "\tshow-vnic [-pP] [-l <link>] [-s [-i <interval>]]" }, + "\tshow-vnic [-pP] [-l <link>] [-s [-i <interval>]]" }, { "up-vnic", do_up_vnic, NULL }, { "create-etherstub", do_create_etherstub, "\tcreate-etherstub [-t] [-R <root-dir>] <link>\n" }, @@ -1000,6 +1000,12 @@ static print_field_t usage_l_fields[] = { static char *progname; static sig_atomic_t signalled; +/* + * Handle to libdladm. Opened in main() before the sub-command + * specific function is called. + */ +static dladm_handle_t handle = NULL; + #define DLADM_ETHERSTUB_NAME "etherstub" #define DLADM_IS_ETHERSTUB(id) (id == DATALINK_INVALID_LINKID) @@ -1015,6 +1021,11 @@ usage(void) if (cmdp->c_usage != NULL) (void) fprintf(stderr, "%s\n", gettext(cmdp->c_usage)); } + + /* close dladm handle if it was opened */ + if (handle != NULL) + dladm_close(handle); + exit(1); } @@ -1023,6 +1034,7 @@ main(int argc, char *argv[]) { int i; cmd_t *cmdp; + dladm_status_t status; (void) setlocale(LC_ALL, ""); #if !defined(TEXT_DOMAIN) @@ -1038,7 +1050,15 @@ main(int argc, char *argv[]) for (i = 0; i < sizeof (cmds) / sizeof (cmds[0]); i++) { cmdp = &cmds[i]; if (strcmp(argv[1], cmdp->c_name) == 0) { + /* Open the libdladm handle */ + if ((status = dladm_open(&handle)) != DLADM_STATUS_OK) { + die_dlerr(status, + "could not open /dev/dld"); + } + cmdp->c_fn(argc - 1, &argv[1], cmdp->c_usage); + + dladm_close(handle); exit(0); } } @@ -1424,21 +1444,22 @@ do_create_aggr(int argc, char *argv[], const char *use) altroot_cmd(altroot, argc, argv); for (n = 0; n < ndev; n++) { - if (dladm_dev2linkid(devs[n], &port[n].lp_linkid) != - DLADM_STATUS_OK) { - die("invalid dev name '%s'", devs[n]); + if ((status = dladm_dev2linkid(handle, devs[n], + &port[n].lp_linkid)) != DLADM_STATUS_OK) { + die_dlerr(status, "invalid dev name '%s'", devs[n]); } } for (n = 0; n < nlink; n++) { - if (dladm_name2info(links[n], &port[ndev + n].lp_linkid, - NULL, NULL, NULL) != DLADM_STATUS_OK) { - die("invalid link name '%s'", links[n]); + if ((status = dladm_name2info(handle, links[n], + &port[ndev + n].lp_linkid, NULL, NULL, NULL)) != + DLADM_STATUS_OK) { + die_dlerr(status, "invalid link name '%s'", links[n]); } } - status = dladm_aggr_create(name, key, ndev + nlink, port, policy, - mac_addr_fixed, (const uchar_t *)mac_addr, lacp_mode, + status = dladm_aggr_create(handle, name, key, ndev + nlink, port, + policy, mac_addr_fixed, (const uchar_t *)mac_addr, lacp_mode, lacp_timer, flags); if (status != DLADM_STATUS_OK) goto done; @@ -1446,14 +1467,14 @@ do_create_aggr(int argc, char *argv[], const char *use) if (proplist == NULL) return; - status = dladm_name2info(name, &linkid, NULL, NULL, NULL); + status = dladm_name2info(handle, name, &linkid, NULL, NULL, NULL); if (status != DLADM_STATUS_OK) goto done; for (i = 0; i < proplist->al_count; i++) { dladm_arg_info_t *aip = &proplist->al_info[i]; - pstatus = dladm_set_linkprop(linkid, aip->ai_name, + pstatus = dladm_set_linkprop(handle, linkid, aip->ai_name, aip->ai_val, aip->ai_count, flags); if (pstatus != DLADM_STATUS_OK) { @@ -1496,9 +1517,10 @@ i_dladm_aggr_get_linkid(const char *altroot, const char *arg, return (DLADM_STATUS_OK); if (aggr != NULL) { - status = dladm_name2info(aggr, linkidp, NULL, NULL, NULL); + status = dladm_name2info(handle, aggr, linkidp, NULL, NULL, + NULL); } else { - status = dladm_key2linkid(key, linkidp, flags); + status = dladm_key2linkid(handle, key, linkidp, flags); } return (status); @@ -1539,7 +1561,7 @@ do_delete_aggr(int argc, char *argv[], const char *use) if (altroot != NULL) altroot_cmd(altroot, argc, argv); - status = dladm_aggr_delete(linkid, flags); + status = dladm_aggr_delete(handle, linkid, flags); done: if (status != DLADM_STATUS_OK) die_dlerr(status, "delete operation failed"); @@ -1606,20 +1628,21 @@ do_add_aggr(int argc, char *argv[], const char *use) altroot_cmd(altroot, argc, argv); for (n = 0; n < ndev; n++) { - if (dladm_dev2linkid(devs[n], &(port[n].lp_linkid)) != - DLADM_STATUS_OK) { - die("invalid <dev> '%s'", devs[n]); + if ((status = dladm_dev2linkid(handle, devs[n], + &(port[n].lp_linkid))) != DLADM_STATUS_OK) { + die_dlerr(status, "invalid <dev> '%s'", devs[n]); } } for (n = 0; n < nlink; n++) { - if (dladm_name2info(links[n], &port[n + ndev].lp_linkid, - NULL, NULL, NULL) != DLADM_STATUS_OK) { - die("invalid <link> '%s'", links[n]); + if ((status = dladm_name2info(handle, links[n], + &port[n + ndev].lp_linkid, NULL, NULL, NULL)) != + DLADM_STATUS_OK) { + die_dlerr(status, "invalid <link> '%s'", links[n]); } } - status = dladm_aggr_add(linkid, ndev + nlink, port, flags); + status = dladm_aggr_add(handle, linkid, ndev + nlink, port, flags); done: if (status != DLADM_STATUS_OK) { /* @@ -1631,6 +1654,7 @@ done: gettext("%s: add operation failed: %s\n"), progname, gettext("link capabilities don't match")); + dladm_close(handle); exit(ENOTSUP); } else if (status == DLADM_STATUS_NONOTIF) { die_dlerr(status, "not all links have link up/down " @@ -1698,20 +1722,21 @@ do_remove_aggr(int argc, char *argv[], const char *use) altroot_cmd(altroot, argc, argv); for (n = 0; n < ndev; n++) { - if (dladm_dev2linkid(devs[n], &(port[n].lp_linkid)) != - DLADM_STATUS_OK) { - die("invalid <dev> '%s'", devs[n]); + if ((status = dladm_dev2linkid(handle, devs[n], + &(port[n].lp_linkid))) != DLADM_STATUS_OK) { + die_dlerr(status, "invalid <dev> '%s'", devs[n]); } } for (n = 0; n < nlink; n++) { - if (dladm_name2info(links[n], &port[n + ndev].lp_linkid, - NULL, NULL, NULL) != DLADM_STATUS_OK) { - die("invalid <link> '%s'", links[n]); + if ((status = dladm_name2info(handle, links[n], + &port[n + ndev].lp_linkid, NULL, NULL, NULL)) != + DLADM_STATUS_OK) { + die_dlerr(status, "invalid <link> '%s'", links[n]); } } - status = dladm_aggr_remove(linkid, ndev + nlink, port, flags); + status = dladm_aggr_remove(handle, linkid, ndev + nlink, port, flags); done: if (status != DLADM_STATUS_OK) die_dlerr(status, "remove operation failed"); @@ -1800,8 +1825,9 @@ do_modify_aggr(int argc, char *argv[], const char *use) if (altroot != NULL) altroot_cmd(altroot, argc, argv); - status = dladm_aggr_modify(linkid, modify_mask, policy, mac_addr_fixed, - (const uchar_t *)mac_addr, lacp_mode, lacp_timer, flags); + status = dladm_aggr_modify(handle, linkid, modify_mask, policy, + mac_addr_fixed, (const uchar_t *)mac_addr, lacp_mode, lacp_timer, + flags); done: if (status != DLADM_STATUS_OK) @@ -1820,14 +1846,13 @@ do_up_aggr(int argc, char *argv[], const char *use) */ if (argc == 2) { if ((status = i_dladm_aggr_get_linkid(NULL, argv[1], &linkid, - DLADM_OPT_PERSIST)) != DLADM_STATUS_OK) { + DLADM_OPT_PERSIST)) != DLADM_STATUS_OK) goto done; - } } else if (argc > 2) { usage(); } - status = dladm_aggr_up(linkid); + status = dladm_aggr_up(handle, linkid); done: if (status != DLADM_STATUS_OK) { if (argc == 2) { @@ -1915,13 +1940,13 @@ do_create_vlan(int argc, char *argv[], const char *use) if (altroot != NULL) altroot_cmd(altroot, argc, argv); - if (dladm_name2info(link, &dev_linkid, NULL, NULL, NULL) != + if (dladm_name2info(handle, link, &dev_linkid, NULL, NULL, NULL) != DLADM_STATUS_OK) { die("invalid link name '%s'", link); } - if ((status = dladm_vlan_create(vlan, dev_linkid, vid, proplist, flags, - &linkid)) != DLADM_STATUS_OK) { + if ((status = dladm_vlan_create(handle, vlan, dev_linkid, vid, proplist, + flags, &linkid)) != DLADM_STATUS_OK) { die_dlerr(status, "create operation over %s failed", link); } } @@ -1957,11 +1982,12 @@ do_delete_vlan(int argc, char *argv[], const char *use) if (altroot != NULL) altroot_cmd(altroot, argc, argv); - status = dladm_name2info(argv[optind], &linkid, NULL, NULL, NULL); + status = dladm_name2info(handle, argv[optind], &linkid, NULL, NULL, + NULL); if (status != DLADM_STATUS_OK) goto done; - status = dladm_vlan_delete(linkid, flags); + status = dladm_vlan_delete(handle, linkid, flags); done: if (status != DLADM_STATUS_OK) die_dlerr(status, "delete operation failed"); @@ -2003,7 +2029,8 @@ do_rename_link(int argc, char *argv[], const char *use) link1 = argv[optind++]; link2 = argv[optind]; - if ((status = dladm_rename_link(link1, link2)) != DLADM_STATUS_OK) + if ((status = dladm_rename_link(handle, link1, link2)) != + DLADM_STATUS_OK) die_dlerr(status, "rename operation failed"); } @@ -2019,12 +2046,12 @@ do_delete_phys(int argc, char *argv[], const char *use) usage(); if (argc == 2) { - status = dladm_name2info(argv[1], &linkid, NULL, NULL, NULL); - if (status != DLADM_STATUS_OK) + if ((status = dladm_name2info(handle, argv[1], &linkid, NULL, + NULL, NULL)) != DLADM_STATUS_OK) die_dlerr(status, "cannot delete '%s'", argv[1]); } - if ((status = dladm_phys_delete(linkid)) != DLADM_STATUS_OK) { + if ((status = dladm_phys_delete(handle, linkid)) != DLADM_STATUS_OK) { if (argc == 2) die_dlerr(status, "cannot delete '%s'", argv[1]); else @@ -2034,7 +2061,7 @@ do_delete_phys(int argc, char *argv[], const char *use) /*ARGSUSED*/ static int -i_dladm_walk_linkmap(datalink_id_t linkid, void *arg) +i_dladm_walk_linkmap(dladm_handle_t dh, datalink_id_t linkid, void *arg) { char name[MAXLINKNAMELEN]; char mediabuf[DLADM_STRSIZE]; @@ -2043,7 +2070,7 @@ i_dladm_walk_linkmap(datalink_id_t linkid, void *arg) uint32_t media; uint32_t flags; - if (dladm_datalink_id2info(linkid, &flags, &class, &media, name, + if (dladm_datalink_id2info(dh, linkid, &flags, &class, &media, name, MAXLINKNAMELEN) == DLADM_STATUS_OK) { (void) dladm_class2str(class, classbuf); (void) dladm_media2str(media, mediabuf); @@ -2062,7 +2089,8 @@ do_show_linkmap(int argc, char *argv[], const char *use) (void) printf("%-12s%8s %-12s%-20s %6s\n", "NAME", "LINKID", "CLASS", "MEDIA", "FLAGS"); - (void) dladm_walk_datalink_id(i_dladm_walk_linkmap, NULL, + + (void) dladm_walk_datalink_id(i_dladm_walk_linkmap, handle, NULL, DATALINK_CLASS_ALL, DATALINK_ANY_MEDIATYPE, DLADM_OPT_ACTIVE | DLADM_OPT_PERSIST); } @@ -2072,18 +2100,18 @@ do_show_linkmap(int argc, char *argv[], const char *use) */ /*ARGSUSED*/ static int -purge_phys(datalink_id_t linkid, void *arg) +purge_phys(dladm_handle_t dh, datalink_id_t linkid, void *arg) { datalink_class_t class; uint32_t flags; - if (dladm_datalink_id2info(linkid, &flags, &class, NULL, - NULL, 0) != DLADM_STATUS_OK) { + if (dladm_datalink_id2info(dh, linkid, &flags, &class, NULL, NULL, 0) + != DLADM_STATUS_OK) { return (DLADM_WALK_CONTINUE); } if (class == DATALINK_CLASS_PHYS && !(flags & DLADM_OPT_ACTIVE)) - (void) dladm_phys_delete(linkid); + (void) dladm_phys_delete(dh, linkid); return (DLADM_WALK_CONTINUE); } @@ -2092,7 +2120,7 @@ purge_phys(datalink_id_t linkid, void *arg) static void do_init_phys(int argc, char *argv[], const char *use) { - di_node_t devtree; + di_node_t devtree; if (argc > 1) usage(); @@ -2104,7 +2132,7 @@ do_init_phys(int argc, char *argv[], const char *use) if ((devtree = di_init("/", DINFOFORCE | DINFOSUBTREE)) != DI_NODE_NIL) di_fini(devtree); - (void) dladm_walk_datalink_id(purge_phys, NULL, + (void) dladm_walk_datalink_id(purge_phys, handle, NULL, DATALINK_CLASS_PHYS, DATALINK_ANY_MEDIATYPE, DLADM_OPT_PERSIST); } @@ -2128,11 +2156,11 @@ print_link_topology(show_state_t *state, datalink_id_t linkid, if (class == DATALINK_CLASS_VLAN) { dladm_vlan_attr_t vinfo; - status = dladm_vlan_info(linkid, &vinfo, flags); + status = dladm_vlan_info(handle, linkid, &vinfo, flags); if (status != DLADM_STATUS_OK) goto done; - status = dladm_datalink_id2info(vinfo.dv_linkid, NULL, NULL, - NULL, lbuf->link_over, sizeof (lbuf->link_over)); + status = dladm_datalink_id2info(handle, vinfo.dv_linkid, NULL, + NULL, NULL, lbuf->link_over, sizeof (lbuf->link_over)); if (status != DLADM_STATUS_OK) goto done; } else if (class == DATALINK_CLASS_AGGR) { @@ -2141,7 +2169,7 @@ print_link_topology(show_state_t *state, datalink_id_t linkid, (void) sprintf(lbuf->link_over, ""); - status = dladm_aggr_info(linkid, &ginfo, flags); + status = dladm_aggr_info(handle, linkid, &ginfo, flags); if (status != DLADM_STATUS_OK) goto done; @@ -2150,7 +2178,7 @@ print_link_topology(show_state_t *state, datalink_id_t linkid, goto done; } for (i = 0; i < ginfo.lg_nports; i++) { - status = dladm_datalink_id2info( + status = dladm_datalink_id2info(handle, ginfo.lg_ports[i].lp_linkid, NULL, NULL, NULL, tmpbuf, sizeof (tmpbuf)); if (status != DLADM_STATUS_OK) { @@ -2168,9 +2196,10 @@ print_link_topology(show_state_t *state, datalink_id_t linkid, } else if (class == DATALINK_CLASS_VNIC) { dladm_vnic_attr_t vinfo; - if ((status = dladm_vnic_info(linkid, &vinfo, flags)) != - DLADM_STATUS_OK || (status = dladm_datalink_id2info( - vinfo.va_link_id, NULL, NULL, NULL, lbuf->link_over, + if ((status = dladm_vnic_info(handle, linkid, &vinfo, flags)) != + DLADM_STATUS_OK || + (status = dladm_datalink_id2info(handle, vinfo.va_link_id, + NULL, NULL, NULL, lbuf->link_over, sizeof (lbuf->link_over)) != DLADM_STATUS_OK)) { goto done; } @@ -2188,8 +2217,8 @@ print_link(show_state_t *state, datalink_id_t linkid, link_fields_buf_t *lbuf) uint32_t flags; dladm_status_t status; - if ((status = dladm_datalink_id2info(linkid, &flags, &class, NULL, - link, sizeof (link))) != DLADM_STATUS_OK) { + if ((status = dladm_datalink_id2info(handle, linkid, &flags, &class, + NULL, link, sizeof (link))) != DLADM_STATUS_OK) { goto done; } @@ -2206,7 +2235,7 @@ print_link(show_state_t *state, datalink_id_t linkid, link_fields_buf_t *lbuf) dlpi_handle_t dh; dlpi_info_t dlinfo; - if ((status = dladm_phys_info(linkid, &dpa, + if ((status = dladm_phys_info(handle, linkid, &dpa, DLADM_OPT_ACTIVE)) != DLADM_STATUS_OK) { goto done; } @@ -2234,7 +2263,7 @@ print_link(show_state_t *state, datalink_id_t linkid, link_fields_buf_t *lbuf) mtu = dlinfo.di_max_sdu; } else { link_mtu: - status = dladm_info(linkid, &dlattr); + status = dladm_info(handle, linkid, &dlattr); if (status != DLADM_STATUS_OK) goto done; mtu = dlattr.da_max_sdu; @@ -2258,8 +2287,9 @@ done: return (status); } +/* ARGSUSED */ static int -show_link(datalink_id_t linkid, void *arg) +show_link(dladm_handle_t dh, datalink_id_t linkid, void *arg) { show_state_t *state = (show_state_t *)arg; dladm_status_t status; @@ -2288,7 +2318,7 @@ done: } static int -show_link_stats(datalink_id_t linkid, void *arg) +show_link_stats(dladm_handle_t dh, datalink_id_t linkid, void *arg) { char link[DLPI_LINKNAME_MAX]; datalink_class_t class; @@ -2304,13 +2334,13 @@ show_link_stats(datalink_id_t linkid, void *arg) bzero(&state->ls_prevstats, sizeof (state->ls_prevstats)); } - if (dladm_datalink_id2info(linkid, NULL, &class, NULL, link, + if (dladm_datalink_id2info(dh, linkid, NULL, &class, NULL, link, DLPI_LINKNAME_MAX) != DLADM_STATUS_OK) { return (DLADM_WALK_CONTINUE); } if (class == DATALINK_CLASS_PHYS) { - if (dladm_phys_info(linkid, &dpa, DLADM_OPT_ACTIVE) != + if (dladm_phys_info(dh, linkid, &dpa, DLADM_OPT_ACTIVE) != DLADM_STATUS_OK) { return (DLADM_WALK_CONTINUE); } @@ -2394,13 +2424,14 @@ print_xaggr_callback(print_field_t *pf, void *arg) if (is_port) { portnum = l->laggr_lport; portp = &(l->laggr_ginfop->lg_ports[portnum]); - if ((status = dladm_datalink_id2info(portp->lp_linkid, - NULL, NULL, NULL, buf, sizeof (buf))) != + if ((status = dladm_datalink_id2info(handle, + portp->lp_linkid, NULL, NULL, NULL, buf, sizeof (buf))) != DLADM_STATUS_OK) { goto err; } - if ((status = dladm_phys_info(portp->lp_linkid, &dpa, - DLADM_OPT_ACTIVE)) != DLADM_STATUS_OK) { + + if ((status = dladm_phys_info(handle, portp->lp_linkid, + &dpa, DLADM_OPT_ACTIVE)) != DLADM_STATUS_OK) { goto err; } } @@ -2520,7 +2551,8 @@ print_lacp_callback(print_field_t *pf, void *arg) portnum = l->laggr_lport; portp = &(l->laggr_ginfop->lg_ports[portnum]); - if ((status = dladm_datalink_id2info(portp->lp_linkid, + + if ((status = dladm_datalink_id2info(handle, portp->lp_linkid, NULL, NULL, NULL, buf, sizeof (buf))) != DLADM_STATUS_OK) { goto err; } @@ -2623,15 +2655,16 @@ print_aggr_stats_callback(print_field_t *pf, void *arg) if (is_port) { portnum = l->laggr_lport; portp = &(l->laggr_ginfop->lg_ports[portnum]); - if ((status = dladm_phys_info(portp->lp_linkid, &dpa, - DLADM_OPT_ACTIVE)) != DLADM_STATUS_OK) { + if ((status = dladm_phys_info(handle, portp->lp_linkid, + &dpa, DLADM_OPT_ACTIVE)) != DLADM_STATUS_OK) { goto err; } get_mac_stats(dpa.dp_dev, &port_stat); - if ((status = dladm_datalink_id2info(portp->lp_linkid, NULL, - NULL, NULL, buf, sizeof (buf))) != DLADM_STATUS_OK) { + if ((status = dladm_datalink_id2info(handle, + portp->lp_linkid, NULL, NULL, NULL, buf, sizeof (buf))) != + DLADM_STATUS_OK) { goto err; } @@ -2685,7 +2718,6 @@ print_aggr_stats_callback(print_field_t *pf, void *arg) } else { (void) snprintf(buf, sizeof (buf), "%llu", l->laggr_pktsumtot->obytes); - } break; @@ -2733,7 +2765,7 @@ print_aggr_stats(show_grp_state_t *state, const char *link, for (i = 0; i < ginfop->lg_nports; i++) { portp = &(ginfop->lg_ports[i]); - if ((status = dladm_phys_info(portp->lp_linkid, &dpa, + if ((status = dladm_phys_info(handle, portp->lp_linkid, &dpa, DLADM_OPT_ACTIVE)) != DLADM_STATUS_OK) { goto done; } @@ -2783,15 +2815,15 @@ print_aggr(show_grp_state_t *state, datalink_id_t linkid) dladm_status_t status; bzero(&ginfo, sizeof (dladm_aggr_grp_attr_t)); - if ((status = dladm_datalink_id2info(linkid, &flags, NULL, NULL, link, - MAXLINKNAMELEN)) != DLADM_STATUS_OK) { + if ((status = dladm_datalink_id2info(handle, linkid, &flags, NULL, + NULL, link, MAXLINKNAMELEN)) != DLADM_STATUS_OK) { return (status); } if (!(state->gs_flags & flags)) return (DLADM_STATUS_NOTFOUND); - status = dladm_aggr_info(linkid, &ginfo, state->gs_flags); + status = dladm_aggr_info(handle, linkid, &ginfo, state->gs_flags); if (status != DLADM_STATUS_OK) return (status); @@ -2801,23 +2833,22 @@ print_aggr(show_grp_state_t *state, datalink_id_t linkid) status = print_aggr_extended(state, link, &ginfo); else if (state->gs_stats) status = print_aggr_stats(state, link, &ginfo); - else { + else status = print_aggr_info(state, link, &ginfo); - } done: free(ginfo.lg_ports); return (status); } +/* ARGSUSED */ static int -show_aggr(datalink_id_t linkid, void *arg) +show_aggr(dladm_handle_t dh, datalink_id_t linkid, void *arg) { show_grp_state_t *state = arg; dladm_status_t status; - status = print_aggr(state, linkid); - if (status != DLADM_STATUS_OK) + if ((status = print_aggr(state, linkid)) != DLADM_STATUS_OK) goto done; done: @@ -2917,9 +2948,10 @@ do_show_link(int argc, char *argv[], const char *use) (void) fprintf(stderr, gettext("%s: link name too long\n"), progname); + dladm_close(handle); exit(1); } - if ((status = dladm_name2info(linkname, &linkid, &f, + if ((status = dladm_name2info(handle, linkname, &linkid, &f, NULL, NULL)) != DLADM_STATUS_OK) { die_dlerr(status, "link %s is not valid", linkname); } @@ -2937,7 +2969,7 @@ do_show_link(int argc, char *argv[], const char *use) die("-p requires -o"); if (S_arg) { - dladm_continuous(linkid, NULL, interval, LINK_REPORT); + dladm_continuous(handle, linkid, NULL, interval, LINK_REPORT); return; } @@ -2972,10 +3004,10 @@ do_show_link(int argc, char *argv[], const char *use) state.ls_print.ps_nfields = nfields; if (linkid == DATALINK_ALL_LINKID) { - (void) dladm_walk_datalink_id(show_link, &state, + (void) dladm_walk_datalink_id(show_link, handle, &state, DATALINK_CLASS_ALL, DATALINK_ANY_MEDIATYPE, flags); } else { - (void) show_link(linkid, &state); + (void) show_link(handle, linkid, &state); if (state.ls_status != DLADM_STATUS_OK) { die_dlerr(state.ls_status, "failed to show link %s", argv[optind]); @@ -3090,10 +3122,10 @@ do_show_aggr(int argc, char *argv[], const char *use) /* get aggregation key or aggrname (optional last argument) */ if (optind == (argc-1)) { if (!str2int(argv[optind], &key)) { - status = dladm_name2info(argv[optind], &linkid, NULL, - NULL, NULL); + status = dladm_name2info(handle, argv[optind], + &linkid, NULL, NULL, NULL); } else { - status = dladm_key2linkid((uint16_t)key, + status = dladm_key2linkid(handle, (uint16_t)key, &linkid, DLADM_OPT_ACTIVE); } @@ -3152,10 +3184,10 @@ do_show_aggr(int argc, char *argv[], const char *use) } if (linkid == DATALINK_ALL_LINKID) { - (void) dladm_walk_datalink_id(show_aggr, &state, + (void) dladm_walk_datalink_id(show_aggr, handle, &state, DATALINK_CLASS_AGGR, DATALINK_ANY_MEDIATYPE, flags); } else { - (void) show_aggr(linkid, &state); + (void) show_aggr(handle, linkid, &state); if (state.gs_status != DLADM_STATUS_OK) { die_dlerr(state.gs_status, "failed to show aggr %s", argv[optind]); @@ -3171,7 +3203,7 @@ print_phys_default(show_state_t *state, datalink_id_t linkid, dladm_status_t status; link_fields_buf_t pattr; - status = dladm_phys_info(linkid, &dpa, state->ls_flags); + status = dladm_phys_info(handle, linkid, &dpa, state->ls_flags); if (status != DLADM_STATUS_OK) goto done; @@ -3337,7 +3369,7 @@ print_phys_mac(show_state_t *state, datalink_id_t linkid, char *link) mac_state.ms_state = state; mac_state.ms_link = link; - return (dladm_walk_macaddr(linkid, &mac_state, + return (dladm_walk_macaddr(handle, linkid, &mac_state, print_phys_mac_callback)); } @@ -3367,7 +3399,7 @@ print_phys_hwgrp(show_state_t *state, datalink_id_t linkid, char *link) hwgrp_state.hs_state = state; hwgrp_state.hs_link = link; - return (dladm_walk_hwgrp(linkid, &hwgrp_state, + return (dladm_walk_hwgrp(handle, linkid, &hwgrp_state, print_phys_hwgrp_callback)); } @@ -3380,8 +3412,8 @@ print_phys(show_state_t *state, datalink_id_t linkid) datalink_class_t class; uint32_t media; - if ((status = dladm_datalink_id2info(linkid, &flags, &class, &media, - link, MAXLINKNAMELEN)) != DLADM_STATUS_OK) { + if ((status = dladm_datalink_id2info(handle, linkid, &flags, &class, + &media, link, MAXLINKNAMELEN)) != DLADM_STATUS_OK) { goto done; } @@ -3406,8 +3438,9 @@ done: return (status); } +/* ARGSUSED */ static int -show_phys(datalink_id_t linkid, void *arg) +show_phys(dladm_handle_t dh, datalink_id_t linkid, void *arg) { show_state_t *state = arg; @@ -3425,7 +3458,7 @@ print_vlan(show_state_t *state, datalink_id_t linkid, link_fields_buf_t *l) uint32_t flags; dladm_status_t status; - if ((status = dladm_datalink_id2info(linkid, &flags, NULL, NULL, + if ((status = dladm_datalink_id2info(handle, linkid, &flags, NULL, NULL, l->link_name, sizeof (l->link_name))) != DLADM_STATUS_OK) { goto done; } @@ -3435,10 +3468,11 @@ print_vlan(show_state_t *state, datalink_id_t linkid, link_fields_buf_t *l) goto done; } - if ((status = dladm_vlan_info(linkid, &vinfo, state->ls_flags)) != - DLADM_STATUS_OK || (status = dladm_datalink_id2info( - vinfo.dv_linkid, NULL, NULL, NULL, l->link_over, - sizeof (l->link_over))) != DLADM_STATUS_OK) { + if ((status = dladm_vlan_info(handle, linkid, &vinfo, + state->ls_flags)) != DLADM_STATUS_OK || + (status = dladm_datalink_id2info(handle, vinfo.dv_linkid, NULL, + NULL, NULL, l->link_over, sizeof (l->link_over))) != + DLADM_STATUS_OK) { goto done; } @@ -3451,8 +3485,9 @@ done: return (status); } +/* ARGSUSED */ static int -show_vlan(datalink_id_t linkid, void *arg) +show_vlan(dladm_handle_t dh, datalink_id_t linkid, void *arg) { show_state_t *state = arg; dladm_status_t status; @@ -3544,8 +3579,8 @@ do_show_phys(int argc, char *argv[], const char *use) /* get link name (optional last argument) */ if (optind == (argc-1)) { - if ((status = dladm_name2info(argv[optind], &linkid, NULL, - NULL, NULL)) != DLADM_STATUS_OK) { + if ((status = dladm_name2info(handle, argv[optind], &linkid, + NULL, NULL, NULL)) != DLADM_STATUS_OK) { die_dlerr(status, "link %s is not valid", argv[optind]); } } else if (optind != argc) { @@ -3601,10 +3636,10 @@ do_show_phys(int argc, char *argv[], const char *use) state.ls_print.ps_nfields = nfields; if (linkid == DATALINK_ALL_LINKID) { - (void) dladm_walk_datalink_id(show_phys, &state, + (void) dladm_walk_datalink_id(show_phys, handle, &state, DATALINK_CLASS_PHYS, DATALINK_ANY_MEDIATYPE, flags); } else { - (void) show_phys(linkid, &state); + (void) show_phys(handle, linkid, &state); if (state.ls_status != DLADM_STATUS_OK) { die_dlerr(state.ls_status, "failed to show physical link %s", argv[optind]); @@ -3663,8 +3698,8 @@ do_show_vlan(int argc, char *argv[], const char *use) /* get link name (optional last argument) */ if (optind == (argc-1)) { - if ((status = dladm_name2info(argv[optind], &linkid, NULL, - NULL, NULL)) != DLADM_STATUS_OK) { + if ((status = dladm_name2info(handle, argv[optind], &linkid, + NULL, NULL, NULL)) != DLADM_STATUS_OK) { die_dlerr(status, "link %s is not valid", argv[optind]); } } else if (optind != argc) { @@ -3689,10 +3724,10 @@ do_show_vlan(int argc, char *argv[], const char *use) state.ls_print.ps_nfields = nfields; if (linkid == DATALINK_ALL_LINKID) { - (void) dladm_walk_datalink_id(show_vlan, &state, + (void) dladm_walk_datalink_id(show_vlan, handle, &state, DATALINK_CLASS_VLAN, DATALINK_ANY_MEDIATYPE, flags); } else { - (void) show_vlan(linkid, &state); + (void) show_vlan(handle, linkid, &state); if (state.ls_status != DLADM_STATUS_OK) { die_dlerr(state.ls_status, "failed to show vlan %s", argv[optind]); @@ -3752,7 +3787,6 @@ do_create_vnic(int argc, char *argv[], const char *use) die("invalid MAC address"); else die("out of memory"); - exit(1); } } break; @@ -3774,7 +3808,6 @@ do_create_vnic(int argc, char *argv[], const char *use) die("invalid MAC address"); else die("out of memory"); - exit(1); } break; case 'v': @@ -3824,12 +3857,13 @@ do_create_vnic(int argc, char *argv[], const char *use) if (altroot != NULL) altroot_cmd(altroot, argc, argv); - if (dladm_name2info(devname, &dev_linkid, NULL, NULL, NULL) != + if (dladm_name2info(handle, devname, &dev_linkid, NULL, NULL, NULL) != DLADM_STATUS_OK) die("invalid link name '%s'", devname); - status = dladm_vnic_create(name, dev_linkid, mac_addr_type, mac_addr, - maclen, &mac_slot, mac_prefix_len, vid, &linkid, proplist, flags); + status = dladm_vnic_create(handle, name, dev_linkid, mac_addr_type, + mac_addr, maclen, &mac_slot, mac_prefix_len, vid, &linkid, proplist, + flags); if (status != DLADM_STATUS_OK) die_dlerr(status, "vnic creation over %s failed", devname); @@ -3843,7 +3877,7 @@ do_etherstub_check(const char *name, datalink_id_t linkid, boolean_t etherstub, boolean_t is_etherstub; dladm_vnic_attr_t attr; - if (dladm_vnic_info(linkid, &attr, flags) != DLADM_STATUS_OK) { + if (dladm_vnic_info(handle, linkid, &attr, flags) != DLADM_STATUS_OK) { /* * Let the delete continue anyway. */ @@ -3888,7 +3922,8 @@ do_delete_vnic_common(int argc, char *argv[], const char *use, if (altroot != NULL) altroot_cmd(altroot, argc, argv); - status = dladm_name2info(argv[optind], &linkid, NULL, NULL, NULL); + status = dladm_name2info(handle, argv[optind], &linkid, NULL, NULL, + NULL); if (status != DLADM_STATUS_OK) die("invalid link name '%s'", argv[optind]); @@ -3901,7 +3936,7 @@ do_delete_vnic_common(int argc, char *argv[], const char *use, DLADM_OPT_PERSIST); } - status = dladm_vnic_delete(linkid, flags); + status = dladm_vnic_delete(handle, linkid, flags); if (status != DLADM_STATUS_OK) die_dlerr(status, "vnic deletion failed"); } @@ -3926,7 +3961,8 @@ do_up_vnic_common(int argc, char *argv[], const char *use, boolean_t vlan) * get the id or the name of the vnic/vlan (optional last argument) */ if (argc == 2) { - status = dladm_name2info(argv[1], &linkid, NULL, NULL, NULL); + status = dladm_name2info(handle, argv[1], &linkid, NULL, NULL, + NULL); if (status != DLADM_STATUS_OK) goto done; @@ -3935,9 +3971,9 @@ do_up_vnic_common(int argc, char *argv[], const char *use, boolean_t vlan) } if (vlan) - status = dladm_vlan_up(linkid); + status = dladm_vlan_up(handle, linkid); else - status = dladm_vnic_up(linkid, 0); + status = dladm_vnic_up(handle, linkid, 0); done: if (status != DLADM_STATUS_OK) { @@ -4020,7 +4056,7 @@ print_vnic(show_vnic_state_t *state, datalink_id_t linkid) char mstr[MAXMACADDRLEN * 3]; vnic_fields_buf_t vbuf; - if ((status = dladm_vnic_info(linkid, vnic, state->vs_flags)) != + if ((status = dladm_vnic_info(handle, linkid, vnic, state->vs_flags)) != DLADM_STATUS_OK) return (status); @@ -4038,13 +4074,13 @@ print_vnic(show_vnic_state_t *state, datalink_id_t linkid) return (DLADM_STATUS_OK); } - if (dladm_datalink_id2info(linkid, NULL, NULL, + if (dladm_datalink_id2info(handle, linkid, NULL, NULL, NULL, vnic_name, sizeof (vnic_name)) != DLADM_STATUS_OK) return (DLADM_STATUS_BADARG); bzero(devname, sizeof (devname)); if (!is_etherstub && - dladm_datalink_id2info(vnic->va_link_id, NULL, NULL, + dladm_datalink_id2info(handle, vnic->va_link_id, NULL, NULL, NULL, devname, sizeof (devname)) != DLADM_STATUS_OK) return (DLADM_STATUS_BADARG); @@ -4130,8 +4166,9 @@ print_vnic(show_vnic_state_t *state, datalink_id_t linkid) } } +/* ARGSUSED */ static int -show_vnic(datalink_id_t linkid, void *arg) +show_vnic(dladm_handle_t dh, datalink_id_t linkid, void *arg) { show_vnic_state_t *state = arg; @@ -4216,7 +4253,7 @@ do_show_vnic_common(int argc, char *argv[], const char *use, /* get vnic ID (optional last argument) */ if (optind == (argc - 1)) { - status = dladm_name2info(argv[optind], &linkid, NULL, + status = dladm_name2info(handle, argv[optind], &linkid, NULL, NULL, NULL); if (status != DLADM_STATUS_OK) { die_dlerr(status, "invalid vnic name '%s'", @@ -4228,8 +4265,8 @@ do_show_vnic_common(int argc, char *argv[], const char *use, } if (l_arg) { - status = dladm_name2info(state.vs_link, &dev_linkid, NULL, - NULL, NULL); + status = dladm_name2info(handle, state.vs_link, &dev_linkid, + NULL, NULL, NULL); if (status != DLADM_STATUS_OK) { die_dlerr(status, "invalid link name '%s'", state.vs_link); @@ -4273,11 +4310,11 @@ do_show_vnic_common(int argc, char *argv[], const char *use, state.vs_donefirst = B_FALSE; if (linkid == DATALINK_ALL_LINKID) { - (void) dladm_walk_datalink_id(show_vnic, &state, + (void) dladm_walk_datalink_id(show_vnic, handle, &state, DATALINK_CLASS_VNIC | DATALINK_CLASS_ETHERSTUB, DATALINK_ANY_MEDIATYPE, DLADM_OPT_ACTIVE); } else { - (void) show_vnic(linkid, &state); + (void) show_vnic(handle, linkid, &state); if (state.vs_status != DLADM_STATUS_OK) { die_dlerr(state.vs_status, "failed to show vnic '%s'", state.vs_vnic); @@ -4333,7 +4370,7 @@ do_create_etherstub(int argc, char *argv[], const char *use) if (altroot != NULL) altroot_cmd(altroot, argc, argv); - status = dladm_vnic_create(name, DATALINK_INVALID_LINKID, + status = dladm_vnic_create(handle, name, DATALINK_INVALID_LINKID, VNIC_MAC_ADDR_TYPE_AUTO, mac_addr, ETHERADDRL, NULL, 0, 0, NULL, NULL, flags); if (status != DLADM_STATUS_OK) @@ -4383,11 +4420,11 @@ link_stats(datalink_id_t linkid, uint_t interval, char *fields_str, for (;;) { state->ls_donefirst = B_FALSE; if (linkid == DATALINK_ALL_LINKID) { - (void) dladm_walk_datalink_id(show_link_stats, state, - DATALINK_CLASS_ALL, DATALINK_ANY_MEDIATYPE, + (void) dladm_walk_datalink_id(show_link_stats, handle, + state, DATALINK_CLASS_ALL, DATALINK_ANY_MEDIATYPE, DLADM_OPT_ACTIVE); } else { - (void) show_link_stats(linkid, state); + (void) show_link_stats(handle, linkid, state); } if (interval == 0) @@ -4409,11 +4446,11 @@ aggr_stats(datalink_id_t linkid, show_grp_state_t *state, uint_t interval) for (;;) { state->gs_donefirst = B_FALSE; if (linkid == DATALINK_ALL_LINKID) - (void) dladm_walk_datalink_id(show_aggr, state, + (void) dladm_walk_datalink_id(show_aggr, handle, state, DATALINK_CLASS_AGGR, DATALINK_ANY_MEDIATYPE, DLADM_OPT_ACTIVE); else - (void) show_aggr(linkid, state); + (void) show_aggr(handle, linkid, state); if (interval == 0) break; @@ -4452,11 +4489,11 @@ vnic_stats(show_vnic_state_t *sp, uint32_t interval) state.vs_flags = DLADM_OPT_ACTIVE; if (!specific_link) { - (void) dladm_walk_datalink_id(show_vnic, &state, + (void) dladm_walk_datalink_id(show_vnic, handle, &state, DATALINK_CLASS_VNIC, DATALINK_ANY_MEDIATYPE, DLADM_OPT_ACTIVE); } else { - (void) show_vnic(sp->vs_vnic_id, &state); + (void) show_vnic(handle, sp->vs_vnic_id, &state); if (state.vs_status != DLADM_STATUS_OK) { die_dlerr(state.vs_status, "failed to show vnic '%s'", sp->vs_vnic); @@ -4486,11 +4523,11 @@ vnic_stats(show_vnic_state_t *sp, uint32_t interval) state.vs_printstats = B_TRUE; if (!specific_link) { - (void) dladm_walk_datalink_id(show_vnic, &state, + (void) dladm_walk_datalink_id(show_vnic, handle, &state, DATALINK_CLASS_VNIC, DATALINK_ANY_MEDIATYPE, DLADM_OPT_ACTIVE); } else { - (void) show_vnic(sp->vs_vnic_id, &state); + (void) show_vnic(handle, sp->vs_vnic_id, &state); if (state.vs_status != DLADM_STATUS_OK) { die_dlerr(state.vs_status, "failed to show vnic '%s'", sp->vs_vnic); @@ -4893,19 +4930,19 @@ print_scan_results(void *arg, dladm_wlan_attr_t *attrp) } static int -scan_wifi(datalink_id_t linkid, void *arg) +scan_wifi(dladm_handle_t dh, datalink_id_t linkid, void *arg) { print_wifi_state_t *statep = arg; dladm_status_t status; char link[MAXLINKNAMELEN]; - if ((status = dladm_datalink_id2info(linkid, NULL, NULL, NULL, link, + if ((status = dladm_datalink_id2info(dh, linkid, NULL, NULL, NULL, link, sizeof (link))) != DLADM_STATUS_OK) { return (DLADM_WALK_CONTINUE); } statep->ws_link = link; - status = dladm_wlan_scan(linkid, statep, print_scan_results); + status = dladm_wlan_scan(dh, linkid, statep, print_scan_results); if (status != DLADM_STATUS_OK) die_dlerr(status, "cannot scan link '%s'", statep->ws_link); @@ -4936,7 +4973,7 @@ print_link_attr(print_field_t *wfp, void *warg) } static int -show_wifi(datalink_id_t linkid, void *arg) +show_wifi(dladm_handle_t dh, datalink_id_t linkid, void *arg) { print_wifi_state_t *statep = arg; dladm_wlan_linkattr_t attr; @@ -4944,13 +4981,13 @@ show_wifi(datalink_id_t linkid, void *arg) char link[MAXLINKNAMELEN]; wlan_scan_args_t warg; - if ((status = dladm_datalink_id2info(linkid, NULL, NULL, NULL, link, + if ((status = dladm_datalink_id2info(dh, linkid, NULL, NULL, NULL, link, sizeof (link))) != DLADM_STATUS_OK) { return (DLADM_WALK_CONTINUE); } /* dladm_wlan_get_linkattr() memsets attr with 0 */ - status = dladm_wlan_get_linkattr(linkid, &attr); + status = dladm_wlan_get_linkattr(dh, linkid, &attr); if (status != DLADM_STATUS_OK) die_dlerr(status, "cannot get link attributes for %s", link); @@ -4977,7 +5014,7 @@ do_display_wifi(int argc, char **argv, int cmd, const char *use) int option; char *fields_str = NULL; print_field_t **fields; - int (*callback)(datalink_id_t, void *); + int (*callback)(dladm_handle_t, datalink_id_t, void *); uint_t nfields; print_wifi_state_t state; datalink_id_t linkid = DATALINK_ALL_LINKID; @@ -5014,8 +5051,8 @@ do_display_wifi(int argc, char **argv, int cmd, const char *use) die("\"-o all\" is invalid with -p"); if (optind == (argc - 1)) { - if ((status = dladm_name2info(argv[optind], &linkid, NULL, - NULL, NULL)) != DLADM_STATUS_OK) { + if ((status = dladm_name2info(handle, argv[optind], &linkid, + NULL, NULL, NULL)) != DLADM_STATUS_OK) { die_dlerr(status, "link %s is not valid", argv[optind]); } } else if (optind != argc) { @@ -5030,10 +5067,10 @@ do_display_wifi(int argc, char **argv, int cmd, const char *use) state.ws_print_state.ps_nfields = nfields; if (linkid == DATALINK_ALL_LINKID) { - (void) dladm_walk_datalink_id(callback, &state, + (void) dladm_walk_datalink_id(callback, handle, &state, DATALINK_CLASS_PHYS, DL_WIFI, DLADM_OPT_ACTIVE); } else { - (void) (*callback)(linkid, &state); + (void) (*callback)(handle, linkid, &state); } free(fields); } @@ -5055,8 +5092,9 @@ typedef struct wlan_count_attr { datalink_id_t wc_linkid; } wlan_count_attr_t; +/* ARGSUSED */ static int -do_count_wlan(datalink_id_t linkid, void *arg) +do_count_wlan(dladm_handle_t dh, datalink_id_t linkid, void *arg) { wlan_count_attr_t *cp = arg; @@ -5099,11 +5137,11 @@ parse_wlan_keys(char *str, dladm_wlan_key_t **keys, uint_t *key_countp) } wk[i].wk_len = DLADM_WLAN_MAX_KEY_LEN; - status = dladm_get_secobj(wk[i].wk_name, &class, + status = dladm_get_secobj(handle, wk[i].wk_name, &class, wk[i].wk_val, &wk[i].wk_len, 0); if (status != DLADM_STATUS_OK) { if (status == DLADM_STATUS_NOTFOUND) { - status = dladm_get_secobj(wk[i].wk_name, + status = dladm_get_secobj(handle, wk[i].wk_name, &class, wk[i].wk_val, &wk[i].wk_len, DLADM_OPT_PERSIST); } @@ -5230,8 +5268,8 @@ do_connect_wifi(int argc, char **argv, const char *use) } if (optind == (argc - 1)) { - if ((status = dladm_name2info(argv[optind], &linkid, NULL, - NULL, NULL)) != DLADM_STATUS_OK) { + if ((status = dladm_name2info(handle, argv[optind], &linkid, + NULL, NULL, NULL)) != DLADM_STATUS_OK) { die_dlerr(status, "link %s is not valid", argv[optind]); } } else if (optind != argc) { @@ -5243,7 +5281,7 @@ do_connect_wifi(int argc, char **argv, const char *use) wcattr.wc_linkid = DATALINK_INVALID_LINKID; wcattr.wc_count = 0; - (void) dladm_walk_datalink_id(do_count_wlan, &wcattr, + (void) dladm_walk_datalink_id(do_count_wlan, handle, &wcattr, DATALINK_CLASS_PHYS, DL_WIFI, DLADM_OPT_ACTIVE); if (wcattr.wc_count == 0) { die("no wifi links are available"); @@ -5255,7 +5293,7 @@ do_connect_wifi(int argc, char **argv, const char *use) } attrp = (attr.wa_valid == 0) ? NULL : &attr; again: - if ((status = dladm_wlan_connect(linkid, attrp, timeout, keys, + if ((status = dladm_wlan_connect(handle, linkid, attrp, timeout, keys, key_count, flags)) != DLADM_STATUS_OK) { if ((flags & DLADM_WLAN_CONNECT_NOSCAN) != 0) { /* @@ -5280,11 +5318,11 @@ again: /* ARGSUSED */ static int -do_all_disconnect_wifi(datalink_id_t linkid, void *arg) +do_all_disconnect_wifi(dladm_handle_t dh, datalink_id_t linkid, void *arg) { dladm_status_t status; - status = dladm_wlan_disconnect(linkid); + status = dladm_wlan_disconnect(dh, linkid); if (status != DLADM_STATUS_OK) warn_dlerr(status, "cannot disconnect link"); @@ -5314,8 +5352,8 @@ do_disconnect_wifi(int argc, char **argv, const char *use) } if (optind == (argc - 1)) { - if ((status = dladm_name2info(argv[optind], &linkid, NULL, - NULL, NULL)) != DLADM_STATUS_OK) { + if ((status = dladm_name2info(handle, argv[optind], &linkid, + NULL, NULL, NULL)) != DLADM_STATUS_OK) { die_dlerr(status, "link %s is not valid", argv[optind]); } } else if (optind != argc) { @@ -5326,8 +5364,9 @@ do_disconnect_wifi(int argc, char **argv, const char *use) if (!all_links) { wcattr.wc_linkid = linkid; wcattr.wc_count = 0; - (void) dladm_walk_datalink_id(do_count_wlan, &wcattr, - DATALINK_CLASS_PHYS, DL_WIFI, DLADM_OPT_ACTIVE); + (void) dladm_walk_datalink_id(do_count_wlan, handle, + &wcattr, DATALINK_CLASS_PHYS, DL_WIFI, + DLADM_OPT_ACTIVE); if (wcattr.wc_count == 0) { die("no wifi links are available"); } else if (wcattr.wc_count > 1) { @@ -5337,20 +5376,20 @@ do_disconnect_wifi(int argc, char **argv, const char *use) linkid = wcattr.wc_linkid; } else { (void) dladm_walk_datalink_id(do_all_disconnect_wifi, - NULL, DATALINK_CLASS_PHYS, DL_WIFI, + handle, NULL, DATALINK_CLASS_PHYS, DL_WIFI, DLADM_OPT_ACTIVE); return; } } - status = dladm_wlan_disconnect(linkid); + status = dladm_wlan_disconnect(handle, linkid); if (status != DLADM_STATUS_OK) die_dlerr(status, "cannot disconnect"); } static void print_linkprop(datalink_id_t linkid, show_linkprop_state_t *statep, - const char *propname, dladm_prop_type_t type, - const char *format, char **pptr) + const char *propname, dladm_prop_type_t type, const char *format, + char **pptr) { int i; char *ptr, *lim; @@ -5360,7 +5399,8 @@ print_linkprop(datalink_id_t linkid, show_linkprop_state_t *statep, uint_t valcnt = DLADM_MAX_PROP_VALCNT; dladm_status_t status; - status = dladm_get_linkprop(linkid, type, propname, propvals, &valcnt); + status = dladm_get_linkprop(handle, linkid, type, propname, propvals, + &valcnt); if (status != DLADM_STATUS_OK) { if (status == DLADM_STATUS_TEMPONLY) { if (type == DLADM_PROP_VAL_MODIFIABLE && @@ -5493,7 +5533,7 @@ linkprop_is_supported(datalink_id_t linkid, const char *propname, if (statep->ls_proplist != NULL) return (B_TRUE); - status = dladm_get_linkprop(linkid, DLADM_PROP_VAL_DEFAULT, + status = dladm_get_linkprop(handle, linkid, DLADM_PROP_VAL_DEFAULT, propname, statep->ls_propvals, &valcnt); if (status == DLADM_STATUS_OK) @@ -5503,14 +5543,16 @@ linkprop_is_supported(datalink_id_t linkid, const char *propname, * A system wide default value is not available for the * property. Check if current value can be retrieved. */ - status = dladm_get_linkprop(linkid, DLADM_PROP_VAL_CURRENT, + status = dladm_get_linkprop(handle, linkid, DLADM_PROP_VAL_CURRENT, propname, statep->ls_propvals, &valcnt); return (status == DLADM_STATUS_OK); } +/* ARGSUSED */ static int -show_linkprop(datalink_id_t linkid, const char *propname, void *arg) +show_linkprop(dladm_handle_t dh, datalink_id_t linkid, const char *propname, + void *arg) { show_linkprop_state_t *statep = arg; linkprop_args_t ls_arg; @@ -5595,8 +5637,8 @@ do_show_linkprop(int argc, char **argv, const char *use) die("\"-o all\" is invalid with -c"); if (optind == (argc - 1)) { - if ((status = dladm_name2info(argv[optind], &linkid, NULL, - NULL, NULL)) != DLADM_STATUS_OK) { + if ((status = dladm_name2info(handle, argv[optind], &linkid, + NULL, NULL, NULL)) != DLADM_STATUS_OK) { die_dlerr(status, "link %s is not valid", argv[optind]); } } else if (optind != argc) { @@ -5618,19 +5660,21 @@ do_show_linkprop(int argc, char **argv, const char *use) state.ls_print.ps_fields = fields; state.ls_print.ps_nfields = nfields; if (linkid == DATALINK_ALL_LINKID) { - (void) dladm_walk_datalink_id(show_linkprop_onelink, &state, - DATALINK_CLASS_ALL, DATALINK_ANY_MEDIATYPE, flags); + (void) dladm_walk_datalink_id(show_linkprop_onelink, handle, + &state, DATALINK_CLASS_ALL, DATALINK_ANY_MEDIATYPE, flags); } else { - (void) show_linkprop_onelink(linkid, &state); + (void) show_linkprop_onelink(handle, linkid, &state); } dladm_free_props(proplist); - if (state.ls_retstatus != DLADM_STATUS_OK) + if (state.ls_retstatus != DLADM_STATUS_OK) { + dladm_close(handle); exit(EXIT_FAILURE); + } } static int -show_linkprop_onelink(datalink_id_t linkid, void *arg) +show_linkprop_onelink(dladm_handle_t hdl, datalink_id_t linkid, void *arg) { int i; char *buf; @@ -5641,8 +5685,8 @@ show_linkprop_onelink(datalink_id_t linkid, void *arg) statep->ls_status = DLADM_STATUS_OK; - if (dladm_datalink_id2info(linkid, &flags, NULL, NULL, statep->ls_link, - MAXLINKNAMELEN) != DLADM_STATUS_OK) { + if (dladm_datalink_id2info(hdl, linkid, &flags, NULL, NULL, + statep->ls_link, MAXLINKNAMELEN) != DLADM_STATUS_OK) { statep->ls_status = DLADM_STATUS_NOTFOUND; return (DLADM_WALK_CONTINUE); } @@ -5685,11 +5729,12 @@ show_linkprop_onelink(datalink_id_t linkid, void *arg) if (proplist != NULL) { for (i = 0; i < proplist->al_count; i++) { - (void) show_linkprop(linkid, + (void) show_linkprop(hdl, linkid, proplist->al_info[i].ai_name, statep); } } else { - (void) dladm_walk_linkprop(linkid, statep, show_linkprop); + (void) dladm_walk_linkprop(hdl, linkid, statep, + show_linkprop); } if (dh != NULL) dlpi_close(dh); @@ -5703,8 +5748,8 @@ set_linkprop_persist(datalink_id_t linkid, const char *prop_name, { dladm_status_t status; - status = dladm_set_linkprop(linkid, prop_name, prop_val, val_cnt, - DLADM_OPT_PERSIST); + status = dladm_set_linkprop(handle, linkid, prop_name, prop_val, + val_cnt, DLADM_OPT_PERSIST); if (status != DLADM_STATUS_OK) { warn_dlerr(status, "cannot persistently %s link property '%s'", @@ -5714,12 +5759,13 @@ set_linkprop_persist(datalink_id_t linkid, const char *prop_name, } static int -reset_one_linkprop(datalink_id_t linkid, const char *propname, void *arg) +reset_one_linkprop(dladm_handle_t dh, datalink_id_t linkid, + const char *propname, void *arg) { set_linkprop_state_t *statep = arg; dladm_status_t status; - status = dladm_set_linkprop(linkid, propname, NULL, 0, + status = dladm_set_linkprop(dh, linkid, propname, NULL, 0, DLADM_OPT_ACTIVE); if (status != DLADM_STATUS_OK) { warn_dlerr(status, "cannot reset link property '%s' on '%s'", @@ -5784,7 +5830,8 @@ set_linkprop(int argc, char **argv, boolean_t reset, const char *use) altroot_cmd(altroot, argc, argv); } - status = dladm_name2info(argv[optind], &linkid, NULL, NULL, NULL); + status = dladm_name2info(handle, argv[optind], &linkid, NULL, NULL, + NULL); if (status != DLADM_STATUS_OK) die_dlerr(status, "link %s is not valid", argv[optind]); @@ -5796,7 +5843,8 @@ set_linkprop(int argc, char **argv, boolean_t reset, const char *use) state.ls_temp = temp; state.ls_status = DLADM_STATUS_OK; - (void) dladm_walk_linkprop(linkid, &state, reset_one_linkprop); + (void) dladm_walk_linkprop(handle, linkid, &state, + reset_one_linkprop); status = state.ls_status; goto done; @@ -5821,7 +5869,7 @@ set_linkprop(int argc, char **argv, boolean_t reset, const char *use) continue; } } - s = dladm_set_linkprop(linkid, aip->ai_name, val, count, + s = dladm_set_linkprop(handle, linkid, aip->ai_name, val, count, DLADM_OPT_ACTIVE); if (s == DLADM_STATUS_OK) { if (!temp) { @@ -5856,7 +5904,7 @@ set_linkprop(int argc, char **argv, boolean_t reset, const char *use) DLADM_MAX_PROP_VALCNT + j * DLADM_PROP_VAL_MAX; } - s = dladm_get_linkprop(linkid, + s = dladm_get_linkprop(handle, linkid, DLADM_PROP_VAL_MODIFIABLE, aip->ai_name, propvals, &valcnt); @@ -5898,8 +5946,10 @@ set_linkprop(int argc, char **argv, boolean_t reset, const char *use) } done: dladm_free_props(proplist); - if (status != DLADM_STATUS_OK) + if (status != DLADM_STATUS_OK) { + dladm_close(handle); exit(1); + } } static void @@ -5955,7 +6005,6 @@ convert_secobj(char *buf, uint_t len, uint8_t *obj_val, uint_t *obj_lenp, return (ENOENT); } -/* ARGSUSED */ static void defersig(int sig) { @@ -6209,7 +6258,7 @@ do_create_secobj(int argc, char **argv, const char *use) } } - status = dladm_set_secobj(obj_name, class, obj_val, obj_len, + status = dladm_set_secobj(handle, obj_name, class, obj_val, obj_len, DLADM_OPT_CREATE | DLADM_OPT_ACTIVE); if (status != DLADM_STATUS_OK) { die_dlerr(status, "could not create secure object '%s'", @@ -6218,7 +6267,7 @@ do_create_secobj(int argc, char **argv, const char *use) if (temp) return; - status = dladm_set_secobj(obj_name, class, obj_val, obj_len, + status = dladm_set_secobj(handle, obj_name, class, obj_val, obj_len, DLADM_OPT_PERSIST); if (status != DLADM_STATUS_OK) { warn_dlerr(status, "could not persistently create secure " @@ -6274,9 +6323,10 @@ do_delete_secobj(int argc, char **argv, const char *use) die("authorization '%s' is required", LINK_SEC_AUTH); for (i = 0; i < sp->s_nfields; i++) { - status = dladm_unset_secobj(sp->s_fields[i], DLADM_OPT_ACTIVE); + status = dladm_unset_secobj(handle, sp->s_fields[i], + DLADM_OPT_ACTIVE); if (!temp) { - pstatus = dladm_unset_secobj(sp->s_fields[i], + pstatus = dladm_unset_secobj(handle, sp->s_fields[i], DLADM_OPT_PERSIST); } else { pstatus = DLADM_STATUS_OK; @@ -6291,8 +6341,11 @@ do_delete_secobj(int argc, char **argv, const char *use) "secure object '%s'", sp->s_fields[i]); } } - if (status != DLADM_STATUS_OK || pstatus != DLADM_STATUS_OK) + + if (status != DLADM_STATUS_OK || pstatus != DLADM_STATUS_OK) { + dladm_close(handle); exit(1); + } } typedef struct show_secobj_state { @@ -6304,7 +6357,7 @@ typedef struct show_secobj_state { static boolean_t -show_secobj(void *arg, const char *obj_name) +show_secobj(dladm_handle_t dh, void *arg, const char *obj_name) { uint_t obj_len = DLADM_SECOBJ_VAL_MAX; uint8_t obj_val[DLADM_SECOBJ_VAL_MAX]; @@ -6319,7 +6372,8 @@ show_secobj(void *arg, const char *obj_name) if (statep->ss_persist) flags |= DLADM_OPT_PERSIST; - status = dladm_get_secobj(obj_name, &class, obj_val, &obj_len, flags); + status = dladm_get_secobj(dh, obj_name, &class, obj_val, &obj_len, + flags); if (status != DLADM_STATUS_OK) die_dlerr(status, "cannot get secure object '%s'", obj_name); @@ -6408,6 +6462,7 @@ do_show_secobj(int argc, char **argv, const char *use) state.ss_print.ps_nfields = nfields; flags = state.ss_persist ? DLADM_OPT_PERSIST : 0; + if (optind == (argc - 1)) { sp = split(argv[optind], MAX_SECOBJS, MAX_SECOBJ_NAMELEN); if (sp == NULL) { @@ -6415,7 +6470,7 @@ do_show_secobj(int argc, char **argv, const char *use) argv[optind]); } for (i = 0; i < sp->s_nfields; i++) { - if (!show_secobj(&state, sp->s_fields[i])) + if (!show_secobj(handle, &state, sp->s_fields[i])) break; } splitfree(sp); @@ -6423,16 +6478,17 @@ do_show_secobj(int argc, char **argv, const char *use) } else if (optind != argc) usage(); - status = dladm_walk_secobj(&state, show_secobj, flags); + status = dladm_walk_secobj(handle, &state, show_secobj, flags); + if (status != DLADM_STATUS_OK) die_dlerr(status, "show-secobj"); } /*ARGSUSED*/ static int -i_dladm_init_linkprop(datalink_id_t linkid, void *arg) +i_dladm_init_linkprop(dladm_handle_t dh, datalink_id_t linkid, void *arg) { - (void) dladm_init_linkprop(linkid, B_TRUE); + (void) dladm_init_linkprop(dh, linkid, B_TRUE); return (DLADM_WALK_CONTINUE); } @@ -6464,8 +6520,8 @@ do_init_linkprop(int argc, char **argv, const char *use) } if (optind == (argc - 1)) { - if ((status = dladm_name2info(argv[optind], &linkid, NULL, NULL, - NULL)) != DLADM_STATUS_OK) + if ((status = dladm_name2info(handle, argv[optind], &linkid, + NULL, NULL, NULL)) != DLADM_STATUS_OK) die_dlerr(status, "link %s is not valid", argv[optind]); } else if (optind != argc) { usage(); @@ -6476,14 +6532,13 @@ do_init_linkprop(int argc, char **argv, const char *use) * linkprops of links of other classes have been initialized as * part of the dladm up-xxx operation. */ - (void) dladm_walk_datalink_id(i_dladm_init_linkprop, NULL, - DATALINK_CLASS_PHYS, media, DLADM_OPT_PERSIST); + (void) dladm_walk_datalink_id(i_dladm_init_linkprop, handle, + NULL, DATALINK_CLASS_PHYS, media, DLADM_OPT_PERSIST); } else { - (void) dladm_init_linkprop(linkid, any_media); + (void) dladm_init_linkprop(handle, linkid, any_media); } } -/* ARGSUSED */ static void do_show_ether(int argc, char **argv, const char *use) { @@ -6538,26 +6593,22 @@ do_show_ether(int argc, char **argv, const char *use) fields = parse_output_fields(fields_str, ether_fields, ETHER_MAX_FIELDS, CMD_TYPE_ANY, &nfields); - if (fields == NULL) { + if (fields == NULL) die("invalid field(s) specified"); - exit(EXIT_FAILURE); - } + state.es_print.ps_fields = fields; state.es_print.ps_nfields = nfields; + if (state.es_link == NULL) { - (void) dladm_walk_datalink_id(show_etherprop, &state, + (void) dladm_walk_datalink_id(show_etherprop, handle, &state, DATALINK_CLASS_PHYS, DL_ETHER, DLADM_OPT_ACTIVE | DLADM_OPT_PERSIST); } else { - if (!link_is_ether(state.es_link, &linkid)) { + if (!link_is_ether(state.es_link, &linkid)) die("invalid link specified"); - } - (void) show_etherprop(linkid, &state); + (void) show_etherprop(handle, linkid, &state); } - - exit(DLADM_STATUS_OK); - } static char * @@ -6570,7 +6621,7 @@ dladm_print_field(print_field_t *pf, void *arg) } static int -show_etherprop(datalink_id_t linkid, void *arg) +show_etherprop(dladm_handle_t dh, datalink_id_t linkid, void *arg) { print_ether_state_t *statep = arg; ether_fields_buf_t ebuf; @@ -6578,7 +6629,7 @@ show_etherprop(datalink_id_t linkid, void *arg) dladm_status_t status; bzero(&ebuf, sizeof (ether_fields_buf_t)); - if (dladm_datalink_id2info(linkid, NULL, NULL, NULL, + if (dladm_datalink_id2info(dh, linkid, NULL, NULL, NULL, ebuf.eth_link, sizeof (ebuf.eth_link)) != DLADM_STATUS_OK) { return (DLADM_WALK_CONTINUE); } @@ -6588,7 +6639,7 @@ show_etherprop(datalink_id_t linkid, void *arg) statep->es_header = B_TRUE; } - status = dladm_ether_info(linkid, &eattr); + status = dladm_ether_info(dh, linkid, &eattr); if (status != DLADM_STATUS_OK) goto cleanup; @@ -6622,9 +6673,9 @@ cleanup: static void do_init_secobj(int argc, char **argv, const char *use) { - dladm_status_t status; + dladm_status_t status; - status = dladm_init_secobj(); + status = dladm_init_secobj(handle); if (status != DLADM_STATUS_OK) die_dlerr(status, "secure object initialization failed"); } @@ -6686,6 +6737,7 @@ altroot_cmd(char *altroot, int argc, char *argv[]) } (void) fprintf(fp, "%s\n", SMF_DLADM_UPGRADE_MSG); (void) fclose(fp); + dladm_close(handle); exit(0); } @@ -6740,6 +6792,9 @@ warn_dlerr(dladm_status_t err, const char *format, ...) (void) fprintf(stderr, ": %s\n", dladm_status2str(err, errmsg)); } +/* + * Also closes the dladm handle if it is not NULL. + */ /* PRINTFLIKE2 */ static void die_dlerr(dladm_status_t err, const char *format, ...) @@ -6755,6 +6810,10 @@ die_dlerr(dladm_status_t err, const char *format, ...) va_end(alist); (void) fprintf(stderr, ": %s\n", dladm_status2str(err, errmsg)); + /* close dladm handle if it was opened */ + if (handle != NULL) + dladm_close(handle); + exit(EXIT_FAILURE); } @@ -6772,6 +6831,11 @@ die(const char *format, ...) va_end(alist); (void) putchar('\n'); + + /* close dladm handle if it was opened */ + if (handle != NULL) + dladm_close(handle); + exit(EXIT_FAILURE); } @@ -6861,7 +6925,7 @@ link_is_ether(const char *link, datalink_id_t *linkid) uint32_t media; datalink_class_t class; - if (dladm_name2info(link, linkid, NULL, &class, &media) == + if (dladm_name2info(handle, link, linkid, NULL, &class, &media) == DLADM_STATUS_OK) { if (class == DATALINK_CLASS_PHYS && media == DL_ETHER) return (B_TRUE); diff --git a/usr/src/cmd/dlmgmtd/dlmgmt_door.c b/usr/src/cmd/dlmgmtd/dlmgmt_door.c index aa32d7cee5..532260ac4f 100644 --- a/usr/src/cmd/dlmgmtd/dlmgmt_door.c +++ b/usr/src/cmd/dlmgmtd/dlmgmt_door.c @@ -951,7 +951,8 @@ dlmgmt_upcall_linkprop_init(void *argp, void *retp) dlmgmt_table_unlock(); if (do_linkprop) - retvalp->lr_err = dladm_init_linkprop(lip->ld_linkid, B_TRUE); + retvalp->lr_err = dladm_init_linkprop(dld_handle, + lip->ld_linkid, B_TRUE); } static dlmgmt_door_info_t i_dlmgmt_door_info_tbl[] = { diff --git a/usr/src/cmd/dlmgmtd/dlmgmt_impl.h b/usr/src/cmd/dlmgmtd/dlmgmt_impl.h index b8a9258102..09dcf2b1b4 100644 --- a/usr/src/cmd/dlmgmtd/dlmgmt_impl.h +++ b/usr/src/cmd/dlmgmtd/dlmgmt_impl.h @@ -24,8 +24,6 @@ * Use is subject to license terms. */ -#pragma ident "%Z%%M% %I% %E% SMI" - /* * Functions to maintain a table of datalink configuration information. */ @@ -83,6 +81,7 @@ typedef struct dlmgmt_dlconf_s { extern boolean_t debug; extern const char *progname; +extern dladm_handle_t dld_handle; extern avl_tree_t dlmgmt_name_avl; extern avl_tree_t dlmgmt_id_avl; diff --git a/usr/src/cmd/dlmgmtd/dlmgmt_main.c b/usr/src/cmd/dlmgmtd/dlmgmt_main.c index e6d7581138..3eaac30ff8 100644 --- a/usr/src/cmd/dlmgmtd/dlmgmt_main.c +++ b/usr/src/cmd/dlmgmtd/dlmgmt_main.c @@ -51,14 +51,27 @@ #include <sys/param.h> #include <sys/stat.h> #include <unistd.h> +#include <libdladm_impl.h> #include <libdlmgmt.h> #include "dlmgmt_impl.h" const char *progname; boolean_t debug; static int pfds[2]; +/* + * This file descriptor to DLMGMT_DOOR cannot be in the libdladm + * handle because the door isn't created when the handle is created. + */ static int dlmgmt_door_fd = -1; -static int dld_control_fd = -1; + +/* + * This libdladm handle is global so that dlmgmt_upcall_linkprop_init() + * can pass to libdladm. The handle is opened during dlmgmt_init_privileges() + * with "ALL" privileges. It is not able to open DLMGMT_DOOR at that time as + * it hasn't been created yet. This door in the handle is opened in the first + * call to dladm_door_fd(). + */ +dladm_handle_t dld_handle = NULL; static void dlmgmtd_exit(int); static int dlmgmt_init(); @@ -72,11 +85,11 @@ dlmgmt_set_doorfd(boolean_t start) dld_ioc_door_t did; int err = 0; - assert(dld_control_fd != -1); + assert(dld_handle != NULL); did.did_start_door = start; - if (ioctl(dld_control_fd, DLDIOC_DOORSERVER, &did) == -1) + if (ioctl(dladm_dld_fd(dld_handle), DLDIOC_DOORSERVER, &did) == -1) err = errno; return (err); @@ -144,7 +157,7 @@ dlmgmt_door_fini() static int dlmgmt_init() { - int err; + int err; if (signal(SIGTERM, dlmgmtd_exit) == SIG_ERR || signal(SIGINT, dlmgmtd_exit) == SIG_ERR) { @@ -237,10 +250,12 @@ dlmgmt_init_privileges() /* * When dlmgmtd is started at boot, "ALL" privilege is required - * to open the dld control node. + * to open the dld control node. The door isn't created yet. */ - if ((dld_control_fd = open(DLD_CONTROL_DEV, O_RDWR)) < 0) - return (errno); + if (dladm_open(&dld_handle) != DLADM_STATUS_OK) { + dlmgmt_log(LOG_ERR, "dladm_open() failed"); + return (EPERM); + } /* * We need PRIV_SYS_DL_CONFIG for the DLDIOC_DOORSERVER ioctl, @@ -248,20 +263,21 @@ dlmgmt_init_privileges() */ if (__init_daemon_priv(PU_RESETGROUPS|PU_CLEARLIMITSET, UID_DLADM, GID_SYS, PRIV_SYS_DL_CONFIG, PRIV_SYS_CONFIG, NULL) == -1) { - (void) close(dld_control_fd); - dld_control_fd = -1; + dladm_close(dld_handle); + dld_handle = NULL; return (EPERM); } + return (0); } static void dlmgmt_fini_privileges() { - if (dld_control_fd != -1) { - (void) close(dld_control_fd); - dld_control_fd = -1; + if (dld_handle != NULL) { + dladm_close(dld_handle); + dld_handle = NULL; } } diff --git a/usr/src/cmd/flowadm/flowadm.c b/usr/src/cmd/flowadm/flowadm.c index f4c3859172..5c6fef48c2 100644 --- a/usr/src/cmd/flowadm/flowadm.c +++ b/usr/src/cmd/flowadm/flowadm.c @@ -112,18 +112,18 @@ static cmdfunc_t do_show_flowprop, do_set_flowprop, do_reset_flowprop; static cmdfunc_t do_show_usage; static int show_flow(dladm_flow_attr_t *, void *); -static int show_flows_onelink(datalink_id_t, void *); +static int show_flows_onelink(dladm_handle_t, datalink_id_t, void *); static void flow_stats(const char *, datalink_id_t, uint_t); static void get_flow_stats(const char *, pktsum_t *); static int show_flow_stats(dladm_flow_attr_t *, void *); -static int show_link_flow_stats(datalink_id_t, void *); +static int show_link_flow_stats(dladm_handle_t, datalink_id_t, void *); static int remove_flow(dladm_flow_attr_t *, void *); static int show_flowprop(dladm_flow_attr_t *, void *); static void show_flowprop_one_flow(void *, const char *); -static int show_flowprop_onelink(datalink_id_t, void *); +static int show_flowprop_onelink(dladm_handle_t, datalink_id_t, void *); static void die(const char *, ...); static void die_optdup(int); @@ -367,6 +367,12 @@ static char *progname; boolean_t t_arg = B_FALSE; /* changes are persistent */ char *altroot = NULL; +/* + * Handle to libdladm. Opened in main() before the sub-command + * specific function is called. + */ +static dladm_handle_t handle = NULL; + static const char *attr_table[] = {"local_ip", "remote_ip", "transport", "local_port", "dsfield"}; @@ -389,6 +395,11 @@ usage(void) "\tshow-flow [-p] [-s [-i <interval>]] [-l <link>] [flow-name]\n" "\tshow-usage [-d|-p -F <format>] [-s <DD/MM/YYYY,HH:MM:SS>]\n" "\t\t[-e <DD/MM/YYYY,HH:MM:SS>]] -f <logfile> [<name>]\n")); + + /* close dladm handle if it was opened */ + if (handle != NULL) + dladm_close(handle); + exit(1); } @@ -397,6 +408,7 @@ main(int argc, char *argv[]) { int i, arglen, cmdlen; cmd_t *cmdp; + dladm_status_t status; (void) setlocale(LC_ALL, ""); #if !defined(TEXT_DOMAIN) @@ -415,7 +427,15 @@ main(int argc, char *argv[]) cmdlen = strlen(cmdp->c_name); if ((arglen == cmdlen) && (strncmp(argv[1], cmdp->c_name, cmdlen) == 0)) { + /* Open the libdladm handle */ + if ((status = dladm_open(&handle)) != DLADM_STATUS_OK) { + die_dlerr(status, + "could not open /dev/dld"); + } + cmdp->c_fn(argc - 1, &argv[1]); + + dladm_close(handle); exit(0); } } @@ -447,7 +467,7 @@ do_init_flow(int argc, char *argv[]) { dladm_status_t status; - status = dladm_flow_init(); + status = dladm_flow_init(handle); if (status != DLADM_STATUS_OK) die_dlerr(status, "flows initialization failed"); } @@ -726,7 +746,7 @@ do_add_flow(int argc, char *argv[]) MAXNAMELEN) >= MAXNAMELEN) { die("link name too long"); } - if (dladm_name2info(devname, &linkid, NULL, + if (dladm_name2info(handle, devname, &linkid, NULL, NULL, NULL) != DLADM_STATUS_OK) die("invalid link '%s'", devname); l_arg = B_TRUE; @@ -761,7 +781,7 @@ do_add_flow(int argc, char *argv[]) name = argv[index]; } - status = dladm_flow_add(linkid, attrlist, proplist, name, + status = dladm_flow_add(handle, linkid, attrlist, proplist, name, t_arg, altroot); if (status != DLADM_STATUS_OK) die_dlerr(status, "add flow failed"); @@ -798,7 +818,7 @@ do_remove_flow(int argc, char *argv[]) MAXLINKNAMELEN) >= MAXLINKNAMELEN) { die("link name too long"); } - if (dladm_name2info(linkname, &linkid, NULL, + if (dladm_name2info(handle, linkname, &linkid, NULL, NULL, NULL) != DLADM_STATUS_OK) { die("invalid link '%s'", linkname); } @@ -819,7 +839,7 @@ do_remove_flow(int argc, char *argv[]) die("flow name too long"); flowname = argv[optind]; } - status = dladm_flow_remove(flowname, t_arg, altroot); + status = dladm_flow_remove(handle, flowname, t_arg, altroot); } else { /* if link is specified then flow name should not be there */ if (optind == argc-1) @@ -828,7 +848,8 @@ do_remove_flow(int argc, char *argv[]) state.fs_tempop = t_arg; state.fs_altroot = altroot; state.fs_status = DLADM_STATUS_OK; - status = dladm_walk_flow(remove_flow, linkid, &state, B_FALSE); + status = dladm_walk_flow(remove_flow, handle, linkid, &state, + B_FALSE); /* * check if dladm_walk_flow terminated early and see if the * walker function as any status for us @@ -849,7 +870,7 @@ remove_flow(dladm_flow_attr_t *attr, void *arg) { remove_flow_state_t *state = (remove_flow_state_t *)arg; - state->fs_status = dladm_flow_remove(attr->fa_flowname, + state->fs_status = dladm_flow_remove(handle, attr->fa_flowname, state->fs_tempop, state->fs_altroot); if (state->fs_status == DLADM_STATUS_OK) @@ -875,8 +896,8 @@ print_flow(show_flow_state_t *state, dladm_flow_attr_t *attr, char link[MAXLINKNAMELEN]; dladm_status_t status; - if ((status = dladm_datalink_id2info(attr->fa_linkid, NULL, NULL, - NULL, link, sizeof (link))) != DLADM_STATUS_OK) { + if ((status = dladm_datalink_id2info(handle, attr->fa_linkid, NULL, + NULL, NULL, link, sizeof (link))) != DLADM_STATUS_OK) { return (status); } @@ -933,12 +954,11 @@ static void show_one_flow(void *arg, const char *name) { dladm_flow_attr_t attr; - dladm_status_t status; - if (dladm_flow_info(name, &attr) != DLADM_STATUS_OK) + if (dladm_flow_info(handle, name, &attr) != DLADM_STATUS_OK) die("invalid flow: '%s'", name); else - show_flow(&attr, arg); + (void) show_flow(&attr, arg); } /* @@ -947,11 +967,11 @@ show_one_flow(void *arg, const char *name) * all flows on all links. */ static int -show_flows_onelink(datalink_id_t linkid, void *arg) +show_flows_onelink(dladm_handle_t dh, datalink_id_t linkid, void *arg) { show_flow_state_t *state = arg; - (void) dladm_walk_flow(show_flow, linkid, arg, state->fs_persist); + (void) dladm_walk_flow(show_flow, dh, linkid, arg, state->fs_persist); return (DLADM_WALK_CONTINUE); } @@ -1015,9 +1035,9 @@ show_flow_stats(dladm_flow_attr_t *attr, void *arg) * all flows on all links. */ static int -show_link_flow_stats(datalink_id_t linkid, void * arg) +show_link_flow_stats(dladm_handle_t dh, datalink_id_t linkid, void * arg) { - if (dladm_walk_flow(show_flow_stats, linkid, arg, B_FALSE) + if (dladm_walk_flow(show_flow_stats, dh, linkid, arg, B_FALSE) == DLADM_STATUS_OK) return (DLADM_WALK_CONTINUE); else @@ -1031,7 +1051,8 @@ flow_stats(const char *flow, datalink_id_t linkid, uint_t interval) show_flow_state_t state; dladm_flow_attr_t attr; - if (flow != NULL && dladm_flow_info(flow, &attr) != DLADM_STATUS_OK) + if (flow != NULL && + dladm_flow_info(handle, flow, &attr) != DLADM_STATUS_OK) die("invalid flow %s", flow); bzero(&state, sizeof (state)); @@ -1057,14 +1078,14 @@ flow_stats(const char *flow, datalink_id_t linkid, uint_t interval) /* Show all stats on a link */ } else if (linkid != DATALINK_INVALID_LINKID) { - (void) dladm_walk_flow(show_flow_stats, linkid, &state, - B_FALSE); + (void) dladm_walk_flow(show_flow_stats, handle, linkid, + &state, B_FALSE); /* Show all stats by datalink */ } else { (void) dladm_walk_datalink_id(show_link_flow_stats, - &state, DATALINK_CLASS_ALL, DATALINK_ANY_MEDIATYPE, - DLADM_OPT_ACTIVE); + handle, &state, DATALINK_CLASS_ALL, + DATALINK_ANY_MEDIATYPE, DLADM_OPT_ACTIVE); } if (interval == 0) @@ -1094,7 +1115,6 @@ do_show_flow(int argc, char *argv[]) uint_t nfields; char *all_fields = "flow,link,ipaddr,transport,port,dsfield"; - dladm_status_t status; bzero(&state, sizeof (state)); @@ -1143,7 +1163,7 @@ do_show_flow(int argc, char *argv[]) if (strlcpy(linkname, optarg, MAXLINKNAMELEN) >= MAXLINKNAMELEN) die("link name too long\n"); - if (dladm_name2info(linkname, &linkid, NULL, + if (dladm_name2info(handle, linkname, &linkid, NULL, NULL, NULL) != DLADM_STATUS_OK) die("invalid link '%s'", linkname); l_arg = B_TRUE; @@ -1173,7 +1193,8 @@ do_show_flow(int argc, char *argv[]) } if (S_arg) { - dladm_continuous(linkid, state.fs_flow, interval, FLOW_REPORT); + dladm_continuous(handle, linkid, state.fs_flow, interval, + FLOW_REPORT); return; } @@ -1197,12 +1218,12 @@ do_show_flow(int argc, char *argv[]) /* Show attributes of flows on one link */ } else if (l_arg) { - (void) show_flows_onelink(linkid, &state); + (void) show_flows_onelink(handle, linkid, &state); /* Show attributes of all flows on all links */ } else { - (void) dladm_walk_datalink_id(show_flows_onelink, &state, - DATALINK_CLASS_ALL, DATALINK_ANY_MEDIATYPE, + (void) dladm_walk_datalink_id(show_flows_onelink, handle, + &state, DATALINK_CLASS_ALL, DATALINK_ANY_MEDIATYPE, DLADM_OPT_ACTIVE); } } @@ -1214,7 +1235,7 @@ set_flowprop_persist(const char *flow, const char *prop_name, char **prop_val, dladm_status_t status; char *errprop; - status = dladm_set_flowprop(flow, prop_name, prop_val, val_cnt, + status = dladm_set_flowprop(handle, flow, prop_name, prop_val, val_cnt, DLADM_OPT_PERSIST, &errprop); if (status != DLADM_STATUS_OK) { @@ -1276,7 +1297,7 @@ set_flowprop(int argc, char **argv, boolean_t reset) if (!reset) die("flow property must be specified"); - status = dladm_set_flowprop(flow, NULL, NULL, 0, + status = dladm_set_flowprop(handle, flow, NULL, NULL, 0, DLADM_OPT_ACTIVE, &errprop); if (status != DLADM_STATUS_OK) { warn_dlerr(status, "cannot reset flow property '%s' " @@ -1311,7 +1332,7 @@ set_flowprop(int argc, char **argv, boolean_t reset) continue; } } - s = dladm_set_flowprop(flow, aip->ai_name, val, count, + s = dladm_set_flowprop(handle, flow, aip->ai_name, val, count, DLADM_OPT_ACTIVE, NULL); if (s == DLADM_STATUS_OK) { if (!temp) { @@ -1346,8 +1367,9 @@ set_flowprop(int argc, char **argv, boolean_t reset) DLADM_MAX_PROP_VALCNT + j * DLADM_PROP_VAL_MAX; } - s = dladm_get_flowprop(flow, DLADM_PROP_VAL_MODIFIABLE, - aip->ai_name, propvals, &valcnt); + s = dladm_get_flowprop(handle, flow, + DLADM_PROP_VAL_MODIFIABLE, aip->ai_name, propvals, + &valcnt); ptr = errmsg; lim = ptr + DLADM_STRSIZE; @@ -1381,8 +1403,10 @@ set_flowprop(int argc, char **argv, boolean_t reset) } done: dladm_free_props(proplist); - if (status != DLADM_STATUS_OK) + if (status != DLADM_STATUS_OK) { + dladm_close(handle); exit(1); + } } static void @@ -1442,6 +1466,11 @@ die(const char *format, ...) va_end(alist); (void) putchar('\n'); + + /* close dladm handle if it was opened */ + if (handle != NULL) + dladm_close(handle); + exit(EXIT_FAILURE); } @@ -1480,6 +1509,10 @@ die_dlerr(dladm_status_t err, const char *format, ...) va_end(alist); (void) fprintf(stderr, ": %s\n", dladm_status2str(err, errmsg)); + /* close dladm handle if it was opened */ + if (handle != NULL) + dladm_close(handle); + exit(EXIT_FAILURE); } @@ -1496,7 +1529,7 @@ print_flowprop(const char *flowname, show_flowprop_state_t *statep, uint_t valcnt = DLADM_MAX_PROP_VALCNT; dladm_status_t status; - status = dladm_get_flowprop(flowname, type, propname, propvals, + status = dladm_get_flowprop(handle, flowname, type, propname, propvals, &valcnt); if (status != DLADM_STATUS_OK) { if (status == DLADM_STATUS_TEMPONLY) { @@ -1642,15 +1675,15 @@ show_flowprop(dladm_flow_attr_t *attr, void *arg) * usable to dladm_walk_datalink_id() */ static int -show_flowprop_onelink(datalink_id_t linkid, void *arg) +show_flowprop_onelink(dladm_handle_t dh, datalink_id_t linkid, void *arg) { char name[MAXLINKNAMELEN]; - if (dladm_datalink_id2info(linkid, NULL, NULL, NULL, - name, sizeof (name)) != DLADM_STATUS_OK) + if (dladm_datalink_id2info(dh, linkid, NULL, NULL, NULL, name, + sizeof (name)) != DLADM_STATUS_OK) return (DLADM_WALK_TERMINATE); - (void) dladm_walk_flow(show_flowprop, linkid, arg, B_FALSE); + (void) dladm_walk_flow(show_flowprop, dh, linkid, arg, B_FALSE); return (DLADM_WALK_CONTINUE); } @@ -1693,7 +1726,7 @@ do_show_flowprop(int argc, char **argv) state.fs_persist = B_TRUE; break; case 'l': - if (dladm_name2info(optarg, &state.fs_linkid, + if (dladm_name2info(handle, optarg, &state.fs_linkid, NULL, NULL, NULL) != DLADM_STATUS_OK) die("invalid link '%s'", optarg); break; @@ -1737,12 +1770,12 @@ do_show_flowprop(int argc, char **argv) /* Show properties for all flows on one link */ } else if (state.fs_linkid != DATALINK_INVALID_LINKID) { - (void) show_flowprop_onelink(state.fs_linkid, &state); + (void) show_flowprop_onelink(handle, state.fs_linkid, &state); /* Show properties for all flows on all links */ } else { - (void) dladm_walk_datalink_id(show_flowprop_onelink, &state, - DATALINK_CLASS_ALL, DATALINK_ANY_MEDIATYPE, + (void) dladm_walk_datalink_id(show_flowprop_onelink, handle, + &state, DATALINK_CLASS_ALL, DATALINK_ANY_MEDIATYPE, DLADM_OPT_ACTIVE); } @@ -1763,7 +1796,8 @@ show_flowprop_one_flow(void *arg, const char *flow) /* * Do not print flow props for invalid flows. */ - if ((status = dladm_flow_info(flow, &attr)) != DLADM_STATUS_OK) { + if ((status = dladm_flow_info(handle, flow, &attr)) != + DLADM_STATUS_OK) { die("invalid flow: '%s'", flow); } 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, diff --git a/usr/src/cmd/vna/vna.c b/usr/src/cmd/vna/vna.c index 6a05cf1777..6dcec3e172 100644 --- a/usr/src/cmd/vna/vna.c +++ b/usr/src/cmd/vna/vna.c @@ -44,13 +44,13 @@ typedef struct vnic_attr { /*ARGSUSED*/ static int -v_print(datalink_id_t vnic_id, void *arg) +v_print(dladm_handle_t handle, datalink_id_t vnic_id, void *arg) { dladm_vnic_attr_t attr; char vnic[MAXLINKNAMELEN]; char link[MAXLINKNAMELEN]; - if (dladm_vnic_info(vnic_id, &attr, DLADM_OPT_ACTIVE) != + if (dladm_vnic_info(handle, vnic_id, &attr, DLADM_OPT_ACTIVE) != DLADM_STATUS_OK) { return (DLADM_WALK_CONTINUE); } @@ -58,13 +58,13 @@ v_print(datalink_id_t vnic_id, void *arg) if (attr.va_mac_len != ETHERADDRL) return (DLADM_WALK_CONTINUE); - if (dladm_datalink_id2info(vnic_id, NULL, NULL, NULL, vnic, + if (dladm_datalink_id2info(handle, vnic_id, NULL, NULL, NULL, vnic, sizeof (vnic)) != DLADM_STATUS_OK) { return (DLADM_WALK_CONTINUE); } - if (dladm_datalink_id2info(attr.va_link_id, NULL, NULL, NULL, link, - sizeof (link)) != DLADM_STATUS_OK) { + if (dladm_datalink_id2info(handle, attr.va_link_id, NULL, NULL, NULL, + link, sizeof (link)) != DLADM_STATUS_OK) { return (DLADM_WALK_CONTINUE); } @@ -75,21 +75,21 @@ v_print(datalink_id_t vnic_id, void *arg) } static void -v_list(void) +v_list(dladm_handle_t handle) { - (void) dladm_walk_datalink_id(v_print, NULL, DATALINK_CLASS_VNIC, - DATALINK_ANY_MEDIATYPE, DLADM_OPT_ACTIVE); + (void) dladm_walk_datalink_id(v_print, handle, NULL, + DATALINK_CLASS_VNIC, DATALINK_ANY_MEDIATYPE, DLADM_OPT_ACTIVE); } static int -v_find(datalink_id_t vnic_id, void *arg) +v_find(dladm_handle_t handle, datalink_id_t vnic_id, void *arg) { vnic_attr_t *vattr = arg; dladm_vnic_attr_t *specp = &vattr->attr; dladm_vnic_attr_t attr; char linkname[MAXLINKNAMELEN]; - if (dladm_vnic_info(vnic_id, &attr, DLADM_OPT_ACTIVE) != + if (dladm_vnic_info(handle, vnic_id, &attr, DLADM_OPT_ACTIVE) != DLADM_STATUS_OK) { return (DLADM_WALK_CONTINUE); } @@ -107,8 +107,8 @@ v_find(datalink_id_t vnic_id, void *arg) if (vattr->name != NULL) { /* Names must match. */ - if (dladm_datalink_id2info(vnic_id, NULL, NULL, NULL, linkname, - sizeof (linkname)) != DLADM_STATUS_OK) { + if (dladm_datalink_id2info(handle, vnic_id, NULL, NULL, NULL, + linkname, sizeof (linkname)) != DLADM_STATUS_OK) { return (DLADM_WALK_CONTINUE); } @@ -178,7 +178,7 @@ v_broadcast(char *link) * Print out the link name of the VNIC. */ static int -v_add(char *link, char *addr, char *name) +v_add(dladm_handle_t handle, char *link, char *addr, char *name) { struct ether_addr *ea; vnic_attr_t vattr; @@ -194,7 +194,7 @@ v_add(char *link, char *addr, char *name) return (-1); } - if (dladm_name2info(link, &linkid, NULL, NULL, NULL) != + if (dladm_name2info(handle, link, &linkid, NULL, NULL, NULL) != DLADM_STATUS_OK) { (void) fprintf(stderr, "Invalid link name: %s\n", link); return (-1); @@ -211,13 +211,13 @@ v_add(char *link, char *addr, char *name) vattr.attr.va_mac_len); vattr.name = name; - (void) dladm_walk_datalink_id(v_find, &vattr, DATALINK_CLASS_VNIC, - DATALINK_ANY_MEDIATYPE, DLADM_OPT_ACTIVE); + (void) dladm_walk_datalink_id(v_find, handle, &vattr, + DATALINK_CLASS_VNIC, DATALINK_ANY_MEDIATYPE, DLADM_OPT_ACTIVE); if (vattr.attr.va_vnic_id == DATALINK_INVALID_LINKID) { /* * None found, so create. */ - status = dladm_vnic_create(name, linkid, + status = dladm_vnic_create(handle, name, linkid, VNIC_MAC_ADDR_TYPE_FIXED, (uchar_t *)ea->ether_addr_octet, ETHERADDRL, NULL, 0, 0, &vnic_id, NULL, DLADM_OPT_ACTIVE); @@ -231,12 +231,13 @@ v_add(char *link, char *addr, char *name) vnic_id = vattr.attr.va_vnic_id; } - if ((status = dladm_datalink_id2info(vnic_id, NULL, NULL, NULL, vnic, - sizeof (vnic))) != DLADM_STATUS_OK) { + if ((status = dladm_datalink_id2info(handle, vnic_id, NULL, NULL, NULL, + vnic, sizeof (vnic))) != DLADM_STATUS_OK) { (void) fprintf(stderr, "dladm_datalink_id2info: %s\n", dladm_status2str(status, buf)); if (vattr.attr.va_vnic_id == DATALINK_INVALID_LINKID) - (void) dladm_vnic_delete(vnic_id, DLADM_OPT_ACTIVE); + (void) dladm_vnic_delete(handle, vnic_id, + DLADM_OPT_ACTIVE); return (-1); } @@ -257,20 +258,20 @@ v_add(char *link, char *addr, char *name) * v_remove() takes VNIC link name as the argument. */ static int -v_remove(char *vnic) +v_remove(dladm_handle_t handle, char *vnic) { datalink_id_t vnic_id; dladm_status_t status; char buf[DLADM_STRSIZE]; - if ((status = dladm_name2info(vnic, &vnic_id, NULL, NULL, NULL)) != - DLADM_STATUS_OK) { + if ((status = dladm_name2info(handle, vnic, &vnic_id, NULL, NULL, + NULL)) != DLADM_STATUS_OK) { (void) fprintf(stderr, "dladm_name2info: %s\n", dladm_status2str(status, buf)); return (-1); } - status = dladm_vnic_delete(vnic_id, DLADM_OPT_ACTIVE); + status = dladm_vnic_delete(handle, vnic_id, DLADM_OPT_ACTIVE); if (status != DLADM_STATUS_OK) { (void) fprintf(stderr, "dladm_vnic_delete: %s\n", @@ -284,27 +285,37 @@ v_remove(char *vnic) int main(int argc, char *argv[]) { + dladm_handle_t handle; + int ret; + + if (dladm_open(&handle) != DLADM_STATUS_OK) { + (void) fprintf(stderr, "Failed to open dladm handle\n"); + return (-1); + } + switch (argc) { case 1: /* List operation. */ - v_list(); - return (0); - /* NOTREACHED */ + v_list(handle); + ret = 0; + break; case 2: /* Remove operation. */ - return (v_remove(argv[1])); - /* NOTREACHED */ + ret = v_remove(handle, argv[1]); + break; case 3: case 4: /* Add operation. */ - return (v_add(argv[1], argv[2], (argc == 3 ? NULL : argv[3]))); - /* NOTREACHED */ + ret = v_add(handle, argv[1], argv[2], + (argc == 3 ? NULL : argv[3])); + break; default: (void) fprintf(stderr, "Incorrect number of arguments - " "must have 0, 1, 2 or 3.\n"); - return (-1); - /* NOTREACHED */ + ret = -1; + break; } - /* NOTREACHED */ + dladm_close(handle); + return (ret); } diff --git a/usr/src/cmd/zoneadmd/vplat.c b/usr/src/cmd/zoneadmd/vplat.c index 622a8b6787..72b6ce5c76 100644 --- a/usr/src/cmd/zoneadmd/vplat.c +++ b/usr/src/cmd/zoneadmd/vplat.c @@ -2526,7 +2526,7 @@ add_datalink(zlog_t *zlogp, char *zone_name, char *dlname) } /* Set zoneid of this link. */ - if (dladm_setzid(dlname, zone_name) != DLADM_STATUS_OK) { + if (dladm_setzid(dld_handle, dlname, zone_name) != DLADM_STATUS_OK) { zerror(zlogp, B_TRUE, "WARNING: unable to add network " "interface '%s'.", dlname); return (-1); @@ -2538,7 +2538,7 @@ add_datalink(zlog_t *zlogp, char *zone_name, char *dlname) static int remove_datalink(zlog_t *zlogp, char *dlname) { - if (dladm_setzid(dlname, GLOBAL_ZONENAME) + if (dladm_setzid(dld_handle, dlname, GLOBAL_ZONENAME) != DLADM_STATUS_OK) { zerror(zlogp, B_TRUE, "unable to release network " "interface '%s'", dlname); diff --git a/usr/src/cmd/zoneadmd/zoneadmd.c b/usr/src/cmd/zoneadmd/zoneadmd.c index f5646878a5..813369a773 100644 --- a/usr/src/cmd/zoneadmd/zoneadmd.c +++ b/usr/src/cmd/zoneadmd/zoneadmd.c @@ -107,6 +107,7 @@ char brand_name[MAXNAMELEN]; boolean_t zone_isnative; boolean_t zone_iscluster; static zoneid_t zone_id; +dladm_handle_t dld_handle = NULL; static char pre_statechg_hook[2 * MAXPATHLEN]; static char post_statechg_hook[2 * MAXPATHLEN]; @@ -1925,6 +1926,12 @@ main(int argc, char *argv[]) goto child_out; } + /* open the dladm handle */ + if (dladm_open(&dld_handle) != DLADM_STATUS_OK) { + zerror(zlogp, B_FALSE, "failed to open dladm handle"); + goto child_out; + } + /* * Note: door setup must occur *after* the console is setup. * This is so that as zlogin tests the door to see if zoneadmd @@ -1984,6 +1991,7 @@ main(int argc, char *argv[]) */ assert(!MUTEX_HELD(&lock)); (void) fdetach(zone_door_path); + for (;;) (void) pause(); @@ -2006,5 +2014,9 @@ child_out: (void) door_revoke(zone_door); (void) fdetach(zone_door_path); } + + if (dld_handle != NULL) + dladm_close(dld_handle); + return (1); /* return from main() forcibly exits an MT process */ } diff --git a/usr/src/cmd/zoneadmd/zoneadmd.h b/usr/src/cmd/zoneadmd/zoneadmd.h index 4b89eead78..97b5cc6d1e 100644 --- a/usr/src/cmd/zoneadmd/zoneadmd.h +++ b/usr/src/cmd/zoneadmd/zoneadmd.h @@ -31,6 +31,8 @@ extern "C" { #endif +#include <libdladm.h> + /* * Multi-threaded programs should avoid MT-unsafe library calls (i.e., any- * thing which could try to acquire a user-level lock unprotected by an atfork @@ -87,6 +89,7 @@ extern char boot_args[BOOTARGS_MAX]; extern char bad_boot_arg[BOOTARGS_MAX]; extern boolean_t zone_isnative; extern boolean_t zone_iscluster; +extern dladm_handle_t dld_handle; extern void zerror(zlog_t *, boolean_t, const char *, ...); extern char *localize_msg(char *locale, const char *msg); diff --git a/usr/src/lib/libdladm/common/flowprop.c b/usr/src/lib/libdladm/common/flowprop.c index a2125a9d33..d61be6236b 100644 --- a/usr/src/lib/libdladm/common/flowprop.c +++ b/usr/src/lib/libdladm/common/flowprop.c @@ -46,10 +46,10 @@ */ #define DLADM_PROP_VAL_MAX 32 -static dladm_status_t i_dladm_set_flowprop_db(const char *, const char *, - char **, uint_t); -static dladm_status_t i_dladm_get_flowprop_db(const char *, const char *, - char **, uint_t *); +static dladm_status_t i_dladm_set_flowprop_db(dladm_handle_t, const char *, + const char *, char **, uint_t); +static dladm_status_t i_dladm_get_flowprop_db(dladm_handle_t, const char *, + const char *, char **, uint_t *); static fpd_getf_t do_get_maxbw; static fpd_setf_t do_set_maxbw; @@ -85,8 +85,9 @@ static resource_prop_t rsrc_prop_table[] = { static dladm_status_t flow_proplist_check(dladm_arg_list_t *); dladm_status_t -dladm_set_flowprop(const char *flow, const char *prop_name, char **prop_val, - uint_t val_cnt, uint_t flags, char **errprop) +dladm_set_flowprop(dladm_handle_t handle, const char *flow, + const char *prop_name, char **prop_val, uint_t val_cnt, uint_t flags, + char **errprop) { dladm_status_t status = DLADM_STATUS_BADARG; @@ -95,8 +96,8 @@ dladm_set_flowprop(const char *flow, const char *prop_name, char **prop_val, return (DLADM_STATUS_BADARG); if ((flags & DLADM_OPT_ACTIVE) != 0) { - status = i_dladm_set_prop_temp(flow, prop_name, prop_val, - val_cnt, flags, errprop, &prop_tbl); + status = i_dladm_set_prop_temp(handle, flow, prop_name, + prop_val, val_cnt, flags, errprop, &prop_tbl); if (status == DLADM_STATUS_TEMPONLY && (flags & DLADM_OPT_PERSIST) != 0) return (DLADM_STATUS_TEMPONLY); @@ -107,7 +108,7 @@ dladm_set_flowprop(const char *flow, const char *prop_name, char **prop_val, if (i_dladm_is_prop_temponly(prop_name, errprop, &prop_tbl)) return (DLADM_STATUS_TEMPONLY); - status = i_dladm_set_flowprop_db(flow, prop_name, + status = i_dladm_set_flowprop_db(handle, flow, prop_name, prop_val, val_cnt); } return (status); @@ -131,7 +132,7 @@ dladm_walk_flowprop(int (*func)(void *, const char *), const char *flow, } dladm_status_t -dladm_get_flowprop(const char *flow, uint32_t type, +dladm_get_flowprop(dladm_handle_t handle, const char *flow, uint32_t type, const char *prop_name, char **prop_val, uint_t *val_cntp) { dladm_status_t status; @@ -143,11 +144,11 @@ dladm_get_flowprop(const char *flow, uint32_t type, if (type == DLADM_PROP_VAL_PERSISTENT) { if (i_dladm_is_prop_temponly(prop_name, NULL, &prop_tbl)) return (DLADM_STATUS_TEMPONLY); - return (i_dladm_get_flowprop_db(flow, prop_name, + return (i_dladm_get_flowprop_db(handle, flow, prop_name, prop_val, val_cntp)); } - status = i_dladm_get_prop_temp(flow, type, prop_name, + status = i_dladm_get_prop_temp(handle, flow, type, prop_name, prop_val, val_cntp, &prop_tbl); if (status != DLADM_STATUS_NOTFOUND) return (status); @@ -155,14 +156,14 @@ dladm_get_flowprop(const char *flow, uint32_t type, return (DLADM_STATUS_BADARG); } -#define FLOWPROP_RW_DB(statep, writeop) \ - (i_dladm_rw_db("/etc/dladm/flowprop.conf", \ +#define FLOWPROP_RW_DB(handle, statep, writeop) \ + (i_dladm_rw_db(handle, "/etc/dladm/flowprop.conf", \ S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH, process_prop_db, \ (statep), (writeop))) static dladm_status_t -i_dladm_set_flowprop_db(const char *flow, const char *prop_name, - char **prop_val, uint_t val_cnt) +i_dladm_set_flowprop_db(dladm_handle_t handle, const char *flow, + const char *prop_name, char **prop_val, uint_t val_cnt) { prop_db_state_t state; @@ -173,12 +174,12 @@ i_dladm_set_flowprop_db(const char *flow, const char *prop_name, state.ls_valcntp = &val_cnt; state.ls_initop = NULL; - return (FLOWPROP_RW_DB(&state, B_TRUE)); + return (FLOWPROP_RW_DB(handle, &state, B_TRUE)); } static dladm_status_t -i_dladm_get_flowprop_db(const char *flow, const char *prop_name, - char **prop_val, uint_t *val_cntp) +i_dladm_get_flowprop_db(dladm_handle_t handle, const char *flow, + const char *prop_name, char **prop_val, uint_t *val_cntp) { prop_db_state_t state; @@ -189,11 +190,11 @@ i_dladm_get_flowprop_db(const char *flow, const char *prop_name, state.ls_valcntp = val_cntp; state.ls_initop = NULL; - return (FLOWPROP_RW_DB(&state, B_FALSE)); + return (FLOWPROP_RW_DB(handle, &state, B_FALSE)); } dladm_status_t -i_dladm_init_flowprop_db(void) +i_dladm_init_flowprop_db(dladm_handle_t handle) { prop_db_state_t state; @@ -204,34 +205,30 @@ i_dladm_init_flowprop_db(void) state.ls_valcntp = NULL; state.ls_initop = dladm_set_flowprop; - return (FLOWPROP_RW_DB(&state, B_FALSE)); + return (FLOWPROP_RW_DB(handle, &state, B_FALSE)); } #define MIN_INFO_SIZE (4 * 1024) dladm_status_t -dladm_flow_info(const char *flow, dladm_flow_attr_t *attr) +dladm_flow_info(dladm_handle_t handle, const char *flow, + dladm_flow_attr_t *attr) { dld_ioc_walkflow_t *ioc; - int bufsize, fd; + int bufsize; dld_flowinfo_t *flowinfo; if ((flow == NULL) || (attr == NULL)) return (DLADM_STATUS_BADARG); - if ((fd = open(DLD_CONTROL_DEV, O_RDWR)) < 0) - return (dladm_errno2status(errno)); - bufsize = MIN_INFO_SIZE; - if ((ioc = calloc(1, bufsize)) == NULL) { - (void) close(fd); + if ((ioc = calloc(1, bufsize)) == NULL) return (dladm_errno2status(errno)); - } (void) strlcpy(ioc->wf_name, flow, sizeof (ioc->wf_name)); ioc->wf_len = bufsize - sizeof (*ioc); - while (ioctl(fd, DLDIOC_WALKFLOW, ioc) < 0) { + while (ioctl(dladm_dld_fd(handle), DLDIOC_WALKFLOW, ioc) < 0) { if (errno == ENOSPC) { bufsize *= 2; ioc = realloc(ioc, bufsize); @@ -243,7 +240,6 @@ dladm_flow_info(const char *flow, dladm_flow_attr_t *attr) } } free(ioc); - (void) close(fd); return (dladm_errno2status(errno)); } @@ -260,20 +256,20 @@ dladm_flow_info(const char *flow, dladm_flow_attr_t *attr) sizeof (attr->fa_resource_props)); free(ioc); - (void) close(fd); return (DLADM_STATUS_OK); } /* ARGSUSED */ static dladm_status_t -do_get_maxbw(const char *flow, char **prop_val, uint_t *val_cnt) +do_get_maxbw(dladm_handle_t handle, const char *flow, char **prop_val, + uint_t *val_cnt) { mac_resource_props_t *mrp; char buf[DLADM_STRSIZE]; dladm_flow_attr_t fa; dladm_status_t status; - status = dladm_flow_info(flow, &fa); + status = dladm_flow_info(handle, flow, &fa); if (status != DLADM_STATUS_OK) return (status); mrp = &(fa.fa_resource_props); @@ -290,10 +286,10 @@ do_get_maxbw(const char *flow, char **prop_val, uint_t *val_cnt) /* ARGSUSED */ static dladm_status_t -do_set_maxbw(const char *flow, val_desc_t *vdp, uint_t val_cnt) +do_set_maxbw(dladm_handle_t handle, const char *flow, val_desc_t *vdp, + uint_t val_cnt) { dld_ioc_modifyflow_t attr; - int fd; mac_resource_props_t mrp; void *val; @@ -313,16 +309,9 @@ do_set_maxbw(const char *flow, val_desc_t *vdp, uint_t val_cnt) (void) strlcpy(attr.mf_name, flow, sizeof (attr.mf_name)); bcopy(&mrp, &attr.mf_resource_props, sizeof (mac_resource_props_t)); - fd = open(DLD_CONTROL_DEV, O_RDWR); - if (fd < 0) { + if (ioctl(dladm_dld_fd(handle), DLDIOC_MODIFYFLOW, &attr) < 0) return (dladm_errno2status(errno)); - } - if (ioctl(fd, DLDIOC_MODIFYFLOW, &attr) < 0) { - (void) close(fd); - return (dladm_errno2status(errno)); - } - (void) close(fd); return (DLADM_STATUS_OK); } @@ -366,7 +355,8 @@ do_check_maxbw(fprop_desc_t *pdp, char **prop_val, uint_t val_cnt, /* ARGSUSED */ static dladm_status_t -do_get_priority(const char *flow, char **prop_val, uint_t *val_cnt) +do_get_priority(dladm_handle_t handle, const char *flow, char **prop_val, + uint_t *val_cnt) { mac_resource_props_t *mrp; char buf[DLADM_STRSIZE]; @@ -374,7 +364,7 @@ do_get_priority(const char *flow, char **prop_val, uint_t *val_cnt) dladm_status_t status; bzero(&fa, sizeof (dladm_flow_attr_t)); - status = dladm_flow_info(flow, &fa); + status = dladm_flow_info(handle, flow, &fa); if (status != DLADM_STATUS_OK) return (status); mrp = &(fa.fa_resource_props); @@ -391,10 +381,10 @@ do_get_priority(const char *flow, char **prop_val, uint_t *val_cnt) /* ARGSUSED */ static dladm_status_t -do_set_priority(const char *flow, val_desc_t *vdp, uint_t val_cnt) +do_set_priority(dladm_handle_t handle, const char *flow, val_desc_t *vdp, + uint_t val_cnt) { dld_ioc_modifyflow_t attr; - int fd; mac_resource_props_t mrp; void *val; @@ -414,16 +404,9 @@ do_set_priority(const char *flow, val_desc_t *vdp, uint_t val_cnt) (void) strlcpy(attr.mf_name, flow, sizeof (attr.mf_name)); bcopy(&mrp, &attr.mf_resource_props, sizeof (mac_resource_props_t)); - fd = open(DLD_CONTROL_DEV, O_RDWR); - if (fd < 0) { + if (ioctl(dladm_dld_fd(handle), DLDIOC_MODIFYFLOW, &attr) < 0) return (dladm_errno2status(errno)); - } - if (ioctl(fd, DLDIOC_MODIFYFLOW, &attr) < 0) { - (void) close(fd); - return (dladm_errno2status(errno)); - } - (void) close(fd); return (DLADM_STATUS_OK); } @@ -594,7 +577,8 @@ dladm_flow_proplist_extract(dladm_arg_list_t *proplist, } dladm_status_t -i_dladm_set_flow_proplist_db(char *flow, dladm_arg_list_t *proplist) +i_dladm_set_flow_proplist_db(dladm_handle_t handle, char *flow, + dladm_arg_list_t *proplist) { dladm_status_t status, ssave = DLADM_STATUS_OK; dladm_arg_info_t ai; @@ -602,7 +586,7 @@ i_dladm_set_flow_proplist_db(char *flow, dladm_arg_list_t *proplist) for (i = 0; i < proplist->al_count; i++) { ai = proplist->al_info[i]; - status = i_dladm_set_flowprop_db(flow, ai.ai_name, + status = i_dladm_set_flowprop_db(handle, flow, ai.ai_name, ai.ai_val, ai.ai_count); if (status != DLADM_STATUS_OK) ssave = status; diff --git a/usr/src/lib/libdladm/common/libdladm.c b/usr/src/lib/libdladm/common/libdladm.c index cc6bf542f7..7eeed7e91f 100644 --- a/usr/src/lib/libdladm/common/libdladm.c +++ b/usr/src/lib/libdladm/common/libdladm.c @@ -32,11 +32,77 @@ #include <stdlib.h> #include <sys/param.h> #include <sys/stat.h> +#include <sys/dld.h> #include <libdladm_impl.h> #include <libintl.h> #include <libdlpi.h> -static char dladm_rootdir[MAXPATHLEN] = "/"; +static char dladm_rootdir[MAXPATHLEN] = "/"; + +dladm_status_t +dladm_open(dladm_handle_t *handle) +{ + int dld_fd; + + if (handle == NULL) + return (DLADM_STATUS_BADARG); + + if ((dld_fd = open(DLD_CONTROL_DEV, O_RDWR)) < 0) + return (dladm_errno2status(errno)); + + /* + * Don't open DLMGMT_DOOR now. dlmgmtd(1M) is not able to + * open the door when the dladm handle is opened because the + * door hasn't been created yet at that time. Thus, we must + * open it on-demand in dladm_door_fd(). Move the open() + * to dladm_door_fd() for all cases. + */ + + if ((*handle = malloc(sizeof (struct dladm_handle))) == NULL) { + (void) close(dld_fd); + return (DLADM_STATUS_NOMEM); + } + + (*handle)->dld_fd = dld_fd; + (*handle)->door_fd = -1; + + return (DLADM_STATUS_OK); +} + +void +dladm_close(dladm_handle_t handle) +{ + if (handle != NULL) { + (void) close(handle->dld_fd); + if (handle->door_fd != -1) + (void) close(handle->door_fd); + free(handle); + } +} + +int +dladm_dld_fd(dladm_handle_t handle) +{ + return (handle->dld_fd); +} + +/* + * If DLMGMT_DOOR hasn't been opened in the handle yet, open it. + */ +dladm_status_t +dladm_door_fd(dladm_handle_t handle, int *door_fd) +{ + int fd; + + if (handle->door_fd == -1) { + if ((fd = open(DLMGMT_DOOR, O_RDONLY)) < 0) + return (dladm_errno2status(errno)); + handle->door_fd = fd; + } + *door_fd = handle->door_fd; + + return (DLADM_STATUS_OK); +} const char * dladm_status2str(dladm_status_t status, char *buf) @@ -557,8 +623,8 @@ dladm_media2str(uint32_t media, char *buf) } dladm_status_t -i_dladm_rw_db(const char *db_file, mode_t db_perms, - dladm_status_t (*process_db)(void *, FILE *, FILE *), +i_dladm_rw_db(dladm_handle_t handle, const char *db_file, mode_t db_perms, + dladm_status_t (*process_db)(dladm_handle_t, void *, FILE *, FILE *), void *arg, boolean_t writeop) { dladm_status_t status = DLADM_STATUS_OK; @@ -613,7 +679,7 @@ i_dladm_rw_db(const char *db_file, mode_t db_perms, return (dladm_errno2status(errno)); } } - status = (*process_db)(arg, fp, nfp); + status = (*process_db)(handle, arg, fp, nfp); if (!writeop || status != DLADM_STATUS_OK) goto done; diff --git a/usr/src/lib/libdladm/common/libdladm.h b/usr/src/lib/libdladm/common/libdladm.h index a76245d478..c0725cf45f 100644 --- a/usr/src/lib/libdladm/common/libdladm.h +++ b/usr/src/lib/libdladm/common/libdladm.h @@ -160,6 +160,20 @@ typedef enum { typedef int dladm_conf_t; #define DLADM_INVALID_CONF 0 +/* opaque dladm handle to libdladm functions */ +struct dladm_handle; +typedef struct dladm_handle *dladm_handle_t; + +/* open/close handle */ +extern dladm_status_t dladm_open(dladm_handle_t *); +extern void dladm_close(dladm_handle_t); + +/* + * retrieve the dld file descriptor from handle, only libdladm and + * dlmgmtd are given access to the door file descriptor. + */ +extern int dladm_dld_fd(dladm_handle_t); + typedef struct dladm_arg_info { const char *ai_name; char *ai_val[DLADM_MAX_ARG_VALS]; @@ -207,8 +221,9 @@ extern dladm_status_t dladm_parse_flow_attrs(char *, dladm_arg_list_t **, boolean_t); extern void dladm_free_attrs(dladm_arg_list_t *); -extern dladm_status_t dladm_start_usagelog(dladm_logtype_t, uint_t); -extern dladm_status_t dladm_stop_usagelog(dladm_logtype_t); +extern dladm_status_t dladm_start_usagelog(dladm_handle_t, dladm_logtype_t, + uint_t); +extern dladm_status_t dladm_stop_usagelog(dladm_handle_t, dladm_logtype_t); extern dladm_status_t dladm_walk_usage_res(int (*)(dladm_usage_t *, void *), int, char *, char *, char *, char *, void *); extern dladm_status_t dladm_walk_usage_time(int (*)(dladm_usage_t *, void *), diff --git a/usr/src/lib/libdladm/common/libdladm_impl.h b/usr/src/lib/libdladm/common/libdladm_impl.h index cf57e1d49e..eb631fef7d 100644 --- a/usr/src/lib/libdladm/common/libdladm_impl.h +++ b/usr/src/lib/libdladm/common/libdladm_impl.h @@ -36,11 +36,26 @@ extern "C" { #define MAXLINELEN 1024 #define BUFLEN(lim, ptr) (((lim) > (ptr)) ? ((lim) - (ptr)) : 0) +/* + * The handle contains file descriptors to DLD_CONTROL_DEV and + * DLMGMT_DOOR. Rather than opening the file descriptor each time + * it is required, the handle is opened by consumers of libdladm + * (e.g., dladm) and then passed to libdladm. + */ +struct dladm_handle { + int dld_fd; /* file descriptor to DLD_CONTROL_DEV */ + int door_fd; /* file descriptor to DLMGMT_DOOR */ +}; + +/* DLMGMT_DOOR can only be accessed by libdladm and dlmgmtd */ +extern dladm_status_t dladm_door_fd(dladm_handle_t, int *); + extern dladm_status_t dladm_errno2status(int); -extern dladm_status_t i_dladm_rw_db(const char *, mode_t, - dladm_status_t (*)(void *, FILE *, FILE *), - void *, boolean_t); -extern dladm_status_t i_dladm_get_state(datalink_id_t, link_state_t *); +extern dladm_status_t i_dladm_rw_db(dladm_handle_t, const char *, mode_t, + dladm_status_t (*)(dladm_handle_t, void *, FILE *, + FILE *), void *, boolean_t); +extern dladm_status_t i_dladm_get_state(dladm_handle_t, datalink_id_t, + link_state_t *); extern const char *dladm_pri2str(mac_priority_level_t, char *); extern dladm_status_t dladm_str2pri(char *, mac_priority_level_t *); @@ -94,8 +109,8 @@ typedef struct val_desc { #define VALCNT(vals) (sizeof ((vals)) / sizeof (val_desc_t)) -extern dladm_status_t dladm_link_proplist_extract(dladm_arg_list_t *, - mac_resource_props_t *); +extern dladm_status_t dladm_link_proplist_extract(dladm_handle_t, + dladm_arg_list_t *, mac_resource_props_t *); extern dladm_status_t dladm_flow_proplist_extract(dladm_arg_list_t *, mac_resource_props_t *); diff --git a/usr/src/lib/libdladm/common/libdlaggr.c b/usr/src/lib/libdladm/common/libdlaggr.c index 5a155fcad9..a1e58b469b 100644 --- a/usr/src/lib/libdladm/common/libdlaggr.c +++ b/usr/src/lib/libdladm/common/libdlaggr.c @@ -137,17 +137,9 @@ static dladm_aggr_port_state_t port_states[] = { (sizeof (port_states) / sizeof (dladm_aggr_port_state_t)) static int -i_dladm_aggr_ioctl(int cmd, void *ptr) +i_dladm_aggr_ioctl(dladm_handle_t handle, int cmd, void *ptr) { - int err, fd; - - if ((fd = open(DLD_CONTROL_DEV, O_RDWR)) < 0) - return (-1); - - err = ioctl(fd, cmd, ptr); - (void) close(fd); - - return (err); + return (ioctl(dladm_dld_fd(handle), cmd, ptr)); } /* @@ -207,7 +199,8 @@ fail: * Caller must free attrp->la_ports. */ static dladm_status_t -i_dladm_aggr_info_active(datalink_id_t linkid, dladm_aggr_grp_attr_t *attrp) +i_dladm_aggr_info_active(dladm_handle_t handle, datalink_id_t linkid, + dladm_aggr_grp_attr_t *attrp) { laioc_info_t *ioc; int bufsize; @@ -223,7 +216,7 @@ i_dladm_aggr_info_active(datalink_id_t linkid, dladm_aggr_grp_attr_t *attrp) tryagain: ioc->li_bufsize = bufsize; - if (i_dladm_aggr_ioctl(LAIOC_INFO, ioc) != 0) { + if (i_dladm_aggr_ioctl(handle, LAIOC_INFO, ioc) != 0) { if (errno == ENOSPC) { /* * The LAIOC_INFO call failed due to a short @@ -261,7 +254,8 @@ bail: * Caller must free attrp->la_ports. */ static dladm_status_t -i_dladm_aggr_info_persist(datalink_id_t linkid, dladm_aggr_grp_attr_t *attrp) +i_dladm_aggr_info_persist(dladm_handle_t handle, datalink_id_t linkid, + dladm_aggr_grp_attr_t *attrp) { dladm_conf_t conf; uint32_t nports, i; @@ -272,29 +266,31 @@ i_dladm_aggr_info_persist(datalink_id_t linkid, dladm_aggr_grp_attr_t *attrp) char macstr[ETHERADDRL * 3]; attrp->lg_linkid = linkid; - if ((status = dladm_read_conf(linkid, &conf)) != DLADM_STATUS_OK) + if ((status = dladm_read_conf(handle, linkid, &conf)) != + DLADM_STATUS_OK) return (status); - status = dladm_get_conf_field(conf, FKEY, &u64, sizeof (u64)); + status = dladm_get_conf_field(handle, conf, FKEY, &u64, sizeof (u64)); if (status != DLADM_STATUS_OK) goto done; attrp->lg_key = (uint16_t)u64; - status = dladm_get_conf_field(conf, FPOLICY, &u64, sizeof (u64)); + status = dladm_get_conf_field(handle, conf, FPOLICY, &u64, + sizeof (u64)); if (status != DLADM_STATUS_OK) goto done; attrp->lg_policy = (uint32_t)u64; - status = dladm_get_conf_field(conf, FFIXMACADDR, &attrp->lg_mac_fixed, - sizeof (boolean_t)); + status = dladm_get_conf_field(handle, conf, FFIXMACADDR, + &attrp->lg_mac_fixed, sizeof (boolean_t)); if (status != DLADM_STATUS_OK) goto done; if (attrp->lg_mac_fixed) { boolean_t fixed; - if ((status = dladm_get_conf_field(conf, FMACADDR, macstr, - sizeof (macstr))) != DLADM_STATUS_OK) { + if ((status = dladm_get_conf_field(handle, conf, FMACADDR, + macstr, sizeof (macstr))) != DLADM_STATUS_OK) { goto done; } if (!dladm_aggr_str2macaddr(macstr, &fixed, attrp->lg_mac)) { @@ -303,22 +299,25 @@ i_dladm_aggr_info_persist(datalink_id_t linkid, dladm_aggr_grp_attr_t *attrp) } } - status = dladm_get_conf_field(conf, FFORCE, &attrp->lg_force, + status = dladm_get_conf_field(handle, conf, FFORCE, &attrp->lg_force, sizeof (boolean_t)); if (status != DLADM_STATUS_OK) goto done; - status = dladm_get_conf_field(conf, FLACPMODE, &u64, sizeof (u64)); + status = dladm_get_conf_field(handle, conf, FLACPMODE, &u64, + sizeof (u64)); if (status != DLADM_STATUS_OK) goto done; attrp->lg_lacp_mode = (aggr_lacp_mode_t)u64; - status = dladm_get_conf_field(conf, FLACPTIMER, &u64, sizeof (u64)); + status = dladm_get_conf_field(handle, conf, FLACPTIMER, &u64, + sizeof (u64)); if (status != DLADM_STATUS_OK) goto done; attrp->lg_lacp_timer = (aggr_lacp_timer_t)u64; - status = dladm_get_conf_field(conf, FNPORTS, &u64, sizeof (u64)); + status = dladm_get_conf_field(handle, conf, FNPORTS, &u64, + sizeof (u64)); if (status != DLADM_STATUS_OK) goto done; nports = (uint32_t)u64; @@ -330,7 +329,7 @@ i_dladm_aggr_info_persist(datalink_id_t linkid, dladm_aggr_grp_attr_t *attrp) goto done; } - status = dladm_get_conf_field(conf, FPORTS, portstr, size); + status = dladm_get_conf_field(handle, conf, FPORTS, portstr, size); if (status != DLADM_STATUS_OK) { free(portstr); goto done; @@ -354,27 +353,27 @@ i_dladm_aggr_info_persist(datalink_id_t linkid, dladm_aggr_grp_attr_t *attrp) free(portstr); done: - dladm_destroy_conf(conf); + dladm_destroy_conf(handle, conf); return (status); } dladm_status_t -dladm_aggr_info(datalink_id_t linkid, dladm_aggr_grp_attr_t *attrp, - uint32_t flags) +dladm_aggr_info(dladm_handle_t handle, datalink_id_t linkid, + dladm_aggr_grp_attr_t *attrp, uint32_t flags) { assert(flags == DLADM_OPT_ACTIVE || flags == DLADM_OPT_PERSIST); if (flags == DLADM_OPT_ACTIVE) - return (i_dladm_aggr_info_active(linkid, attrp)); + return (i_dladm_aggr_info_active(handle, linkid, attrp)); else - return (i_dladm_aggr_info_persist(linkid, attrp)); + return (i_dladm_aggr_info_persist(handle, linkid, attrp)); } /* * Add or remove one or more ports to/from an existing link aggregation. */ static dladm_status_t -i_dladm_aggr_add_rmv(datalink_id_t linkid, uint32_t nports, - dladm_aggr_port_attr_db_t *ports, uint32_t flags, int cmd) +i_dladm_aggr_add_rmv(dladm_handle_t handle, datalink_id_t linkid, + uint32_t nports, dladm_aggr_port_attr_db_t *ports, uint32_t flags, int cmd) { char *orig_portstr = NULL, *portstr = NULL; laioc_add_rem_t *iocp = NULL; @@ -395,7 +394,7 @@ i_dladm_aggr_add_rmv(datalink_id_t linkid, uint32_t nports, * physical links. */ for (i = 0; i < nports; i++) { - if ((dladm_datalink_id2info(ports[i].lp_linkid, NULL, + if ((dladm_datalink_id2info(handle, ports[i].lp_linkid, NULL, &class, &media, NULL, 0) != DLADM_STATUS_OK) || (class != DATALINK_CLASS_PHYS) || (media != DL_ETHER)) { return (DLADM_STATUS_BADARG); @@ -409,14 +408,14 @@ i_dladm_aggr_add_rmv(datalink_id_t linkid, uint32_t nports, * PORT_DELIMITER ('.'). */ if (flags & DLADM_OPT_PERSIST) { - status = dladm_read_conf(linkid, &conf); + status = dladm_read_conf(handle, linkid, &conf); if (status != DLADM_STATUS_OK) return (status); /* * Get the original configuration of FNPORTS and FPORTS. */ - status = dladm_get_conf_field(conf, FNPORTS, &u64, + status = dladm_get_conf_field(handle, conf, FNPORTS, &u64, sizeof (u64)); if (status != DLADM_STATUS_OK) goto destroyconf; @@ -436,7 +435,8 @@ i_dladm_aggr_add_rmv(datalink_id_t linkid, uint32_t nports, goto destroyconf; } - status = dladm_get_conf_field(conf, FPORTS, orig_portstr, size); + status = dladm_get_conf_field(handle, conf, FPORTS, + orig_portstr, size); if (status != DLADM_STATUS_OK) goto destroyconf; @@ -496,14 +496,14 @@ i_dladm_aggr_add_rmv(datalink_id_t linkid, uint32_t nports, } u64 = result_nports; - if ((status = dladm_set_conf_field(conf, FNPORTS, + if ((status = dladm_set_conf_field(handle, conf, FNPORTS, DLADM_TYPE_UINT64, &u64)) != DLADM_STATUS_OK) { free(portstr); goto destroyconf; } - status = dladm_set_conf_field(conf, FPORTS, DLADM_TYPE_STR, - portstr); + status = dladm_set_conf_field(handle, conf, FPORTS, + DLADM_TYPE_STR, portstr); free(portstr); if (status != DLADM_STATUS_OK) goto destroyconf; @@ -511,10 +511,10 @@ i_dladm_aggr_add_rmv(datalink_id_t linkid, uint32_t nports, /* * Write the new configuration to the persistent repository. */ - status = dladm_write_conf(conf); + status = dladm_write_conf(handle, conf); destroyconf: - dladm_destroy_conf(conf); + dladm_destroy_conf(handle, conf); if (status != DLADM_STATUS_OK) { free(orig_portstr); return (status); @@ -546,7 +546,7 @@ destroyconf: for (i = 0; i < nports; i++) ioc_ports[i].lp_linkid = ports[i].lp_linkid; - if (i_dladm_aggr_ioctl(cmd, iocp) < 0) + if (i_dladm_aggr_ioctl(handle, cmd, iocp) < 0) status = dladm_errno2status(errno); done: @@ -557,15 +557,15 @@ done: * persistent configuration if we've changed that. */ if ((status != DLADM_STATUS_OK) && (flags & DLADM_OPT_PERSIST)) { - if (dladm_read_conf(linkid, &conf) == DLADM_STATUS_OK) { + if (dladm_read_conf(handle, linkid, &conf) == DLADM_STATUS_OK) { u64 = orig_nports; - if ((dladm_set_conf_field(conf, FNPORTS, + if ((dladm_set_conf_field(handle, conf, FNPORTS, DLADM_TYPE_UINT64, &u64) == DLADM_STATUS_OK) && - (dladm_set_conf_field(conf, FPORTS, DLADM_TYPE_STR, - orig_portstr) == DLADM_STATUS_OK)) { - (void) dladm_write_conf(conf); + (dladm_set_conf_field(handle, conf, FPORTS, + DLADM_TYPE_STR, orig_portstr) == DLADM_STATUS_OK)) { + (void) dladm_write_conf(handle, conf); } - (void) dladm_destroy_conf(conf); + (void) dladm_destroy_conf(handle, conf); } } free(orig_portstr); @@ -576,8 +576,8 @@ done: * Send a modify command to the link aggregation driver. */ static dladm_status_t -i_dladm_aggr_modify_sys(datalink_id_t linkid, uint32_t mask, - dladm_aggr_modify_attr_t *attr) +i_dladm_aggr_modify_sys(dladm_handle_t handle, datalink_id_t linkid, + uint32_t mask, dladm_aggr_modify_attr_t *attr) { laioc_modify_t ioc; @@ -599,7 +599,7 @@ i_dladm_aggr_modify_sys(datalink_id_t linkid, uint32_t mask, ioc.lu_lacp_mode = attr->ld_lacp_mode; ioc.lu_lacp_timer = attr->ld_lacp_timer; - if (i_dladm_aggr_ioctl(LAIOC_MODIFY, &ioc) < 0) { + if (i_dladm_aggr_ioctl(handle, LAIOC_MODIFY, &ioc) < 0) { if (errno == EINVAL) return (DLADM_STATUS_MACADDRINVAL); else @@ -613,9 +613,9 @@ i_dladm_aggr_modify_sys(datalink_id_t linkid, uint32_t mask, * Send a create command to the link aggregation driver. */ static dladm_status_t -i_dladm_aggr_create_sys(datalink_id_t linkid, uint16_t key, uint32_t nports, - dladm_aggr_port_attr_db_t *ports, uint32_t policy, - boolean_t mac_addr_fixed, const uchar_t *mac_addr, +i_dladm_aggr_create_sys(dladm_handle_t handle, datalink_id_t linkid, + uint16_t key, uint32_t nports, dladm_aggr_port_attr_db_t *ports, + uint32_t policy, boolean_t mac_addr_fixed, const uchar_t *mac_addr, aggr_lacp_mode_t lacp_mode, aggr_lacp_timer_t lacp_timer, boolean_t force) { int i, len; @@ -648,7 +648,7 @@ i_dladm_aggr_create_sys(datalink_id_t linkid, uint16_t key, uint32_t nports, bcopy(mac_addr, iocp->lc_mac, ETHERADDRL); iocp->lc_mac_fixed = mac_addr_fixed; - if (i_dladm_aggr_ioctl(LAIOC_CREATE, iocp) < 0) + if (i_dladm_aggr_ioctl(handle, LAIOC_CREATE, iocp) < 0) status = dladm_errno2status(errno); done: @@ -660,7 +660,7 @@ done: * Invoked to bring up a link aggregation group. */ static int -i_dladm_aggr_up(datalink_id_t linkid, void *arg) +i_dladm_aggr_up(dladm_handle_t handle, datalink_id_t linkid, void *arg) { dladm_status_t *statusp = (dladm_status_t *)arg; dladm_aggr_grp_attr_t attr; @@ -669,7 +669,7 @@ i_dladm_aggr_up(datalink_id_t linkid, void *arg) int i, j; dladm_status_t status; - status = dladm_aggr_info(linkid, &attr, DLADM_OPT_PERSIST); + status = dladm_aggr_info(handle, linkid, &attr, DLADM_OPT_PERSIST); if (status != DLADM_STATUS_OK) { *statusp = status; return (DLADM_WALK_CONTINUE); @@ -694,7 +694,8 @@ i_dladm_aggr_up(datalink_id_t linkid, void *arg) uint32_t flags; dladm_status_t s; - s = dladm_datalink_id2info(portid, &flags, NULL, NULL, NULL, 0); + s = dladm_datalink_id2info(handle, portid, &flags, NULL, NULL, + NULL, 0); if (s != DLADM_STATUS_OK || !(flags & DLADM_OPT_ACTIVE)) continue; @@ -712,24 +713,25 @@ i_dladm_aggr_up(datalink_id_t linkid, void *arg) /* * Create active aggregation. */ - if ((status = i_dladm_aggr_create_sys(linkid, + if ((status = i_dladm_aggr_create_sys(handle, linkid, key, j, ports, attr.lg_policy, attr.lg_mac_fixed, (const uchar_t *)attr.lg_mac, attr.lg_lacp_mode, attr.lg_lacp_timer, attr.lg_force)) != DLADM_STATUS_OK) { goto done; } - if ((status = dladm_up_datalink_id(linkid)) != DLADM_STATUS_OK) { + if ((status = dladm_up_datalink_id(handle, linkid)) != + DLADM_STATUS_OK) { laioc_delete_t ioc; ioc.ld_linkid = linkid; - (void) i_dladm_aggr_ioctl(LAIOC_DELETE, &ioc); + (void) i_dladm_aggr_ioctl(handle, LAIOC_DELETE, &ioc); goto done; } /* * Reset the active linkprop of this specific link. */ - (void) dladm_init_linkprop(linkid, B_FALSE); + (void) dladm_init_linkprop(handle, linkid, B_FALSE); done: free(attr.lg_ports); @@ -744,17 +746,17 @@ done: * case, the walk may terminate early if bringup of an aggregation fails. */ dladm_status_t -dladm_aggr_up(datalink_id_t linkid) +dladm_aggr_up(dladm_handle_t handle, datalink_id_t linkid) { dladm_status_t status; if (linkid == DATALINK_ALL_LINKID) { - (void) dladm_walk_datalink_id(i_dladm_aggr_up, &status, + (void) dladm_walk_datalink_id(i_dladm_aggr_up, handle, &status, DATALINK_CLASS_AGGR, DATALINK_ANY_MEDIATYPE, DLADM_OPT_PERSIST); return (DLADM_STATUS_OK); } else { - (void) i_dladm_aggr_up(linkid, &status); + (void) i_dladm_aggr_up(handle, linkid, &status); return (status); } } @@ -995,11 +997,11 @@ dladm_aggr_portstate2str(aggr_port_state_t state_id, char *buf) } static dladm_status_t -dladm_aggr_persist_aggr_conf(const char *link, datalink_id_t linkid, - uint16_t key, uint32_t nports, dladm_aggr_port_attr_db_t *ports, - uint32_t policy, boolean_t mac_addr_fixed, const uchar_t *mac_addr, - aggr_lacp_mode_t lacp_mode, aggr_lacp_timer_t lacp_timer, - boolean_t force) +dladm_aggr_persist_aggr_conf(dladm_handle_t handle, const char *link, + datalink_id_t linkid, uint16_t key, uint32_t nports, + dladm_aggr_port_attr_db_t *ports, uint32_t policy, boolean_t mac_addr_fixed, + const uchar_t *mac_addr, aggr_lacp_mode_t lacp_mode, + aggr_lacp_timer_t lacp_timer, boolean_t force) { dladm_conf_t conf = DLADM_INVALID_CONF; char *portstr = NULL; @@ -1008,18 +1010,20 @@ dladm_aggr_persist_aggr_conf(const char *link, datalink_id_t linkid, int i, size; uint64_t u64; - if ((status = dladm_create_conf(link, linkid, DATALINK_CLASS_AGGR, - DL_ETHER, &conf)) != DLADM_STATUS_OK) { + if ((status = dladm_create_conf(handle, link, linkid, + DATALINK_CLASS_AGGR, DL_ETHER, &conf)) != DLADM_STATUS_OK) { return (status); } u64 = key; - status = dladm_set_conf_field(conf, FKEY, DLADM_TYPE_UINT64, &u64); + status = dladm_set_conf_field(handle, conf, FKEY, DLADM_TYPE_UINT64, + &u64); if (status != DLADM_STATUS_OK) goto done; u64 = nports; - status = dladm_set_conf_field(conf, FNPORTS, DLADM_TYPE_UINT64, &u64); + status = dladm_set_conf_field(handle, conf, FNPORTS, DLADM_TYPE_UINT64, + &u64); if (status != DLADM_STATUS_OK) goto done; @@ -1031,19 +1035,21 @@ dladm_aggr_persist_aggr_conf(const char *link, datalink_id_t linkid, for (i = 0; i < nports; i++) WRITE_PORT(portstr, ports[i].lp_linkid, size); - status = dladm_set_conf_field(conf, FPORTS, DLADM_TYPE_STR, portstr); + status = dladm_set_conf_field(handle, conf, FPORTS, DLADM_TYPE_STR, + portstr); free(portstr); if (status != DLADM_STATUS_OK) goto done; u64 = policy; - status = dladm_set_conf_field(conf, FPOLICY, DLADM_TYPE_UINT64, &u64); + status = dladm_set_conf_field(handle, conf, FPOLICY, DLADM_TYPE_UINT64, + &u64); if (status != DLADM_STATUS_OK) goto done; - status = dladm_set_conf_field(conf, FFIXMACADDR, DLADM_TYPE_BOOLEAN, - &mac_addr_fixed); + status = dladm_set_conf_field(handle, conf, FFIXMACADDR, + DLADM_TYPE_BOOLEAN, &mac_addr_fixed); if (status != DLADM_STATUS_OK) goto done; @@ -1054,34 +1060,36 @@ dladm_aggr_persist_aggr_conf(const char *link, datalink_id_t linkid, } (void) dladm_aggr_macaddr2str(mac_addr, macstr); - status = dladm_set_conf_field(conf, FMACADDR, DLADM_TYPE_STR, - macstr); + status = dladm_set_conf_field(handle, conf, FMACADDR, + DLADM_TYPE_STR, macstr); if (status != DLADM_STATUS_OK) goto done; } - status = dladm_set_conf_field(conf, FFORCE, DLADM_TYPE_BOOLEAN, &force); + status = dladm_set_conf_field(handle, conf, FFORCE, DLADM_TYPE_BOOLEAN, + &force); if (status != DLADM_STATUS_OK) goto done; u64 = lacp_mode; - status = dladm_set_conf_field(conf, FLACPMODE, DLADM_TYPE_UINT64, &u64); + status = dladm_set_conf_field(handle, conf, FLACPMODE, + DLADM_TYPE_UINT64, &u64); if (status != DLADM_STATUS_OK) goto done; u64 = lacp_timer; - status = dladm_set_conf_field(conf, FLACPTIMER, DLADM_TYPE_UINT64, - &u64); + status = dladm_set_conf_field(handle, conf, FLACPTIMER, + DLADM_TYPE_UINT64, &u64); if (status != DLADM_STATUS_OK) goto done; /* * Commit the link aggregation configuration. */ - status = dladm_write_conf(conf); + status = dladm_write_conf(handle, conf); done: - dladm_destroy_conf(conf); + dladm_destroy_conf(handle, conf); return (status); } @@ -1090,10 +1098,10 @@ done: * file and bring it up. */ dladm_status_t -dladm_aggr_create(const char *name, uint16_t key, uint32_t nports, - dladm_aggr_port_attr_db_t *ports, uint32_t policy, boolean_t mac_addr_fixed, - const uchar_t *mac_addr, aggr_lacp_mode_t lacp_mode, - aggr_lacp_timer_t lacp_timer, uint32_t flags) +dladm_aggr_create(dladm_handle_t handle, const char *name, uint16_t key, + uint32_t nports, dladm_aggr_port_attr_db_t *ports, uint32_t policy, + boolean_t mac_addr_fixed, const uchar_t *mac_addr, + aggr_lacp_mode_t lacp_mode, aggr_lacp_timer_t lacp_timer, uint32_t flags) { datalink_id_t linkid = DATALINK_INVALID_LINKID; uint32_t media; @@ -1109,7 +1117,7 @@ dladm_aggr_create(const char *name, uint16_t key, uint32_t nports, return (DLADM_STATUS_BADARG); for (i = 0; i < nports; i++) { - if ((dladm_datalink_id2info(ports[i].lp_linkid, NULL, + if ((dladm_datalink_id2info(handle, ports[i].lp_linkid, NULL, &class, &media, NULL, 0) != DLADM_STATUS_OK) || !((class == DATALINK_CLASS_PHYS) && (media == DL_ETHER))) { return (DLADM_STATUS_BADARG); @@ -1117,27 +1125,28 @@ dladm_aggr_create(const char *name, uint16_t key, uint32_t nports, } flags &= (DLADM_OPT_ACTIVE | DLADM_OPT_PERSIST); - if ((status = dladm_create_datalink_id(name, DATALINK_CLASS_AGGR, - DL_ETHER, flags, &linkid)) != DLADM_STATUS_OK) { + if ((status = dladm_create_datalink_id(handle, name, + DATALINK_CLASS_AGGR, DL_ETHER, flags, &linkid)) != + DLADM_STATUS_OK) { goto fail; } if ((flags & DLADM_OPT_PERSIST) && - (status = dladm_aggr_persist_aggr_conf(name, linkid, key, nports, - ports, policy, mac_addr_fixed, mac_addr, lacp_mode, lacp_timer, - force)) != DLADM_STATUS_OK) { + (status = dladm_aggr_persist_aggr_conf(handle, name, linkid, key, + nports, ports, policy, mac_addr_fixed, mac_addr, lacp_mode, + lacp_timer, force)) != DLADM_STATUS_OK) { goto fail; } if (!(flags & DLADM_OPT_ACTIVE)) return (DLADM_STATUS_OK); - status = i_dladm_aggr_create_sys(linkid, key, nports, ports, policy, - mac_addr_fixed, mac_addr, lacp_mode, lacp_timer, force); + status = i_dladm_aggr_create_sys(handle, linkid, key, nports, ports, + policy, mac_addr_fixed, mac_addr, lacp_mode, lacp_timer, force); if (status != DLADM_STATUS_OK) { if (flags & DLADM_OPT_PERSIST) - (void) dladm_remove_conf(linkid); + (void) dladm_remove_conf(handle, linkid); goto fail; } @@ -1145,21 +1154,21 @@ dladm_aggr_create(const char *name, uint16_t key, uint32_t nports, fail: if (linkid != DATALINK_INVALID_LINKID) - (void) dladm_destroy_datalink_id(linkid, flags); + (void) dladm_destroy_datalink_id(handle, linkid, flags); return (status); } static dladm_status_t -i_dladm_aggr_get_aggr_attr(dladm_conf_t conf, uint32_t mask, - dladm_aggr_modify_attr_t *attrp) +i_dladm_aggr_get_aggr_attr(dladm_handle_t handle, dladm_conf_t conf, + uint32_t mask, dladm_aggr_modify_attr_t *attrp) { dladm_status_t status = DLADM_STATUS_OK; char macstr[ETHERADDRL * 3]; uint64_t u64; if (mask & DLADM_AGGR_MODIFY_POLICY) { - status = dladm_get_conf_field(conf, FPOLICY, &u64, + status = dladm_get_conf_field(handle, conf, FPOLICY, &u64, sizeof (u64)); if (status != DLADM_STATUS_OK) return (status); @@ -1167,7 +1176,7 @@ i_dladm_aggr_get_aggr_attr(dladm_conf_t conf, uint32_t mask, } if (mask & DLADM_AGGR_MODIFY_MAC) { - status = dladm_get_conf_field(conf, FFIXMACADDR, + status = dladm_get_conf_field(handle, conf, FFIXMACADDR, &attrp->ld_mac_fixed, sizeof (boolean_t)); if (status != DLADM_STATUS_OK) return (status); @@ -1175,7 +1184,7 @@ i_dladm_aggr_get_aggr_attr(dladm_conf_t conf, uint32_t mask, if (attrp->ld_mac_fixed) { boolean_t fixed; - status = dladm_get_conf_field(conf, FMACADDR, + status = dladm_get_conf_field(handle, conf, FMACADDR, macstr, sizeof (macstr)); if (status != DLADM_STATUS_OK) return (status); @@ -1188,7 +1197,7 @@ i_dladm_aggr_get_aggr_attr(dladm_conf_t conf, uint32_t mask, } if (mask & DLADM_AGGR_MODIFY_LACP_MODE) { - status = dladm_get_conf_field(conf, FLACPMODE, &u64, + status = dladm_get_conf_field(handle, conf, FLACPMODE, &u64, sizeof (u64)); if (status != DLADM_STATUS_OK) return (status); @@ -1196,7 +1205,7 @@ i_dladm_aggr_get_aggr_attr(dladm_conf_t conf, uint32_t mask, } if (mask & DLADM_AGGR_MODIFY_LACP_TIMER) { - status = dladm_get_conf_field(conf, FLACPTIMER, &u64, + status = dladm_get_conf_field(handle, conf, FLACPTIMER, &u64, sizeof (u64)); if (status != DLADM_STATUS_OK) return (status); @@ -1207,8 +1216,8 @@ i_dladm_aggr_get_aggr_attr(dladm_conf_t conf, uint32_t mask, } static dladm_status_t -i_dladm_aggr_set_aggr_attr(dladm_conf_t conf, uint32_t mask, - dladm_aggr_modify_attr_t *attrp) +i_dladm_aggr_set_aggr_attr(dladm_handle_t handle, dladm_conf_t conf, + uint32_t mask, dladm_aggr_modify_attr_t *attrp) { dladm_status_t status = DLADM_STATUS_OK; char macstr[ETHERADDRL * 3]; @@ -1216,21 +1225,21 @@ i_dladm_aggr_set_aggr_attr(dladm_conf_t conf, uint32_t mask, if (mask & DLADM_AGGR_MODIFY_POLICY) { u64 = attrp->ld_policy; - status = dladm_set_conf_field(conf, FPOLICY, DLADM_TYPE_UINT64, - &u64); + status = dladm_set_conf_field(handle, conf, FPOLICY, + DLADM_TYPE_UINT64, &u64); if (status != DLADM_STATUS_OK) return (status); } if (mask & DLADM_AGGR_MODIFY_MAC) { - status = dladm_set_conf_field(conf, FFIXMACADDR, + status = dladm_set_conf_field(handle, conf, FFIXMACADDR, DLADM_TYPE_BOOLEAN, &attrp->ld_mac_fixed); if (status != DLADM_STATUS_OK) return (status); if (attrp->ld_mac_fixed) { (void) dladm_aggr_macaddr2str(attrp->ld_mac, macstr); - status = dladm_set_conf_field(conf, FMACADDR, + status = dladm_set_conf_field(handle, conf, FMACADDR, DLADM_TYPE_STR, macstr); if (status != DLADM_STATUS_OK) return (status); @@ -1239,7 +1248,7 @@ i_dladm_aggr_set_aggr_attr(dladm_conf_t conf, uint32_t mask, if (mask & DLADM_AGGR_MODIFY_LACP_MODE) { u64 = attrp->ld_lacp_mode; - status = dladm_set_conf_field(conf, FLACPMODE, + status = dladm_set_conf_field(handle, conf, FLACPMODE, DLADM_TYPE_UINT64, &u64); if (status != DLADM_STATUS_OK) return (status); @@ -1247,7 +1256,7 @@ i_dladm_aggr_set_aggr_attr(dladm_conf_t conf, uint32_t mask, if (mask & DLADM_AGGR_MODIFY_LACP_TIMER) { u64 = attrp->ld_lacp_timer; - status = dladm_set_conf_field(conf, FLACPTIMER, + status = dladm_set_conf_field(handle, conf, FLACPTIMER, DLADM_TYPE_UINT64, &u64); if (status != DLADM_STATUS_OK) return (status); @@ -1261,8 +1270,9 @@ i_dladm_aggr_set_aggr_attr(dladm_conf_t conf, uint32_t mask, * the configuration file and pass the changes to the kernel. */ dladm_status_t -dladm_aggr_modify(datalink_id_t linkid, uint32_t modify_mask, uint32_t policy, - boolean_t mac_fixed, const uchar_t *mac_addr, aggr_lacp_mode_t lacp_mode, +dladm_aggr_modify(dladm_handle_t handle, datalink_id_t linkid, + uint32_t modify_mask, uint32_t policy, boolean_t mac_fixed, + const uchar_t *mac_addr, aggr_lacp_mode_t lacp_mode, aggr_lacp_timer_t lacp_timer, uint32_t flags) { dladm_aggr_modify_attr_t new_attr, old_attr; @@ -1276,24 +1286,24 @@ dladm_aggr_modify(datalink_id_t linkid, uint32_t modify_mask, uint32_t policy, bcopy(mac_addr, new_attr.ld_mac, ETHERADDRL); if (flags & DLADM_OPT_PERSIST) { - status = dladm_read_conf(linkid, &conf); + status = dladm_read_conf(handle, linkid, &conf); if (status != DLADM_STATUS_OK) return (status); - if ((status = i_dladm_aggr_get_aggr_attr(conf, modify_mask, - &old_attr)) != DLADM_STATUS_OK) { + if ((status = i_dladm_aggr_get_aggr_attr(handle, conf, + modify_mask, &old_attr)) != DLADM_STATUS_OK) { goto done; } - if ((status = i_dladm_aggr_set_aggr_attr(conf, modify_mask, - &new_attr)) != DLADM_STATUS_OK) { + if ((status = i_dladm_aggr_set_aggr_attr(handle, conf, + modify_mask, &new_attr)) != DLADM_STATUS_OK) { goto done; } - status = dladm_write_conf(conf); + status = dladm_write_conf(handle, conf); done: - dladm_destroy_conf(conf); + dladm_destroy_conf(handle, conf); if (status != DLADM_STATUS_OK) return (status); } @@ -1301,14 +1311,15 @@ done: if (!(flags & DLADM_OPT_ACTIVE)) return (DLADM_STATUS_OK); - status = i_dladm_aggr_modify_sys(linkid, modify_mask, &new_attr); + status = i_dladm_aggr_modify_sys(handle, linkid, modify_mask, + &new_attr); if ((status != DLADM_STATUS_OK) && (flags & DLADM_OPT_PERSIST)) { - if (dladm_read_conf(linkid, &conf) == DLADM_STATUS_OK) { - if (i_dladm_aggr_set_aggr_attr(conf, modify_mask, - &old_attr) == DLADM_STATUS_OK) { - (void) dladm_write_conf(conf); + if (dladm_read_conf(handle, linkid, &conf) == DLADM_STATUS_OK) { + if (i_dladm_aggr_set_aggr_attr(handle, conf, + modify_mask, &old_attr) == DLADM_STATUS_OK) { + (void) dladm_write_conf(handle, conf); } - dladm_destroy_conf(conf); + dladm_destroy_conf(handle, conf); } } @@ -1321,12 +1332,13 @@ typedef struct aggr_held_arg_s { } aggr_held_arg_t; static int -i_dladm_aggr_is_held(datalink_id_t linkid, void *arg) +i_dladm_aggr_is_held(dladm_handle_t handle, datalink_id_t linkid, void *arg) { aggr_held_arg_t *aggr_held_arg = arg; dladm_vlan_attr_t dva; - if (dladm_vlan_info(linkid, &dva, DLADM_OPT_PERSIST) != DLADM_STATUS_OK) + if (dladm_vlan_info(handle, linkid, &dva, DLADM_OPT_PERSIST) != + DLADM_STATUS_OK) return (DLADM_WALK_CONTINUE); if (dva.dv_linkid == aggr_held_arg->aggrid) { @@ -1344,20 +1356,20 @@ i_dladm_aggr_is_held(datalink_id_t linkid, void *arg) * or the "key" is specified. */ dladm_status_t -dladm_aggr_delete(datalink_id_t linkid, uint32_t flags) +dladm_aggr_delete(dladm_handle_t handle, datalink_id_t linkid, uint32_t flags) { laioc_delete_t ioc; datalink_class_t class; dladm_status_t status; - if ((dladm_datalink_id2info(linkid, NULL, &class, NULL, NULL, 0) != - DLADM_STATUS_OK) || (class != DATALINK_CLASS_AGGR)) { + if ((dladm_datalink_id2info(handle, linkid, NULL, &class, NULL, NULL, + 0) != DLADM_STATUS_OK) || (class != DATALINK_CLASS_AGGR)) { return (DLADM_STATUS_BADARG); } if (flags & DLADM_OPT_ACTIVE) { ioc.ld_linkid = linkid; - if ((i_dladm_aggr_ioctl(LAIOC_DELETE, &ioc) < 0) && + if ((i_dladm_aggr_ioctl(handle, LAIOC_DELETE, &ioc) < 0) && ((errno != ENOENT) || !(flags & DLADM_OPT_PERSIST))) { status = dladm_errno2status(errno); return (status); @@ -1366,9 +1378,10 @@ dladm_aggr_delete(datalink_id_t linkid, uint32_t flags) /* * Delete ACTIVE linkprop first. */ - (void) dladm_set_linkprop(linkid, NULL, NULL, 0, + (void) dladm_set_linkprop(handle, linkid, NULL, NULL, 0, + DLADM_OPT_ACTIVE); + (void) dladm_destroy_datalink_id(handle, linkid, DLADM_OPT_ACTIVE); - (void) dladm_destroy_datalink_id(linkid, DLADM_OPT_ACTIVE); } /* @@ -1383,14 +1396,15 @@ dladm_aggr_delete(datalink_id_t linkid, uint32_t flags) arg.aggrid = linkid; arg.isheld = B_FALSE; - (void) dladm_walk_datalink_id(i_dladm_aggr_is_held, + (void) dladm_walk_datalink_id(i_dladm_aggr_is_held, handle, &arg, DATALINK_CLASS_VLAN, DATALINK_ANY_MEDIATYPE, DLADM_OPT_PERSIST); if (arg.isheld) return (DLADM_STATUS_LINKBUSY); - (void) dladm_destroy_datalink_id(linkid, DLADM_OPT_PERSIST); - (void) dladm_remove_conf(linkid); + (void) dladm_destroy_datalink_id(handle, linkid, + DLADM_OPT_PERSIST); + (void) dladm_remove_conf(handle, linkid); } return (DLADM_STATUS_OK); @@ -1400,20 +1414,21 @@ dladm_aggr_delete(datalink_id_t linkid, uint32_t flags) * Add one or more ports to an existing link aggregation. */ dladm_status_t -dladm_aggr_add(datalink_id_t linkid, uint32_t nports, +dladm_aggr_add(dladm_handle_t handle, datalink_id_t linkid, uint32_t nports, dladm_aggr_port_attr_db_t *ports, uint32_t flags) { - return (i_dladm_aggr_add_rmv(linkid, nports, ports, flags, LAIOC_ADD)); + return (i_dladm_aggr_add_rmv(handle, linkid, nports, ports, flags, + LAIOC_ADD)); } /* * Remove one or more ports from an existing link aggregation. */ dladm_status_t -dladm_aggr_remove(datalink_id_t linkid, uint32_t nports, +dladm_aggr_remove(dladm_handle_t handle, datalink_id_t linkid, uint32_t nports, dladm_aggr_port_attr_db_t *ports, uint32_t flags) { - return (i_dladm_aggr_add_rmv(linkid, nports, ports, flags, + return (i_dladm_aggr_add_rmv(handle, linkid, nports, ports, flags, LAIOC_REMOVE)); } @@ -1424,7 +1439,7 @@ typedef struct i_walk_key_state_s { } i_walk_key_state_t; static int -i_dladm_walk_key2linkid(datalink_id_t linkid, void *arg) +i_dladm_walk_key2linkid(dladm_handle_t handle, datalink_id_t linkid, void *arg) { dladm_conf_t conf; uint16_t key; @@ -1432,12 +1447,12 @@ i_dladm_walk_key2linkid(datalink_id_t linkid, void *arg) i_walk_key_state_t *statep = (i_walk_key_state_t *)arg; uint64_t u64; - if (dladm_read_conf(linkid, &conf) != 0) + if (dladm_read_conf(handle, linkid, &conf) != 0) return (DLADM_WALK_CONTINUE); - status = dladm_get_conf_field(conf, FKEY, &u64, sizeof (u64)); + status = dladm_get_conf_field(handle, conf, FKEY, &u64, sizeof (u64)); key = (uint16_t)u64; - dladm_destroy_conf(conf); + dladm_destroy_conf(handle, conf); if ((status == DLADM_STATUS_OK) && (key == statep->key)) { statep->found = B_TRUE; @@ -1449,7 +1464,8 @@ i_dladm_walk_key2linkid(datalink_id_t linkid, void *arg) } dladm_status_t -dladm_key2linkid(uint16_t key, datalink_id_t *linkidp, uint32_t flags) +dladm_key2linkid(dladm_handle_t handle, uint16_t key, datalink_id_t *linkidp, + uint32_t flags) { i_walk_key_state_t state; @@ -1459,7 +1475,7 @@ dladm_key2linkid(uint16_t key, datalink_id_t *linkidp, uint32_t flags) state.found = B_FALSE; state.key = key; - (void) dladm_walk_datalink_id(i_dladm_walk_key2linkid, &state, + (void) dladm_walk_datalink_id(i_dladm_walk_key2linkid, handle, &state, DATALINK_CLASS_AGGR, DATALINK_ANY_MEDIATYPE, flags); if (state.found == B_TRUE) { *linkidp = state.linkid; diff --git a/usr/src/lib/libdladm/common/libdlaggr.h b/usr/src/lib/libdladm/common/libdlaggr.h index 1b5df523c4..7d9cd8fc8b 100644 --- a/usr/src/lib/libdladm/common/libdlaggr.h +++ b/usr/src/lib/libdladm/common/libdlaggr.h @@ -26,8 +26,6 @@ #ifndef _LIBDLAGGR_H #define _LIBDLAGGR_H -#pragma ident "%Z%%M% %I% %E% SMI" - /* * This file includes structures, macros and routines used by aggregation link * administration. @@ -73,21 +71,22 @@ typedef struct dladm_aggr_grp_attr { aggr_lacp_timer_t lg_lacp_timer; } dladm_aggr_grp_attr_t; -extern dladm_status_t dladm_aggr_create(const char *, uint16_t, uint32_t, - dladm_aggr_port_attr_db_t *, uint32_t, boolean_t, - const uchar_t *, aggr_lacp_mode_t, - aggr_lacp_timer_t, uint32_t); -extern dladm_status_t dladm_aggr_delete(datalink_id_t, uint32_t); -extern dladm_status_t dladm_aggr_add(datalink_id_t, uint32_t, - dladm_aggr_port_attr_db_t *, uint32_t); -extern dladm_status_t dladm_aggr_remove(datalink_id_t, uint32_t, - dladm_aggr_port_attr_db_t *, uint32_t); -extern dladm_status_t dladm_aggr_modify(datalink_id_t, uint32_t, uint32_t, - boolean_t, const uchar_t *, aggr_lacp_mode_t, - aggr_lacp_timer_t, uint32_t); -extern dladm_status_t dladm_aggr_up(datalink_id_t); -extern dladm_status_t dladm_aggr_info(datalink_id_t, dladm_aggr_grp_attr_t *, +extern dladm_status_t dladm_aggr_create(dladm_handle_t, const char *, + uint16_t, uint32_t, dladm_aggr_port_attr_db_t *, + uint32_t, boolean_t, const uchar_t *, + aggr_lacp_mode_t, aggr_lacp_timer_t, uint32_t); +extern dladm_status_t dladm_aggr_delete(dladm_handle_t, datalink_id_t, uint32_t); +extern dladm_status_t dladm_aggr_add(dladm_handle_t, datalink_id_t, uint32_t, + dladm_aggr_port_attr_db_t *, uint32_t); +extern dladm_status_t dladm_aggr_remove(dladm_handle_t, datalink_id_t, + uint32_t, dladm_aggr_port_attr_db_t *, uint32_t); +extern dladm_status_t dladm_aggr_modify(dladm_handle_t, datalink_id_t, + uint32_t, uint32_t, boolean_t, const uchar_t *, + aggr_lacp_mode_t, aggr_lacp_timer_t, uint32_t); +extern dladm_status_t dladm_aggr_up(dladm_handle_t, datalink_id_t); +extern dladm_status_t dladm_aggr_info(dladm_handle_t, datalink_id_t, + dladm_aggr_grp_attr_t *, uint32_t); extern boolean_t dladm_aggr_str2policy(const char *, uint32_t *); extern char *dladm_aggr_policy2str(uint32_t, char *); @@ -101,8 +100,8 @@ extern boolean_t dladm_aggr_str2lacptimer(const char *, aggr_lacp_timer_t *); extern const char *dladm_aggr_lacptimer2str(aggr_lacp_timer_t, char *); extern const char *dladm_aggr_portstate2str(aggr_port_state_t, char *); -extern dladm_status_t dladm_key2linkid(uint16_t, datalink_id_t *, - uint32_t); +extern dladm_status_t dladm_key2linkid(dladm_handle_t, uint16_t, + datalink_id_t *, uint32_t); #ifdef __cplusplus } diff --git a/usr/src/lib/libdladm/common/libdlether.c b/usr/src/lib/libdladm/common/libdlether.c index 926df49dfb..ef89439ae1 100644 --- a/usr/src/lib/libdladm/common/libdlether.c +++ b/usr/src/lib/libdladm/common/libdlether.c @@ -105,8 +105,8 @@ static attr_kstat_t attrstat[] = { * by querying the appropriate kstat for each entry in the table. */ static dladm_status_t -i_dladm_get_spdx(datalink_id_t linkid, dladm_ether_attr_t *eattr, - ether_spdx_t *spdx_stat) +i_dladm_get_spdx(dladm_handle_t handle, datalink_id_t linkid, + dladm_ether_attr_t *eattr, ether_spdx_t *spdx_stat) { int i, nspdx = 0; uint32_t speed; @@ -115,7 +115,7 @@ i_dladm_get_spdx(datalink_id_t linkid, dladm_ether_attr_t *eattr, eattr->le_spdx = NULL; for (i = 0; spdx_stat[i].eth_spdx_stat_name != NULL; i++) { - if ((status = dladm_get_single_mac_stat(linkid, + if ((status = dladm_get_single_mac_stat(handle, linkid, spdx_stat[i].eth_spdx_stat_name, KSTAT_DATA_UINT32, &speed)) != DLADM_STATUS_OK) { @@ -265,7 +265,8 @@ dladm_ether_spdx2str(char *buf, size_t buflen, dladm_ether_info_t *eattr, * freed by calling dladm_ether_info_done(). */ extern dladm_status_t -dladm_ether_info(datalink_id_t linkid, dladm_ether_info_t *eattr) +dladm_ether_info(dladm_handle_t handle, datalink_id_t linkid, + dladm_ether_info_t *eattr) { uint32_t autoneg, pause, asmpause, fault; uint64_t sp64; @@ -274,7 +275,7 @@ dladm_ether_info(datalink_id_t linkid, dladm_ether_info_t *eattr) link_duplex_t link_duplex; bzero(eattr, sizeof (*eattr)); - status = dladm_datalink_id2info(linkid, NULL, NULL, NULL, + status = dladm_datalink_id2info(handle, linkid, NULL, NULL, NULL, eattr->lei_linkname, sizeof (eattr->lei_linkname)); if (status != DLADM_STATUS_OK) goto bail; @@ -287,35 +288,35 @@ dladm_ether_info(datalink_id_t linkid, dladm_ether_info_t *eattr) goto bail; } - if ((status = dladm_get_single_mac_stat(linkid, "ifspeed", + if ((status = dladm_get_single_mac_stat(handle, linkid, "ifspeed", KSTAT_DATA_UINT64, &sp64)) != DLADM_STATUS_OK) goto bail; - if ((status = dladm_get_single_mac_stat(linkid, "link_duplex", + if ((status = dladm_get_single_mac_stat(handle, linkid, "link_duplex", KSTAT_DATA_UINT32, &link_duplex)) != DLADM_STATUS_OK) goto bail; eattr->lei_attr[CURRENT].le_spdx->lesd_speed = (int)(sp64/1000000ull); eattr->lei_attr[CURRENT].le_spdx->lesd_duplex = link_duplex; - status = i_dladm_get_state(linkid, &eattr->lei_state); + status = i_dladm_get_state(handle, linkid, &eattr->lei_state); if (status != DLADM_STATUS_OK) goto bail; /* get the auto, pause, asmpause, fault values */ for (i = CURRENT; i <= PEERADV; i++) { - status = dladm_get_single_mac_stat(linkid, + status = dladm_get_single_mac_stat(handle, linkid, attrstat[i].autoneg_stat, KSTAT_DATA_UINT32, &autoneg); if (status != DLADM_STATUS_OK) goto bail; - status = dladm_get_single_mac_stat(linkid, + status = dladm_get_single_mac_stat(handle, linkid, attrstat[i].pause_stat, KSTAT_DATA_UINT32, &pause); if (status != DLADM_STATUS_OK) goto bail; - status = dladm_get_single_mac_stat(linkid, + status = dladm_get_single_mac_stat(handle, linkid, attrstat[i].asmpause_stat, KSTAT_DATA_UINT32, &asmpause); if (status != DLADM_STATUS_OK) goto bail; @@ -326,14 +327,14 @@ dladm_ether_info(datalink_id_t linkid, dladm_ether_info_t *eattr) if (i == CURRENT) continue; - status = dladm_get_single_mac_stat(linkid, + status = dladm_get_single_mac_stat(handle, linkid, attrstat[i].fault_stat, KSTAT_DATA_UINT32, &fault); if (status != DLADM_STATUS_OK) goto bail; eattr->lei_attr[i].le_fault = (pause != 0); /* get all the supported speed/duplex values */ - status = i_dladm_get_spdx(linkid, &eattr->lei_attr[i], + status = i_dladm_get_spdx(handle, linkid, &eattr->lei_attr[i], attrstat[i].spdx_stat); if (status != DLADM_STATUS_OK) goto bail; diff --git a/usr/src/lib/libdladm/common/libdlether.h b/usr/src/lib/libdladm/common/libdlether.h index 2ba38bc2d7..319e4a30a6 100644 --- a/usr/src/lib/libdladm/common/libdlether.h +++ b/usr/src/lib/libdladm/common/libdlether.h @@ -65,7 +65,8 @@ typedef struct dladm_ether_info { dladm_ether_attr_t lei_attr[PEERADV+1]; } dladm_ether_info_t; -extern dladm_status_t dladm_ether_info(datalink_id_t, dladm_ether_info_t *); +extern dladm_status_t dladm_ether_info(dladm_handle_t, datalink_id_t, + dladm_ether_info_t *); extern char *dladm_ether_autoneg2str(char *, size_t, dladm_ether_info_t *, int); extern char *dladm_ether_pause2str(char *, size_t, diff --git a/usr/src/lib/libdladm/common/libdlflow.c b/usr/src/lib/libdladm/common/libdlflow.c index 3ec77705a7..2cb5bf94a0 100644 --- a/usr/src/lib/libdladm/common/libdlflow.c +++ b/usr/src/lib/libdladm/common/libdlflow.c @@ -533,11 +533,10 @@ failed: } static dladm_status_t -i_dladm_flow_add(char *flowname, datalink_id_t linkid, flow_desc_t *flowdesc, - mac_resource_props_t *mrp) +i_dladm_flow_add(dladm_handle_t handle, char *flowname, datalink_id_t linkid, + flow_desc_t *flowdesc, mac_resource_props_t *mrp) { dld_ioc_addflow_t attr; - int fd; /* create flow */ bzero(&attr, sizeof (attr)); @@ -550,48 +549,33 @@ i_dladm_flow_add(char *flowname, datalink_id_t linkid, flow_desc_t *flowdesc, (void) strlcpy(attr.af_name, flowname, sizeof (attr.af_name)); attr.af_linkid = linkid; - fd = open(DLD_CONTROL_DEV, O_RDWR); - if (fd < 0) - return (dladm_errno2status(errno)); - - if (ioctl(fd, DLDIOC_ADDFLOW, &attr) < 0) { - (void) close(fd); + if (ioctl(dladm_dld_fd(handle), DLDIOC_ADDFLOW, &attr) < 0) return (dladm_errno2status(errno)); - } - - (void) close(fd); return (DLADM_STATUS_OK); } static dladm_status_t -i_dladm_flow_remove(char *flowname) +i_dladm_flow_remove(dladm_handle_t handle, char *flowname) { dld_ioc_removeflow_t attr; - int fd; dladm_status_t status = DLADM_STATUS_OK; (void) strlcpy(attr.rf_name, flowname, sizeof (attr.rf_name)); - fd = open(DLD_CONTROL_DEV, O_RDWR); - if (fd < 0) - return (dladm_errno2status(errno)); - - if (ioctl(fd, DLDIOC_REMOVEFLOW, &attr) < 0) + if (ioctl(dladm_dld_fd(handle), DLDIOC_REMOVEFLOW, &attr) < 0) status = dladm_errno2status(errno); - (void) close(fd); - return (status); } /* ARGSUSED */ dladm_status_t -dladm_flow_add(datalink_id_t linkid, dladm_arg_list_t *attrlist, - dladm_arg_list_t *proplist, char *flowname, boolean_t tempop, - const char *root) +dladm_flow_add(dladm_handle_t handle, datalink_id_t linkid, + dladm_arg_list_t *attrlist, dladm_arg_list_t *proplist, char *flowname, + boolean_t tempop, const char *root) { dld_flowinfo_t db_attr; flow_desc_t flowdesc; @@ -613,7 +597,7 @@ dladm_flow_add(datalink_id_t linkid, dladm_arg_list_t *attrlist, } /* Add flow in kernel */ - status = i_dladm_flow_add(flowname, linkid, &flowdesc, &mrp); + status = i_dladm_flow_add(handle, flowname, linkid, &flowdesc, &mrp); if (status != DLADM_STATUS_OK) return (status); @@ -627,15 +611,15 @@ dladm_flow_add(datalink_id_t linkid, dladm_arg_list_t *attrlist, if ((status = i_dladm_flow_create_db(&db_attr, root)) != DLADM_STATUS_OK) { - (void) i_dladm_flow_remove(flowname); + (void) i_dladm_flow_remove(handle, flowname); return (status); } /* set flow properties */ if (proplist != NULL) { - status = i_dladm_set_flow_proplist_db(flowname, + status = i_dladm_set_flow_proplist_db(handle, flowname, proplist); if (status != DLADM_STATUS_OK) { - (void) i_dladm_flow_remove(flowname); + (void) i_dladm_flow_remove(handle, flowname); return (status); } } @@ -648,7 +632,7 @@ dladm_flow_add(datalink_id_t linkid, dladm_arg_list_t *attrlist, */ /* ARGSUSED */ dladm_status_t -dladm_flow_remove(char *flowname, boolean_t tempop, +dladm_flow_remove(dladm_handle_t handle, char *flowname, boolean_t tempop, const char *root) { remove_db_state_t state; @@ -656,7 +640,7 @@ dladm_flow_remove(char *flowname, boolean_t tempop, dladm_status_t s = DLADM_STATUS_OK; /* remove flow */ - status = i_dladm_flow_remove(flowname); + status = i_dladm_flow_remove(handle, flowname); if ((status != DLADM_STATUS_OK) && (tempop || status != DLADM_STATUS_NOTFOUND)) goto done; @@ -675,7 +659,7 @@ dladm_flow_remove(char *flowname, boolean_t tempop, } /* flow prop DB */ - s = dladm_set_flowprop(flowname, NULL, NULL, 0, + s = dladm_set_flowprop(handle, flowname, NULL, NULL, 0, DLADM_OPT_PERSIST, NULL); } @@ -735,11 +719,11 @@ i_dladm_flow_get_db_fn(void *arg, dld_flowinfo_t *grp) */ /* ARGSUSED */ dladm_status_t -dladm_walk_flow(int (*fn)(dladm_flow_attr_t *, void *), +dladm_walk_flow(int (*fn)(dladm_flow_attr_t *, void *), dladm_handle_t handle, datalink_id_t linkid, void *arg, boolean_t persist) { dld_flowinfo_t *flow; - int i, bufsize, fd; + int i, bufsize; dld_ioc_walkflow_t *ioc = NULL; dladm_flow_attr_t attr; dladm_status_t status = DLADM_STATUS_OK; @@ -760,20 +744,16 @@ dladm_walk_flow(int (*fn)(dladm_flow_attr_t *, void *), if (status != DLADM_STATUS_OK) return (status); } else { - if ((fd = open(DLD_CONTROL_DEV, O_RDWR)) < 0) - return (dladm_errno2status(errno)); - bufsize = MIN_INFO_SIZE; if ((ioc = calloc(1, bufsize)) == NULL) { status = dladm_errno2status(errno); - (void) close(fd); return (status); } ioc->wf_linkid = linkid; ioc->wf_len = bufsize - sizeof (*ioc); - while (ioctl(fd, DLDIOC_WALKFLOW, ioc) < 0) { + while (ioctl(dladm_dld_fd(handle), DLDIOC_WALKFLOW, ioc) < 0) { if (errno == ENOSPC) { bufsize *= 2; ioc = realloc(ioc, bufsize); @@ -805,12 +785,11 @@ dladm_walk_flow(int (*fn)(dladm_flow_attr_t *, void *), bail: free(ioc); - (void) close(fd); return (status); } dladm_status_t -dladm_flow_init(void) +dladm_flow_init(dladm_handle_t handle) { flow_desc_t flowdesc; datalink_id_t linkid; @@ -841,11 +820,11 @@ dladm_flow_init(void) sizeof (attr.fi_flowname)); linkid = attr.fi_linkid; - s = i_dladm_flow_add(name, linkid, &flowdesc, NULL); + s = i_dladm_flow_add(handle, name, linkid, &flowdesc, NULL); if (s != DLADM_STATUS_OK) status = s; } - s = i_dladm_init_flowprop_db(); + s = i_dladm_init_flowprop_db(handle); if (s != DLADM_STATUS_OK) status = s; diff --git a/usr/src/lib/libdladm/common/libdlflow.h b/usr/src/lib/libdladm/common/libdlflow.h index d35631ba4b..c4d246ae89 100644 --- a/usr/src/lib/libdladm/common/libdlflow.h +++ b/usr/src/lib/libdladm/common/libdlflow.h @@ -52,21 +52,23 @@ typedef struct dladm_flow_attr { int fa_nattr; } dladm_flow_attr_t; -extern dladm_status_t dladm_flow_add(datalink_id_t, dladm_arg_list_t *, - dladm_arg_list_t *, char *, boolean_t, +extern dladm_status_t dladm_flow_add(dladm_handle_t, datalink_id_t, + dladm_arg_list_t *, dladm_arg_list_t *, char *, + boolean_t, const char *); +extern dladm_status_t dladm_flow_remove(dladm_handle_t, char *, boolean_t, const char *); -extern dladm_status_t dladm_flow_remove(char *, boolean_t, const char *); -extern dladm_status_t dladm_flow_init(void); +extern dladm_status_t dladm_flow_init(dladm_handle_t); extern dladm_status_t dladm_flow_parse_db(char *, dld_flowinfo_t *); -extern dladm_status_t dladm_walk_flow(int (*)(dladm_flow_attr_t *, - void *), datalink_id_t, void *, boolean_t); -extern dladm_status_t dladm_flow_info(const char *, dladm_flow_attr_t *); +extern dladm_status_t dladm_walk_flow(int (*)(dladm_flow_attr_t *, void *), + dladm_handle_t, datalink_id_t, void *, boolean_t); +extern dladm_status_t dladm_flow_info(dladm_handle_t, const char *, + dladm_flow_attr_t *); -extern dladm_status_t dladm_set_flowprop(const char *, const char *, - char **, uint_t, uint_t, char **); -extern dladm_status_t dladm_get_flowprop(const char *, uint32_t, - const char *, char **, uint_t *); +extern dladm_status_t dladm_set_flowprop(dladm_handle_t, const char *, + const char *, char **, uint_t, uint_t, char **); +extern dladm_status_t dladm_get_flowprop(dladm_handle_t, const char *, + uint32_t, const char *, char **, uint_t *); extern dladm_status_t dladm_walk_flowprop(int (*)(void *, const char *), const char *, void *); diff --git a/usr/src/lib/libdladm/common/libdlflow_impl.h b/usr/src/lib/libdladm/common/libdlflow_impl.h index 09b6d55bc1..060c31d84b 100644 --- a/usr/src/lib/libdladm/common/libdlflow_impl.h +++ b/usr/src/lib/libdladm/common/libdlflow_impl.h @@ -38,10 +38,12 @@ extern "C" { struct fprop_desc; struct fattr_desc; -typedef dladm_status_t fpd_getf_t(const char *, char **, uint_t *); -typedef dladm_status_t fpd_setf_t(const char *, val_desc_t *, uint_t); -typedef dladm_status_t fpd_checkf_t(struct fprop_desc *, char **, - uint_t, val_desc_t **); +typedef dladm_status_t fpd_getf_t(dladm_handle_t, const char *, char **, + uint_t *); +typedef dladm_status_t fpd_setf_t(dladm_handle_t, const char *, val_desc_t *, + uint_t); +typedef dladm_status_t fpd_checkf_t(struct fprop_desc *, char **, uint_t, + val_desc_t **); typedef struct fprop_desc { char *pd_name; @@ -77,10 +79,12 @@ typedef struct fattr_desc { fad_checkf_t *ad_check; } fattr_desc_t; -extern dladm_status_t i_dladm_get_prop_temp(const char *, prop_type_t, - const char *, char **, uint_t *, prop_table_t *); -extern dladm_status_t i_dladm_set_prop_temp(const char *, const char *, - char **, uint_t, uint_t, char **, prop_table_t *); +extern dladm_status_t i_dladm_get_prop_temp(dladm_handle_t, const char *, + prop_type_t, const char *, char **, uint_t *, + prop_table_t *); +extern dladm_status_t i_dladm_set_prop_temp(dladm_handle_t, const char *, + const char *, char **, uint_t, uint_t, char **, + prop_table_t *); extern boolean_t i_dladm_is_prop_temponly(const char *prop_name, char **, prop_table_t *); /* @@ -99,11 +103,11 @@ typedef struct prop_db_info { typedef struct prop_db_state prop_db_state_t; -typedef boolean_t (*prop_db_op_t)(prop_db_state_t *, +typedef boolean_t (*prop_db_op_t)(dladm_handle_t, prop_db_state_t *, char *, prop_db_info_t *, dladm_status_t *); -typedef dladm_status_t (*prop_db_initop_t)(const char *, const char *, - char **, uint_t, uint_t, char **); +typedef dladm_status_t (*prop_db_initop_t)(dladm_handle_t, const char *, + const char *, char **, uint_t, uint_t, char **); struct prop_db_state { prop_db_op_t ls_op; @@ -114,22 +118,26 @@ struct prop_db_state { prop_db_initop_t ls_initop; }; -extern boolean_t process_prop_set(prop_db_state_t *lsp, char *buf, - prop_db_info_t *listp, dladm_status_t *statusp); -extern boolean_t process_prop_get(prop_db_state_t *lsp, char *buf, - prop_db_info_t *listp, dladm_status_t *statusp); -extern boolean_t process_prop_init(prop_db_state_t *lsp, char *buf, - prop_db_info_t *listp, dladm_status_t *statusp); -extern dladm_status_t process_prop_db(void *arg, FILE *fp, FILE *nfp); - -extern dladm_status_t i_dladm_init_flowprop_db(void); -extern dladm_status_t i_dladm_set_flow_proplist_db(char *, - dladm_arg_list_t *); +extern boolean_t process_prop_set(dladm_handle_t, prop_db_state_t *lsp, + char *buf, prop_db_info_t *listp, + dladm_status_t *statusp); +extern boolean_t process_prop_get(dladm_handle_t, prop_db_state_t *lsp, + char *buf, prop_db_info_t *listp, + dladm_status_t *statusp); +extern boolean_t process_prop_init(dladm_handle_t, prop_db_state_t *lsp, + char *buf, prop_db_info_t *listp, + dladm_status_t *statusp); +extern dladm_status_t process_prop_db(dladm_handle_t, void *arg, FILE *fp, + FILE *nfp); + +extern dladm_status_t i_dladm_init_flowprop_db(dladm_handle_t); +extern dladm_status_t i_dladm_set_flow_proplist_db(dladm_handle_t, char *, + dladm_arg_list_t *); extern dladm_status_t i_dladm_flow_check_restriction(datalink_id_t, - flow_desc_t *, mac_resource_props_t *, boolean_t); + flow_desc_t *, mac_resource_props_t *, boolean_t); extern dladm_status_t dladm_flow_attrlist_extract(dladm_arg_list_t *, - flow_desc_t *); + flow_desc_t *); #ifdef __cplusplus } diff --git a/usr/src/lib/libdladm/common/libdllink.c b/usr/src/lib/libdladm/common/libdllink.c index 5698409442..c73e7e0b92 100644 --- a/usr/src/lib/libdladm/common/libdllink.c +++ b/usr/src/lib/libdladm/common/libdllink.c @@ -48,13 +48,14 @@ * Return the attributes of the specified datalink from the DLD driver. */ static dladm_status_t -i_dladm_info(int fd, const datalink_id_t linkid, dladm_attr_t *dap) +i_dladm_info(dladm_handle_t handle, const datalink_id_t linkid, + dladm_attr_t *dap) { dld_ioc_attr_t dia; dia.dia_linkid = linkid; - if (ioctl(fd, DLDIOC_ATTR, &dia) < 0) + if (ioctl(dladm_dld_fd(handle), DLDIOC_ATTR, &dia) < 0) return (dladm_errno2status(errno)); dap->da_max_sdu = dia.dia_max_sdu; @@ -63,47 +64,41 @@ i_dladm_info(int fd, const datalink_id_t linkid, dladm_attr_t *dap) } static dladm_status_t -dladm_usagelog(dladm_logtype_t type, dld_ioc_usagelog_t *log_info) +dladm_usagelog(dladm_handle_t handle, dladm_logtype_t type, + dld_ioc_usagelog_t *log_info) { - int fd; - - fd = open(DLD_CONTROL_DEV, O_RDWR); - if (fd < 0) - return (DLADM_STATUS_IOERR); - if (type == DLADM_LOGTYPE_FLOW) log_info->ul_type = MAC_LOGTYPE_FLOW; else log_info->ul_type = MAC_LOGTYPE_LINK; - if (ioctl(fd, DLDIOC_USAGELOG, log_info) < 0) { - (void) close(fd); + if (ioctl(dladm_dld_fd(handle), DLDIOC_USAGELOG, log_info) < 0) return (DLADM_STATUS_IOERR); - } - (void) close(fd); + return (DLADM_STATUS_OK); } dladm_status_t -dladm_start_usagelog(dladm_logtype_t type, uint_t interval) +dladm_start_usagelog(dladm_handle_t handle, dladm_logtype_t type, + uint_t interval) { dld_ioc_usagelog_t log_info; log_info.ul_onoff = B_TRUE; log_info.ul_interval = interval; - return (dladm_usagelog(type, &log_info)); + return (dladm_usagelog(handle, type, &log_info)); } dladm_status_t -dladm_stop_usagelog(dladm_logtype_t type) +dladm_stop_usagelog(dladm_handle_t handle, dladm_logtype_t type) { dld_ioc_usagelog_t log_info; log_info.ul_onoff = B_FALSE; log_info.ul_interval = 0; - return (dladm_usagelog(type, &log_info)); + return (dladm_usagelog(handle, type, &log_info)); } struct i_dladm_walk_arg { @@ -112,12 +107,12 @@ struct i_dladm_walk_arg { }; static int -i_dladm_walk(datalink_id_t linkid, void *arg) +i_dladm_walk(dladm_handle_t handle, datalink_id_t linkid, void *arg) { struct i_dladm_walk_arg *walk_arg = arg; char link[MAXLINKNAMELEN]; - if (dladm_datalink_id2info(linkid, NULL, NULL, NULL, link, + if (dladm_datalink_id2info(handle, linkid, NULL, NULL, NULL, link, sizeof (link)) == DLADM_STATUS_OK) { return (walk_arg->fn(link, walk_arg->arg)); } @@ -129,30 +124,27 @@ i_dladm_walk(datalink_id_t linkid, void *arg) * Walk all datalinks. */ dladm_status_t -dladm_walk(dladm_walkcb_t *fn, void *arg, datalink_class_t class, - datalink_media_t dmedia, uint32_t flags) +dladm_walk(dladm_walkcb_t *fn, dladm_handle_t handle, void *arg, + datalink_class_t class, datalink_media_t dmedia, uint32_t flags) { struct i_dladm_walk_arg walk_arg; walk_arg.fn = fn; walk_arg.arg = arg; - return (dladm_walk_datalink_id(i_dladm_walk, &walk_arg, + return (dladm_walk_datalink_id(i_dladm_walk, handle, &walk_arg, class, dmedia, flags)); } #define MAXGRPPERLINK 64 int -dladm_walk_hwgrp(datalink_id_t linkid, void *arg, +dladm_walk_hwgrp(dladm_handle_t handle, datalink_id_t linkid, void *arg, boolean_t (*fn)(void *, dladm_hwgrp_attr_t *)) { - int fd, bufsize, ret; + int bufsize, ret; int nhwgrp = MAXGRPPERLINK; dld_ioc_hwgrpget_t *iomp = NULL; - if ((fd = open(DLD_CONTROL_DEV, O_RDWR)) < 0) - return (-1); - bufsize = sizeof (dld_ioc_hwgrpget_t) + nhwgrp * sizeof (dld_hwgrpinfo_t); @@ -162,7 +154,7 @@ dladm_walk_hwgrp(datalink_id_t linkid, void *arg, iomp->dih_size = nhwgrp * sizeof (dld_hwgrpinfo_t); iomp->dih_linkid = linkid; - ret = ioctl(fd, DLDIOC_GETHWGRP, iomp); + ret = ioctl(dladm_dld_fd(handle), DLDIOC_GETHWGRP, iomp); if (ret == 0) { int i; dld_hwgrpinfo_t *dhip; @@ -187,7 +179,6 @@ dladm_walk_hwgrp(datalink_id_t linkid, void *arg, } } free(iomp); - (void) close(fd); return (ret); } @@ -196,16 +187,13 @@ dladm_walk_hwgrp(datalink_id_t linkid, void *arg, * the specified device. */ int -dladm_walk_macaddr(datalink_id_t linkid, void *arg, +dladm_walk_macaddr(dladm_handle_t handle, datalink_id_t linkid, void *arg, boolean_t (*fn)(void *, dladm_macaddr_attr_t *)) { - int fd, bufsize, ret; + int bufsize, ret; int nmacaddr = 1024; dld_ioc_macaddrget_t *iomp = NULL; - if ((fd = open(DLD_CONTROL_DEV, O_RDWR)) < 0) - return (-1); - bufsize = sizeof (dld_ioc_macaddrget_t) + nmacaddr * sizeof (dld_macaddrinfo_t); @@ -215,7 +203,7 @@ dladm_walk_macaddr(datalink_id_t linkid, void *arg, iomp->dig_size = nmacaddr * sizeof (dld_macaddrinfo_t); iomp->dig_linkid = linkid; - ret = ioctl(fd, DLDIOC_MACADDRGET, iomp); + ret = ioctl(dladm_dld_fd(handle), DLDIOC_MACADDRGET, iomp); if (ret == 0) { int i; dld_macaddrinfo_t *dmip; @@ -242,7 +230,6 @@ dladm_walk_macaddr(datalink_id_t linkid, void *arg, } } free(iomp); - (void) close(fd); return (ret); } @@ -346,18 +333,9 @@ dladm_mac_walk(int (*fn)(const char *, void *arg), void *arg) * Get the current attributes of the specified datalink. */ dladm_status_t -dladm_info(datalink_id_t linkid, dladm_attr_t *dap) +dladm_info(dladm_handle_t handle, datalink_id_t linkid, dladm_attr_t *dap) { - int fd; - dladm_status_t status; - - if ((fd = open(DLD_CONTROL_DEV, O_RDWR)) < 0) - return (dladm_errno2status(errno)); - - status = i_dladm_info(fd, linkid, dap); - - (void) close(fd); - return (status); + return (i_dladm_info(handle, linkid, dap)); } const char * @@ -406,17 +384,17 @@ dladm_linkduplex2str(link_duplex_t duplex, char *buf) * be created implicitly as the result of this function. */ dladm_status_t -dladm_setzid(const char *dlname, char *zone_name) +dladm_setzid(dladm_handle_t handle, const char *dlname, char *zone_name) { datalink_id_t linkid; dladm_status_t status = DLADM_STATUS_OK; /* If the link does not exist, it is a ppa-hacked vlan. */ - status = dladm_name2info(dlname, &linkid, NULL, NULL, NULL); + status = dladm_name2info(handle, dlname, &linkid, NULL, NULL, NULL); if (status != DLADM_STATUS_OK) return (status); - status = dladm_set_linkprop(linkid, "zone", &zone_name, 1, + status = dladm_set_linkprop(handle, linkid, "zone", &zone_name, 1, DLADM_OPT_ACTIVE); return (status); @@ -427,13 +405,12 @@ dladm_setzid(const char *dlname, char *zone_name) * Result: <linkid1, link2> */ static dladm_status_t -i_dladm_rename_link_c1(datalink_id_t linkid1, const char *link1, - const char *link2, uint32_t flags) +i_dladm_rename_link_c1(dladm_handle_t handle, datalink_id_t linkid1, + const char *link1, const char *link2, uint32_t flags) { dld_ioc_rename_t dir; dladm_conf_t conf; dladm_status_t status = DLADM_STATUS_OK; - int fd; /* * Link is currently available. Check to see whether anything is @@ -443,17 +420,14 @@ i_dladm_rename_link_c1(datalink_id_t linkid1, const char *link1, dir.dir_linkid1 = linkid1; dir.dir_linkid2 = DATALINK_INVALID_LINKID; (void) strlcpy(dir.dir_link, link2, MAXLINKNAMELEN); - if ((fd = open(DLD_CONTROL_DEV, O_RDWR)) < 0) - return (dladm_errno2status(errno)); - if (ioctl(fd, DLDIOC_RENAME, &dir) < 0) { + if (ioctl(dladm_dld_fd(handle), DLDIOC_RENAME, &dir) < 0) { status = dladm_errno2status(errno); - (void) close(fd); return (status); } } - status = dladm_remap_datalink_id(linkid1, link2); + status = dladm_remap_datalink_id(handle, linkid1, link2); if (status != DLADM_STATUS_OK) goto done; @@ -461,17 +435,17 @@ i_dladm_rename_link_c1(datalink_id_t linkid1, const char *link1, * Flush the current mapping to persistent configuration. */ if ((flags & DLADM_OPT_PERSIST) && - (((status = dladm_read_conf(linkid1, &conf)) != DLADM_STATUS_OK) || - ((status = dladm_write_conf(conf)) != DLADM_STATUS_OK))) { - (void) dladm_remap_datalink_id(linkid1, link1); + (((status = dladm_read_conf(handle, linkid1, &conf)) != + DLADM_STATUS_OK) || + ((status = dladm_write_conf(handle, conf)) != DLADM_STATUS_OK))) { + (void) dladm_remap_datalink_id(handle, linkid1, link1); } done: if (flags & DLADM_OPT_ACTIVE) { if (status != DLADM_STATUS_OK) { (void) strlcpy(dir.dir_link, link1, MAXLINKNAMELEN); - (void) ioctl(fd, DLDIOC_RENAME, &dir); + (void) ioctl(dladm_dld_fd(handle), DLDIOC_RENAME, &dir); } - (void) close(fd); } return (status); } @@ -483,14 +457,14 @@ typedef struct link_hold_arg_s { } link_hold_arg_t; static int -i_dladm_aggr_link_hold(datalink_id_t aggrid, void *arg) +i_dladm_aggr_link_hold(dladm_handle_t handle, datalink_id_t aggrid, void *arg) { link_hold_arg_t *hold_arg = arg; dladm_aggr_grp_attr_t ginfo; dladm_status_t status; int i; - status = dladm_aggr_info(aggrid, &ginfo, hold_arg->flags); + status = dladm_aggr_info(handle, aggrid, &ginfo, hold_arg->flags); if (status != DLADM_STATUS_OK) return (DLADM_WALK_CONTINUE); @@ -504,13 +478,13 @@ i_dladm_aggr_link_hold(datalink_id_t aggrid, void *arg) } static int -i_dladm_vlan_link_hold(datalink_id_t vlanid, void *arg) +i_dladm_vlan_link_hold(dladm_handle_t handle, datalink_id_t vlanid, void *arg) { link_hold_arg_t *hold_arg = arg; dladm_vlan_attr_t vinfo; dladm_status_t status; - status = dladm_vlan_info(vlanid, &vinfo, hold_arg->flags); + status = dladm_vlan_info(handle, vlanid, &vinfo, hold_arg->flags); if (status != DLADM_STATUS_OK) return (DLADM_WALK_CONTINUE); @@ -529,13 +503,13 @@ i_dladm_vlan_link_hold(datalink_id_t vlanid, void *arg) * link2_other_attr> */ static dladm_status_t -i_dladm_rename_link_c2(datalink_id_t linkid1, datalink_id_t linkid2) +i_dladm_rename_link_c2(dladm_handle_t handle, datalink_id_t linkid1, + datalink_id_t linkid2) { rcm_handle_t *rcm_hdl = NULL; nvlist_t *nvl = NULL; link_hold_arg_t arg; dld_ioc_rename_t dir; - int fd; dladm_conf_t conf1, conf2; char devname[MAXLINKNAMELEN]; uint64_t phymaj, phyinst; @@ -548,13 +522,13 @@ i_dladm_rename_link_c2(datalink_id_t linkid1, datalink_id_t linkid2) arg.linkid = linkid1; arg.holder = DATALINK_INVALID_LINKID; arg.flags = DLADM_OPT_PERSIST; - (void) dladm_walk_datalink_id(i_dladm_aggr_link_hold, &arg, + (void) dladm_walk_datalink_id(i_dladm_aggr_link_hold, handle, &arg, DATALINK_CLASS_AGGR, DATALINK_ANY_MEDIATYPE, DLADM_OPT_PERSIST); if (arg.holder != DATALINK_INVALID_LINKID) return (DLADM_STATUS_LINKBUSY); arg.flags = DLADM_OPT_PERSIST; - (void) dladm_walk_datalink_id(i_dladm_vlan_link_hold, &arg, + (void) dladm_walk_datalink_id(i_dladm_vlan_link_hold, handle, &arg, DATALINK_CLASS_VLAN, DATALINK_ANY_MEDIATYPE, DLADM_OPT_PERSIST); if (arg.holder != DATALINK_INVALID_LINKID) return (DLADM_STATUS_LINKBUSY); @@ -565,16 +539,12 @@ i_dladm_rename_link_c2(datalink_id_t linkid1, datalink_id_t linkid2) * aggregations or VLANs, or is held by any application. If yes, * return failure. */ - if ((fd = open(DLD_CONTROL_DEV, O_RDWR)) < 0) - return (dladm_errno2status(errno)); - dir.dir_linkid1 = linkid1; dir.dir_linkid2 = linkid2; - if (ioctl(fd, DLDIOC_RENAME, &dir) < 0) + if (ioctl(dladm_dld_fd(handle), DLDIOC_RENAME, &dir) < 0) status = dladm_errno2status(errno); if (status != DLADM_STATUS_OK) { - (void) close(fd); return (status); } @@ -583,40 +553,43 @@ i_dladm_rename_link_c2(datalink_id_t linkid1, datalink_id_t linkid2) * to be associated with linkid2. Before doing that, the old active * linkprop of linkid1 should be deleted. */ - (void) dladm_set_linkprop(linkid1, NULL, NULL, 0, DLADM_OPT_ACTIVE); + (void) dladm_set_linkprop(handle, linkid1, NULL, NULL, 0, + DLADM_OPT_ACTIVE); - if (((status = dladm_read_conf(linkid1, &conf1)) != DLADM_STATUS_OK) || - ((status = dladm_get_conf_field(conf1, FDEVNAME, devname, + if (((status = dladm_read_conf(handle, linkid1, &conf1)) != + DLADM_STATUS_OK) || + ((status = dladm_get_conf_field(handle, conf1, FDEVNAME, devname, MAXLINKNAMELEN)) != DLADM_STATUS_OK) || - ((status = dladm_get_conf_field(conf1, FPHYMAJ, &phymaj, + ((status = dladm_get_conf_field(handle, conf1, FPHYMAJ, &phymaj, sizeof (uint64_t))) != DLADM_STATUS_OK) || - ((status = dladm_get_conf_field(conf1, FPHYINST, &phyinst, + ((status = dladm_get_conf_field(handle, conf1, FPHYINST, &phyinst, sizeof (uint64_t))) != DLADM_STATUS_OK) || - ((status = dladm_read_conf(linkid2, &conf2)) != DLADM_STATUS_OK)) { + ((status = dladm_read_conf(handle, linkid2, &conf2)) != + DLADM_STATUS_OK)) { dir.dir_linkid1 = linkid2; dir.dir_linkid2 = linkid1; - (void) dladm_init_linkprop(linkid1, B_FALSE); - (void) ioctl(fd, DLDIOC_RENAME, &dir); - (void) close(fd); + (void) dladm_init_linkprop(handle, linkid1, B_FALSE); + (void) ioctl(dladm_dld_fd(handle), DLDIOC_RENAME, &dir); return (status); } - (void) close(fd); - dladm_destroy_conf(conf1); - (void) dladm_set_conf_field(conf2, FDEVNAME, DLADM_TYPE_STR, devname); - (void) dladm_set_conf_field(conf2, FPHYMAJ, DLADM_TYPE_UINT64, &phymaj); - (void) dladm_set_conf_field(conf2, FPHYINST, + dladm_destroy_conf(handle, conf1); + (void) dladm_set_conf_field(handle, conf2, FDEVNAME, DLADM_TYPE_STR, + devname); + (void) dladm_set_conf_field(handle, conf2, FPHYMAJ, DLADM_TYPE_UINT64, + &phymaj); + (void) dladm_set_conf_field(handle, conf2, FPHYINST, DLADM_TYPE_UINT64, &phyinst); - (void) dladm_write_conf(conf2); - dladm_destroy_conf(conf2); + (void) dladm_write_conf(handle, conf2); + dladm_destroy_conf(handle, conf2); /* * Delete link1 and mark link2 up. */ - (void) dladm_destroy_datalink_id(linkid1, DLADM_OPT_ACTIVE | + (void) dladm_destroy_datalink_id(handle, linkid1, DLADM_OPT_ACTIVE | DLADM_OPT_PERSIST); - (void) dladm_remove_conf(linkid1); - (void) dladm_up_datalink_id(linkid2); + (void) dladm_remove_conf(handle, linkid1); + (void) dladm_up_datalink_id(handle, linkid2); /* * Now generate the RCM_RESOURCE_LINK_NEW sysevent which can be @@ -652,7 +625,8 @@ done: * the removed physical link. */ static dladm_status_t -i_dladm_rename_link_c3(const char *link1, datalink_id_t linkid2) +i_dladm_rename_link_c3(dladm_handle_t handle, const char *link1, + datalink_id_t linkid2) { dladm_conf_t conf; dladm_status_t status; @@ -660,23 +634,23 @@ i_dladm_rename_link_c3(const char *link1, datalink_id_t linkid2) if (!dladm_valid_linkname(link1)) return (DLADM_STATUS_LINKINVAL); - status = dladm_read_conf(linkid2, &conf); + status = dladm_read_conf(handle, linkid2, &conf); if (status != DLADM_STATUS_OK) goto done; - if ((status = dladm_set_conf_field(conf, FDEVNAME, DLADM_TYPE_STR, - link1)) == DLADM_STATUS_OK) { - status = dladm_write_conf(conf); + if ((status = dladm_set_conf_field(handle, conf, FDEVNAME, + DLADM_TYPE_STR, link1)) == DLADM_STATUS_OK) { + status = dladm_write_conf(handle, conf); } - dladm_destroy_conf(conf); + dladm_destroy_conf(handle, conf); done: return (status); } dladm_status_t -dladm_rename_link(const char *link1, const char *link2) +dladm_rename_link(dladm_handle_t handle, const char *link1, const char *link2) { datalink_id_t linkid1 = DATALINK_INVALID_LINKID; datalink_id_t linkid2 = DATALINK_INVALID_LINKID; @@ -686,9 +660,10 @@ dladm_rename_link(const char *link1, const char *link2) boolean_t remphy2 = B_FALSE; dladm_status_t status; - (void) dladm_name2info(link1, &linkid1, &flags1, &class1, &media1); - if ((dladm_name2info(link2, &linkid2, &flags2, &class2, &media2) == - DLADM_STATUS_OK) && (class2 == DATALINK_CLASS_PHYS) && + (void) dladm_name2info(handle, link1, &linkid1, &flags1, &class1, + &media1); + if ((dladm_name2info(handle, link2, &linkid2, &flags2, &class2, + &media2) == DLADM_STATUS_OK) && (class2 == DATALINK_CLASS_PHYS) && (flags2 == DLADM_OPT_PERSIST)) { /* * see whether link2 is a removed physical link. @@ -702,8 +677,8 @@ dladm_rename_link(const char *link1, const char *link2) * case 1: rename an existing link to a link that * does not exist. */ - status = i_dladm_rename_link_c1(linkid1, link1, link2, - flags1); + status = i_dladm_rename_link_c1(handle, linkid1, link1, + link2, flags1); } else if (remphy2) { /* * case 2: rename an available link to a REMOVED @@ -714,14 +689,14 @@ dladm_rename_link(const char *link1, const char *link2) !(flags1 & DLADM_OPT_ACTIVE)) { status = DLADM_STATUS_BADARG; } else { - status = i_dladm_rename_link_c2(linkid1, + status = i_dladm_rename_link_c2(handle, linkid1, linkid2); } } else { status = DLADM_STATUS_EXIST; } } else if (remphy2) { - status = i_dladm_rename_link_c3(link1, linkid2); + status = i_dladm_rename_link_c3(handle, link1, linkid2); } else { status = DLADM_STATUS_NOTFOUND; } @@ -733,23 +708,23 @@ typedef struct consumer_del_phys_arg_s { } consumer_del_phys_arg_t; static int -i_dladm_vlan_link_del(datalink_id_t vlanid, void *arg) +i_dladm_vlan_link_del(dladm_handle_t handle, datalink_id_t vlanid, void *arg) { consumer_del_phys_arg_t *del_arg = arg; dladm_vlan_attr_t vinfo; dladm_status_t status; - status = dladm_vlan_info(vlanid, &vinfo, DLADM_OPT_PERSIST); + status = dladm_vlan_info(handle, vlanid, &vinfo, DLADM_OPT_PERSIST); if (status != DLADM_STATUS_OK) return (DLADM_WALK_CONTINUE); if (vinfo.dv_linkid == del_arg->linkid) - (void) dladm_vlan_delete(vlanid, DLADM_OPT_PERSIST); + (void) dladm_vlan_delete(handle, vlanid, DLADM_OPT_PERSIST); return (DLADM_WALK_CONTINUE); } static int -i_dladm_aggr_link_del(datalink_id_t aggrid, void *arg) +i_dladm_aggr_link_del(dladm_handle_t handle, datalink_id_t aggrid, void *arg) { consumer_del_phys_arg_t *del_arg = arg; dladm_aggr_grp_attr_t ginfo; @@ -757,7 +732,7 @@ i_dladm_aggr_link_del(datalink_id_t aggrid, void *arg) dladm_aggr_port_attr_db_t port[1]; int i; - status = dladm_aggr_info(aggrid, &ginfo, DLADM_OPT_PERSIST); + status = dladm_aggr_info(handle, aggrid, &ginfo, DLADM_OPT_PERSIST); if (status != DLADM_STATUS_OK) return (DLADM_WALK_CONTINUE); @@ -775,12 +750,13 @@ i_dladm_aggr_link_del(datalink_id_t aggrid, void *arg) */ aggr_del_arg.linkid = aggrid; (void) dladm_walk_datalink_id(i_dladm_vlan_link_del, - &aggr_del_arg, DATALINK_CLASS_VLAN, + handle, &aggr_del_arg, DATALINK_CLASS_VLAN, DATALINK_ANY_MEDIATYPE, DLADM_OPT_PERSIST); - (void) dladm_aggr_delete(aggrid, DLADM_OPT_PERSIST); + (void) dladm_aggr_delete(handle, aggrid, + DLADM_OPT_PERSIST); } else { port[0].lp_linkid = del_arg->linkid; - (void) dladm_aggr_remove(aggrid, 1, port, + (void) dladm_aggr_remove(handle, aggrid, 1, port, DLADM_OPT_PERSIST); } } @@ -792,7 +768,7 @@ typedef struct del_phys_arg_s { } del_phys_arg_t; static int -i_dladm_phys_delete(datalink_id_t linkid, void *arg) +i_dladm_phys_delete(dladm_handle_t handle, datalink_id_t linkid, void *arg) { uint32_t flags; datalink_class_t class; @@ -801,7 +777,7 @@ i_dladm_phys_delete(datalink_id_t linkid, void *arg) del_phys_arg_t *del_phys_arg = arg; consumer_del_phys_arg_t del_arg; - if ((status = dladm_datalink_id2info(linkid, &flags, &class, + if ((status = dladm_datalink_id2info(handle, linkid, &flags, &class, &media, NULL, 0)) != DLADM_STATUS_OK) { goto done; } @@ -817,16 +793,16 @@ i_dladm_phys_delete(datalink_id_t linkid, void *arg) if (media == DL_ETHER) { del_arg.linkid = linkid; - (void) dladm_walk_datalink_id(i_dladm_aggr_link_del, &del_arg, - DATALINK_CLASS_AGGR, DATALINK_ANY_MEDIATYPE, + (void) dladm_walk_datalink_id(i_dladm_aggr_link_del, handle, + &del_arg, DATALINK_CLASS_AGGR, DATALINK_ANY_MEDIATYPE, DLADM_OPT_PERSIST); - (void) dladm_walk_datalink_id(i_dladm_vlan_link_del, &del_arg, - DATALINK_CLASS_VLAN, DATALINK_ANY_MEDIATYPE, + (void) dladm_walk_datalink_id(i_dladm_vlan_link_del, handle, + &del_arg, DATALINK_CLASS_VLAN, DATALINK_ANY_MEDIATYPE, DLADM_OPT_PERSIST); } - (void) dladm_destroy_datalink_id(linkid, DLADM_OPT_PERSIST); - (void) dladm_remove_conf(linkid); + (void) dladm_destroy_datalink_id(handle, linkid, DLADM_OPT_PERSIST); + (void) dladm_remove_conf(handle, linkid); done: del_phys_arg->rval = status; @@ -834,23 +810,24 @@ done: } dladm_status_t -dladm_phys_delete(datalink_id_t linkid) +dladm_phys_delete(dladm_handle_t handle, datalink_id_t linkid) { del_phys_arg_t arg = {DLADM_STATUS_OK}; if (linkid == DATALINK_ALL_LINKID) { - (void) dladm_walk_datalink_id(i_dladm_phys_delete, &arg, + (void) dladm_walk_datalink_id(i_dladm_phys_delete, handle, &arg, DATALINK_CLASS_PHYS, DATALINK_ANY_MEDIATYPE, DLADM_OPT_PERSIST); return (DLADM_STATUS_OK); } else { - (void) i_dladm_phys_delete(linkid, &arg); + (void) i_dladm_phys_delete(handle, linkid, &arg); return (arg.rval); } } dladm_status_t -dladm_phys_info(datalink_id_t linkid, dladm_phys_attr_t *dpap, uint32_t flags) +dladm_phys_info(dladm_handle_t handle, datalink_id_t linkid, + dladm_phys_attr_t *dpap, uint32_t flags) { dladm_status_t status; @@ -860,29 +837,23 @@ dladm_phys_info(datalink_id_t linkid, dladm_phys_attr_t *dpap, uint32_t flags) case DLADM_OPT_PERSIST: { dladm_conf_t conf; - status = dladm_read_conf(linkid, &conf); + status = dladm_read_conf(handle, linkid, &conf); if (status != DLADM_STATUS_OK) return (status); - status = dladm_get_conf_field(conf, FDEVNAME, dpap->dp_dev, - MAXLINKNAMELEN); - dladm_destroy_conf(conf); + status = dladm_get_conf_field(handle, conf, FDEVNAME, + dpap->dp_dev, MAXLINKNAMELEN); + dladm_destroy_conf(handle, conf); return (status); } case DLADM_OPT_ACTIVE: { dld_ioc_phys_attr_t dip; - int fd; - - if ((fd = open(DLD_CONTROL_DEV, O_RDWR)) < 0) - return (dladm_errno2status(errno)); dip.dip_linkid = linkid; - if (ioctl(fd, DLDIOC_PHYS_ATTR, &dip) < 0) { + if (ioctl(dladm_dld_fd(handle), DLDIOC_PHYS_ATTR, &dip) < 0) { status = dladm_errno2status(errno); - (void) close(fd); return (status); } - (void) close(fd); dpap->dp_novanity = dip.dip_novanity; (void) strlcpy(dpap->dp_dev, dip.dip_dev, MAXLINKNAMELEN); return (DLADM_STATUS_OK); @@ -899,13 +870,13 @@ typedef struct i_walk_dev_state_s { } i_walk_dev_state_t; int -i_dladm_walk_dev2linkid(datalink_id_t linkid, void *arg) +i_dladm_walk_dev2linkid(dladm_handle_t handle, datalink_id_t linkid, void *arg) { dladm_phys_attr_t dpa; dladm_status_t status; i_walk_dev_state_t *statep = arg; - status = dladm_phys_info(linkid, &dpa, DLADM_OPT_PERSIST); + status = dladm_phys_info(handle, linkid, &dpa, DLADM_OPT_PERSIST); if ((status == DLADM_STATUS_OK) && (strcmp(statep->devname, dpa.dp_dev) == 0)) { statep->found = B_TRUE; @@ -919,14 +890,15 @@ i_dladm_walk_dev2linkid(datalink_id_t linkid, void *arg) * Get the linkid from the physical device name. */ dladm_status_t -dladm_dev2linkid(const char *devname, datalink_id_t *linkidp) +dladm_dev2linkid(dladm_handle_t handle, const char *devname, + datalink_id_t *linkidp) { i_walk_dev_state_t state; state.found = B_FALSE; state.devname = devname; - (void) dladm_walk_datalink_id(i_dladm_walk_dev2linkid, &state, + (void) dladm_walk_datalink_id(i_dladm_walk_dev2linkid, handle, &state, DATALINK_CLASS_PHYS, DATALINK_ANY_MEDIATYPE, DLADM_OPT_PERSIST); if (state.found == B_TRUE) { *linkidp = state.linkid; @@ -962,14 +934,16 @@ parse_devname(const char *devname, char *driver, uint_t *ppa, size_t maxlen) } dladm_status_t -dladm_linkid2legacyname(datalink_id_t linkid, char *dev, size_t len) +dladm_linkid2legacyname(dladm_handle_t handle, datalink_id_t linkid, char *dev, + size_t len) { char devname[MAXLINKNAMELEN]; uint16_t vid = VLAN_ID_NONE; datalink_class_t class; dladm_status_t status; - status = dladm_datalink_id2info(linkid, NULL, &class, NULL, NULL, 0); + status = dladm_datalink_id2info(handle, linkid, NULL, &class, NULL, + NULL, 0); if (status != DLADM_STATUS_OK) goto done; @@ -980,14 +954,15 @@ dladm_linkid2legacyname(datalink_id_t linkid, char *dev, size_t len) if (class == DATALINK_CLASS_VLAN) { dladm_vlan_attr_t dva; - status = dladm_vlan_info(linkid, &dva, DLADM_OPT_ACTIVE); + status = dladm_vlan_info(handle, linkid, &dva, + DLADM_OPT_ACTIVE); if (status != DLADM_STATUS_OK) goto done; linkid = dva.dv_linkid; vid = dva.dv_vid; - if ((status = dladm_datalink_id2info(linkid, NULL, &class, NULL, - NULL, 0)) != DLADM_STATUS_OK) { + if ((status = dladm_datalink_id2info(handle, linkid, NULL, + &class, NULL, NULL, 0)) != DLADM_STATUS_OK) { goto done; } } @@ -996,7 +971,8 @@ dladm_linkid2legacyname(datalink_id_t linkid, char *dev, size_t len) case DATALINK_CLASS_AGGR: { dladm_aggr_grp_attr_t dga; - status = dladm_aggr_info(linkid, &dga, DLADM_OPT_ACTIVE); + status = dladm_aggr_info(handle, linkid, &dga, + DLADM_OPT_ACTIVE); if (status != DLADM_STATUS_OK) goto done; @@ -1014,7 +990,8 @@ dladm_linkid2legacyname(datalink_id_t linkid, char *dev, size_t len) case DATALINK_CLASS_PHYS: { dladm_phys_attr_t dpa; - status = dladm_phys_info(linkid, &dpa, DLADM_OPT_PERSIST); + status = dladm_phys_info(handle, linkid, &dpa, + DLADM_OPT_PERSIST); if (status != DLADM_STATUS_OK) goto done; diff --git a/usr/src/lib/libdladm/common/libdllink.h b/usr/src/lib/libdladm/common/libdllink.h index 22f396c3a6..c486cfa774 100644 --- a/usr/src/lib/libdladm/common/libdllink.h +++ b/usr/src/lib/libdladm/common/libdllink.h @@ -114,28 +114,34 @@ typedef struct dladm_macaddr_attr { datalink_id_t ma_client_linkid; } dladm_macaddr_attr_t; -extern dladm_status_t dladm_walk(dladm_walkcb_t *, void *, datalink_class_t, - datalink_media_t, uint32_t); +extern dladm_status_t dladm_walk(dladm_walkcb_t *, dladm_handle_t, void *, + datalink_class_t, datalink_media_t, uint32_t); extern dladm_status_t dladm_mac_walk(dladm_walkcb_t *, void *); -extern dladm_status_t dladm_info(datalink_id_t, dladm_attr_t *); -extern dladm_status_t dladm_setzid(const char *, char *); - -extern dladm_status_t dladm_rename_link(const char *, const char *); - -extern dladm_status_t dladm_set_linkprop(datalink_id_t, const char *, - char **, uint_t, uint_t); -extern dladm_status_t dladm_get_linkprop(datalink_id_t, dladm_prop_type_t, - const char *, char **, uint_t *); -extern dladm_status_t dladm_walk_linkprop(datalink_id_t, void *, - int (*)(datalink_id_t, const char *, void *)); - -extern dladm_status_t dladm_set_secobj(const char *, dladm_secobj_class_t, - uint8_t *, uint_t, uint_t); -extern dladm_status_t dladm_get_secobj(const char *, dladm_secobj_class_t *, - uint8_t *, uint_t *, uint_t); -extern dladm_status_t dladm_unset_secobj(const char *, uint_t); -extern dladm_status_t dladm_walk_secobj(void *, - boolean_t (*)(void *, const char *), uint_t); +extern dladm_status_t dladm_info(dladm_handle_t, datalink_id_t, + dladm_attr_t *); +extern dladm_status_t dladm_setzid(dladm_handle_t, const char *, char *); + +extern dladm_status_t dladm_rename_link(dladm_handle_t, const char *, + const char *); + +extern dladm_status_t dladm_set_linkprop(dladm_handle_t, datalink_id_t, + const char *, char **, uint_t, uint_t); +extern dladm_status_t dladm_get_linkprop(dladm_handle_t, datalink_id_t, + dladm_prop_type_t, const char *, char **, uint_t *); +extern dladm_status_t dladm_walk_linkprop(dladm_handle_t, datalink_id_t, + void *, int (*)(dladm_handle_t, datalink_id_t, + const char *, void *)); + +extern dladm_status_t dladm_set_secobj(dladm_handle_t, const char *, + dladm_secobj_class_t, uint8_t *, uint_t, uint_t); +extern dladm_status_t dladm_get_secobj(dladm_handle_t, const char *, + dladm_secobj_class_t *, uint8_t *, uint_t *, + uint_t); +extern dladm_status_t dladm_unset_secobj(dladm_handle_t, const char *, + uint_t); +extern dladm_status_t dladm_walk_secobj(dladm_handle_t, void *, + boolean_t (*)(dladm_handle_t, void *, const char *), + uint_t); extern const char *dladm_linkstate2str(link_state_t, char *); extern const char *dladm_linkduplex2str(link_duplex_t, char *); @@ -143,48 +149,60 @@ extern const char *dladm_secobjclass2str(dladm_secobj_class_t, char *); extern dladm_status_t dladm_str2secobjclass(const char *, dladm_secobj_class_t *); -extern dladm_status_t dladm_init_linkprop(datalink_id_t, boolean_t); -extern dladm_status_t dladm_init_secobj(void); +extern dladm_status_t dladm_init_linkprop(dladm_handle_t, datalink_id_t, + boolean_t); +extern dladm_status_t dladm_init_secobj(dladm_handle_t); extern boolean_t dladm_valid_secobj_name(const char *); -extern dladm_status_t dladm_create_datalink_id(const char *, datalink_class_t, - uint_t, uint32_t, datalink_id_t *); -extern dladm_status_t dladm_destroy_datalink_id(datalink_id_t, uint32_t); -extern dladm_status_t dladm_remap_datalink_id(datalink_id_t, const char *); -extern dladm_status_t dladm_up_datalink_id(datalink_id_t); -extern dladm_status_t dladm_name2info(const char *, datalink_id_t *, - uint32_t *, datalink_class_t *, uint32_t *); -extern dladm_status_t dladm_datalink_id2info(datalink_id_t, uint32_t *, - datalink_class_t *, uint32_t *, char *, size_t); -extern dladm_status_t dladm_walk_datalink_id(int (*)(datalink_id_t, void *), - void *, datalink_class_t, datalink_media_t, - uint32_t); -extern dladm_status_t dladm_create_conf(const char *, datalink_id_t, - datalink_class_t, uint32_t, dladm_conf_t *); -extern dladm_status_t dladm_read_conf(datalink_id_t, dladm_conf_t *); -extern dladm_status_t dladm_write_conf(dladm_conf_t); -extern dladm_status_t dladm_remove_conf(datalink_id_t); -extern void dladm_destroy_conf(dladm_conf_t); -extern dladm_status_t dladm_get_conf_field(dladm_conf_t, const char *, - void *, size_t); -extern dladm_status_t dladm_set_conf_field(dladm_conf_t, const char *, - dladm_datatype_t, const void *); -extern dladm_status_t dladm_unset_conf_field(dladm_conf_t, const char *); - -extern dladm_status_t dladm_dev2linkid(const char *, datalink_id_t *); -extern dladm_status_t dladm_linkid2legacyname(datalink_id_t, char *, size_t); -extern dladm_status_t dladm_phys_delete(datalink_id_t); - -extern dladm_status_t dladm_phys_info(datalink_id_t, dladm_phys_attr_t *, +extern dladm_status_t dladm_create_datalink_id(dladm_handle_t, const char *, + datalink_class_t, uint_t, uint32_t, + datalink_id_t *); +extern dladm_status_t dladm_destroy_datalink_id(dladm_handle_t, datalink_id_t, uint32_t); +extern dladm_status_t dladm_remap_datalink_id(dladm_handle_t, datalink_id_t, + const char *); +extern dladm_status_t dladm_up_datalink_id(dladm_handle_t, datalink_id_t); +extern dladm_status_t dladm_name2info(dladm_handle_t, const char *, + datalink_id_t *, uint32_t *, datalink_class_t *, + uint32_t *); +extern dladm_status_t dladm_datalink_id2info(dladm_handle_t, datalink_id_t, + uint32_t *, datalink_class_t *, uint32_t *, char *, + size_t); +extern dladm_status_t dladm_walk_datalink_id(int (*)(dladm_handle_t, + datalink_id_t, void *), dladm_handle_t, void *, + datalink_class_t, datalink_media_t, uint32_t); +extern dladm_status_t dladm_create_conf(dladm_handle_t, const char *, + datalink_id_t, datalink_class_t, uint32_t, + dladm_conf_t *); +extern dladm_status_t dladm_read_conf(dladm_handle_t, datalink_id_t, + dladm_conf_t *); +extern dladm_status_t dladm_write_conf(dladm_handle_t, dladm_conf_t); +extern dladm_status_t dladm_remove_conf(dladm_handle_t, datalink_id_t); +extern void dladm_destroy_conf(dladm_handle_t, dladm_conf_t); +extern dladm_status_t dladm_get_conf_field(dladm_handle_t, dladm_conf_t, + const char *, void *, size_t); +extern dladm_status_t dladm_set_conf_field(dladm_handle_t, dladm_conf_t, + const char *, dladm_datatype_t, const void *); +extern dladm_status_t dladm_unset_conf_field(dladm_handle_t, dladm_conf_t, + const char *); + +extern dladm_status_t dladm_dev2linkid(dladm_handle_t, const char *, + datalink_id_t *); +extern dladm_status_t dladm_linkid2legacyname(dladm_handle_t, datalink_id_t, + char *, size_t); +extern dladm_status_t dladm_phys_delete(dladm_handle_t, datalink_id_t); + +extern dladm_status_t dladm_phys_info(dladm_handle_t, datalink_id_t, + dladm_phys_attr_t *, uint32_t); extern dladm_status_t dladm_parselink(const char *, char *, uint_t *); -extern int dladm_walk_macaddr(datalink_id_t, void *, +extern int dladm_walk_macaddr(dladm_handle_t, datalink_id_t, + void *, boolean_t (*)(void *, dladm_macaddr_attr_t *)); -extern int dladm_walk_hwgrp(datalink_id_t, void *, +extern int dladm_walk_hwgrp(dladm_handle_t, datalink_id_t, void *, boolean_t (*)(void *, dladm_hwgrp_attr_t *)); -extern dladm_status_t dladm_link_get_proplist(datalink_id_t, +extern dladm_status_t dladm_link_get_proplist(dladm_handle_t, datalink_id_t, dladm_arg_list_t **); extern dladm_status_t i_dladm_set_link_proplist_db(char *, diff --git a/usr/src/lib/libdladm/common/libdlmgmt.c b/usr/src/lib/libdladm/common/libdlmgmt.c index 2e7d6c58aa..611c693579 100644 --- a/usr/src/lib/libdladm/common/libdlmgmt.c +++ b/usr/src/lib/libdladm/common/libdlmgmt.c @@ -50,15 +50,13 @@ static size_t dladm_datatype_size[] = { }; static dladm_status_t -dladm_door_call(void *arg, size_t asize, void *rbuf, size_t rsize) +dladm_door_call(dladm_handle_t handle, void *arg, size_t asize, void *rbuf, + size_t rsize) { door_arg_t darg; - int fd; + int door_fd; dladm_status_t status = DLADM_STATUS_OK; - if ((fd = open(DLMGMT_DOOR, O_RDONLY)) == -1) - return (dladm_errno2status(errno)); - darg.data_ptr = arg; darg.data_size = asize; darg.desc_ptr = NULL; @@ -66,10 +64,11 @@ dladm_door_call(void *arg, size_t asize, void *rbuf, size_t rsize) darg.rbuf = rbuf; darg.rsize = rsize; - if (door_call(fd, &darg) == -1) + /* The door descriptor is opened if it isn't already */ + if ((status = dladm_door_fd(handle, &door_fd)) != DLADM_STATUS_OK) + return (status); + if (door_call(door_fd, &darg) == -1) status = dladm_errno2status(errno); - (void) close(fd); - if (status != DLADM_STATUS_OK) return (status); @@ -92,8 +91,9 @@ dladm_door_call(void *arg, size_t asize, void *rbuf, size_t rsize) * Allocate a new linkid with the given name. Return the new linkid. */ dladm_status_t -dladm_create_datalink_id(const char *link, datalink_class_t class, - uint32_t media, uint32_t flags, datalink_id_t *linkidp) +dladm_create_datalink_id(dladm_handle_t handle, const char *link, + datalink_class_t class, uint32_t media, uint32_t flags, + datalink_id_t *linkidp) { dlmgmt_door_createid_t createid; dlmgmt_createid_retval_t retval; @@ -116,8 +116,8 @@ dladm_create_datalink_id(const char *link, datalink_class_t class, createid.ld_cmd = DLMGMT_CMD_CREATE_LINKID; createid.ld_prefix = (flags & DLADM_OPT_PREFIX); - if ((status = dladm_door_call(&createid, sizeof (createid), &retval, - sizeof (retval))) == DLADM_STATUS_OK) { + if ((status = dladm_door_call(handle, &createid, sizeof (createid), + &retval, sizeof (retval))) == DLADM_STATUS_OK) { *linkidp = retval.lr_linkid; } return (status); @@ -127,7 +127,8 @@ dladm_create_datalink_id(const char *link, datalink_class_t class, * Destroy the given link ID. */ dladm_status_t -dladm_destroy_datalink_id(datalink_id_t linkid, uint32_t flags) +dladm_destroy_datalink_id(dladm_handle_t handle, datalink_id_t linkid, + uint32_t flags) { dlmgmt_door_destroyid_t destroyid; dlmgmt_destroyid_retval_t retval; @@ -140,15 +141,16 @@ dladm_destroy_datalink_id(datalink_id_t linkid, uint32_t flags) destroyid.ld_linkid = linkid; destroyid.ld_flags = dlmgmt_flags; - return (dladm_door_call(&destroyid, sizeof (destroyid), - &retval, sizeof (retval))); + return (dladm_door_call(handle, &destroyid, sizeof (destroyid), &retval, + sizeof (retval))); } /* * Remap a given link ID to a new name. */ dladm_status_t -dladm_remap_datalink_id(datalink_id_t linkid, const char *link) +dladm_remap_datalink_id(dladm_handle_t handle, datalink_id_t linkid, + const char *link) { dlmgmt_door_remapid_t remapid; dlmgmt_remapid_retval_t retval; @@ -157,15 +159,15 @@ dladm_remap_datalink_id(datalink_id_t linkid, const char *link) remapid.ld_linkid = linkid; (void) strlcpy(remapid.ld_link, link, MAXLINKNAMELEN); - return (dladm_door_call(&remapid, sizeof (remapid), - &retval, sizeof (retval))); + return (dladm_door_call(handle, &remapid, sizeof (remapid), &retval, + sizeof (retval))); } /* * Make a given link ID active. */ dladm_status_t -dladm_up_datalink_id(datalink_id_t linkid) +dladm_up_datalink_id(dladm_handle_t handle, datalink_id_t linkid) { dlmgmt_door_upid_t upid; dlmgmt_upid_retval_t retval; @@ -173,15 +175,15 @@ dladm_up_datalink_id(datalink_id_t linkid) upid.ld_cmd = DLMGMT_CMD_UP_LINKID; upid.ld_linkid = linkid; - return (dladm_door_call(&upid, sizeof (upid), - &retval, sizeof (retval))); + return (dladm_door_call(handle, &upid, sizeof (upid), &retval, + sizeof (retval))); } /* * Create a new link with the given name. Return the new link's handle */ dladm_status_t -dladm_create_conf(const char *link, datalink_id_t linkid, +dladm_create_conf(dladm_handle_t handle, const char *link, datalink_id_t linkid, datalink_class_t class, uint32_t media, dladm_conf_t *confp) { dlmgmt_door_createconf_t createconf; @@ -197,7 +199,7 @@ dladm_create_conf(const char *link, datalink_id_t linkid, createconf.ld_linkid = linkid; createconf.ld_cmd = DLMGMT_CMD_CREATECONF; - if ((status = dladm_door_call(&createconf, sizeof (createconf), + if ((status = dladm_door_call(handle, &createconf, sizeof (createconf), &retval, sizeof (retval))) == DLADM_STATUS_OK) { *confp = retval.lr_conf; } @@ -210,14 +212,15 @@ dladm_create_conf(const char *link, datalink_id_t linkid, * real status by calling dladm_phys_info(). */ dladm_status_t -i_dladm_phys_status(datalink_id_t linkid, uint32_t *flagsp) +i_dladm_phys_status(dladm_handle_t handle, datalink_id_t linkid, + uint32_t *flagsp) { dladm_phys_attr_t dpa; dladm_status_t status; assert((*flagsp) & DLMGMT_ACTIVE); - status = dladm_phys_info(linkid, &dpa, DLADM_OPT_ACTIVE); + status = dladm_phys_info(handle, linkid, &dpa, DLADM_OPT_ACTIVE); if (status == DLADM_STATUS_NOTFOUND) { /* * No active status, this link was removed. Update its status @@ -227,11 +230,11 @@ i_dladm_phys_status(datalink_id_t linkid, uint32_t *flagsp) * failure now since otherwise dladm_set_linkprop() might * call back to i_dladm_phys_status() recursively. */ - status = dladm_destroy_datalink_id(linkid, DLADM_OPT_ACTIVE); - if (status != DLADM_STATUS_OK) + if ((status = dladm_destroy_datalink_id(handle, linkid, + DLADM_OPT_ACTIVE)) != DLADM_STATUS_OK) return (status); - (void) dladm_set_linkprop(linkid, NULL, NULL, 0, + (void) dladm_set_linkprop(handle, linkid, NULL, NULL, 0, DLADM_OPT_ACTIVE); (*flagsp) &= ~DLMGMT_ACTIVE; @@ -245,8 +248,9 @@ i_dladm_phys_status(datalink_id_t linkid, uint32_t *flagsp) * call fn on the linkid and arg. */ dladm_status_t -dladm_walk_datalink_id(int (*fn)(datalink_id_t, void *), void *argp, - datalink_class_t class, datalink_media_t dmedia, uint32_t flags) +dladm_walk_datalink_id(int (*fn)(dladm_handle_t, datalink_id_t, void *), + dladm_handle_t handle, void *argp, datalink_class_t class, + datalink_media_t dmedia, uint32_t flags) { dlmgmt_door_getnext_t getnext; dlmgmt_getnext_retval_t retval; @@ -267,8 +271,9 @@ dladm_walk_datalink_id(int (*fn)(datalink_id_t, void *), void *argp, do { getnext.ld_linkid = linkid; - if ((status = dladm_door_call(&getnext, sizeof (getnext), - &retval, sizeof (retval))) != DLADM_STATUS_OK) { + if ((status = dladm_door_call(handle, &getnext, + sizeof (getnext), &retval, sizeof (retval))) != + DLADM_STATUS_OK) { /* * done with walking */ @@ -283,8 +288,8 @@ dladm_walk_datalink_id(int (*fn)(datalink_id_t, void *), void *argp, * daemon might not be active anymore. Check its * real status. */ - if (i_dladm_phys_status(linkid, &retval.lr_flags) != - DLADM_STATUS_OK) { + if (i_dladm_phys_status(handle, linkid, + &retval.lr_flags) != DLADM_STATUS_OK) { continue; } @@ -292,7 +297,7 @@ dladm_walk_datalink_id(int (*fn)(datalink_id_t, void *), void *argp, continue; } - if (fn(linkid, argp) == DLADM_WALK_TERMINATE) + if (fn(handle, linkid, argp) == DLADM_WALK_TERMINATE) break; } while (linkid != DATALINK_INVALID_LINKID); @@ -303,7 +308,8 @@ dladm_walk_datalink_id(int (*fn)(datalink_id_t, void *), void *argp, * Get the link properties structure for the given link. */ dladm_status_t -dladm_read_conf(datalink_id_t linkid, dladm_conf_t *confp) +dladm_read_conf(dladm_handle_t handle, datalink_id_t linkid, + dladm_conf_t *confp) { dlmgmt_door_readconf_t readconf; dlmgmt_readconf_retval_t retval; @@ -315,7 +321,7 @@ dladm_read_conf(datalink_id_t linkid, dladm_conf_t *confp) readconf.ld_linkid = linkid; readconf.ld_cmd = DLMGMT_CMD_READCONF; - if ((status = dladm_door_call(&readconf, sizeof (readconf), + if ((status = dladm_door_call(handle, &readconf, sizeof (readconf), &retval, sizeof (retval))) == DLADM_STATUS_OK) { *confp = retval.lr_conf; } @@ -327,7 +333,7 @@ dladm_read_conf(datalink_id_t linkid, dladm_conf_t *confp) * that it will persist across reboots. */ dladm_status_t -dladm_write_conf(dladm_conf_t conf) +dladm_write_conf(dladm_handle_t handle, dladm_conf_t conf) { dlmgmt_door_writeconf_t writeconf; dlmgmt_writeconf_retval_t retval; @@ -338,8 +344,8 @@ dladm_write_conf(dladm_conf_t conf) writeconf.ld_cmd = DLMGMT_CMD_WRITECONF; writeconf.ld_conf = conf; - return (dladm_door_call(&writeconf, sizeof (writeconf), - &retval, sizeof (retval))); + return (dladm_door_call(handle, &writeconf, sizeof (writeconf), &retval, + sizeof (retval))); } /* @@ -347,8 +353,8 @@ dladm_write_conf(dladm_conf_t conf) * data link configuration repository. */ dladm_status_t -dladm_get_conf_field(dladm_conf_t conf, const char *attr, void *attrval, - size_t attrsz) +dladm_get_conf_field(dladm_handle_t handle, dladm_conf_t conf, const char *attr, + void *attrval, size_t attrsz) { dlmgmt_door_getattr_t getattr; dlmgmt_getattr_retval_t retval; @@ -363,8 +369,8 @@ dladm_get_conf_field(dladm_conf_t conf, const char *attr, void *attrval, getattr.ld_conf = conf; (void) strlcpy(getattr.ld_attr, attr, MAXLINKATTRLEN); - if ((status = dladm_door_call(&getattr, sizeof (getattr), &retval, - sizeof (retval))) != DLADM_STATUS_OK) { + if ((status = dladm_door_call(handle, &getattr, sizeof (getattr), + &retval, sizeof (retval))) != DLADM_STATUS_OK) { return (status); } @@ -379,8 +385,8 @@ dladm_get_conf_field(dladm_conf_t conf, const char *attr, void *attrval, * Get the link ID that is associated with the given name. */ dladm_status_t -dladm_name2info(const char *link, datalink_id_t *linkidp, uint32_t *flagp, - datalink_class_t *classp, uint32_t *mediap) +dladm_name2info(dladm_handle_t handle, const char *link, datalink_id_t *linkidp, + uint32_t *flagp, datalink_class_t *classp, uint32_t *mediap) { dlmgmt_door_getlinkid_t getlinkid; dlmgmt_getlinkid_retval_t retval; @@ -390,7 +396,7 @@ dladm_name2info(const char *link, datalink_id_t *linkidp, uint32_t *flagp, getlinkid.ld_cmd = DLMGMT_CMD_GETLINKID; (void) strlcpy(getlinkid.ld_link, link, MAXLINKNAMELEN); - if ((status = dladm_door_call(&getlinkid, sizeof (getlinkid), + if ((status = dladm_door_call(handle, &getlinkid, sizeof (getlinkid), &retval, sizeof (retval))) != DLADM_STATUS_OK) { return (status); } @@ -402,7 +408,7 @@ dladm_name2info(const char *link, datalink_id_t *linkidp, uint32_t *flagp, * An active physical link reported by the dlmgmtd daemon * might not be active anymore. Check and set its real status. */ - status = i_dladm_phys_status(linkid, &retval.lr_flags); + status = i_dladm_phys_status(handle, linkid, &retval.lr_flags); if (status != DLADM_STATUS_OK) return (status); } @@ -426,8 +432,9 @@ dladm_name2info(const char *link, datalink_id_t *linkidp, uint32_t *flagp, * Get the link name that is associated with the given id. */ dladm_status_t -dladm_datalink_id2info(datalink_id_t linkid, uint32_t *flagp, - datalink_class_t *classp, uint32_t *mediap, char *link, size_t len) +dladm_datalink_id2info(dladm_handle_t handle, datalink_id_t linkid, + uint32_t *flagp, datalink_class_t *classp, uint32_t *mediap, char *link, + size_t len) { dlmgmt_door_getname_t getname; dlmgmt_getname_retval_t retval; @@ -440,8 +447,8 @@ dladm_datalink_id2info(datalink_id_t linkid, uint32_t *flagp, getname.ld_cmd = DLMGMT_CMD_GETNAME; getname.ld_linkid = linkid; - if ((status = dladm_door_call(&getname, sizeof (getname), &retval, - sizeof (retval))) != DLADM_STATUS_OK) { + if ((status = dladm_door_call(handle, &getname, sizeof (getname), + &retval, sizeof (retval))) != DLADM_STATUS_OK) { return (status); } @@ -454,7 +461,7 @@ dladm_datalink_id2info(datalink_id_t linkid, uint32_t *flagp, * An active physical link reported by the dlmgmtd daemon * might not be active anymore. Check and set its real status. */ - status = i_dladm_phys_status(linkid, &retval.lr_flags); + status = i_dladm_phys_status(handle, linkid, &retval.lr_flags); if (status != DLADM_STATUS_OK) return (status); } @@ -478,7 +485,7 @@ dladm_datalink_id2info(datalink_id_t linkid, uint32_t *flagp, * Set the given attr with the given attrval for the given link. */ dladm_status_t -dladm_set_conf_field(dladm_conf_t conf, const char *attr, +dladm_set_conf_field(dladm_handle_t handle, dladm_conf_t conf, const char *attr, dladm_datatype_t type, const void *attrval) { dlmgmt_door_setattr_t setattr; @@ -503,15 +510,16 @@ dladm_set_conf_field(dladm_conf_t conf, const char *attr, setattr.ld_type = type; bcopy(attrval, &setattr.ld_attrval, attrsz); - return (dladm_door_call(&setattr, sizeof (setattr), - &retval, sizeof (retval))); + return (dladm_door_call(handle, &setattr, sizeof (setattr), &retval, + sizeof (retval))); } /* * Unset the given attr the given link. */ dladm_status_t -dladm_unset_conf_field(dladm_conf_t conf, const char *attr) +dladm_unset_conf_field(dladm_handle_t handle, dladm_conf_t conf, + const char *attr) { dlmgmt_door_unsetattr_t unsetattr; dlmgmt_unsetattr_retval_t retval; @@ -523,8 +531,8 @@ dladm_unset_conf_field(dladm_conf_t conf, const char *attr) unsetattr.ld_conf = conf; (void) strlcpy(unsetattr.ld_attr, attr, MAXLINKATTRLEN); - return (dladm_door_call(&unsetattr, sizeof (unsetattr), - &retval, sizeof (retval))); + return (dladm_door_call(handle, &unsetattr, sizeof (unsetattr), &retval, + sizeof (retval))); } /* @@ -532,7 +540,7 @@ dladm_unset_conf_field(dladm_conf_t conf, const char *attr) * repository. */ dladm_status_t -dladm_remove_conf(datalink_id_t linkid) +dladm_remove_conf(dladm_handle_t handle, datalink_id_t linkid) { dlmgmt_door_removeconf_t removeconf; dlmgmt_removeconf_retval_t retval; @@ -540,7 +548,7 @@ dladm_remove_conf(datalink_id_t linkid) removeconf.ld_cmd = DLMGMT_CMD_REMOVECONF; removeconf.ld_linkid = linkid; - return (dladm_door_call(&removeconf, sizeof (removeconf), + return (dladm_door_call(handle, &removeconf, sizeof (removeconf), &retval, sizeof (retval))); } @@ -548,7 +556,7 @@ dladm_remove_conf(datalink_id_t linkid) * Free the contents of the link structure. */ void -dladm_destroy_conf(dladm_conf_t conf) +dladm_destroy_conf(dladm_handle_t handle, dladm_conf_t conf) { dlmgmt_door_destroyconf_t destroyconf; dlmgmt_destroyconf_retval_t retval; @@ -559,6 +567,6 @@ dladm_destroy_conf(dladm_conf_t conf) destroyconf.ld_cmd = DLMGMT_CMD_DESTROYCONF; destroyconf.ld_conf = conf; - (void) dladm_door_call(&destroyconf, sizeof (destroyconf), + (void) dladm_door_call(handle, &destroyconf, sizeof (destroyconf), &retval, sizeof (retval)); } diff --git a/usr/src/lib/libdladm/common/libdlstat.c b/usr/src/lib/libdladm/common/libdlstat.c index 1990d27c67..81d0d7d321 100644 --- a/usr/src/lib/libdladm/common/libdlstat.c +++ b/usr/src/lib/libdladm/common/libdlstat.c @@ -126,7 +126,7 @@ findstat(const char *flowname, datalink_id_t linkid) } static void -print_flow_stats(struct flowlist *flist) +print_flow_stats(dladm_handle_t handle, struct flowlist *flist) { struct flowlist *fcurr; double ikbs, okbs; @@ -147,8 +147,8 @@ print_flow_stats(struct flowlist *flist) if (fcurr->flowname && fcurr->display) { char linkname[MAXNAMELEN]; - (void) dladm_datalink_id2info(fcurr->linkid, NULL, NULL, - NULL, linkname, sizeof (linkname)); + (void) dladm_datalink_id2info(handle, fcurr->linkid, + NULL, NULL, NULL, linkname, sizeof (linkname)); dlt = (double)fcurr->diffstats.snaptime/(double)NANOSEC; ikbs = fcurr->diffstats.rbytes * 8 / dlt / 1024; okbs = fcurr->diffstats.obytes * 8 / dlt / 1024; @@ -205,7 +205,7 @@ flow_kstats(dladm_flow_attr_t *attr, void *arg) } static void -print_link_stats(struct flowlist *flist) +print_link_stats(dladm_handle_t handle, struct flowlist *flist) { struct flowlist *fcurr; double ikbs, okbs; @@ -228,8 +228,8 @@ print_link_stats(struct flowlist *flist) fcurr->display) { char linkname[MAXNAMELEN]; - (void) dladm_datalink_id2info(fcurr->linkid, NULL, NULL, - NULL, linkname, sizeof (linkname)); + (void) dladm_datalink_id2info(handle, fcurr->linkid, + NULL, NULL, NULL, linkname, sizeof (linkname)); dlt = (double)fcurr->diffstats.snaptime/(double)NANOSEC; ikbs = (double)fcurr->diffstats.rbytes * 8 / dlt / 1024; okbs = (double)fcurr->diffstats.obytes * 8 / dlt / 1024; @@ -258,14 +258,14 @@ print_link_stats(struct flowlist *flist) /*ARGSUSED*/ static int -link_flowstats(datalink_id_t linkid, void *arg) +link_flowstats(dladm_handle_t handle, datalink_id_t linkid, void *arg) { - return (dladm_walk_flow(flow_kstats, linkid, arg, B_FALSE)); + return (dladm_walk_flow(flow_kstats, handle, linkid, arg, B_FALSE)); } /*ARGSUSED*/ static int -link_kstats(datalink_id_t linkid, void *arg) +link_kstats(dladm_handle_t handle, datalink_id_t linkid, void *arg) { kstat_ctl_t *kcp = (kstat_ctl_t *)arg; struct flowlist *flist; @@ -283,8 +283,8 @@ link_kstats(datalink_id_t linkid, void *arg) } /* lookup kstat entry */ - (void) dladm_datalink_id2info(linkid, NULL, NULL, NULL, linkname, - sizeof (linkname)); + (void) dladm_datalink_id2info(handle, linkid, NULL, NULL, NULL, + linkname, sizeof (linkname)); if (linkname == NULL) { warn("no linkname for linkid"); @@ -362,8 +362,8 @@ curses_fin() } static void -stat_report(kstat_ctl_t *kcp, datalink_id_t linkid, const char *flowname, - int opt) +stat_report(dladm_handle_t handle, kstat_ctl_t *kcp, datalink_id_t linkid, + const char *flowname, int opt) { double dlt, ikbs, okbs, ipks, opks; @@ -407,34 +407,34 @@ stat_report(kstat_ctl_t *kcp, datalink_id_t linkid, const char *flowname, if (opt == LINK_REPORT) { /* Display all links */ if (linkid == DATALINK_ALL_LINKID) { - (void) dladm_walk_datalink_id(link_kstats, + (void) dladm_walk_datalink_id(link_kstats, handle, (void *)kcp, DATALINK_CLASS_ALL, DATALINK_ANY_MEDIATYPE, DLADM_OPT_ACTIVE); /* Display 1 link */ } else { - (void) link_kstats(linkid, kcp); + (void) link_kstats(handle, linkid, kcp); } - print_link_stats(fstable); + print_link_stats(handle, fstable); } else if (opt == FLOW_REPORT) { /* Display 1 flow */ if (flowname != NULL) { dladm_flow_attr_t fattr; - if (dladm_flow_info(flowname, &fattr) != + if (dladm_flow_info(handle, flowname, &fattr) != DLADM_STATUS_OK) return; (void) flow_kstats(&fattr, kcp); /* Display all flows on all links */ } else if (linkid == DATALINK_ALL_LINKID) { - (void) dladm_walk_datalink_id(link_flowstats, + (void) dladm_walk_datalink_id(link_flowstats, handle, (void *)kcp, DATALINK_CLASS_ALL, DATALINK_ANY_MEDIATYPE, DLADM_OPT_ACTIVE); /* Display all flows on a link */ } else if (linkid != DATALINK_INVALID_LINKID) { - (void) dladm_walk_flow(flow_kstats, linkid, kcp, + (void) dladm_walk_flow(flow_kstats, handle, linkid, kcp, B_FALSE); } - print_flow_stats(fstable); + print_flow_stats(handle, fstable); /* Print totals */ (void) attron(A_BOLD); @@ -469,8 +469,8 @@ stat_report(kstat_ctl_t *kcp, datalink_id_t linkid, const char *flowname, */ void -dladm_continuous(datalink_id_t linkid, const char *flowname, int interval, - int opt) +dladm_continuous(dladm_handle_t handle, datalink_id_t linkid, + const char *flowname, int interval, int opt) { kstat_ctl_t *kcp; @@ -486,7 +486,7 @@ dladm_continuous(datalink_id_t linkid, const char *flowname, int interval, if (handle_break) break; - stat_report(kcp, linkid, flowname, opt); + stat_report(handle, kcp, linkid, flowname, opt); (void) sleep(max(1, interval)); } @@ -601,8 +601,8 @@ dladm_kstat_value(kstat_t *ksp, const char *name, uint8_t type, void *buf) } dladm_status_t -dladm_get_single_mac_stat(datalink_id_t linkid, const char *name, uint8_t type, - void *val) +dladm_get_single_mac_stat(dladm_handle_t handle, datalink_id_t linkid, + const char *name, uint8_t type, void *val) { kstat_ctl_t *kcp; char module[DLPI_LINKNAME_MAX]; @@ -618,14 +618,14 @@ dladm_get_single_mac_stat(datalink_id_t linkid, const char *name, uint8_t type, return (-1); } - if ((status = dladm_datalink_id2info(linkid, &flags, NULL, &media, - link, DLPI_LINKNAME_MAX)) != DLADM_STATUS_OK) + if ((status = dladm_datalink_id2info(handle, linkid, &flags, NULL, + &media, link, DLPI_LINKNAME_MAX)) != DLADM_STATUS_OK) return (status); if (media != DL_ETHER) return (DLADM_STATUS_LINKINVAL); - status = dladm_phys_info(linkid, &dpap, DLADM_OPT_PERSIST); + status = dladm_phys_info(handle, linkid, &dpap, DLADM_OPT_PERSIST); if (status != DLADM_STATUS_OK) return (status); diff --git a/usr/src/lib/libdladm/common/libdlstat.h b/usr/src/lib/libdladm/common/libdlstat.h index a142275268..51e28627a9 100644 --- a/usr/src/lib/libdladm/common/libdlstat.h +++ b/usr/src/lib/libdladm/common/libdlstat.h @@ -51,15 +51,16 @@ typedef struct pktsum_s { uint64_t oerrors; } pktsum_t; -extern void dladm_continuous(datalink_id_t, const char *, int, int); +extern void dladm_continuous(dladm_handle_t, datalink_id_t, + const char *, int, int); extern kstat_t *dladm_kstat_lookup(kstat_ctl_t *, const char *, int, const char *, const char *); extern void dladm_get_stats(kstat_ctl_t *, kstat_t *, pktsum_t *); extern int dladm_kstat_value(kstat_t *, const char *, uint8_t, void *); -extern dladm_status_t dladm_get_single_mac_stat(datalink_id_t, const char *, - uint8_t, void *); +extern dladm_status_t dladm_get_single_mac_stat(dladm_handle_t, datalink_id_t, + const char *, uint8_t, void *); extern void dladm_stats_total(pktsum_t *, pktsum_t *, pktsum_t *); extern void dladm_stats_diff(pktsum_t *, pktsum_t *, pktsum_t *); diff --git a/usr/src/lib/libdladm/common/libdlvlan.c b/usr/src/lib/libdladm/common/libdlvlan.c index 1dc04bf4eb..0e21c235fa 100644 --- a/usr/src/lib/libdladm/common/libdlvlan.c +++ b/usr/src/lib/libdladm/common/libdlvlan.c @@ -37,12 +37,13 @@ * Returns the current attributes of the specified VLAN. */ dladm_status_t -dladm_vlan_info(datalink_id_t vlanid, dladm_vlan_attr_t *dvap, uint32_t flags) +dladm_vlan_info(dladm_handle_t handle, datalink_id_t vlanid, + dladm_vlan_attr_t *dvap, uint32_t flags) { dladm_status_t status; dladm_vnic_attr_t attr, *vnic = &attr; - if ((status = dladm_vnic_info(vlanid, vnic, flags)) != + if ((status = dladm_vnic_info(handle, vlanid, vnic, flags)) != DLADM_STATUS_OK) return (status); @@ -56,25 +57,26 @@ dladm_vlan_info(datalink_id_t vlanid, dladm_vlan_attr_t *dvap, uint32_t flags) * Create a VLAN on given link. */ dladm_status_t -dladm_vlan_create(const char *vlan, datalink_id_t linkid, uint16_t vid, - dladm_arg_list_t *proplist, uint32_t flags, datalink_id_t *vlan_id_out) +dladm_vlan_create(dladm_handle_t handle, const char *vlan, datalink_id_t linkid, + uint16_t vid, dladm_arg_list_t *proplist, uint32_t flags, + datalink_id_t *vlan_id_out) { - return (dladm_vnic_create(vlan, linkid, VNIC_MAC_ADDR_TYPE_PRIMARY, - NULL, 0, NULL, 0, vid, vlan_id_out, proplist, - flags | DLADM_OPT_VLAN)); + return (dladm_vnic_create(handle, vlan, linkid, + VNIC_MAC_ADDR_TYPE_PRIMARY, NULL, 0, NULL, 0, vid, vlan_id_out, + proplist, flags | DLADM_OPT_VLAN)); } /* * Delete a given VLAN. */ dladm_status_t -dladm_vlan_delete(datalink_id_t vlanid, uint32_t flags) +dladm_vlan_delete(dladm_handle_t handle, datalink_id_t vlanid, uint32_t flags) { - return (dladm_vnic_delete(vlanid, flags | DLADM_OPT_VLAN)); + return (dladm_vnic_delete(handle, vlanid, flags | DLADM_OPT_VLAN)); } dladm_status_t -dladm_vlan_up(datalink_id_t linkid) +dladm_vlan_up(dladm_handle_t handle, datalink_id_t linkid) { - return (dladm_vnic_up(linkid, DLADM_OPT_VLAN)); + return (dladm_vnic_up(handle, linkid, DLADM_OPT_VLAN)); } diff --git a/usr/src/lib/libdladm/common/libdlvlan.h b/usr/src/lib/libdladm/common/libdlvlan.h index 91f6ee8671..8e32a9ad30 100644 --- a/usr/src/lib/libdladm/common/libdlvlan.h +++ b/usr/src/lib/libdladm/common/libdlvlan.h @@ -43,13 +43,14 @@ typedef struct dladm_vlan_attr { boolean_t dv_force; } dladm_vlan_attr_t; -extern dladm_status_t dladm_vlan_info(datalink_id_t, dladm_vlan_attr_t *, +extern dladm_status_t dladm_vlan_info(dladm_handle_t, datalink_id_t, + dladm_vlan_attr_t *, uint32_t); +extern dladm_status_t dladm_vlan_create(dladm_handle_t, const char *, + datalink_id_t, uint16_t, dladm_arg_list_t *, + uint32_t, datalink_id_t *); +extern dladm_status_t dladm_vlan_delete(dladm_handle_t, datalink_id_t, uint32_t); -extern dladm_status_t dladm_vlan_create(const char *, datalink_id_t, - uint16_t, dladm_arg_list_t *, uint32_t, - datalink_id_t *); -extern dladm_status_t dladm_vlan_delete(datalink_id_t, uint32_t); -extern dladm_status_t dladm_vlan_up(datalink_id_t); +extern dladm_status_t dladm_vlan_up(dladm_handle_t, datalink_id_t); #ifdef __cplusplus } diff --git a/usr/src/lib/libdladm/common/libdlvnic.c b/usr/src/lib/libdladm/common/libdlvnic.c index dfa58bcac5..3e83a6e6a2 100644 --- a/usr/src/lib/libdladm/common/libdlvnic.c +++ b/usr/src/lib/libdladm/common/libdlvnic.c @@ -50,8 +50,9 @@ */ static char dladm_vnic_def_prefix[] = {0x02, 0x08, 0x20}; -static dladm_status_t dladm_vnic_persist_conf(const char *name, - dladm_vnic_attr_t *, datalink_class_t); +static dladm_status_t dladm_vnic_persist_conf(dladm_handle_t, + const char *name, dladm_vnic_attr_t *, + datalink_class_t); static const char *dladm_vnic_macaddr2str(const uchar_t *, char *); static dladm_status_t dladm_vnic_str2macaddr(const char *, uchar_t *); @@ -94,9 +95,9 @@ dladm_vnic_diag2status(vnic_ioc_diag_t ioc_diag) * Send a create command to the VNIC driver. */ dladm_status_t -i_dladm_vnic_create_sys(dladm_vnic_attr_t *attr) +i_dladm_vnic_create_sys(dladm_handle_t handle, dladm_vnic_attr_t *attr) { - int rc, fd; + int rc; vnic_ioc_create_t ioc; dladm_status_t status = DLADM_STATUS_OK; @@ -118,14 +119,10 @@ i_dladm_vnic_create_sys(dladm_vnic_attr_t *attr) if (attr->va_link_id == DATALINK_INVALID_LINKID) ioc.vc_flags |= VNIC_IOC_CREATE_ANCHOR; - if ((fd = open(DLD_CONTROL_DEV, O_RDWR)) < 0) - return (dladm_errno2status(errno)); - - rc = ioctl(fd, VNIC_IOC_CREATE, &ioc); + rc = ioctl(dladm_dld_fd(handle), VNIC_IOC_CREATE, &ioc); if (rc < 0) status = dladm_errno2status(errno); - (void) close(fd); if (status != DLADM_STATUS_OK) { if (ioc.vc_diag != VNIC_IOC_DIAG_NONE) status = dladm_vnic_diag2status(ioc.vc_diag); @@ -150,21 +147,19 @@ i_dladm_vnic_create_sys(dladm_vnic_attr_t *attr) * Get the configuration information of the given VNIC. */ static dladm_status_t -i_dladm_vnic_info_active(datalink_id_t linkid, dladm_vnic_attr_t *attrp) +i_dladm_vnic_info_active(dladm_handle_t handle, datalink_id_t linkid, + dladm_vnic_attr_t *attrp) { vnic_ioc_info_t ioc; vnic_info_t *vnic; - int rc, fd; + int rc; dladm_status_t status = DLADM_STATUS_OK; - if ((fd = open(DLD_CONTROL_DEV, O_RDWR)) == -1) - return (dladm_errno2status(errno)); - bzero(&ioc, sizeof (ioc)); vnic = &ioc.vi_info; vnic->vn_vnic_id = linkid; - rc = ioctl(fd, VNIC_IOC_INFO, &ioc); + rc = ioctl(dladm_dld_fd(handle), VNIC_IOC_INFO, &ioc); if (rc != 0) { status = dladm_errno2status(errno); goto bail; @@ -181,12 +176,12 @@ i_dladm_vnic_info_active(datalink_id_t linkid, dladm_vnic_attr_t *attrp) attrp->va_force = vnic->vn_force; bail: - (void) close(fd); return (status); } static dladm_status_t -i_dladm_vnic_info_persist(datalink_id_t linkid, dladm_vnic_attr_t *attrp) +i_dladm_vnic_info_persist(dladm_handle_t handle, datalink_id_t linkid, + dladm_vnic_attr_t *attrp) { dladm_conf_t conf; dladm_status_t status; @@ -195,22 +190,24 @@ i_dladm_vnic_info_persist(datalink_id_t linkid, dladm_vnic_attr_t *attrp) datalink_class_t class; attrp->va_vnic_id = linkid; - if ((status = dladm_read_conf(linkid, &conf)) != DLADM_STATUS_OK) + if ((status = dladm_read_conf(handle, linkid, &conf)) != + DLADM_STATUS_OK) return (status); - status = dladm_get_conf_field(conf, FLINKOVER, &u64, sizeof (u64)); + status = dladm_get_conf_field(handle, conf, FLINKOVER, &u64, + sizeof (u64)); attrp->va_link_id = ((status == DLADM_STATUS_OK) ? (datalink_id_t)u64 : DATALINK_INVALID_LINKID); - status = dladm_get_conf_field(conf, FHWRINGS, &attrp->va_hwrings, - sizeof (boolean_t)); + status = dladm_get_conf_field(handle, conf, FHWRINGS, + &attrp->va_hwrings, sizeof (boolean_t)); if (status != DLADM_STATUS_OK && status != DLADM_STATUS_NOTFOUND) goto done; if (status == DLADM_STATUS_NOTFOUND) attrp->va_hwrings = B_FALSE; - if ((status = dladm_datalink_id2info(linkid, NULL, &class, + if ((status = dladm_datalink_id2info(handle, linkid, NULL, &class, NULL, NULL, 0)) != DLADM_STATUS_OK) goto done; @@ -222,29 +219,29 @@ i_dladm_vnic_info_persist(datalink_id_t linkid, dladm_vnic_attr_t *attrp) attrp->va_mac_addr_type = VNIC_MAC_ADDR_TYPE_PRIMARY; attrp->va_mac_len = 0; } else { - status = dladm_get_conf_field(conf, FMADDRTYPE, &u64, + status = dladm_get_conf_field(handle, conf, FMADDRTYPE, &u64, sizeof (u64)); if (status != DLADM_STATUS_OK) goto done; attrp->va_mac_addr_type = (vnic_mac_addr_type_t)u64; - status = dladm_get_conf_field(conf, FMADDRLEN, &u64, + status = dladm_get_conf_field(handle, conf, FMADDRLEN, &u64, sizeof (u64)); attrp->va_mac_len = ((status == DLADM_STATUS_OK) ? (uint_t)u64 : ETHERADDRL); - status = dladm_get_conf_field(conf, FMADDRSLOT, &u64, + status = dladm_get_conf_field(handle, conf, FMADDRSLOT, &u64, sizeof (u64)); attrp->va_mac_slot = ((status == DLADM_STATUS_OK) ? (int)u64 : -1); - status = dladm_get_conf_field(conf, FMADDRPREFIXLEN, &u64, - sizeof (u64)); + status = dladm_get_conf_field(handle, conf, FMADDRPREFIXLEN, + &u64, sizeof (u64)); attrp->va_mac_prefix_len = ((status == DLADM_STATUS_OK) ? (uint_t)u64 : sizeof (dladm_vnic_def_prefix)); - status = dladm_get_conf_field(conf, FMACADDR, macstr, + status = dladm_get_conf_field(handle, conf, FMACADDR, macstr, sizeof (macstr)); if (status != DLADM_STATUS_OK) goto done; @@ -254,24 +251,25 @@ i_dladm_vnic_info_persist(datalink_id_t linkid, dladm_vnic_attr_t *attrp) goto done; } - status = dladm_get_conf_field(conf, FVLANID, &u64, sizeof (u64)); + status = dladm_get_conf_field(handle, conf, FVLANID, &u64, + sizeof (u64)); attrp->va_vid = ((status == DLADM_STATUS_OK) ? (uint16_t)u64 : 0); status = DLADM_STATUS_OK; done: - dladm_destroy_conf(conf); + dladm_destroy_conf(handle, conf); return (status); } dladm_status_t -dladm_vnic_info(datalink_id_t linkid, dladm_vnic_attr_t *attrp, - uint32_t flags) +dladm_vnic_info(dladm_handle_t handle, datalink_id_t linkid, + dladm_vnic_attr_t *attrp, uint32_t flags) { if (flags == DLADM_OPT_ACTIVE) - return (i_dladm_vnic_info_active(linkid, attrp)); + return (i_dladm_vnic_info_active(handle, linkid, attrp)); else if (flags == DLADM_OPT_PERSIST) - return (i_dladm_vnic_info_persist(linkid, attrp)); + return (i_dladm_vnic_info_persist(handle, linkid, attrp)); else return (DLADM_STATUS_BADARG); } @@ -280,22 +278,18 @@ dladm_vnic_info(datalink_id_t linkid, dladm_vnic_attr_t *attrp, * Remove a VNIC from the kernel. */ dladm_status_t -i_dladm_vnic_delete_sys(datalink_id_t linkid) +i_dladm_vnic_delete_sys(dladm_handle_t handle, datalink_id_t linkid) { vnic_ioc_delete_t ioc; dladm_status_t status = DLADM_STATUS_OK; - int rc, fd; - - if ((fd = open(DLD_CONTROL_DEV, O_RDWR)) < 0) - return (dladm_errno2status(errno)); + int rc; ioc.vd_vnic_id = linkid; - rc = ioctl(fd, VNIC_IOC_DELETE, &ioc); + rc = ioctl(dladm_dld_fd(handle), VNIC_IOC_DELETE, &ioc); if (rc < 0) status = dladm_errno2status(errno); - (void) close(fd); return (status); } @@ -352,7 +346,7 @@ dladm_vnic_str2macaddrtype(const char *str, vnic_mac_addr_type_t *val) * Create a new VNIC / VLAN. Update the configuration file and bring it up. */ dladm_status_t -dladm_vnic_create(const char *vnic, datalink_id_t linkid, +dladm_vnic_create(dladm_handle_t handle, const char *vnic, datalink_id_t linkid, vnic_mac_addr_type_t mac_addr_type, uchar_t *mac_addr, int mac_len, int *mac_slot, uint_t mac_prefix_len, uint16_t vid, datalink_id_t *vnic_id_out, dladm_arg_list_t *proplist, uint32_t flags) @@ -400,8 +394,8 @@ dladm_vnic_create(const char *vnic, datalink_id_t linkid, } if ((flags & DLADM_OPT_ANCHOR) == 0) { - if ((status = dladm_datalink_id2info(linkid, NULL, &class, - &media, NULL, 0)) != DLADM_STATUS_OK) + if ((status = dladm_datalink_id2info(handle, linkid, NULL, + &class, &media, NULL, 0)) != DLADM_STATUS_OK) return (status); if (class == DATALINK_CLASS_VNIC || @@ -422,7 +416,7 @@ dladm_vnic_create(const char *vnic, datalink_id_t linkid, class = is_vlan ? DATALINK_CLASS_VLAN : (is_etherstub ? DATALINK_CLASS_ETHERSTUB : DATALINK_CLASS_VNIC); - if ((status = dladm_create_datalink_id(name, class, + if ((status = dladm_create_datalink_id(handle, name, class, media, flags, &vnic_id)) != DLADM_STATUS_OK) return (status); @@ -435,7 +429,7 @@ dladm_vnic_create(const char *vnic, datalink_id_t linkid, /* Extract resource_ctl and cpu_list from proplist */ if (proplist != NULL) { - status = dladm_link_proplist_extract(proplist, + status = dladm_link_proplist_extract(handle, proplist, &attr.va_resource_props); if (status != DLADM_STATUS_OK) goto done; @@ -456,7 +450,7 @@ dladm_vnic_create(const char *vnic, datalink_id_t linkid, attr.va_force = (flags & DLADM_OPT_FORCE) != 0; attr.va_hwrings = (flags & DLADM_OPT_HWRINGS) != 0; - status = i_dladm_vnic_create_sys(&attr); + status = i_dladm_vnic_create_sys(handle, &attr); if (status != DLADM_STATUS_OK) goto done; @@ -464,9 +458,9 @@ dladm_vnic_create(const char *vnic, datalink_id_t linkid, if (!(flags & DLADM_OPT_PERSIST)) goto done; - status = dladm_vnic_persist_conf(name, &attr, class); + status = dladm_vnic_persist_conf(handle, name, &attr, class); if (status != DLADM_STATUS_OK) { - (void) i_dladm_vnic_delete_sys(vnic_id); + (void) i_dladm_vnic_delete_sys(handle, vnic_id); goto done; } @@ -474,21 +468,22 @@ dladm_vnic_create(const char *vnic, datalink_id_t linkid, for (i = 0; i < proplist->al_count; i++) { dladm_arg_info_t *aip = &proplist->al_info[i]; - status = dladm_set_linkprop(vnic_id, aip->ai_name, - aip->ai_val, aip->ai_count, DLADM_OPT_PERSIST); + status = dladm_set_linkprop(handle, vnic_id, + aip->ai_name, aip->ai_val, aip->ai_count, + DLADM_OPT_PERSIST); if (status != DLADM_STATUS_OK) break; } if (status != DLADM_STATUS_OK) { - (void) dladm_remove_conf(vnic_id); - (void) i_dladm_vnic_delete_sys(vnic_id); + (void) dladm_remove_conf(handle, vnic_id); + (void) i_dladm_vnic_delete_sys(handle, vnic_id); } } done: if (status != DLADM_STATUS_OK) { - (void) dladm_destroy_datalink_id(vnic_id, flags); + (void) dladm_destroy_datalink_id(handle, vnic_id, flags); } else { if (vnic_id_out != NULL) *vnic_id_out = vnic_id; @@ -502,7 +497,7 @@ done: * Delete a VNIC / VLAN. */ dladm_status_t -dladm_vnic_delete(datalink_id_t linkid, uint32_t flags) +dladm_vnic_delete(dladm_handle_t handle, datalink_id_t linkid, uint32_t flags) { dladm_status_t status; datalink_class_t class; @@ -510,8 +505,8 @@ dladm_vnic_delete(datalink_id_t linkid, uint32_t flags) if (flags == 0) return (DLADM_STATUS_BADARG); - if ((dladm_datalink_id2info(linkid, NULL, &class, NULL, NULL, 0) != - DLADM_STATUS_OK)) + if ((dladm_datalink_id2info(handle, linkid, NULL, &class, NULL, NULL, 0) + != DLADM_STATUS_OK)) return (DLADM_STATUS_BADARG); if ((flags & DLADM_OPT_VLAN) != 0) { @@ -524,11 +519,11 @@ dladm_vnic_delete(datalink_id_t linkid, uint32_t flags) } if ((flags & DLADM_OPT_ACTIVE) != 0) { - status = i_dladm_vnic_delete_sys(linkid); + status = i_dladm_vnic_delete_sys(handle, linkid); if (status == DLADM_STATUS_OK) { - (void) dladm_set_linkprop(linkid, NULL, NULL, 0, + (void) dladm_set_linkprop(handle, linkid, NULL, NULL, 0, DLADM_OPT_ACTIVE); - (void) dladm_destroy_datalink_id(linkid, + (void) dladm_destroy_datalink_id(handle, linkid, DLADM_OPT_ACTIVE); } else if (status != DLADM_STATUS_NOTFOUND || !(flags & DLADM_OPT_PERSIST)) { @@ -536,8 +531,9 @@ dladm_vnic_delete(datalink_id_t linkid, uint32_t flags) } } if ((flags & DLADM_OPT_PERSIST) != 0) { - (void) dladm_destroy_datalink_id(linkid, DLADM_OPT_PERSIST); - (void) dladm_remove_conf(linkid); + (void) dladm_destroy_datalink_id(handle, linkid, + DLADM_OPT_PERSIST); + (void) dladm_remove_conf(handle, linkid); } return (DLADM_STATUS_OK); } @@ -574,21 +570,21 @@ dladm_vnic_str2macaddr(const char *str, uchar_t *buf) static dladm_status_t -dladm_vnic_persist_conf(const char *name, dladm_vnic_attr_t *attrp, - datalink_class_t class) +dladm_vnic_persist_conf(dladm_handle_t handle, const char *name, + dladm_vnic_attr_t *attrp, datalink_class_t class) { dladm_conf_t conf = DLADM_INVALID_CONF; dladm_status_t status; char macstr[ETHERADDRL * 3]; uint64_t u64; - if ((status = dladm_create_conf(name, attrp->va_vnic_id, + if ((status = dladm_create_conf(handle, name, attrp->va_vnic_id, class, DL_ETHER, &conf)) != DLADM_STATUS_OK) return (status); if (attrp->va_link_id != DATALINK_INVALID_LINKID) { u64 = attrp->va_link_id; - status = dladm_set_conf_field(conf, FLINKOVER, + status = dladm_set_conf_field(handle, conf, FLINKOVER, DLADM_TYPE_UINT64, &u64); if (status != DLADM_STATUS_OK) goto done; @@ -596,14 +592,14 @@ dladm_vnic_persist_conf(const char *name, dladm_vnic_attr_t *attrp, if (class != DATALINK_CLASS_VLAN) { u64 = attrp->va_mac_addr_type; - status = dladm_set_conf_field(conf, FMADDRTYPE, + status = dladm_set_conf_field(handle, conf, FMADDRTYPE, DLADM_TYPE_UINT64, &u64); if (status != DLADM_STATUS_OK) goto done; if (attrp->va_mac_len != ETHERADDRL) { u64 = attrp->va_mac_len; - status = dladm_set_conf_field(conf, FMADDRLEN, + status = dladm_set_conf_field(handle, conf, FMADDRLEN, DLADM_TYPE_UINT64, &u64); if (status != DLADM_STATUS_OK) goto done; @@ -612,7 +608,7 @@ dladm_vnic_persist_conf(const char *name, dladm_vnic_attr_t *attrp, if (attrp->va_hwrings) { boolean_t hwrings = attrp->va_hwrings; - status = dladm_set_conf_field(conf, FHWRINGS, + status = dladm_set_conf_field(handle, conf, FHWRINGS, DLADM_TYPE_BOOLEAN, &hwrings); if (status != DLADM_STATUS_OK) goto done; @@ -621,7 +617,7 @@ dladm_vnic_persist_conf(const char *name, dladm_vnic_attr_t *attrp, if (class != DATALINK_CLASS_VLAN) { if (attrp->va_mac_slot != -1) { u64 = attrp->va_mac_slot; - status = dladm_set_conf_field(conf, FMADDRSLOT, + status = dladm_set_conf_field(handle, conf, FMADDRSLOT, DLADM_TYPE_UINT64, &u64); if (status != DLADM_STATUS_OK) goto done; @@ -630,22 +626,22 @@ dladm_vnic_persist_conf(const char *name, dladm_vnic_attr_t *attrp, if (attrp->va_mac_prefix_len != sizeof (dladm_vnic_def_prefix)) { u64 = attrp->va_mac_prefix_len; - status = dladm_set_conf_field(conf, FMADDRPREFIXLEN, - DLADM_TYPE_UINT64, &u64); + status = dladm_set_conf_field(handle, conf, + FMADDRPREFIXLEN, DLADM_TYPE_UINT64, &u64); if (status != DLADM_STATUS_OK) goto done; } (void) dladm_vnic_macaddr2str(attrp->va_mac_addr, macstr); - status = dladm_set_conf_field(conf, FMACADDR, DLADM_TYPE_STR, - macstr); + status = dladm_set_conf_field(handle, conf, FMACADDR, + DLADM_TYPE_STR, macstr); if (status != DLADM_STATUS_OK) goto done; } if (attrp->va_vid != 0) { u64 = attrp->va_vid; - status = dladm_set_conf_field(conf, FVLANID, + status = dladm_set_conf_field(handle, conf, FVLANID, DLADM_TYPE_UINT64, &u64); if (status != DLADM_STATUS_OK) goto done; @@ -654,10 +650,10 @@ dladm_vnic_persist_conf(const char *name, dladm_vnic_attr_t *attrp, /* * Commit the link configuration. */ - status = dladm_write_conf(conf); + status = dladm_write_conf(handle, conf); done: - dladm_destroy_conf(conf); + dladm_destroy_conf(handle, conf); return (status); } @@ -670,7 +666,7 @@ typedef struct dladm_vnic_up_arg_s { #define DLADM_VNIC_UP_SECOND_WALK 0x2 static int -i_dladm_vnic_up(datalink_id_t linkid, void *arg) +i_dladm_vnic_up(dladm_handle_t handle, datalink_id_t linkid, void *arg) { dladm_status_t *statusp = &(((dladm_vnic_up_arg_t *)arg)->status); dladm_vnic_attr_t attr; @@ -680,7 +676,7 @@ i_dladm_vnic_up(datalink_id_t linkid, void *arg) bzero(&attr, sizeof (attr)); - status = dladm_vnic_info(linkid, &attr, DLADM_OPT_PERSIST); + status = dladm_vnic_info(handle, linkid, &attr, DLADM_OPT_PERSIST); if (status != DLADM_STATUS_OK) goto done; @@ -693,21 +689,22 @@ i_dladm_vnic_up(datalink_id_t linkid, void *arg) goto done; /* Get all properties for this vnic */ - status = dladm_link_get_proplist(linkid, &proplist); + status = dladm_link_get_proplist(handle, linkid, &proplist); if (status != DLADM_STATUS_OK) goto done; if (proplist != NULL) { - status = dladm_link_proplist_extract(proplist, + status = dladm_link_proplist_extract(handle, proplist, &attr.va_resource_props); } - status = i_dladm_vnic_create_sys(&attr); + status = i_dladm_vnic_create_sys(handle, &attr); if (status != DLADM_STATUS_OK) goto done; - if ((status = dladm_up_datalink_id(linkid)) != DLADM_STATUS_OK) { - (void) i_dladm_vnic_delete_sys(linkid); + if ((status = dladm_up_datalink_id(handle, linkid)) != + DLADM_STATUS_OK) { + (void) i_dladm_vnic_delete_sys(handle, linkid); goto done; } done: @@ -716,7 +713,7 @@ done: } dladm_status_t -dladm_vnic_up(datalink_id_t linkid, uint32_t flags) +dladm_vnic_up(dladm_handle_t handle, datalink_id_t linkid, uint32_t flags) { dladm_vnic_up_arg_t vnic_arg; datalink_class_t class; @@ -726,14 +723,16 @@ dladm_vnic_up(datalink_id_t linkid, uint32_t flags) if (linkid == DATALINK_ALL_LINKID) { vnic_arg.flags = DLADM_VNIC_UP_FIRST_WALK; - (void) dladm_walk_datalink_id(i_dladm_vnic_up, &vnic_arg, - class, DATALINK_ANY_MEDIATYPE, DLADM_OPT_PERSIST); + (void) dladm_walk_datalink_id(i_dladm_vnic_up, handle, + &vnic_arg, class, DATALINK_ANY_MEDIATYPE, + DLADM_OPT_PERSIST); vnic_arg.flags = DLADM_VNIC_UP_SECOND_WALK; - (void) dladm_walk_datalink_id(i_dladm_vnic_up, &vnic_arg, - class, DATALINK_ANY_MEDIATYPE, DLADM_OPT_PERSIST); + (void) dladm_walk_datalink_id(i_dladm_vnic_up, handle, + &vnic_arg, class, DATALINK_ANY_MEDIATYPE, + DLADM_OPT_PERSIST); return (DLADM_STATUS_OK); } else { - (void) i_dladm_vnic_up(linkid, &vnic_arg); + (void) i_dladm_vnic_up(handle, linkid, &vnic_arg); return (vnic_arg.status); } } diff --git a/usr/src/lib/libdladm/common/libdlvnic.h b/usr/src/lib/libdladm/common/libdlvnic.h index 77f78130be..9c93ceae3a 100644 --- a/usr/src/lib/libdladm/common/libdlvnic.h +++ b/usr/src/lib/libdladm/common/libdlvnic.h @@ -51,16 +51,17 @@ typedef struct dladm_vnic_attr { mac_resource_props_t va_resource_props; } dladm_vnic_attr_t; -extern dladm_status_t dladm_vnic_create(const char *, datalink_id_t, - vnic_mac_addr_type_t, uchar_t *, int, int *, - uint_t, uint16_t, datalink_id_t *, +extern dladm_status_t dladm_vnic_create(dladm_handle_t, const char *, + datalink_id_t, vnic_mac_addr_type_t, uchar_t *, + int, int *, uint_t, uint16_t, datalink_id_t *, dladm_arg_list_t *, uint32_t); -extern dladm_status_t dladm_vnic_delete(datalink_id_t, uint32_t); -extern dladm_status_t dladm_vnic_info(datalink_id_t, dladm_vnic_attr_t *, +extern dladm_status_t dladm_vnic_delete(dladm_handle_t, datalink_id_t, uint32_t); +extern dladm_status_t dladm_vnic_info(dladm_handle_t, datalink_id_t, + dladm_vnic_attr_t *, uint32_t); -extern dladm_status_t dladm_vnic_up(datalink_id_t, uint32_t); +extern dladm_status_t dladm_vnic_up(dladm_handle_t, datalink_id_t, uint32_t); extern dladm_status_t dladm_vnic_str2macaddrtype(const char *, vnic_mac_addr_type_t *); diff --git a/usr/src/lib/libdladm/common/libdlwlan.c b/usr/src/lib/libdladm/common/libdlwlan.c index 9694c5350b..82dd9e49e5 100644 --- a/usr/src/lib/libdladm/common/libdlwlan.c +++ b/usr/src/lib/libdladm/common/libdlwlan.c @@ -43,43 +43,61 @@ #include <libdlwlan_impl.h> #include <net/wpa.h> -static dladm_status_t wpa_instance_create(datalink_id_t, void *); -static dladm_status_t wpa_instance_delete(datalink_id_t); - -static dladm_status_t do_get_bsstype(datalink_id_t, void *, int); -static dladm_status_t do_get_essid(datalink_id_t, void *, int); -static dladm_status_t do_get_bssid(datalink_id_t, void *, int); -static dladm_status_t do_get_signal(datalink_id_t, void *, int); -static dladm_status_t do_get_encryption(datalink_id_t, void *, int); -static dladm_status_t do_get_authmode(datalink_id_t, void *, int); -static dladm_status_t do_get_linkstatus(datalink_id_t, void *, int); -static dladm_status_t do_get_esslist(datalink_id_t, void *, int); -static dladm_status_t do_get_rate(datalink_id_t, void *, int); -static dladm_status_t do_get_mode(datalink_id_t, void *, int); -static dladm_status_t do_get_capability(datalink_id_t, void *, int); -static dladm_status_t do_get_wpamode(datalink_id_t, void *, int); - -static dladm_status_t do_set_bsstype(datalink_id_t, dladm_wlan_bsstype_t *); -static dladm_status_t do_set_authmode(datalink_id_t, dladm_wlan_auth_t *); -static dladm_status_t do_set_encryption(datalink_id_t, - dladm_wlan_secmode_t *); -static dladm_status_t do_set_essid(datalink_id_t, dladm_wlan_essid_t *); -static dladm_status_t do_set_createibss(datalink_id_t, boolean_t *); -static dladm_status_t do_set_key(datalink_id_t, dladm_wlan_key_t *, uint_t); -static dladm_status_t do_set_channel(datalink_id_t, dladm_wlan_channel_t *); +static dladm_status_t wpa_instance_create(dladm_handle_t, datalink_id_t, + void *); +static dladm_status_t wpa_instance_delete(dladm_handle_t, datalink_id_t); -static dladm_status_t do_scan(datalink_id_t, void *, int); -static dladm_status_t do_connect(datalink_id_t, void *, int, +static dladm_status_t do_get_bsstype(dladm_handle_t, datalink_id_t, void *, + int); +static dladm_status_t do_get_essid(dladm_handle_t, datalink_id_t, void *, + int); +static dladm_status_t do_get_bssid(dladm_handle_t, datalink_id_t, void *, + int); +static dladm_status_t do_get_signal(dladm_handle_t, datalink_id_t, void *, + int); +static dladm_status_t do_get_encryption(dladm_handle_t, datalink_id_t, void *, + int); +static dladm_status_t do_get_authmode(dladm_handle_t, datalink_id_t, void *, + int); +static dladm_status_t do_get_linkstatus(dladm_handle_t, datalink_id_t, void *, + int); +static dladm_status_t do_get_esslist(dladm_handle_t, datalink_id_t, void *, + int); +static dladm_status_t do_get_rate(dladm_handle_t, datalink_id_t, void *, int); +static dladm_status_t do_get_mode(dladm_handle_t, datalink_id_t, void *, int); +static dladm_status_t do_get_capability(dladm_handle_t, datalink_id_t, void *, + int); +static dladm_status_t do_get_wpamode(dladm_handle_t, datalink_id_t, void *, + int); + +static dladm_status_t do_set_bsstype(dladm_handle_t, datalink_id_t, + dladm_wlan_bsstype_t *); +static dladm_status_t do_set_authmode(dladm_handle_t, datalink_id_t, + dladm_wlan_auth_t *); +static dladm_status_t do_set_encryption(dladm_handle_t, datalink_id_t, + dladm_wlan_secmode_t *); +static dladm_status_t do_set_essid(dladm_handle_t, datalink_id_t, + dladm_wlan_essid_t *); +static dladm_status_t do_set_createibss(dladm_handle_t, datalink_id_t, + boolean_t *); +static dladm_status_t do_set_key(dladm_handle_t, datalink_id_t, + dladm_wlan_key_t *, uint_t); +static dladm_status_t do_set_channel(dladm_handle_t, datalink_id_t, + dladm_wlan_channel_t *); + +static dladm_status_t do_scan(dladm_handle_t, datalink_id_t, void *, int); +static dladm_status_t do_connect(dladm_handle_t, datalink_id_t, void *, int, dladm_wlan_attr_t *, boolean_t, void *, uint_t, int); -static dladm_status_t do_disconnect(datalink_id_t, void *, int); +static dladm_status_t do_disconnect(dladm_handle_t, datalink_id_t, void *, + int); static boolean_t find_val_by_name(const char *, val_desc_t *, uint_t, uint_t *); static boolean_t find_name_by_val(uint_t, val_desc_t *, uint_t, char **); static void generate_essid(dladm_wlan_essid_t *); static dladm_status_t dladm_wlan_wlresult2status(wldp_t *); -static dladm_status_t dladm_wlan_validate(datalink_id_t); +static dladm_status_t dladm_wlan_validate(dladm_handle_t, datalink_id_t); static val_desc_t linkstatus_vals[] = { { "disconnected", DLADM_WLAN_LINK_DISCONNECTED }, @@ -231,7 +249,7 @@ fill_wlan_attr(wl_ess_conf_t *wlp, dladm_wlan_attr_t *attrp) } dladm_status_t -dladm_wlan_scan(datalink_id_t linkid, void *arg, +dladm_wlan_scan(dladm_handle_t handle, datalink_id_t linkid, void *arg, boolean_t (*func)(void *, dladm_wlan_attr_t *)) { int i; @@ -243,14 +261,16 @@ dladm_wlan_scan(datalink_id_t linkid, void *arg, dladm_wlan_attr_t wlattr; dladm_status_t status; - if ((status = dladm_wlan_validate(linkid)) != DLADM_STATUS_OK) + if ((status = dladm_wlan_validate(handle, linkid)) != DLADM_STATUS_OK) goto done; - status = do_get_linkstatus(linkid, &wl_status, sizeof (wl_status)); + status = do_get_linkstatus(handle, linkid, &wl_status, + sizeof (wl_status)); if (status != DLADM_STATUS_OK) goto done; - if ((status = do_scan(linkid, buf, sizeof (buf))) != DLADM_STATUS_OK) + if ((status = do_scan(handle, linkid, buf, sizeof (buf))) != + DLADM_STATUS_OK) goto done; if (func == NULL) { @@ -264,7 +284,7 @@ dladm_wlan_scan(datalink_id_t linkid, void *arg, goto done; } - if ((status = do_get_esslist(linkid, wls, WLDP_BUFSIZE)) + if ((status = do_get_esslist(handle, linkid, wls, WLDP_BUFSIZE)) != DLADM_STATUS_OK) goto done; @@ -278,12 +298,12 @@ dladm_wlan_scan(datalink_id_t linkid, void *arg, } if (wl_status != WL_CONNECTED) { - status = do_get_linkstatus(linkid, &wl_status, + status = do_get_linkstatus(handle, linkid, &wl_status, sizeof (&wl_status)); if (status != DLADM_STATUS_OK) goto done; if (wl_status == WL_CONNECTED) - (void) do_disconnect(linkid, buf, sizeof (buf)); + (void) do_disconnect(handle, linkid, buf, sizeof (buf)); } status = DLADM_STATUS_OK; @@ -402,7 +422,7 @@ append: #define IEEE80211_C_WPA 0x01800000 static dladm_status_t -do_connect(datalink_id_t linkid, void *buf, int bufsize, +do_connect(dladm_handle_t handle, datalink_id_t linkid, void *buf, int bufsize, dladm_wlan_attr_t *attrp, boolean_t create_ibss, void *keys, uint_t key_count, int timeout) { @@ -419,7 +439,7 @@ do_connect(datalink_id_t linkid, void *buf, int bufsize, if ((attrp->wa_valid & DLADM_WLAN_ATTR_CHANNEL) != 0) { channel = attrp->wa_channel; - status = do_set_channel(linkid, &channel); + status = do_set_channel(handle, linkid, &channel); if (status != DLADM_STATUS_OK) goto fail; } @@ -427,19 +447,22 @@ do_connect(datalink_id_t linkid, void *buf, int bufsize, secmode = ((attrp->wa_valid & DLADM_WLAN_ATTR_SECMODE) != 0) ? attrp->wa_secmode : DLADM_WLAN_SECMODE_NONE; - if ((status = do_set_encryption(linkid, &secmode)) != DLADM_STATUS_OK) + if ((status = do_set_encryption(handle, linkid, &secmode)) != + DLADM_STATUS_OK) goto fail; authmode = ((attrp->wa_valid & DLADM_WLAN_ATTR_AUTH) != 0) ? attrp->wa_auth : DLADM_WLAN_AUTH_OPEN; - if ((status = do_set_authmode(linkid, &authmode)) != DLADM_STATUS_OK) + if ((status = do_set_authmode(handle, linkid, &authmode)) != + DLADM_STATUS_OK) goto fail; bsstype = ((attrp->wa_valid & DLADM_WLAN_ATTR_BSSTYPE) != 0) ? attrp->wa_bsstype : DLADM_WLAN_BSSTYPE_BSS; - if ((status = do_set_bsstype(linkid, &bsstype)) != DLADM_STATUS_OK) + if ((status = do_set_bsstype(handle, linkid, &bsstype)) != + DLADM_STATUS_OK) goto fail; if (secmode == DLADM_WLAN_SECMODE_WEP) { @@ -448,7 +471,7 @@ do_connect(datalink_id_t linkid, void *buf, int bufsize, status = DLADM_STATUS_BADARG; goto fail; } - status = do_set_key(linkid, keys, key_count); + status = do_set_key(handle, linkid, keys, key_count); if (status != DLADM_STATUS_OK) goto fail; } else if (secmode == DLADM_WLAN_SECMODE_WPA) { @@ -457,7 +480,7 @@ do_connect(datalink_id_t linkid, void *buf, int bufsize, status = DLADM_STATUS_BADARG; goto fail; } - status = do_get_capability(linkid, buf, bufsize); + status = do_get_capability(handle, linkid, buf, bufsize); if (status != DLADM_STATUS_OK) goto fail; caps = (wl_capability_t *)buf; @@ -466,11 +489,11 @@ do_connect(datalink_id_t linkid, void *buf, int bufsize, } if (create_ibss) { - status = do_set_channel(linkid, &channel); + status = do_set_channel(handle, linkid, &channel); if (status != DLADM_STATUS_OK) goto fail; - status = do_set_createibss(linkid, &create_ibss); + status = do_set_createibss(handle, linkid, &create_ibss); if (status != DLADM_STATUS_OK) goto fail; @@ -490,7 +513,7 @@ do_connect(datalink_id_t linkid, void *buf, int bufsize, goto fail; } - if ((status = do_set_essid(linkid, &essid)) != DLADM_STATUS_OK) + if ((status = do_set_essid(handle, linkid, &essid)) != DLADM_STATUS_OK) goto fail; /* @@ -498,11 +521,11 @@ do_connect(datalink_id_t linkid, void *buf, int bufsize, * we need call do_set_essid() first, then call wpa_instance_create(). */ if (secmode == DLADM_WLAN_SECMODE_WPA && keys != NULL) - (void) wpa_instance_create(linkid, keys); + (void) wpa_instance_create(handle, linkid, keys); start = gethrtime(); for (;;) { - status = do_get_linkstatus(linkid, &wl_status, + status = do_get_linkstatus(handle, linkid, &wl_status, sizeof (wl_status)); if (status != DLADM_STATUS_OK) goto fail; @@ -523,8 +546,9 @@ fail: } dladm_status_t -dladm_wlan_connect(datalink_id_t linkid, dladm_wlan_attr_t *attrp, - int timeout, void *keys, uint_t key_count, uint_t flags) +dladm_wlan_connect(dladm_handle_t handle, datalink_id_t linkid, + dladm_wlan_attr_t *attrp, int timeout, void *keys, uint_t key_count, + uint_t flags) { int i; char buf[WLDP_BUFSIZE]; @@ -535,11 +559,11 @@ dladm_wlan_connect(datalink_id_t linkid, dladm_wlan_attr_t *attrp, dladm_status_t status; wl_linkstatus_t wl_status; - if ((status = dladm_wlan_validate(linkid)) != DLADM_STATUS_OK) + if ((status = dladm_wlan_validate(handle, linkid)) != DLADM_STATUS_OK) return (status); - if ((status = do_get_linkstatus(linkid, &wl_status, sizeof (wl_status))) - != DLADM_STATUS_OK) + if ((status = do_get_linkstatus(handle, linkid, &wl_status, + sizeof (wl_status))) != DLADM_STATUS_OK) goto done; if (wl_status == WL_CONNECTED) { @@ -557,7 +581,7 @@ dladm_wlan_connect(datalink_id_t linkid, dladm_wlan_attr_t *attrp, if ((flags & DLADM_WLAN_CONNECT_NOSCAN) != 0 || (create_ibss && attrp != NULL && (attrp->wa_valid & DLADM_WLAN_ATTR_ESSID) == 0)) { - status = do_connect(linkid, buf, sizeof (buf), attrp, + status = do_connect(handle, linkid, buf, sizeof (buf), attrp, create_ibss, keys, key_count, timeout); goto done; } @@ -566,7 +590,7 @@ dladm_wlan_connect(datalink_id_t linkid, dladm_wlan_attr_t *attrp, state.cs_list = NULL; state.cs_count = 0; - status = dladm_wlan_scan(linkid, &state, connect_cb); + status = dladm_wlan_scan(handle, linkid, &state, connect_cb); if (status != DLADM_STATUS_OK) goto done; @@ -575,7 +599,7 @@ dladm_wlan_connect(datalink_id_t linkid, dladm_wlan_attr_t *attrp, status = DLADM_STATUS_NOTFOUND; goto done; } - status = do_connect(linkid, buf, sizeof (buf), + status = do_connect(handle, linkid, buf, sizeof (buf), attrp, create_ibss, keys, key_count, timeout); goto done; } @@ -597,7 +621,7 @@ dladm_wlan_connect(datalink_id_t linkid, dladm_wlan_attr_t *attrp, for (i = 0; i < state.cs_count; i++) { dladm_wlan_attr_t *ap = wl_list[i]; - status = do_connect(linkid, buf, sizeof (buf), + status = do_connect(handle, linkid, buf, sizeof (buf), ap, create_ibss, keys, key_count, timeout); if (status == DLADM_STATUS_OK) break; @@ -605,7 +629,7 @@ dladm_wlan_connect(datalink_id_t linkid, dladm_wlan_attr_t *attrp, if (!set_authmode) { ap->wa_auth = DLADM_WLAN_AUTH_SHARED; ap->wa_valid |= DLADM_WLAN_ATTR_AUTH; - status = do_connect(linkid, buf, sizeof (buf), + status = do_connect(handle, linkid, buf, sizeof (buf), ap, create_ibss, keys, key_count, timeout); if (status == DLADM_STATUS_OK) break; @@ -613,7 +637,7 @@ dladm_wlan_connect(datalink_id_t linkid, dladm_wlan_attr_t *attrp, } done: if ((status != DLADM_STATUS_OK) && (status != DLADM_STATUS_ISCONN)) - (void) do_disconnect(linkid, buf, sizeof (buf)); + (void) do_disconnect(handle, linkid, buf, sizeof (buf)); while (state.cs_list != NULL) { nodep = state.cs_list; @@ -625,17 +649,17 @@ done: } dladm_status_t -dladm_wlan_disconnect(datalink_id_t linkid) +dladm_wlan_disconnect(dladm_handle_t handle, datalink_id_t linkid) { char buf[WLDP_BUFSIZE]; dladm_status_t status; wl_linkstatus_t wl_status; - if ((status = dladm_wlan_validate(linkid)) != DLADM_STATUS_OK) + if ((status = dladm_wlan_validate(handle, linkid)) != DLADM_STATUS_OK) return (status); - if ((status = do_get_linkstatus(linkid, &wl_status, sizeof (wl_status))) - != DLADM_STATUS_OK) + if ((status = do_get_linkstatus(handle, linkid, &wl_status, + sizeof (wl_status))) != DLADM_STATUS_OK) goto done; if (wl_status != WL_CONNECTED) { @@ -643,12 +667,12 @@ dladm_wlan_disconnect(datalink_id_t linkid) goto done; } - if ((status = do_disconnect(linkid, buf, sizeof (buf))) + if ((status = do_disconnect(handle, linkid, buf, sizeof (buf))) != DLADM_STATUS_OK) goto done; - if ((status = do_get_linkstatus(linkid, &wl_status, sizeof (wl_status))) - != DLADM_STATUS_OK) + if ((status = do_get_linkstatus(handle, linkid, &wl_status, + sizeof (wl_status))) != DLADM_STATUS_OK) goto done; if (wl_status == WL_CONNECTED) { @@ -662,7 +686,8 @@ done: } dladm_status_t -dladm_wlan_get_linkattr(datalink_id_t linkid, dladm_wlan_linkattr_t *attrp) +dladm_wlan_get_linkattr(dladm_handle_t handle, datalink_id_t linkid, + dladm_wlan_linkattr_t *attrp) { wl_rssi_t signal; wl_bss_type_t bsstype; @@ -679,14 +704,14 @@ dladm_wlan_get_linkattr(datalink_id_t linkid, dladm_wlan_linkattr_t *attrp) if (attrp == NULL) return (DLADM_STATUS_BADARG); - if ((status = dladm_wlan_validate(linkid)) != DLADM_STATUS_OK) + if ((status = dladm_wlan_validate(handle, linkid)) != DLADM_STATUS_OK) goto done; (void) memset(attrp, 0, sizeof (*attrp)); wl_attrp = &attrp->la_wlan_attr; - if ((status = do_get_linkstatus(linkid, &wl_status, sizeof (wl_status))) - != DLADM_STATUS_OK) + if ((status = do_get_linkstatus(handle, linkid, &wl_status, + sizeof (wl_status))) != DLADM_STATUS_OK) goto done; attrp->la_valid |= DLADM_WLAN_LINKATTR_STATUS; @@ -695,7 +720,7 @@ dladm_wlan_get_linkattr(datalink_id_t linkid, dladm_wlan_linkattr_t *attrp) else attrp->la_status = DLADM_WLAN_LINK_CONNECTED; - if ((status = do_get_essid(linkid, &wls, sizeof (wls))) + if ((status = do_get_essid(handle, linkid, &wls, sizeof (wls))) != DLADM_STATUS_OK) goto done; @@ -704,7 +729,7 @@ dladm_wlan_get_linkattr(datalink_id_t linkid, dladm_wlan_linkattr_t *attrp) wl_attrp->wa_valid |= DLADM_WLAN_ATTR_ESSID; - if ((status = do_get_bssid(linkid, buf, sizeof (buf))) + if ((status = do_get_bssid(handle, linkid, buf, sizeof (buf))) != DLADM_STATUS_OK) goto done; @@ -718,7 +743,7 @@ dladm_wlan_get_linkattr(datalink_id_t linkid, dladm_wlan_linkattr_t *attrp) goto done; } - if ((status = do_get_encryption(linkid, &encryption, + if ((status = do_get_encryption(handle, linkid, &encryption, sizeof (encryption))) != DLADM_STATUS_OK) goto done; @@ -739,7 +764,7 @@ dladm_wlan_get_linkattr(datalink_id_t linkid, dladm_wlan_linkattr_t *attrp) break; } - if ((status = do_get_signal(linkid, &signal, sizeof (signal))) + if ((status = do_get_signal(handle, linkid, &signal, sizeof (signal))) != DLADM_STATUS_OK) goto done; @@ -752,7 +777,7 @@ dladm_wlan_get_linkattr(datalink_id_t linkid, dladm_wlan_linkattr_t *attrp) goto done; } - if ((status = do_get_rate(linkid, ratesp, WLDP_BUFSIZE)) + if ((status = do_get_rate(handle, linkid, ratesp, WLDP_BUFSIZE)) != DLADM_STATUS_OK) goto done; @@ -767,7 +792,7 @@ dladm_wlan_get_linkattr(datalink_id_t linkid, dladm_wlan_linkattr_t *attrp) wl_attrp->wa_valid |= DLADM_WLAN_ATTR_SPEED; } - if ((status = do_get_authmode(linkid, &authmode, + if ((status = do_get_authmode(handle, linkid, &authmode, sizeof (authmode))) != DLADM_STATUS_OK) goto done; @@ -785,7 +810,7 @@ dladm_wlan_get_linkattr(datalink_id_t linkid, dladm_wlan_linkattr_t *attrp) break; } - if ((status = do_get_bsstype(linkid, &bsstype, + if ((status = do_get_bsstype(handle, linkid, &bsstype, sizeof (bsstype))) != DLADM_STATUS_OK) goto done; @@ -806,7 +831,7 @@ dladm_wlan_get_linkattr(datalink_id_t linkid, dladm_wlan_linkattr_t *attrp) break; } - if ((status = do_get_mode(linkid, &wl_phy_conf, + if ((status = do_get_mode(handle, linkid, &wl_phy_conf, sizeof (wl_phy_conf))) != DLADM_STATUS_OK) goto done; @@ -827,12 +852,13 @@ done: * Check to see if the link is wireless. */ static dladm_status_t -dladm_wlan_validate(datalink_id_t linkid) +dladm_wlan_validate(dladm_handle_t handle, datalink_id_t linkid) { uint32_t media; dladm_status_t status; - status = dladm_datalink_id2info(linkid, NULL, NULL, &media, NULL, 0); + status = dladm_datalink_id2info(handle, linkid, NULL, NULL, &media, + NULL, 0); if (status == DLADM_STATUS_OK) { if (media != DL_WIFI) status = DLADM_STATUS_LINKINVAL; @@ -1056,8 +1082,8 @@ dladm_wlan_str2linkstatus(const char *str, dladm_wlan_linkstatus_t *linkstatus) } dladm_status_t -i_dladm_wlan_legacy_ioctl(datalink_id_t linkid, wldp_t *gbuf, uint_t id, - size_t len, uint_t cmd, size_t cmdlen) +i_dladm_wlan_legacy_ioctl(dladm_handle_t handle, datalink_id_t linkid, + wldp_t *gbuf, uint_t id, size_t len, uint_t cmd, size_t cmdlen) { char linkname[MAXPATHLEN]; int fd, rc; @@ -1067,8 +1093,8 @@ i_dladm_wlan_legacy_ioctl(datalink_id_t linkid, wldp_t *gbuf, uint_t id, uint32_t media; char link[MAXLINKNAMELEN]; - if ((status = dladm_datalink_id2info(linkid, &flags, NULL, &media, - link, MAXLINKNAMELEN)) != DLADM_STATUS_OK) { + if ((status = dladm_datalink_id2info(handle, linkid, &flags, NULL, + &media, link, MAXLINKNAMELEN)) != DLADM_STATUS_OK) { return (status); } @@ -1115,7 +1141,8 @@ i_dladm_wlan_legacy_ioctl(datalink_id_t linkid, wldp_t *gbuf, uint_t id, } static dladm_status_t -do_cmd_ioctl(datalink_id_t linkid, void *buf, int buflen, uint_t cmd) +do_cmd_ioctl(dladm_handle_t handle, datalink_id_t linkid, void *buf, + int buflen, uint_t cmd) { wldp_t *gbuf; dladm_status_t status = DLADM_STATUS_OK; @@ -1124,101 +1151,109 @@ do_cmd_ioctl(datalink_id_t linkid, void *buf, int buflen, uint_t cmd) return (DLADM_STATUS_NOMEM); (void) memset(gbuf, 0, MAX_BUF_LEN); - status = i_dladm_wlan_legacy_ioctl(linkid, gbuf, cmd, WLDP_BUFSIZE, - WLAN_COMMAND, sizeof (wldp_t)); + status = i_dladm_wlan_legacy_ioctl(handle, linkid, gbuf, cmd, + WLDP_BUFSIZE, WLAN_COMMAND, sizeof (wldp_t)); (void) memcpy(buf, gbuf->wldp_buf, buflen); free(gbuf); return (status); } static dladm_status_t -do_scan(datalink_id_t linkid, void *buf, int buflen) +do_scan(dladm_handle_t handle, datalink_id_t linkid, void *buf, int buflen) { - return (do_cmd_ioctl(linkid, buf, buflen, WL_SCAN)); + return (do_cmd_ioctl(handle, linkid, buf, buflen, WL_SCAN)); } static dladm_status_t -do_disconnect(datalink_id_t linkid, void *buf, int buflen) +do_disconnect(dladm_handle_t handle, datalink_id_t linkid, void *buf, + int buflen) { - if (do_get_wpamode(linkid, buf, buflen) == 0 && + if (do_get_wpamode(handle, linkid, buf, buflen) == 0 && ((wl_wpa_t *)(buf))->wpa_flag > 0) - (void) wpa_instance_delete(linkid); + (void) wpa_instance_delete(handle, linkid); - return (do_cmd_ioctl(linkid, buf, buflen, WL_DISASSOCIATE)); + return (do_cmd_ioctl(handle, linkid, buf, buflen, WL_DISASSOCIATE)); } static dladm_status_t -do_get_esslist(datalink_id_t linkid, void *buf, int buflen) +do_get_esslist(dladm_handle_t handle, datalink_id_t linkid, void *buf, + int buflen) { - return (i_dladm_wlan_param(linkid, buf, MAC_PROP_WL_ESS_LIST, buflen, - B_FALSE)); + return (i_dladm_wlan_param(handle, linkid, buf, MAC_PROP_WL_ESS_LIST, + buflen, B_FALSE)); } static dladm_status_t -do_get_bssid(datalink_id_t linkid, void *buf, int buflen) +do_get_bssid(dladm_handle_t handle, datalink_id_t linkid, void *buf, int buflen) { - return (i_dladm_wlan_param(linkid, buf, MAC_PROP_WL_BSSID, buflen, - B_FALSE)); + return (i_dladm_wlan_param(handle, linkid, buf, MAC_PROP_WL_BSSID, + buflen, B_FALSE)); } static dladm_status_t -do_get_essid(datalink_id_t linkid, void *buf, int buflen) +do_get_essid(dladm_handle_t handle, datalink_id_t linkid, void *buf, int buflen) { - return (i_dladm_wlan_param(linkid, buf, MAC_PROP_WL_ESSID, buflen, - B_FALSE)); + return (i_dladm_wlan_param(handle, linkid, buf, MAC_PROP_WL_ESSID, + buflen, B_FALSE)); } static dladm_status_t -do_get_bsstype(datalink_id_t linkid, void *buf, int buflen) +do_get_bsstype(dladm_handle_t handle, datalink_id_t linkid, void *buf, + int buflen) { - return (i_dladm_wlan_param(linkid, buf, MAC_PROP_WL_BSSTYPE, buflen, - B_FALSE)); + return (i_dladm_wlan_param(handle, linkid, buf, MAC_PROP_WL_BSSTYPE, + buflen, B_FALSE)); } static dladm_status_t -do_get_linkstatus(datalink_id_t linkid, void *buf, int buflen) +do_get_linkstatus(dladm_handle_t handle, datalink_id_t linkid, void *buf, + int buflen) { - return (i_dladm_wlan_param(linkid, buf, MAC_PROP_WL_LINKSTATUS, buflen, - B_FALSE)); + return (i_dladm_wlan_param(handle, linkid, buf, MAC_PROP_WL_LINKSTATUS, + buflen, B_FALSE)); } static dladm_status_t -do_get_rate(datalink_id_t linkid, void *buf, int buflen) +do_get_rate(dladm_handle_t handle, datalink_id_t linkid, void *buf, int buflen) { - return (i_dladm_wlan_param(linkid, buf, MAC_PROP_WL_DESIRED_RATES, - buflen, B_FALSE)); + return (i_dladm_wlan_param(handle, linkid, buf, + MAC_PROP_WL_DESIRED_RATES, buflen, B_FALSE)); } static dladm_status_t -do_get_authmode(datalink_id_t linkid, void *buf, int buflen) +do_get_authmode(dladm_handle_t handle, datalink_id_t linkid, void *buf, + int buflen) { - return (i_dladm_wlan_param(linkid, buf, MAC_PROP_WL_AUTH_MODE, buflen, - B_FALSE)); + return (i_dladm_wlan_param(handle, linkid, buf, + MAC_PROP_WL_AUTH_MODE, buflen, B_FALSE)); } static dladm_status_t -do_get_encryption(datalink_id_t linkid, void *buf, int buflen) +do_get_encryption(dladm_handle_t handle, datalink_id_t linkid, void *buf, + int buflen) { - return (i_dladm_wlan_param(linkid, buf, MAC_PROP_WL_ENCRYPTION, buflen, - B_FALSE)); + return (i_dladm_wlan_param(handle, linkid, buf, + MAC_PROP_WL_ENCRYPTION, buflen, B_FALSE)); } static dladm_status_t -do_get_signal(datalink_id_t linkid, void *buf, int buflen) +do_get_signal(dladm_handle_t handle, datalink_id_t linkid, void *buf, + int buflen) { - return (i_dladm_wlan_param(linkid, buf, MAC_PROP_WL_RSSI, buflen, - B_FALSE)); + return (i_dladm_wlan_param(handle, linkid, buf, MAC_PROP_WL_RSSI, + buflen, B_FALSE)); } static dladm_status_t -do_get_mode(datalink_id_t linkid, void *buf, int buflen) +do_get_mode(dladm_handle_t handle, datalink_id_t linkid, void *buf, int buflen) { - return (i_dladm_wlan_param(linkid, buf, MAC_PROP_WL_PHY_CONFIG, + return (i_dladm_wlan_param(handle, linkid, buf, MAC_PROP_WL_PHY_CONFIG, buflen, B_FALSE)); } static dladm_status_t -do_set_bsstype(datalink_id_t linkid, dladm_wlan_bsstype_t *bsstype) +do_set_bsstype(dladm_handle_t handle, datalink_id_t linkid, + dladm_wlan_bsstype_t *bsstype) { wl_bss_type_t ibsstype; @@ -1233,12 +1268,13 @@ do_set_bsstype(datalink_id_t linkid, dladm_wlan_bsstype_t *bsstype) ibsstype = WL_BSS_ANY; break; } - return (i_dladm_wlan_param(linkid, &ibsstype, MAC_PROP_WL_BSSTYPE, - sizeof (ibsstype), B_TRUE)); + return (i_dladm_wlan_param(handle, linkid, &ibsstype, + MAC_PROP_WL_BSSTYPE, sizeof (ibsstype), B_TRUE)); } static dladm_status_t -do_set_authmode(datalink_id_t linkid, dladm_wlan_auth_t *auth) +do_set_authmode(dladm_handle_t handle, datalink_id_t linkid, + dladm_wlan_auth_t *auth) { wl_authmode_t auth_mode; @@ -1252,12 +1288,13 @@ do_set_authmode(datalink_id_t linkid, dladm_wlan_auth_t *auth) default: return (DLADM_STATUS_NOTSUP); } - return (i_dladm_wlan_param(linkid, &auth_mode, MAC_PROP_WL_AUTH_MODE, - sizeof (auth_mode), B_TRUE)); + return (i_dladm_wlan_param(handle, linkid, &auth_mode, + MAC_PROP_WL_AUTH_MODE, sizeof (auth_mode), B_TRUE)); } static dladm_status_t -do_set_encryption(datalink_id_t linkid, dladm_wlan_secmode_t *secmode) +do_set_encryption(dladm_handle_t handle, datalink_id_t linkid, + dladm_wlan_secmode_t *secmode) { wl_encryption_t encryption; @@ -1273,12 +1310,12 @@ do_set_encryption(datalink_id_t linkid, dladm_wlan_secmode_t *secmode) default: return (DLADM_STATUS_NOTSUP); } - return (i_dladm_wlan_param(linkid, &encryption, MAC_PROP_WL_ENCRYPTION, - sizeof (encryption), B_TRUE)); + return (i_dladm_wlan_param(handle, linkid, &encryption, + MAC_PROP_WL_ENCRYPTION, sizeof (encryption), B_TRUE)); } static dladm_status_t -do_set_key(datalink_id_t linkid, dladm_wlan_key_t *keys, +do_set_key(dladm_handle_t handle, datalink_id_t linkid, dladm_wlan_key_t *keys, uint_t key_count) { int i; @@ -1307,12 +1344,13 @@ do_set_key(datalink_id_t linkid, dladm_wlan_key_t *keys, (void) memcpy(wkp->wl_wep_key, kp->wk_val, kp->wk_len); } - return (i_dladm_wlan_param(linkid, &wepkey_tab, MAC_PROP_WL_KEY_TAB, - sizeof (wepkey_tab), B_TRUE)); + return (i_dladm_wlan_param(handle, linkid, &wepkey_tab, + MAC_PROP_WL_KEY_TAB, sizeof (wepkey_tab), B_TRUE)); } static dladm_status_t -do_set_essid(datalink_id_t linkid, dladm_wlan_essid_t *essid) +do_set_essid(dladm_handle_t handle, datalink_id_t linkid, + dladm_wlan_essid_t *essid) { wl_essid_t iessid; @@ -1325,12 +1363,13 @@ do_set_essid(datalink_id_t linkid, dladm_wlan_essid_t *essid) } else { return (DLADM_STATUS_BADARG); } - return (i_dladm_wlan_param(linkid, &iessid, MAC_PROP_WL_ESSID, + return (i_dladm_wlan_param(handle, linkid, &iessid, MAC_PROP_WL_ESSID, sizeof (iessid), B_TRUE)); } static dladm_status_t -do_set_channel(datalink_id_t linkid, dladm_wlan_channel_t *channel) +do_set_channel(dladm_handle_t handle, datalink_id_t linkid, + dladm_wlan_channel_t *channel) { wl_phy_conf_t phy_conf; @@ -1340,16 +1379,17 @@ do_set_channel(datalink_id_t linkid, dladm_wlan_channel_t *channel) (void) memset(&phy_conf, 0xff, sizeof (phy_conf)); phy_conf.wl_phy_dsss_conf.wl_dsss_channel = *channel; - return (i_dladm_wlan_param(linkid, &phy_conf, MAC_PROP_WL_PHY_CONFIG, - sizeof (phy_conf), B_TRUE)); + return (i_dladm_wlan_param(handle, linkid, &phy_conf, + MAC_PROP_WL_PHY_CONFIG, sizeof (phy_conf), B_TRUE)); } static dladm_status_t -do_set_createibss(datalink_id_t linkid, boolean_t *create_ibss) +do_set_createibss(dladm_handle_t handle, datalink_id_t linkid, + boolean_t *create_ibss) { wl_create_ibss_t cr = (wl_create_ibss_t)(*create_ibss); - return (i_dladm_wlan_param(linkid, &cr, MAC_PROP_WL_CREATE_IBSS, + return (i_dladm_wlan_param(handle, linkid, &cr, MAC_PROP_WL_CREATE_IBSS, sizeof (cr), B_TRUE)); } @@ -1362,22 +1402,24 @@ generate_essid(dladm_wlan_essid_t *essid) } static dladm_status_t -do_get_capability(datalink_id_t linkid, void *buf, int buflen) +do_get_capability(dladm_handle_t handle, datalink_id_t linkid, void *buf, + int buflen) { - return (i_dladm_wlan_param(linkid, buf, MAC_PROP_WL_CAPABILITY, + return (i_dladm_wlan_param(handle, linkid, buf, MAC_PROP_WL_CAPABILITY, buflen, B_FALSE)); } static dladm_status_t -do_get_wpamode(datalink_id_t linkid, void *buf, int buflen) +do_get_wpamode(dladm_handle_t handle, datalink_id_t linkid, void *buf, + int buflen) { - return (i_dladm_wlan_param(linkid, buf, MAC_PROP_WL_WPA, buflen, + return (i_dladm_wlan_param(handle, linkid, buf, MAC_PROP_WL_WPA, buflen, B_FALSE)); } dladm_status_t -dladm_wlan_wpa_get_sr(datalink_id_t linkid, dladm_wlan_ess_t *sr, - uint_t escnt, uint_t *estot) +dladm_wlan_wpa_get_sr(dladm_handle_t handle, datalink_id_t linkid, + dladm_wlan_ess_t *sr, uint_t escnt, uint_t *estot) { int i, n; wl_wpa_ess_t *es; @@ -1387,7 +1429,7 @@ dladm_wlan_wpa_get_sr(datalink_id_t linkid, dladm_wlan_ess_t *sr, if (es == NULL) return (DLADM_STATUS_NOMEM); - status = i_dladm_wlan_param(linkid, es, MAC_PROP_WL_SCANRESULTS, + status = i_dladm_wlan_param(handle, linkid, es, MAC_PROP_WL_SCANRESULTS, WLDP_BUFSIZE, B_FALSE); if (status == DLADM_STATUS_OK) { @@ -1411,7 +1453,8 @@ dladm_wlan_wpa_get_sr(datalink_id_t linkid, dladm_wlan_ess_t *sr, } dladm_status_t -dladm_wlan_wpa_set_ie(datalink_id_t linkid, uint8_t *wpa_ie, uint_t wpa_ie_len) +dladm_wlan_wpa_set_ie(dladm_handle_t handle, datalink_id_t linkid, + uint8_t *wpa_ie, uint_t wpa_ie_len) { wl_wpa_ie_t *ie; uint_t len; @@ -1428,26 +1471,27 @@ dladm_wlan_wpa_set_ie(datalink_id_t linkid, uint8_t *wpa_ie, uint_t wpa_ie_len) ie->wpa_ie_len = wpa_ie_len; (void) memcpy(ie->wpa_ie, wpa_ie, wpa_ie_len); - status = i_dladm_wlan_param(linkid, ie, MAC_PROP_WL_SETOPTIE, len, - B_TRUE); + status = i_dladm_wlan_param(handle, linkid, ie, MAC_PROP_WL_SETOPTIE, + len, B_TRUE); free(ie); return (status); } dladm_status_t -dladm_wlan_wpa_set_wpa(datalink_id_t linkid, boolean_t flag) +dladm_wlan_wpa_set_wpa(dladm_handle_t handle, datalink_id_t linkid, + boolean_t flag) { wl_wpa_t wpa; wpa.wpa_flag = flag; - return (i_dladm_wlan_param(linkid, &wpa, MAC_PROP_WL_WPA, + return (i_dladm_wlan_param(handle, linkid, &wpa, MAC_PROP_WL_WPA, sizeof (wpa), B_TRUE)); } dladm_status_t -dladm_wlan_wpa_del_key(datalink_id_t linkid, uint_t key_idx, - const dladm_wlan_bssid_t *addr) +dladm_wlan_wpa_del_key(dladm_handle_t handle, datalink_id_t linkid, + uint_t key_idx, const dladm_wlan_bssid_t *addr) { wl_del_key_t wk; @@ -1456,14 +1500,15 @@ dladm_wlan_wpa_del_key(datalink_id_t linkid, uint_t key_idx, (void) memcpy((char *)wk.idk_macaddr, addr->wb_bytes, DLADM_WLAN_BSSID_LEN); - return (i_dladm_wlan_param(linkid, &wk, MAC_PROP_WL_DELKEY, + return (i_dladm_wlan_param(handle, linkid, &wk, MAC_PROP_WL_DELKEY, sizeof (wk), B_TRUE)); } dladm_status_t -dladm_wlan_wpa_set_key(datalink_id_t linkid, dladm_wlan_cipher_t cipher, - const dladm_wlan_bssid_t *addr, boolean_t set_tx, uint64_t seq, - uint_t key_idx, uint8_t *key, uint_t key_len) +dladm_wlan_wpa_set_key(dladm_handle_t handle, datalink_id_t linkid, + dladm_wlan_cipher_t cipher, const dladm_wlan_bssid_t *addr, + boolean_t set_tx, uint64_t seq, uint_t key_idx, uint8_t *key, + uint_t key_len) { wl_key_t wk; @@ -1502,13 +1547,14 @@ dladm_wlan_wpa_set_key(datalink_id_t linkid, dladm_wlan_cipher_t cipher, (void) memcpy(&wk.ik_keyrsc, &seq, 6); /* only use 48-bit of seq */ (void) memcpy(wk.ik_keydata, key, key_len); - return (i_dladm_wlan_param(linkid, &wk, MAC_PROP_WL_KEY, + return (i_dladm_wlan_param(handle, linkid, &wk, MAC_PROP_WL_KEY, sizeof (wk), B_TRUE)); } dladm_status_t -dladm_wlan_wpa_set_mlme(datalink_id_t linkid, dladm_wlan_mlme_op_t op, - dladm_wlan_reason_t reason, dladm_wlan_bssid_t *bssid) +dladm_wlan_wpa_set_mlme(dladm_handle_t handle, datalink_id_t linkid, + dladm_wlan_mlme_op_t op, dladm_wlan_reason_t reason, + dladm_wlan_bssid_t *bssid) { wl_mlme_t mlme; @@ -1528,7 +1574,7 @@ dladm_wlan_wpa_set_mlme(datalink_id_t linkid, dladm_wlan_mlme_op_t op, (void) memcpy(mlme.im_macaddr, bssid->wb_bytes, DLADM_WLAN_BSSID_LEN); - return (i_dladm_wlan_param(linkid, &mlme, MAC_PROP_WL_MLME, + return (i_dladm_wlan_param(handle, linkid, &mlme, MAC_PROP_WL_MLME, sizeof (mlme), B_TRUE)); } @@ -1866,7 +1912,7 @@ out: } static dladm_status_t -wpa_instance_create(datalink_id_t linkid, void *key) +wpa_instance_create(dladm_handle_t handle, datalink_id_t linkid, void *key) { dladm_status_t status = DLADM_STATUS_FAILED; char *command = NULL; @@ -1877,8 +1923,8 @@ wpa_instance_create(datalink_id_t linkid, void *key) /* * Use the link name as the instance name of the network/wpad service. */ - status = dladm_datalink_id2info(linkid, NULL, NULL, NULL, instance_name, - sizeof (instance_name)); + status = dladm_datalink_id2info(handle, linkid, NULL, NULL, NULL, + instance_name, sizeof (instance_name)); if (status != DLADM_STATUS_OK) goto out; @@ -1910,7 +1956,7 @@ out: } static dladm_status_t -wpa_instance_delete(datalink_id_t linkid) +wpa_instance_delete(dladm_handle_t handle, datalink_id_t linkid) { char instance_name[MAXLINKNAMELEN]; @@ -1918,8 +1964,8 @@ wpa_instance_delete(datalink_id_t linkid) * Get the instance name of the network/wpad service (the same as * the link name). */ - if (dladm_datalink_id2info(linkid, NULL, NULL, NULL, instance_name, - sizeof (instance_name)) != DLADM_STATUS_OK) + if (dladm_datalink_id2info(handle, linkid, NULL, NULL, NULL, + instance_name, sizeof (instance_name)) != DLADM_STATUS_OK) return (DLADM_STATUS_FAILED); return (delete_instance(instance_name)); diff --git a/usr/src/lib/libdladm/common/libdlwlan.h b/usr/src/lib/libdladm/common/libdlwlan.h index 5e81b0001e..87dc01c863 100644 --- a/usr/src/lib/libdladm/common/libdlwlan.h +++ b/usr/src/lib/libdladm/common/libdlwlan.h @@ -26,8 +26,6 @@ #ifndef _LIBDLWLAN_H #define _LIBDLWLAN_H -#pragma ident "%Z%%M% %I% %E% SMI" - /* * This file includes structures, macros and routines used by WLAN link * administration. @@ -181,24 +179,26 @@ typedef struct dladm_wlan_key { uint_t wk_class; } dladm_wlan_key_t; -extern dladm_status_t dladm_wlan_scan(datalink_id_t, void *, +extern dladm_status_t dladm_wlan_scan(dladm_handle_t, datalink_id_t, void *, boolean_t (*)(void *, dladm_wlan_attr_t *)); -extern dladm_status_t dladm_wlan_connect(datalink_id_t, dladm_wlan_attr_t *, - int, void *, uint_t, uint_t); -extern dladm_status_t dladm_wlan_disconnect(datalink_id_t); -extern dladm_status_t dladm_wlan_get_linkattr(datalink_id_t, +extern dladm_status_t dladm_wlan_connect(dladm_handle_t, datalink_id_t, + dladm_wlan_attr_t *, int, void *, uint_t, uint_t); +extern dladm_status_t dladm_wlan_disconnect(dladm_handle_t, datalink_id_t); +extern dladm_status_t dladm_wlan_get_linkattr(dladm_handle_t, datalink_id_t, dladm_wlan_linkattr_t *); /* WPA support routines */ -extern dladm_status_t dladm_wlan_wpa_get_sr(datalink_id_t, dladm_wlan_ess_t *, - uint_t, uint_t *); -extern dladm_status_t dladm_wlan_wpa_set_ie(datalink_id_t, uint8_t *, uint_t); -extern dladm_status_t dladm_wlan_wpa_set_wpa(datalink_id_t, boolean_t); -extern dladm_status_t dladm_wlan_wpa_del_key(datalink_id_t, uint_t, - const dladm_wlan_bssid_t *); -extern dladm_status_t dladm_wlan_wpa_set_key(datalink_id_t, +extern dladm_status_t dladm_wlan_wpa_get_sr(dladm_handle_t, datalink_id_t, + dladm_wlan_ess_t *, uint_t, uint_t *); +extern dladm_status_t dladm_wlan_wpa_set_ie(dladm_handle_t, datalink_id_t, + uint8_t *, uint_t); +extern dladm_status_t dladm_wlan_wpa_set_wpa(dladm_handle_t, datalink_id_t, + boolean_t); +extern dladm_status_t dladm_wlan_wpa_del_key(dladm_handle_t, datalink_id_t, + uint_t, const dladm_wlan_bssid_t *); +extern dladm_status_t dladm_wlan_wpa_set_key(dladm_handle_t, datalink_id_t, dladm_wlan_cipher_t, const dladm_wlan_bssid_t *, boolean_t, uint64_t, uint_t, uint8_t *, uint_t); -extern dladm_status_t dladm_wlan_wpa_set_mlme(datalink_id_t, +extern dladm_status_t dladm_wlan_wpa_set_mlme(dladm_handle_t, datalink_id_t, dladm_wlan_mlme_op_t, dladm_wlan_reason_t, dladm_wlan_bssid_t *); diff --git a/usr/src/lib/libdladm/common/libdlwlan_impl.h b/usr/src/lib/libdladm/common/libdlwlan_impl.h index 256876f030..18457870a0 100644 --- a/usr/src/lib/libdladm/common/libdlwlan_impl.h +++ b/usr/src/lib/libdladm/common/libdlwlan_impl.h @@ -74,10 +74,11 @@ typedef enum { DLADM_WLAN_PM_FAST } dladm_wlan_powermode_t; -extern dladm_status_t i_dladm_wlan_legacy_ioctl(datalink_id_t, wldp_t *, - uint_t, size_t, uint_t, size_t); -extern dladm_status_t i_dladm_wlan_param(datalink_id_t, void *, - mac_prop_id_t, size_t, boolean_t); +extern dladm_status_t i_dladm_wlan_legacy_ioctl(dladm_handle_t, + datalink_id_t, wldp_t *, uint_t, size_t, uint_t, + size_t); +extern dladm_status_t i_dladm_wlan_param(dladm_handle_t, datalink_id_t, + void *, mac_prop_id_t, size_t, boolean_t); extern boolean_t i_dladm_wlan_convert_chan(wl_phy_conf_t *, uint32_t *); #ifdef __cplusplus diff --git a/usr/src/lib/libdladm/common/linkprop.c b/usr/src/lib/libdladm/common/linkprop.c index 0b72c72633..22daa9c5d6 100644 --- a/usr/src/lib/libdladm/common/linkprop.c +++ b/usr/src/lib/libdladm/common/linkprop.c @@ -68,7 +68,7 @@ struct prop_desc; typedef struct prop_desc prop_desc_t; -typedef dladm_status_t pd_getf_t(prop_desc_t *pdp, +typedef dladm_status_t pd_getf_t(dladm_handle_t, prop_desc_t *pdp, datalink_id_t, char **propstp, uint_t *cntp, datalink_media_t, uint_t, uint_t *); @@ -83,7 +83,7 @@ typedef dladm_status_t pd_getf_t(prop_desc_t *pdp, * of ioctl buffers etc. pd_set() may call another common routine (used * by all other pd_sets) which invokes the ioctl. */ -typedef dladm_status_t pd_setf_t(prop_desc_t *, datalink_id_t, +typedef dladm_status_t pd_setf_t(dladm_handle_t, prop_desc_t *, datalink_id_t, val_desc_t *propval, uint_t cnt, uint_t flags, datalink_media_t); @@ -101,9 +101,9 @@ typedef dladm_status_t pd_setf_t(prop_desc_t *, datalink_id_t, * with either a val_desc_t found on the pd_modval list or something * generated on the fly. */ -typedef dladm_status_t pd_checkf_t(prop_desc_t *pdp, datalink_id_t, - char **propstrp, uint_t cnt, val_desc_t *propval, - datalink_media_t); +typedef dladm_status_t pd_checkf_t(dladm_handle_t, prop_desc_t *pdp, + datalink_id_t, char **propstrp, uint_t cnt, + val_desc_t *propval, datalink_media_t); typedef struct link_attr_s { mac_prop_id_t pp_id; @@ -115,13 +115,14 @@ static dld_ioc_macprop_t *i_dladm_buf_alloc_by_name(size_t, datalink_id_t, const char *, uint_t, dladm_status_t *); static dld_ioc_macprop_t *i_dladm_buf_alloc_by_id(size_t, datalink_id_t, mac_prop_id_t, uint_t, dladm_status_t *); -static dld_ioc_macprop_t *i_dladm_get_public_prop(datalink_id_t, char *, uint_t, - dladm_status_t *, uint_t *); - -static dladm_status_t i_dladm_set_prop(datalink_id_t, const char *, char **, - uint_t, uint_t); -static dladm_status_t i_dladm_get_prop(datalink_id_t, const char *, char **, - uint_t *, dladm_prop_type_t, uint_t); +static dld_ioc_macprop_t *i_dladm_get_public_prop(dladm_handle_t, datalink_id_t, + char *, uint_t, dladm_status_t *, uint_t *); + +static dladm_status_t i_dladm_set_prop(dladm_handle_t, datalink_id_t, + const char *, char **, uint_t, uint_t); +static dladm_status_t i_dladm_get_prop(dladm_handle_t, datalink_id_t, + const char *, char **, uint_t *, dladm_prop_type_t, + uint_t); static link_attr_t *dladm_name2prop(const char *); static link_attr_t *dladm_id2prop(mac_prop_id_t); @@ -141,13 +142,13 @@ static pd_checkf_t do_check_zone, do_check_autopush, do_check_rate, i_dladm_defmtu_check, do_check_maxbw, do_check_cpus, do_check_priority; -static dladm_status_t i_dladm_speed_get(prop_desc_t *, datalink_id_t, - char **, uint_t *, uint_t, uint_t *); -static dladm_status_t i_dladm_wlan_get_legacy_ioctl(datalink_id_t, void *, - uint_t, uint_t); -static dladm_status_t i_dladm_wlan_set_legacy_ioctl(datalink_id_t, void *, - uint_t, uint_t); -static dladm_status_t i_dladm_macprop(void *, boolean_t); +static dladm_status_t i_dladm_speed_get(dladm_handle_t, prop_desc_t *, + datalink_id_t, char **, uint_t *, uint_t, uint_t *); +static dladm_status_t i_dladm_wlan_get_legacy_ioctl(dladm_handle_t, + datalink_id_t, void *, uint_t, uint_t); +static dladm_status_t i_dladm_wlan_set_legacy_ioctl(dladm_handle_t, + datalink_id_t, void *, uint_t, uint_t); +static dladm_status_t i_dladm_macprop(dladm_handle_t, void *, boolean_t); static const char *dladm_perm2str(uint_t, char *); struct prop_desc { @@ -509,16 +510,17 @@ static resource_prop_t rsrc_prop_table[] = { */ #define DLADM_PROP_BUF_CHUNK 1024 -static dladm_status_t i_dladm_set_linkprop_db(datalink_id_t, const char *, - char **, uint_t); -static dladm_status_t i_dladm_get_linkprop_db(datalink_id_t, const char *, - char **, uint_t *); -static dladm_status_t i_dladm_set_single_prop(datalink_id_t, datalink_class_t, - uint32_t, prop_desc_t *, char **, uint_t, uint_t); -static dladm_status_t i_dladm_set_linkprop(datalink_id_t, const char *, - char **, uint_t, uint_t); -static dladm_status_t i_dladm_getset_defval(prop_desc_t *, datalink_id_t, - datalink_media_t, uint_t); +static dladm_status_t i_dladm_set_linkprop_db(dladm_handle_t, datalink_id_t, + const char *, char **, uint_t); +static dladm_status_t i_dladm_get_linkprop_db(dladm_handle_t, datalink_id_t, + const char *, char **, uint_t *); +static dladm_status_t i_dladm_set_single_prop(dladm_handle_t, datalink_id_t, + datalink_class_t, uint32_t, prop_desc_t *, char **, + uint_t, uint_t); +static dladm_status_t i_dladm_set_linkprop(dladm_handle_t, datalink_id_t, + const char *, char **, uint_t, uint_t); +static dladm_status_t i_dladm_getset_defval(dladm_handle_t, prop_desc_t *, + datalink_id_t, datalink_media_t, uint_t); static dladm_status_t link_proplist_check(dladm_arg_list_t *); @@ -560,9 +562,9 @@ done: } static dladm_status_t -i_dladm_set_single_prop(datalink_id_t linkid, datalink_class_t class, - uint32_t media, prop_desc_t *pdp, char **prop_val, uint_t val_cnt, - uint_t flags) +i_dladm_set_single_prop(dladm_handle_t handle, datalink_id_t linkid, + datalink_class_t class, uint32_t media, prop_desc_t *pdp, char **prop_val, + uint_t val_cnt, uint_t flags) { dladm_status_t status = DLADM_STATUS_OK; val_desc_t *vdp = NULL; @@ -591,8 +593,8 @@ i_dladm_set_single_prop(datalink_id_t linkid, datalink_class_t class, if (pdp->pd_check != NULL) { needfree = ((pdp->pd_flags & PD_CHECK_ALLOC) != 0); - status = pdp->pd_check(pdp, linkid, prop_val, val_cnt, - vdp, media); + status = pdp->pd_check(handle, pdp, linkid, prop_val, + val_cnt, vdp, media); } else if (pdp->pd_optval != NULL) { status = do_check_prop(pdp, prop_val, val_cnt, vdp); } else { @@ -619,18 +621,18 @@ i_dladm_set_single_prop(datalink_id_t linkid, datalink_class_t class, (void) memcpy(vdp, &pdp->pd_defval, sizeof (val_desc_t)); } else if (pdp->pd_check != NULL) { - status = pdp->pd_check(pdp, linkid, prop_val, - cnt, vdp, media); + status = pdp->pd_check(handle, pdp, linkid, + prop_val, cnt, vdp, media); if (status != DLADM_STATUS_OK) goto done; } } else { - status = i_dladm_getset_defval(pdp, linkid, + status = i_dladm_getset_defval(handle, pdp, linkid, media, flags); return (status); } } - status = pdp->pd_set(pdp, linkid, vdp, cnt, flags, media); + status = pdp->pd_set(handle, pdp, linkid, vdp, cnt, flags, media); if (needfree) { for (i = 0; i < cnt; i++) free((void *)((val_desc_t *)vdp + i)->vd_val); @@ -641,8 +643,8 @@ done: } static dladm_status_t -i_dladm_set_linkprop(datalink_id_t linkid, const char *prop_name, - char **prop_val, uint_t val_cnt, uint_t flags) +i_dladm_set_linkprop(dladm_handle_t handle, datalink_id_t linkid, + const char *prop_name, char **prop_val, uint_t val_cnt, uint_t flags) { int i; boolean_t found = B_FALSE; @@ -650,7 +652,8 @@ i_dladm_set_linkprop(datalink_id_t linkid, const char *prop_name, uint32_t media; dladm_status_t status = DLADM_STATUS_OK; - status = dladm_datalink_id2info(linkid, NULL, &class, &media, NULL, 0); + status = dladm_datalink_id2info(handle, linkid, NULL, &class, &media, + NULL, 0); if (status != DLADM_STATUS_OK) return (status); @@ -662,8 +665,8 @@ i_dladm_set_linkprop(datalink_id_t linkid, const char *prop_name, (strcasecmp(prop_name, pdp->pd_name) != 0)) continue; found = B_TRUE; - s = i_dladm_set_single_prop(linkid, class, media, pdp, prop_val, - val_cnt, flags); + s = i_dladm_set_single_prop(handle, linkid, class, media, pdp, + prop_val, val_cnt, flags); if (prop_name != NULL) { status = s; @@ -677,8 +680,8 @@ i_dladm_set_linkprop(datalink_id_t linkid, const char *prop_name, if (!found) { if (prop_name[0] == '_') { /* other private properties */ - status = i_dladm_set_prop(linkid, prop_name, prop_val, - val_cnt, flags); + status = i_dladm_set_prop(handle, linkid, prop_name, + prop_val, val_cnt, flags); } else { status = DLADM_STATUS_NOTFOUND; } @@ -691,8 +694,8 @@ i_dladm_set_linkprop(datalink_id_t linkid, const char *prop_name, * Set/reset link property for specific link */ dladm_status_t -dladm_set_linkprop(datalink_id_t linkid, const char *prop_name, char **prop_val, - uint_t val_cnt, uint_t flags) +dladm_set_linkprop(dladm_handle_t handle, datalink_id_t linkid, + const char *prop_name, char **prop_val, uint_t val_cnt, uint_t flags) { dladm_status_t status = DLADM_STATUS_OK; @@ -703,13 +706,13 @@ dladm_set_linkprop(datalink_id_t linkid, const char *prop_name, char **prop_val, return (DLADM_STATUS_BADARG); } - status = i_dladm_set_linkprop(linkid, prop_name, prop_val, + status = i_dladm_set_linkprop(handle, linkid, prop_name, prop_val, val_cnt, flags); if (status != DLADM_STATUS_OK) return (status); if (flags & DLADM_OPT_PERSIST) { - status = i_dladm_set_linkprop_db(linkid, prop_name, + status = i_dladm_set_linkprop_db(handle, linkid, prop_name, prop_val, val_cnt); } return (status); @@ -719,8 +722,8 @@ dladm_set_linkprop(datalink_id_t linkid, const char *prop_name, char **prop_val, * Walk link properties of the given specific link. */ dladm_status_t -dladm_walk_linkprop(datalink_id_t linkid, void *arg, - int (*func)(datalink_id_t, const char *, void *)) +dladm_walk_linkprop(dladm_handle_t handle, datalink_id_t linkid, void *arg, + int (*func)(dladm_handle_t, datalink_id_t, const char *, void *)) { dladm_status_t status; datalink_class_t class; @@ -730,7 +733,8 @@ dladm_walk_linkprop(datalink_id_t linkid, void *arg, if (linkid == DATALINK_INVALID_LINKID || func == NULL) return (DLADM_STATUS_BADARG); - status = dladm_datalink_id2info(linkid, NULL, &class, &media, NULL, 0); + status = dladm_datalink_id2info(handle, linkid, NULL, &class, &media, + NULL, 0); if (status != DLADM_STATUS_OK) return (status); @@ -741,7 +745,7 @@ dladm_walk_linkprop(datalink_id_t linkid, void *arg, if (!DATALINK_MEDIA_ACCEPTED(prop_table[i].pd_dmedia, media)) continue; - if (func(linkid, prop_table[i].pd_name, arg) == + if (func(handle, linkid, prop_table[i].pd_name, arg) == DLADM_WALK_TERMINATE) { break; } @@ -754,8 +758,9 @@ dladm_walk_linkprop(datalink_id_t linkid, void *arg, * Get linkprop of the given specific link. */ dladm_status_t -dladm_get_linkprop(datalink_id_t linkid, dladm_prop_type_t type, - const char *prop_name, char **prop_val, uint_t *val_cntp) +dladm_get_linkprop(dladm_handle_t handle, datalink_id_t linkid, + dladm_prop_type_t type, const char *prop_name, char **prop_val, + uint_t *val_cntp) { dladm_status_t status = DLADM_STATUS_OK; datalink_class_t class; @@ -781,7 +786,7 @@ dladm_get_linkprop(datalink_id_t linkid, dladm_prop_type_t type, /* * private property. */ - return (i_dladm_get_prop(linkid, prop_name, + return (i_dladm_get_prop(handle, linkid, prop_name, prop_val, val_cntp, type, dld_flags)); } else { return (DLADM_STATUS_NOTFOUND); @@ -790,7 +795,8 @@ dladm_get_linkprop(datalink_id_t linkid, dladm_prop_type_t type, pdp = &prop_table[i]; - status = dladm_datalink_id2info(linkid, NULL, &class, &media, NULL, 0); + status = dladm_datalink_id2info(handle, linkid, NULL, &class, &media, + NULL, 0); if (status != DLADM_STATUS_OK) return (status); @@ -802,8 +808,8 @@ dladm_get_linkprop(datalink_id_t linkid, dladm_prop_type_t type, switch (type) { case DLADM_PROP_VAL_CURRENT: - status = pdp->pd_get(pdp, linkid, prop_val, val_cntp, media, - dld_flags, &perm_flags); + status = pdp->pd_get(handle, pdp, linkid, prop_val, val_cntp, + media, dld_flags, &perm_flags); break; case DLADM_PROP_VAL_PERM: @@ -811,8 +817,8 @@ dladm_get_linkprop(datalink_id_t linkid, dladm_prop_type_t type, perm_flags = MAC_PROP_PERM_READ; *val_cntp = 1; } else { - status = pdp->pd_get(pdp, linkid, prop_val, val_cntp, - media, dld_flags, &perm_flags); + status = pdp->pd_get(handle, pdp, linkid, prop_val, + val_cntp, media, dld_flags, &perm_flags); } *prop_val[0] = '\0'; @@ -834,8 +840,8 @@ dladm_get_linkprop(datalink_id_t linkid, dladm_prop_type_t type, } if (strlen(pdp->pd_defval.vd_name) == 0) { - status = pdp->pd_get(pdp, linkid, prop_val, val_cntp, - media, dld_flags, &perm_flags); + status = pdp->pd_get(handle, pdp, linkid, prop_val, + val_cntp, media, dld_flags, &perm_flags); } else { (void) strcpy(*prop_val, pdp->pd_defval.vd_name); } @@ -844,7 +850,7 @@ dladm_get_linkprop(datalink_id_t linkid, dladm_prop_type_t type, case DLADM_PROP_VAL_MODIFIABLE: if (pdp->pd_getmod != NULL) { - status = pdp->pd_getmod(pdp, linkid, prop_val, + status = pdp->pd_getmod(handle, pdp, linkid, prop_val, val_cntp, media, dld_flags, &perm_flags); break; } @@ -864,7 +870,7 @@ dladm_get_linkprop(datalink_id_t linkid, dladm_prop_type_t type, case DLADM_PROP_VAL_PERSISTENT: if (pdp->pd_flags & PD_TEMPONLY) return (DLADM_STATUS_TEMPONLY); - status = i_dladm_get_linkprop_db(linkid, prop_name, + status = i_dladm_get_linkprop_db(handle, linkid, prop_name, prop_val, val_cntp); break; default: @@ -877,7 +883,8 @@ dladm_get_linkprop(datalink_id_t linkid, dladm_prop_type_t type, /*ARGSUSED*/ static int -i_dladm_init_one_prop(datalink_id_t linkid, const char *prop_name, void *arg) +i_dladm_init_one_prop(dladm_handle_t handle, datalink_id_t linkid, + const char *prop_name, void *arg) { char *buf, **propvals; uint_t i, valcnt = DLADM_MAX_PROP_VALCNT; @@ -894,12 +901,12 @@ i_dladm_init_one_prop(datalink_id_t linkid, const char *prop_name, void *arg) i * DLADM_PROP_VAL_MAX; } - if (dladm_get_linkprop(linkid, DLADM_PROP_VAL_PERSISTENT, prop_name, - propvals, &valcnt) != DLADM_STATUS_OK) { + if (dladm_get_linkprop(handle, linkid, DLADM_PROP_VAL_PERSISTENT, + prop_name, propvals, &valcnt) != DLADM_STATUS_OK) { goto done; } - (void) dladm_set_linkprop(linkid, prop_name, propvals, valcnt, + (void) dladm_set_linkprop(handle, linkid, prop_name, propvals, valcnt, DLADM_OPT_ACTIVE); done: @@ -911,23 +918,25 @@ done: /*ARGSUSED*/ static int -i_dladm_init_linkprop(datalink_id_t linkid, void *arg) +i_dladm_init_linkprop(dladm_handle_t handle, datalink_id_t linkid, void *arg) { datalink_class_t class; dladm_status_t status; - status = dladm_datalink_id2info(linkid, NULL, &class, NULL, NULL, 0); + status = dladm_datalink_id2info(handle, linkid, NULL, &class, NULL, + NULL, 0); if (status != DLADM_STATUS_OK) return (DLADM_WALK_TERMINATE); if ((class & (DATALINK_CLASS_VNIC | DATALINK_CLASS_VLAN)) == 0) - (void) dladm_init_linkprop(linkid, B_TRUE); + (void) dladm_init_linkprop(handle, linkid, B_TRUE); return (DLADM_WALK_CONTINUE); } dladm_status_t -dladm_init_linkprop(datalink_id_t linkid, boolean_t any_media) +dladm_init_linkprop(dladm_handle_t handle, datalink_id_t linkid, + boolean_t any_media) { datalink_media_t dmedia; uint32_t media; @@ -935,19 +944,21 @@ dladm_init_linkprop(datalink_id_t linkid, boolean_t any_media) dmedia = any_media ? DATALINK_ANY_MEDIATYPE : DL_WIFI; if (linkid == DATALINK_ALL_LINKID) { - (void) dladm_walk_datalink_id(i_dladm_init_linkprop, NULL, - DATALINK_CLASS_ALL, dmedia, DLADM_OPT_PERSIST); - } else if (any_media || ((dladm_datalink_id2info(linkid, NULL, NULL, - &media, NULL, 0) == DLADM_STATUS_OK) && + (void) dladm_walk_datalink_id(i_dladm_init_linkprop, handle, + NULL, DATALINK_CLASS_ALL, dmedia, DLADM_OPT_PERSIST); + } else if (any_media || + ((dladm_datalink_id2info(handle, linkid, NULL, NULL, &media, NULL, + 0) == DLADM_STATUS_OK) && DATALINK_MEDIA_ACCEPTED(dmedia, media))) { - (void) dladm_walk_linkprop(linkid, NULL, i_dladm_init_one_prop); + (void) dladm_walk_linkprop(handle, linkid, NULL, + i_dladm_init_one_prop); } return (DLADM_STATUS_OK); } /* ARGSUSED */ static dladm_status_t -do_get_zone(prop_desc_t *pdp, datalink_id_t linkid, +do_get_zone(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, char **prop_val, uint_t *val_cnt, datalink_media_t media, uint_t flags, uint_t *perm_flags) { @@ -960,7 +971,7 @@ do_get_zone(prop_desc_t *pdp, datalink_id_t linkid, if (flags != 0) return (DLADM_STATUS_NOTSUP); - dip = i_dladm_get_public_prop(linkid, pdp->pd_name, flags, + dip = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags, &status, perm_flags); if (status != DLADM_STATUS_OK) return (status); @@ -1011,7 +1022,8 @@ i_dladm_get_zone_dev(char *zone_name, char *dev, size_t devlen) } static dladm_status_t -i_dladm_update_deventry(zoneid_t zid, datalink_id_t linkid, boolean_t add) +i_dladm_update_deventry(dladm_handle_t handle, zoneid_t zid, + datalink_id_t linkid, boolean_t add) { char path[MAXPATHLEN]; char name[MAXLINKNAMELEN]; @@ -1027,7 +1039,7 @@ i_dladm_update_deventry(zoneid_t zid, datalink_id_t linkid, boolean_t add) if (di_prof_init(path, &prof) != 0) return (dladm_errno2status(errno)); - status = dladm_linkid2legacyname(linkid, name, MAXLINKNAMELEN); + status = dladm_linkid2legacyname(handle, linkid, name, MAXLINKNAMELEN); if (status != DLADM_STATUS_OK) goto cleanup; @@ -1052,8 +1064,8 @@ cleanup: /* ARGSUSED */ static dladm_status_t -do_set_zone(prop_desc_t *pdp, datalink_id_t linkid, val_desc_t *vdp, - uint_t val_cnt, uint_t flags, datalink_media_t media) +do_set_zone(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, + val_desc_t *vdp, uint_t val_cnt, uint_t flags, datalink_media_t media) { dladm_status_t status = DLADM_STATUS_OK; zoneid_t zid_old, zid_new; @@ -1067,7 +1079,7 @@ do_set_zone(prop_desc_t *pdp, datalink_id_t linkid, val_desc_t *vdp, dzp = (dld_ioc_zid_t *)vdp->vd_val; - dip = i_dladm_get_public_prop(linkid, pdp->pd_name, flags, + dip = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags, &status, NULL); if (status != DLADM_STATUS_OK) return (status); @@ -1096,8 +1108,8 @@ do_set_zone(prop_desc_t *pdp, datalink_id_t linkid, val_desc_t *vdp, * link and prevent a link renaming, so we need to do it * before other operations. */ - status = i_dladm_set_public_prop(pdp, linkid, vdp, val_cnt, - flags, media); + status = i_dladm_set_public_prop(handle, pdp, linkid, vdp, + val_cnt, flags, media); if (status != DLADM_STATUS_OK) return (status); } @@ -1113,7 +1125,8 @@ do_set_zone(prop_desc_t *pdp, datalink_id_t linkid, val_desc_t *vdp, * It is okay to fail to update the /dev entry (some * vanity-named links do not have a /dev entry). */ - (void) i_dladm_update_deventry(zid_old, linkid, B_FALSE); + (void) i_dladm_update_deventry(handle, zid_old, linkid, + B_FALSE); } if (zid_new != GLOBAL_ZONEID) { @@ -1122,10 +1135,10 @@ do_set_zone(prop_desc_t *pdp, datalink_id_t linkid, val_desc_t *vdp, goto rollback2; } - (void) i_dladm_update_deventry(zid_new, linkid, B_TRUE); + (void) i_dladm_update_deventry(handle, zid_new, linkid, B_TRUE); } else { - status = i_dladm_set_public_prop(pdp, linkid, vdp, val_cnt, - flags, media); + status = i_dladm_set_public_prop(handle, pdp, linkid, vdp, + val_cnt, flags, media); if (status != DLADM_STATUS_OK) goto rollback2; } @@ -1134,14 +1147,14 @@ do_set_zone(prop_desc_t *pdp, datalink_id_t linkid, val_desc_t *vdp, rollback2: if (zid_old != GLOBAL_ZONEID) - (void) i_dladm_update_deventry(zid_old, linkid, B_TRUE); + (void) i_dladm_update_deventry(handle, zid_old, linkid, B_TRUE); if (zid_old != GLOBAL_ZONEID) (void) zone_add_datalink(zid_old, link); rollback1: if (zid_new != GLOBAL_ZONEID) { dzp->diz_zid = zid_old; - (void) i_dladm_set_public_prop(pdp, linkid, vdp, val_cnt, - flags, media); + (void) i_dladm_set_public_prop(handle, pdp, linkid, vdp, + val_cnt, flags, media); } return (status); @@ -1149,8 +1162,8 @@ rollback1: /* ARGSUSED */ static dladm_status_t -do_check_zone(prop_desc_t *pdp, datalink_id_t linkid, char **prop_val, - uint_t val_cnt, val_desc_t *vdp, datalink_media_t media) +do_check_zone(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, + char **prop_val, uint_t val_cnt, val_desc_t *vdp, datalink_media_t media) { char *zone_name; char linkname[MAXLINKNAMELEN]; @@ -1165,7 +1178,7 @@ do_check_zone(prop_desc_t *pdp, datalink_id_t linkid, char **prop_val, if (dzp == NULL) return (DLADM_STATUS_NOMEM); - if ((status = dladm_datalink_id2info(linkid, NULL, NULL, NULL, + if ((status = dladm_datalink_id2info(handle, linkid, NULL, NULL, NULL, linkname, MAXLINKNAMELEN)) != DLADM_STATUS_OK) { goto done; } @@ -1210,7 +1223,7 @@ done: /* ARGSUSED */ static dladm_status_t -dld_maxbw_get(prop_desc_t *pdp, datalink_id_t linkid, +dld_maxbw_get(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, char **prop_val, uint_t *val_cnt, datalink_media_t media, uint_t flags, uint_t *perm_flags) { @@ -1218,7 +1231,7 @@ dld_maxbw_get(prop_desc_t *pdp, datalink_id_t linkid, mac_resource_props_t mrp; dladm_status_t status; - dip = i_dladm_get_public_prop(linkid, pdp->pd_name, flags, + dip = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags, &status, perm_flags); if (dip == NULL) return (status); @@ -1237,8 +1250,8 @@ dld_maxbw_get(prop_desc_t *pdp, datalink_id_t linkid, /* ARGSUSED */ static dladm_status_t -do_check_maxbw(prop_desc_t *pdp, datalink_id_t linkid, char **prop_val, - uint_t val_cnt, val_desc_t *vdp, datalink_media_t media) +do_check_maxbw(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, + char **prop_val, uint_t val_cnt, val_desc_t *vdp, datalink_media_t media) { uint64_t *maxbw; dladm_status_t status = DLADM_STATUS_OK; @@ -1279,7 +1292,7 @@ do_extract_maxbw(val_desc_t *vdp, void *arg, uint_t cnt) /* ARGSUSED */ static dladm_status_t -dld_cpus_get(prop_desc_t *pdp, datalink_id_t linkid, +dld_cpus_get(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, char **prop_val, uint_t *val_cnt, datalink_media_t media, uint_t flags, uint_t *perm_flags) { @@ -1290,7 +1303,7 @@ dld_cpus_get(prop_desc_t *pdp, datalink_id_t linkid, uchar_t *cp; dladm_status_t status; - dip = i_dladm_get_public_prop(linkid, pdp->pd_name, flags, + dip = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags, &status, perm_flags); if (dip == NULL) return (status); @@ -1320,8 +1333,8 @@ dld_cpus_get(prop_desc_t *pdp, datalink_id_t linkid, /* ARGSUSED */ static dladm_status_t -do_set_res(prop_desc_t *pdp, datalink_id_t linkid, val_desc_t *vdp, - uint_t val_cnt, uint_t flags, datalink_media_t media) +do_set_res(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, + val_desc_t *vdp, uint_t val_cnt, uint_t flags, datalink_media_t media) { mac_resource_props_t mrp; dladm_status_t status = DLADM_STATUS_OK; @@ -1367,15 +1380,15 @@ do_set_res(prop_desc_t *pdp, datalink_id_t linkid, val_desc_t *vdp, } (void) memcpy(dip->pr_val, &mrp, dip->pr_valsize); - status = i_dladm_macprop(dip, B_TRUE); + status = i_dladm_macprop(handle, dip, B_TRUE); free(dip); return (status); } /* ARGSUSED */ static dladm_status_t -do_set_cpus(prop_desc_t *pdp, datalink_id_t linkid, val_desc_t *vdp, - uint_t val_cnt, uint_t flags, datalink_media_t media) +do_set_cpus(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, + val_desc_t *vdp, uint_t val_cnt, uint_t flags, datalink_media_t media) { mac_resource_props_t mrp; dladm_status_t status; @@ -1387,7 +1400,7 @@ do_set_cpus(prop_desc_t *pdp, datalink_id_t linkid, val_desc_t *vdp, * However VNICs fails the dladm_phys_info test(). So apply * the phys_info test only on physical links. */ - if ((status = dladm_datalink_id2info(linkid, NULL, &class, + if ((status = dladm_datalink_id2info(handle, linkid, NULL, &class, NULL, NULL, 0)) != DLADM_STATUS_OK) { return (status); } @@ -1417,15 +1430,15 @@ do_set_cpus(prop_desc_t *pdp, datalink_id_t linkid, val_desc_t *vdp, return (status); (void) memcpy(dip->pr_val, &mrp, dip->pr_valsize); - status = i_dladm_macprop(dip, B_TRUE); + status = i_dladm_macprop(handle, dip, B_TRUE); free(dip); return (status); } /* ARGSUSED */ static dladm_status_t -do_check_cpus(prop_desc_t *pdp, datalink_id_t linkid, char **prop_val, - uint_t val_cnt, val_desc_t *vdp, datalink_media_t media) +do_check_cpus(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, + char **prop_val, uint_t val_cnt, val_desc_t *vdp, datalink_media_t media) { uint32_t cpuid; int i, j, rc; @@ -1490,7 +1503,7 @@ do_extract_cpus(val_desc_t *vdp, void *arg, uint_t cnt) /* ARGSUSED */ static dladm_status_t -dld_priority_get(prop_desc_t *pdp, datalink_id_t linkid, +dld_priority_get(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, char **prop_val, uint_t *val_cnt, datalink_media_t media, uint_t flags, uint_t *perm_flags) { @@ -1499,7 +1512,7 @@ dld_priority_get(prop_desc_t *pdp, datalink_id_t linkid, mac_priority_level_t pri; dladm_status_t status; - dip = i_dladm_get_public_prop(linkid, pdp->pd_name, flags, + dip = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags, &status, perm_flags); if (dip == NULL) return (status); @@ -1517,8 +1530,8 @@ dld_priority_get(prop_desc_t *pdp, datalink_id_t linkid, /* ARGSUSED */ static dladm_status_t -do_check_priority(prop_desc_t *pdp, datalink_id_t linkid, char **prop_val, - uint_t val_cnt, val_desc_t *vdp, datalink_media_t media) +do_check_priority(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, + char **prop_val, uint_t val_cnt, val_desc_t *vdp, datalink_media_t media) { mac_priority_level_t *pri; dladm_status_t status = DLADM_STATUS_OK; @@ -1560,7 +1573,7 @@ do_extract_priority(val_desc_t *vdp, void *arg, uint_t cnt) /* ARGSUSED */ static dladm_status_t -do_get_autopush(prop_desc_t *pdp, datalink_id_t linkid, +do_get_autopush(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, char **prop_val, uint_t *val_cnt, datalink_media_t media, uint_t flags, uint_t *perm_flags) { @@ -1573,7 +1586,7 @@ do_get_autopush(prop_desc_t *pdp, datalink_id_t linkid, return (DLADM_STATUS_NOTDEFINED); *val_cnt = 1; - dip = i_dladm_get_public_prop(linkid, pdp->pd_name, flags, + dip = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags, &status, perm_flags); if (dip == NULL) { (*prop_val)[0] = '\0'; @@ -1641,8 +1654,8 @@ i_dladm_add_ap_module(const char *module, struct dlautopush *dlap) */ /* ARGSUSED */ static dladm_status_t -do_check_autopush(prop_desc_t *pdp, datalink_id_t linkid, char **prop_val, - uint_t val_cnt, val_desc_t *vdp, datalink_media_t media) +do_check_autopush(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, + char **prop_val, uint_t val_cnt, val_desc_t *vdp, datalink_media_t media) { char *module; struct dlautopush *dlap; @@ -1680,8 +1693,9 @@ do_check_autopush(prop_desc_t *pdp, datalink_id_t linkid, char **prop_val, /* ARGSUSED */ static dladm_status_t -do_get_rate_common(prop_desc_t *pdp, datalink_id_t linkid, - char **prop_val, uint_t *val_cnt, uint_t id, uint_t *perm_flags) +do_get_rate_common(dladm_handle_t handle, prop_desc_t *pdp, + datalink_id_t linkid, char **prop_val, uint_t *val_cnt, uint_t id, + uint_t *perm_flags) { wl_rates_t *wrp; uint_t i; @@ -1691,7 +1705,8 @@ do_get_rate_common(prop_desc_t *pdp, datalink_id_t linkid, if (wrp == NULL) return (DLADM_STATUS_NOMEM); - status = i_dladm_wlan_param(linkid, wrp, id, WLDP_BUFSIZE, B_FALSE); + status = i_dladm_wlan_param(handle, linkid, wrp, id, WLDP_BUFSIZE, + B_FALSE); if (status != DLADM_STATUS_OK) goto done; @@ -1720,22 +1735,22 @@ done: } static dladm_status_t -do_get_rate_prop(prop_desc_t *pdp, datalink_id_t linkid, +do_get_rate_prop(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, char **prop_val, uint_t *val_cnt, datalink_media_t media, uint_t flags, uint_t *perm_flags) { if (media != DL_WIFI) { - return (i_dladm_speed_get(pdp, linkid, prop_val, + return (i_dladm_speed_get(handle, pdp, linkid, prop_val, val_cnt, flags, perm_flags)); } - return (do_get_rate_common(pdp, linkid, prop_val, val_cnt, + return (do_get_rate_common(handle, pdp, linkid, prop_val, val_cnt, MAC_PROP_WL_DESIRED_RATES, perm_flags)); } /* ARGSUSED */ static dladm_status_t -do_get_rate_mod(prop_desc_t *pdp, datalink_id_t linkid, +do_get_rate_mod(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, char **prop_val, uint_t *val_cnt, datalink_media_t media, uint_t flags, uint_t *perm_flags) { @@ -1748,15 +1763,16 @@ do_get_rate_mod(prop_desc_t *pdp, datalink_id_t linkid, return (DLADM_STATUS_NOTSUP); case DL_WIFI: - return (do_get_rate_common(pdp, linkid, prop_val, val_cnt, - MAC_PROP_WL_SUPPORTED_RATES, perm_flags)); + return (do_get_rate_common(handle, pdp, linkid, prop_val, + val_cnt, MAC_PROP_WL_SUPPORTED_RATES, perm_flags)); default: return (DLADM_STATUS_BADARG); } } static dladm_status_t -do_set_rate(datalink_id_t linkid, dladm_wlan_rates_t *rates) +do_set_rate(dladm_handle_t handle, datalink_id_t linkid, + dladm_wlan_rates_t *rates) { int i; uint_t len; @@ -1774,8 +1790,8 @@ do_set_rate(datalink_id_t linkid, dladm_wlan_rates_t *rates) len = offsetof(wl_rates_t, wl_rates_rates) + (rates->wr_cnt * sizeof (char)) + WIFI_BUF_OFFSET; - status = i_dladm_wlan_param(linkid, wrp, MAC_PROP_WL_DESIRED_RATES, - len, B_TRUE); + status = i_dladm_wlan_param(handle, linkid, wrp, + MAC_PROP_WL_DESIRED_RATES, len, B_TRUE); free(wrp); return (status); @@ -1783,7 +1799,7 @@ do_set_rate(datalink_id_t linkid, dladm_wlan_rates_t *rates) /* ARGSUSED */ static dladm_status_t -do_set_rate_prop(prop_desc_t *pdp, datalink_id_t linkid, +do_set_rate_prop(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, val_desc_t *vdp, uint_t val_cnt, uint_t flags, datalink_media_t media) { dladm_wlan_rates_t rates; @@ -1801,7 +1817,7 @@ do_set_rate_prop(prop_desc_t *pdp, datalink_id_t linkid, rates.wr_cnt = 1; rates.wr_rates[0] = vdp[0].vd_val; - status = do_set_rate(linkid, &rates); + status = do_set_rate(handle, linkid, &rates); done: return (status); @@ -1809,8 +1825,8 @@ done: /* ARGSUSED */ static dladm_status_t -do_check_rate(prop_desc_t *pdp, datalink_id_t linkid, char **prop_val, - uint_t val_cnt, val_desc_t *vdp, datalink_media_t media) +do_check_rate(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, + char **prop_val, uint_t val_cnt, val_desc_t *vdp, datalink_media_t media) { int i; uint_t modval_cnt = MAX_SUPPORT_RATES; @@ -1834,8 +1850,8 @@ do_check_rate(prop_desc_t *pdp, datalink_id_t linkid, char **prop_val, i * DLADM_STRSIZE; } - status = do_get_rate_mod(NULL, linkid, modval, &modval_cnt, media, - 0, &perm_flags); + status = do_get_rate_mod(handle, NULL, linkid, modval, &modval_cnt, + media, 0, &perm_flags); if (status != DLADM_STATUS_OK) goto done; @@ -1855,24 +1871,25 @@ done: } static dladm_status_t -do_get_phyconf(datalink_id_t linkid, void *buf, int buflen) +do_get_phyconf(dladm_handle_t handle, datalink_id_t linkid, void *buf, + int buflen) { - return (i_dladm_wlan_param(linkid, buf, MAC_PROP_WL_PHY_CONFIG, + return (i_dladm_wlan_param(handle, linkid, buf, MAC_PROP_WL_PHY_CONFIG, buflen, B_FALSE)); } /* ARGSUSED */ static dladm_status_t -do_get_channel_prop(prop_desc_t *pdp, datalink_id_t linkid, - char **prop_val, uint_t *val_cnt, datalink_media_t media, - uint_t flags, uint_t *perm_flags) +do_get_channel_prop(dladm_handle_t handle, prop_desc_t *pdp, + datalink_id_t linkid, char **prop_val, uint_t *val_cnt, + datalink_media_t media, uint_t flags, uint_t *perm_flags) { uint32_t channel; char buf[WLDP_BUFSIZE]; dladm_status_t status = DLADM_STATUS_OK; wl_phy_conf_t wl_phy_conf; - if ((status = do_get_phyconf(linkid, buf, sizeof (buf))) + if ((status = do_get_phyconf(handle, linkid, buf, sizeof (buf))) != DLADM_STATUS_OK) goto done; @@ -1890,24 +1907,25 @@ done: } static dladm_status_t -do_get_powermode(datalink_id_t linkid, void *buf, int buflen) +do_get_powermode(dladm_handle_t handle, datalink_id_t linkid, void *buf, + int buflen) { - return (i_dladm_wlan_param(linkid, buf, MAC_PROP_WL_POWER_MODE, + return (i_dladm_wlan_param(handle, linkid, buf, MAC_PROP_WL_POWER_MODE, buflen, B_FALSE)); } /* ARGSUSED */ static dladm_status_t -do_get_powermode_prop(prop_desc_t *pdp, datalink_id_t linkid, - char **prop_val, uint_t *val_cnt, datalink_media_t media, - uint_t flags, uint_t *perm_flags) +do_get_powermode_prop(dladm_handle_t handle, prop_desc_t *pdp, + datalink_id_t linkid, char **prop_val, uint_t *val_cnt, + datalink_media_t media, uint_t flags, uint_t *perm_flags) { wl_ps_mode_t mode; const char *s; char buf[WLDP_BUFSIZE]; dladm_status_t status = DLADM_STATUS_OK; - if ((status = do_get_powermode(linkid, buf, sizeof (buf))) + if ((status = do_get_powermode(handle, linkid, buf, sizeof (buf))) != DLADM_STATUS_OK) goto done; @@ -1934,7 +1952,8 @@ done: } static dladm_status_t -do_set_powermode(datalink_id_t linkid, dladm_wlan_powermode_t *pm) +do_set_powermode(dladm_handle_t handle, datalink_id_t linkid, + dladm_wlan_powermode_t *pm) { wl_ps_mode_t ps_mode; @@ -1953,14 +1972,15 @@ do_set_powermode(datalink_id_t linkid, dladm_wlan_powermode_t *pm) default: return (DLADM_STATUS_NOTSUP); } - return (i_dladm_wlan_param(linkid, &ps_mode, MAC_PROP_WL_POWER_MODE, - sizeof (ps_mode), B_TRUE)); + return (i_dladm_wlan_param(handle, linkid, &ps_mode, + MAC_PROP_WL_POWER_MODE, sizeof (ps_mode), B_TRUE)); } /* ARGSUSED */ static dladm_status_t -do_set_powermode_prop(prop_desc_t *pdp, datalink_id_t linkid, - val_desc_t *vdp, uint_t val_cnt, uint_t flags, datalink_media_t media) +do_set_powermode_prop(dladm_handle_t handle, prop_desc_t *pdp, + datalink_id_t linkid, val_desc_t *vdp, uint_t val_cnt, uint_t flags, + datalink_media_t media) { dladm_wlan_powermode_t powermode = (dladm_wlan_powermode_t)vdp->vd_val; dladm_status_t status; @@ -1968,21 +1988,21 @@ do_set_powermode_prop(prop_desc_t *pdp, datalink_id_t linkid, if (val_cnt != 1) return (DLADM_STATUS_BADVALCNT); - status = do_set_powermode(linkid, &powermode); + status = do_set_powermode(handle, linkid, &powermode); return (status); } static dladm_status_t -do_get_radio(datalink_id_t linkid, void *buf, int buflen) +do_get_radio(dladm_handle_t handle, datalink_id_t linkid, void *buf, int buflen) { - return (i_dladm_wlan_param(linkid, buf, MAC_PROP_WL_RADIO, buflen, - B_FALSE)); + return (i_dladm_wlan_param(handle, linkid, buf, MAC_PROP_WL_RADIO, + buflen, B_FALSE)); } /* ARGSUSED */ static dladm_status_t -do_get_radio_prop(prop_desc_t *pdp, datalink_id_t linkid, +do_get_radio_prop(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, char **prop_val, uint_t *val_cnt, datalink_media_t media, uint_t flags, uint_t *perm_flags) { @@ -1991,7 +2011,7 @@ do_get_radio_prop(prop_desc_t *pdp, datalink_id_t linkid, char buf[WLDP_BUFSIZE]; dladm_status_t status = DLADM_STATUS_OK; - if ((status = do_get_radio(linkid, buf, sizeof (buf))) + if ((status = do_get_radio(handle, linkid, buf, sizeof (buf))) != DLADM_STATUS_OK) goto done; @@ -2015,7 +2035,8 @@ done: } static dladm_status_t -do_set_radio(datalink_id_t linkid, dladm_wlan_radio_t *radio) +do_set_radio(dladm_handle_t handle, datalink_id_t linkid, + dladm_wlan_radio_t *radio) { wl_radio_t r; @@ -2029,13 +2050,13 @@ do_set_radio(datalink_id_t linkid, dladm_wlan_radio_t *radio) default: return (DLADM_STATUS_NOTSUP); } - return (i_dladm_wlan_param(linkid, &r, MAC_PROP_WL_RADIO, + return (i_dladm_wlan_param(handle, linkid, &r, MAC_PROP_WL_RADIO, sizeof (r), B_TRUE)); } /* ARGSUSED */ static dladm_status_t -do_set_radio_prop(prop_desc_t *pdp, datalink_id_t linkid, +do_set_radio_prop(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, val_desc_t *vdp, uint_t val_cnt, uint_t fags, datalink_media_t media) { dladm_wlan_radio_t radio = (dladm_wlan_radio_t)vdp->vd_val; @@ -2044,21 +2065,21 @@ do_set_radio_prop(prop_desc_t *pdp, datalink_id_t linkid, if (val_cnt != 1) return (DLADM_STATUS_BADVALCNT); - status = do_set_radio(linkid, &radio); + status = do_set_radio(handle, linkid, &radio); return (status); } static dladm_status_t -i_dladm_set_linkprop_db(datalink_id_t linkid, const char *prop_name, - char **prop_val, uint_t val_cnt) +i_dladm_set_linkprop_db(dladm_handle_t handle, datalink_id_t linkid, + const char *prop_name, char **prop_val, uint_t val_cnt) { char buf[MAXLINELEN]; int i; dladm_conf_t conf; dladm_status_t status; - status = dladm_read_conf(linkid, &conf); + status = dladm_read_conf(handle, linkid, &conf); if (status != DLADM_STATUS_OK) return (status); @@ -2066,9 +2087,9 @@ i_dladm_set_linkprop_db(datalink_id_t linkid, const char *prop_name, * reset case. */ if (val_cnt == 0) { - status = dladm_unset_conf_field(conf, prop_name); + status = dladm_unset_conf_field(handle, conf, prop_name); if (status == DLADM_STATUS_OK) - status = dladm_write_conf(conf); + status = dladm_write_conf(handle, conf); goto done; } @@ -2079,29 +2100,30 @@ i_dladm_set_linkprop_db(datalink_id_t linkid, const char *prop_name, (void) strlcat(buf, ",", MAXLINELEN); } - status = dladm_set_conf_field(conf, prop_name, DLADM_TYPE_STR, buf); + status = dladm_set_conf_field(handle, conf, prop_name, DLADM_TYPE_STR, + buf); if (status == DLADM_STATUS_OK) - status = dladm_write_conf(conf); + status = dladm_write_conf(handle, conf); done: - dladm_destroy_conf(conf); + dladm_destroy_conf(handle, conf); return (status); } static dladm_status_t -i_dladm_get_linkprop_db(datalink_id_t linkid, const char *prop_name, - char **prop_val, uint_t *val_cntp) +i_dladm_get_linkprop_db(dladm_handle_t handle, datalink_id_t linkid, + const char *prop_name, char **prop_val, uint_t *val_cntp) { char buf[MAXLINELEN], *str; uint_t cnt = 0; dladm_conf_t conf; dladm_status_t status; - status = dladm_read_conf(linkid, &conf); + status = dladm_read_conf(handle, linkid, &conf); if (status != DLADM_STATUS_OK) return (status); - status = dladm_get_conf_field(conf, prop_name, buf, MAXLINELEN); + status = dladm_get_conf_field(handle, conf, prop_name, buf, MAXLINELEN); if (status != DLADM_STATUS_OK) goto done; @@ -2118,7 +2140,7 @@ i_dladm_get_linkprop_db(datalink_id_t linkid, const char *prop_name, *val_cntp = cnt; done: - dladm_destroy_conf(conf); + dladm_destroy_conf(handle, conf); return (status); } @@ -2197,8 +2219,9 @@ i_dladm_buf_alloc_by_id(size_t valsize, datalink_id_t linkid, /* ARGSUSED */ static dladm_status_t -i_dladm_set_public_prop(prop_desc_t *pdp, datalink_id_t linkid, - val_desc_t *vdp, uint_t val_cnt, uint_t flags, datalink_media_t media) +i_dladm_set_public_prop(dladm_handle_t handle, prop_desc_t *pdp, + datalink_id_t linkid, val_desc_t *vdp, uint_t val_cnt, uint_t flags, + datalink_media_t media) { dld_ioc_macprop_t *dip; dladm_status_t status = DLADM_STATUS_OK; @@ -2242,7 +2265,7 @@ i_dladm_set_public_prop(prop_desc_t *pdp, datalink_id_t linkid, else dip->pr_valsize = 0; - status = i_dladm_macprop(dip, B_TRUE); + status = i_dladm_macprop(handle, dip, B_TRUE); done: free(dip); @@ -2250,25 +2273,20 @@ done: } dladm_status_t -i_dladm_macprop(void *dip, boolean_t set) +i_dladm_macprop(dladm_handle_t handle, void *dip, boolean_t set) { - int fd; dladm_status_t status = DLADM_STATUS_OK; - if ((fd = open(DLD_CONTROL_DEV, O_RDWR)) < 0) { - status = dladm_errno2status(errno); - return (status); - } - if (ioctl(fd, (set ? DLDIOC_SETMACPROP : DLDIOC_GETMACPROP), dip)) + if (ioctl(dladm_dld_fd(handle), + (set ? DLDIOC_SETMACPROP : DLDIOC_GETMACPROP), dip)) status = dladm_errno2status(errno); - (void) close(fd); return (status); } static dld_ioc_macprop_t * -i_dladm_get_public_prop(datalink_id_t linkid, char *prop_name, uint_t flags, - dladm_status_t *status, uint_t *perm_flags) +i_dladm_get_public_prop(dladm_handle_t handle, datalink_id_t linkid, + char *prop_name, uint_t flags, dladm_status_t *status, uint_t *perm_flags) { dld_ioc_macprop_t *dip = NULL; @@ -2276,7 +2294,7 @@ i_dladm_get_public_prop(datalink_id_t linkid, char *prop_name, uint_t flags, if (dip == NULL) return (NULL); - *status = i_dladm_macprop(dip, B_FALSE); + *status = i_dladm_macprop(handle, dip, B_FALSE); if (*status != DLADM_STATUS_OK) { free(dip); return (NULL); @@ -2289,8 +2307,9 @@ i_dladm_get_public_prop(datalink_id_t linkid, char *prop_name, uint_t flags, /* ARGSUSED */ static dladm_status_t -i_dladm_defmtu_check(prop_desc_t *pdp, datalink_id_t linkid, - char **prop_val, uint_t val_cnt, val_desc_t *v, datalink_media_t media) +i_dladm_defmtu_check(dladm_handle_t handle, prop_desc_t *pdp, + datalink_id_t linkid, char **prop_val, uint_t val_cnt, val_desc_t *v, + datalink_media_t media) { if (val_cnt != 1) return (DLADM_STATUS_BADVAL); @@ -2300,14 +2319,14 @@ i_dladm_defmtu_check(prop_desc_t *pdp, datalink_id_t linkid, /* ARGSUSED */ static dladm_status_t -i_dladm_duplex_get(prop_desc_t *pdp, datalink_id_t linkid, - char **prop_val, uint_t *val_cnt, datalink_media_t media, - uint_t flags, uint_t *perm_flags) +i_dladm_duplex_get(dladm_handle_t handle, prop_desc_t *pdp, + datalink_id_t linkid, char **prop_val, uint_t *val_cnt, + datalink_media_t media, uint_t flags, uint_t *perm_flags) { link_duplex_t link_duplex; dladm_status_t status; - if ((status = dladm_get_single_mac_stat(linkid, "link_duplex", + if ((status = dladm_get_single_mac_stat(handle, linkid, "link_duplex", KSTAT_DATA_UINT32, &link_duplex)) != 0) return (status); @@ -2328,13 +2347,13 @@ i_dladm_duplex_get(prop_desc_t *pdp, datalink_id_t linkid, /* ARGSUSED */ static dladm_status_t -i_dladm_speed_get(prop_desc_t *pdp, datalink_id_t linkid, +i_dladm_speed_get(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, char **prop_val, uint_t *val_cnt, uint_t flags, uint_t *perm_flags) { uint64_t ifspeed = 0; dladm_status_t status; - if ((status = dladm_get_single_mac_stat(linkid, "ifspeed", + if ((status = dladm_get_single_mac_stat(handle, linkid, "ifspeed", KSTAT_DATA_UINT64, &ifspeed)) != 0) return (status); @@ -2352,14 +2371,14 @@ i_dladm_speed_get(prop_desc_t *pdp, datalink_id_t linkid, /* ARGSUSED */ static dladm_status_t -i_dladm_status_get(prop_desc_t *pdp, datalink_id_t linkid, - char **prop_val, uint_t *val_cnt, datalink_media_t media, - uint_t flags, uint_t *perm_flags) +i_dladm_status_get(dladm_handle_t handle, prop_desc_t *pdp, + datalink_id_t linkid, char **prop_val, uint_t *val_cnt, + datalink_media_t media, uint_t flags, uint_t *perm_flags) { link_state_t link_state; dladm_status_t status; - status = i_dladm_get_state(linkid, &link_state); + status = i_dladm_get_state(handle, linkid, &link_state); if (status != DLADM_STATUS_OK) return (status); @@ -2381,14 +2400,14 @@ i_dladm_status_get(prop_desc_t *pdp, datalink_id_t linkid, /* ARGSUSED */ static dladm_status_t -i_dladm_binary_get(prop_desc_t *pdp, datalink_id_t linkid, - char **prop_val, uint_t *val_cnt, datalink_media_t media, - uint_t flags, uint_t *perm_flags) +i_dladm_binary_get(dladm_handle_t handle, prop_desc_t *pdp, + datalink_id_t linkid, char **prop_val, uint_t *val_cnt, + datalink_media_t media, uint_t flags, uint_t *perm_flags) { dld_ioc_macprop_t *dip; dladm_status_t status; - dip = i_dladm_get_public_prop(linkid, pdp->pd_name, flags, + dip = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags, &status, perm_flags); if (dip == NULL) return (status); @@ -2401,16 +2420,16 @@ i_dladm_binary_get(prop_desc_t *pdp, datalink_id_t linkid, /* ARGSUSED */ static dladm_status_t -i_dladm_uint32_get(prop_desc_t *pdp, datalink_id_t linkid, - char **prop_val, uint_t *val_cnt, datalink_media_t media, - uint_t flags, uint_t *perm_flags) +i_dladm_uint32_get(dladm_handle_t handle, prop_desc_t *pdp, + datalink_id_t linkid, char **prop_val, uint_t *val_cnt, + datalink_media_t media, uint_t flags, uint_t *perm_flags) { dld_ioc_macprop_t *dip; uint32_t v = 0; uchar_t *cp; dladm_status_t status; - dip = i_dladm_get_public_prop(linkid, pdp->pd_name, flags, + dip = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags, &status, perm_flags); if (dip == NULL) return (status); @@ -2425,16 +2444,16 @@ i_dladm_uint32_get(prop_desc_t *pdp, datalink_id_t linkid, /* ARGSUSED */ static dladm_status_t -i_dladm_flowctl_get(prop_desc_t *pdp, datalink_id_t linkid, - char **prop_val, uint_t *val_cnt, datalink_media_t media, - uint_t flags, uint_t *perm_flags) +i_dladm_flowctl_get(dladm_handle_t handle, prop_desc_t *pdp, + datalink_id_t linkid, char **prop_val, uint_t *val_cnt, + datalink_media_t media, uint_t flags, uint_t *perm_flags) { dld_ioc_macprop_t *dip; link_flowctrl_t v; dladm_status_t status; uchar_t *cp; - dip = i_dladm_get_public_prop(linkid, pdp->pd_name, flags, + dip = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags, &status, perm_flags); if (dip == NULL) return (status); @@ -2463,8 +2482,9 @@ i_dladm_flowctl_get(prop_desc_t *pdp, datalink_id_t linkid, /* ARGSUSED */ static dladm_status_t -i_dladm_set_prop(datalink_id_t linkid, const char *prop_name, - char **prop_val, uint_t val_cnt, uint_t flags) +i_dladm_set_prop(dladm_handle_t handle, datalink_id_t linkid, + const char *prop_name, char **prop_val, uint_t val_cnt, uint_t flags) + { int i, slen; int bufsize = 0; @@ -2504,7 +2524,7 @@ i_dladm_set_prop(datalink_id_t linkid, const char *prop_name, slen = 0; if (prop_val == NULL) { - status = i_dladm_macprop(dip, B_FALSE); + status = i_dladm_macprop(handle, dip, B_FALSE); } else { for (i = 0; i < val_cnt; i++) { int plen = 0; @@ -2519,7 +2539,7 @@ i_dladm_set_prop(datalink_id_t linkid, const char *prop_name, dp[slen++] = ','; dp += (plen + 1); } - status = i_dladm_macprop(dip, B_TRUE); + status = i_dladm_macprop(handle, dip, B_TRUE); } free(dip); @@ -2527,8 +2547,9 @@ i_dladm_set_prop(datalink_id_t linkid, const char *prop_name, } static dladm_status_t -i_dladm_get_prop(datalink_id_t linkid, const char *prop_name, - char **prop_val, uint_t *val_cnt, dladm_prop_type_t type, uint_t dld_flags) +i_dladm_get_prop(dladm_handle_t handle, datalink_id_t linkid, + const char *prop_name, char **prop_val, uint_t *val_cnt, + dladm_prop_type_t type, uint_t dld_flags) { dladm_status_t status = DLADM_STATUS_OK; dld_ioc_macprop_t *dip = NULL; @@ -2557,7 +2578,8 @@ i_dladm_get_prop(datalink_id_t linkid, const char *prop_name, if (dip == NULL) return (status); - if ((status = i_dladm_macprop(dip, B_FALSE)) == DLADM_STATUS_OK) { + if ((status = i_dladm_macprop(handle, dip, B_FALSE)) == + DLADM_STATUS_OK) { if (type == DLADM_PROP_VAL_PERM) { (void) dladm_perm2str(dip->pr_perm_flags, *prop_val); } else { @@ -2572,8 +2594,8 @@ i_dladm_get_prop(datalink_id_t linkid, const char *prop_name, static dladm_status_t -i_dladm_getset_defval(prop_desc_t *pdp, datalink_id_t linkid, - datalink_media_t media, uint_t flags) +i_dladm_getset_defval(dladm_handle_t handle, prop_desc_t *pdp, + datalink_id_t linkid, datalink_media_t media, uint_t flags) { dladm_status_t status; char **prop_vals = NULL, *buf; @@ -2607,12 +2629,12 @@ i_dladm_getset_defval(prop_desc_t *pdp, datalink_id_t linkid, * libdladm to do a getprop to find the default value and then do * a setprop to reset the value to default. */ - status = pdp->pd_get(pdp, linkid, prop_vals, &cnt, media, + status = pdp->pd_get(handle, pdp, linkid, prop_vals, &cnt, media, MAC_PROP_DEFAULT, &perm_flags); if (status == DLADM_STATUS_OK) { if (perm_flags == MAC_PROP_PERM_RW) { - status = i_dladm_set_single_prop(linkid, pdp->pd_class, - media, pdp, prop_vals, cnt, flags); + status = i_dladm_set_single_prop(handle, linkid, + pdp->pd_class, media, pdp, prop_vals, cnt, flags); } else status = DLADM_STATUS_NOTSUP; @@ -2675,8 +2697,8 @@ macprop_to_wifi(mac_prop_id_t wl_prop) } dladm_status_t -i_dladm_wlan_param(datalink_id_t linkid, void *buf, mac_prop_id_t cmd, - size_t len, boolean_t set) +i_dladm_wlan_param(dladm_handle_t handle, datalink_id_t linkid, void *buf, + mac_prop_id_t cmd, size_t len, boolean_t set) { uint32_t flags; dladm_status_t status; @@ -2684,8 +2706,8 @@ i_dladm_wlan_param(datalink_id_t linkid, void *buf, mac_prop_id_t cmd, dld_ioc_macprop_t *dip; void *dp; - if ((status = dladm_datalink_id2info(linkid, &flags, NULL, &media, - NULL, 0)) != DLADM_STATUS_OK) { + if ((status = dladm_datalink_id2info(handle, linkid, &flags, NULL, + &media, NULL, 0)) != DLADM_STATUS_OK) { return (status); } @@ -2706,13 +2728,13 @@ i_dladm_wlan_param(datalink_id_t linkid, void *buf, mac_prop_id_t cmd, if (set) (void) memcpy(dp, buf, len); - status = i_dladm_macprop(dip, set); + status = i_dladm_macprop(handle, dip, set); if (status == DLADM_STATUS_NOTSUP) { if (set) { - status = i_dladm_wlan_set_legacy_ioctl(linkid, + status = i_dladm_wlan_set_legacy_ioctl(handle, linkid, buf, len, macprop_to_wifi(cmd)); } else { - status = i_dladm_wlan_get_legacy_ioctl(linkid, + status = i_dladm_wlan_get_legacy_ioctl(handle, linkid, buf, len, macprop_to_wifi(cmd)); } } else if (status == DLADM_STATUS_OK) { @@ -2725,8 +2747,8 @@ i_dladm_wlan_param(datalink_id_t linkid, void *buf, mac_prop_id_t cmd, } static dladm_status_t -i_dladm_wlan_get_legacy_ioctl(datalink_id_t linkid, void *buf, uint_t buflen, - uint_t id) +i_dladm_wlan_get_legacy_ioctl(dladm_handle_t handle, datalink_id_t linkid, + void *buf, uint_t buflen, uint_t id) { wldp_t *gbuf; dladm_status_t status; @@ -2735,8 +2757,8 @@ i_dladm_wlan_get_legacy_ioctl(datalink_id_t linkid, void *buf, uint_t buflen, return (DLADM_STATUS_NOMEM); (void) memset(gbuf, 0, MAX_BUF_LEN); - status = i_dladm_wlan_legacy_ioctl(linkid, gbuf, id, MAX_BUF_LEN, - WLAN_GET_PARAM, sizeof (wldp_t)); + status = i_dladm_wlan_legacy_ioctl(handle, linkid, gbuf, id, + MAX_BUF_LEN, WLAN_GET_PARAM, sizeof (wldp_t)); if (status == DLADM_STATUS_OK) (void) memcpy(buf, gbuf->wldp_buf, buflen); @@ -2745,8 +2767,8 @@ i_dladm_wlan_get_legacy_ioctl(datalink_id_t linkid, void *buf, uint_t buflen, } static dladm_status_t -i_dladm_wlan_set_legacy_ioctl(datalink_id_t linkid, void *buf, uint_t buflen, - uint_t id) +i_dladm_wlan_set_legacy_ioctl(dladm_handle_t handle, datalink_id_t linkid, + void *buf, uint_t buflen, uint_t id) { wldp_t *gbuf; dladm_status_t status = DLADM_STATUS_OK; @@ -2757,7 +2779,7 @@ i_dladm_wlan_set_legacy_ioctl(datalink_id_t linkid, void *buf, uint_t buflen, (void) memset(gbuf, 0, MAX_BUF_LEN); (void) memcpy(gbuf->wldp_buf, buf, buflen); buflen += WIFI_BUF_OFFSET; - status = i_dladm_wlan_legacy_ioctl(linkid, gbuf, id, buflen, + status = i_dladm_wlan_legacy_ioctl(handle, linkid, gbuf, id, buflen, WLAN_SET_PARAM, buflen); free(gbuf); @@ -2806,7 +2828,8 @@ dladm_parse_link_props(char *str, dladm_arg_list_t **listp, boolean_t novalues) */ /*ARGSUSED*/ static int -i_dladm_get_one_prop(datalink_id_t linkid, const char *prop_name, void *arg) +i_dladm_get_one_prop(dladm_handle_t handle, datalink_id_t linkid, + const char *prop_name, void *arg) { dladm_arg_list_t *proplist = arg; dladm_arg_info_t *aip = NULL; @@ -2818,8 +2841,8 @@ i_dladm_get_one_prop(datalink_id_t linkid, const char *prop_name, void *arg) */ aip->ai_name = prop_name; - (void) dladm_get_linkprop(linkid, DLADM_PROP_VAL_PERSISTENT, prop_name, - aip->ai_val, &aip->ai_count); + (void) dladm_get_linkprop(handle, linkid, DLADM_PROP_VAL_PERSISTENT, + prop_name, aip->ai_val, &aip->ai_count); if (aip->ai_count != 0) proplist->al_count++; @@ -2833,7 +2856,8 @@ i_dladm_get_one_prop(datalink_id_t linkid, const char *prop_name, void *arg) * return a property list. */ dladm_status_t -dladm_link_get_proplist(datalink_id_t linkid, dladm_arg_list_t **listp) +dladm_link_get_proplist(dladm_handle_t handle, datalink_id_t linkid, + dladm_arg_list_t **listp) { dladm_arg_list_t *list; dladm_status_t status = DLADM_STATUS_OK; @@ -2842,7 +2866,8 @@ dladm_link_get_proplist(datalink_id_t linkid, dladm_arg_list_t **listp) if (list == NULL) return (dladm_errno2status(errno)); - status = dladm_walk_linkprop(linkid, list, i_dladm_get_one_prop); + status = dladm_walk_linkprop(handle, linkid, list, + i_dladm_get_one_prop); *listp = list; return (status); @@ -2853,8 +2878,8 @@ dladm_link_get_proplist(datalink_id_t linkid, dladm_arg_list_t **listp) * convert to a kernel structure. */ static dladm_status_t -i_dladm_link_proplist_extract_one(dladm_arg_list_t *proplist, - const char *name, void *val) +i_dladm_link_proplist_extract_one(dladm_handle_t handle, + dladm_arg_list_t *proplist, const char *name, void *val) { dladm_status_t status; dladm_arg_info_t *aip = NULL; @@ -2887,7 +2912,7 @@ i_dladm_link_proplist_extract_one(dladm_arg_list_t *proplist, /* Check property value */ if (pdp->pd_check != NULL) { - status = pdp->pd_check(pdp, 0, aip->ai_val, + status = pdp->pd_check(handle, pdp, 0, aip->ai_val, aip->ai_count, vdp, 0); } else { status = DLADM_STATUS_BADARG; @@ -2924,18 +2949,21 @@ i_dladm_link_proplist_extract_one(dladm_arg_list_t *proplist, * Extract properties from a proplist and convert to mac_resource_props_t. */ dladm_status_t -dladm_link_proplist_extract(dladm_arg_list_t *proplist, +dladm_link_proplist_extract(dladm_handle_t handle, dladm_arg_list_t *proplist, mac_resource_props_t *mrp) { dladm_status_t status = DLADM_STATUS_OK; - status = i_dladm_link_proplist_extract_one(proplist, "maxbw", mrp); + status = i_dladm_link_proplist_extract_one(handle, proplist, "maxbw", + mrp); if (status != DLADM_STATUS_OK) return (status); - status = i_dladm_link_proplist_extract_one(proplist, "priority", mrp); + status = i_dladm_link_proplist_extract_one(handle, proplist, "priority", + mrp); if (status != DLADM_STATUS_OK) return (status); - status = i_dladm_link_proplist_extract_one(proplist, "cpus", mrp); + status = i_dladm_link_proplist_extract_one(handle, proplist, "cpus", + mrp); if (status != DLADM_STATUS_OK) return (status); return (status); @@ -2951,13 +2979,15 @@ dladm_perm2str(uint_t perm, char *buf) } dladm_status_t -i_dladm_get_state(datalink_id_t linkid, link_state_t *state) +i_dladm_get_state(dladm_handle_t handle, datalink_id_t linkid, + link_state_t *state) { dld_ioc_macprop_t *dip; dladm_status_t status; uint_t perms; - dip = i_dladm_get_public_prop(linkid, "state", 0, &status, &perms); + dip = i_dladm_get_public_prop(handle, linkid, "state", 0, &status, + &perms); if (status != DLADM_STATUS_OK) return (status); (void) memcpy(state, dip->pr_val, sizeof (*state)); diff --git a/usr/src/lib/libdladm/common/mapfile-vers b/usr/src/lib/libdladm/common/mapfile-vers index fbdcb31521..4dd0bb9c52 100644 --- a/usr/src/lib/libdladm/common/mapfile-vers +++ b/usr/src/lib/libdladm/common/mapfile-vers @@ -25,6 +25,10 @@ SUNWprivate_1.1 { global: + dladm_open; + dladm_close; + dladm_dld_fd; + dladm_door_fd; dladm_info; dladm_walk; dladm_setzid; diff --git a/usr/src/lib/libdladm/common/propfuncs.c b/usr/src/lib/libdladm/common/propfuncs.c index 74964511eb..d466323604 100644 --- a/usr/src/lib/libdladm/common/propfuncs.c +++ b/usr/src/lib/libdladm/common/propfuncs.c @@ -114,8 +114,9 @@ generate_prop_line(const char *name, char *buf, * will be NULL; a new entry will be generated in this case and it will * contain only the property information in lsp. */ +/* ARGSUSED */ boolean_t -process_prop_set(prop_db_state_t *lsp, char *buf, +process_prop_set(dladm_handle_t handle, prop_db_state_t *lsp, char *buf, prop_db_info_t *listp, dladm_status_t *statusp) { dladm_status_t status; @@ -208,7 +209,7 @@ fail: */ /* ARGSUSED */ boolean_t -process_prop_get(prop_db_state_t *lsp, char *buf, +process_prop_get(dladm_handle_t handle, prop_db_state_t *lsp, char *buf, prop_db_info_t *listp, dladm_status_t *statusp) { prop_db_info_t *lip = listp; @@ -254,7 +255,7 @@ process_prop_get(prop_db_state_t *lsp, char *buf, */ /* ARGSUSED */ boolean_t -process_prop_init(prop_db_state_t *lsp, char *buf, +process_prop_init(dladm_handle_t handle, prop_db_state_t *lsp, char *buf, prop_db_info_t *listp, dladm_status_t *statusp) { dladm_status_t status = DLADM_STATUS_OK; @@ -281,7 +282,7 @@ process_prop_init(prop_db_state_t *lsp, char *buf, for (i = 0; i < valcnt; i++, lvp = lvp->lv_nextval) propval[i] = (char *)lvp->lv_name; - status = (*lsp->ls_initop)(lsp->ls_name, lip->li_name, + status = (*lsp->ls_initop)(handle, lsp->ls_name, lip->li_name, propval, valcnt, DLADM_OPT_ACTIVE, NULL); /* @@ -390,7 +391,7 @@ fail: } static boolean_t -process_prop_line(prop_db_state_t *lsp, char *buf, +process_prop_line(dladm_handle_t handle, prop_db_state_t *lsp, char *buf, dladm_status_t *statusp) { prop_db_info_t *lip = NULL; @@ -447,7 +448,7 @@ process_prop_line(prop_db_state_t *lsp, char *buf, if (parse_props(str, &lip) < 0) goto fail; - cont = (*lsp->ls_op)(lsp, buf, lip, statusp); + cont = (*lsp->ls_op)(handle, lsp, buf, lip, statusp); free_props(lip); if (noname) lsp->ls_name = NULL; @@ -466,7 +467,7 @@ fail: } dladm_status_t -process_prop_db(void *arg, FILE *fp, FILE *nfp) +process_prop_db(dladm_handle_t handle, void *arg, FILE *fp, FILE *nfp) { prop_db_state_t *lsp = arg; dladm_status_t status = DLADM_STATUS_OK; @@ -484,7 +485,7 @@ process_prop_db(void *arg, FILE *fp, FILE *nfp) */ while (fgets(buf, MAXLINELEN, fp) != NULL) { if (cont) - cont = process_prop_line(lsp, buf, &status); + cont = process_prop_line(handle, lsp, buf, &status); if (nfp != NULL && buf[0] != '\0' && fputs(buf, nfp) == EOF) { status = dladm_errno2status(errno); @@ -500,7 +501,7 @@ process_prop_db(void *arg, FILE *fp, FILE *nfp) * If the specified name is not found above, we add the * name and its properties to the configuration file. */ - (void) (*lsp->ls_op)(lsp, buf, NULL, &status); + (void) (*lsp->ls_op)(handle, lsp, buf, NULL, &status); if (status == DLADM_STATUS_OK && fputs(buf, nfp) == EOF) status = dladm_errno2status(errno); } @@ -512,7 +513,7 @@ process_prop_db(void *arg, FILE *fp, FILE *nfp) } dladm_status_t -i_dladm_get_prop_temp(const char *name, prop_type_t type, +i_dladm_get_prop_temp(dladm_handle_t handle, const char *name, prop_type_t type, const char *prop_name, char **prop_val, uint_t *val_cntp, prop_table_t *prop_tbl) { @@ -537,7 +538,7 @@ i_dladm_get_prop_temp(const char *name, prop_type_t type, switch (type) { case DLADM_PROP_VAL_CURRENT: - status = pdp->pd_get(name, prop_val, val_cntp); + status = pdp->pd_get(handle, name, prop_val, val_cntp); break; case DLADM_PROP_VAL_DEFAULT: if (pdp->pd_defval.vd_name == NULL) { @@ -550,7 +551,8 @@ i_dladm_get_prop_temp(const char *name, prop_type_t type, case DLADM_PROP_VAL_MODIFIABLE: if (pdp->pd_getmod != NULL) { - status = pdp->pd_getmod(name, prop_val, val_cntp); + status = pdp->pd_getmod(handle, name, prop_val, + val_cntp); break; } cnt = pdp->pd_nmodval; @@ -575,8 +577,8 @@ i_dladm_get_prop_temp(const char *name, prop_type_t type, } static dladm_status_t -i_dladm_set_one_prop_temp(const char *name, fprop_desc_t *pdp, char **prop_val, - uint_t val_cnt, uint_t flags) +i_dladm_set_one_prop_temp(dladm_handle_t handle, const char *name, + fprop_desc_t *pdp, char **prop_val, uint_t val_cnt, uint_t flags) { dladm_status_t status; val_desc_t *vdp = NULL; @@ -609,15 +611,16 @@ i_dladm_set_one_prop_temp(const char *name, fprop_desc_t *pdp, char **prop_val, cnt = 1; } - status = pdp->pd_set(name, vdp, cnt); + status = pdp->pd_set(handle, name, vdp, cnt); free(vdp); return (status); } dladm_status_t -i_dladm_set_prop_temp(const char *name, const char *prop_name, char **prop_val, - uint_t val_cnt, uint_t flags, char **errprop, prop_table_t *prop_tbl) +i_dladm_set_prop_temp(dladm_handle_t handle, const char *name, + const char *prop_name, char **prop_val, uint_t val_cnt, uint_t flags, + char **errprop, prop_table_t *prop_tbl) { int i; dladm_status_t status = DLADM_STATUS_OK; @@ -632,8 +635,8 @@ i_dladm_set_prop_temp(const char *name, const char *prop_name, char **prop_val, continue; found = B_TRUE; - s = i_dladm_set_one_prop_temp(name, pdp, prop_val, val_cnt, - flags); + s = i_dladm_set_one_prop_temp(handle, name, pdp, prop_val, + val_cnt, flags); if (prop_name != NULL) { status = s; diff --git a/usr/src/lib/libdladm/common/secobj.c b/usr/src/lib/libdladm/common/secobj.c index cf9b262a9b..0f105c8826 100644 --- a/usr/src/lib/libdladm/common/secobj.c +++ b/usr/src/lib/libdladm/common/secobj.c @@ -35,13 +35,14 @@ #include <libdllink.h> #include <libdladm_impl.h> -static dladm_status_t i_dladm_set_secobj_db(const char *, +static dladm_status_t i_dladm_set_secobj_db(dladm_handle_t, const char *, dladm_secobj_class_t, uint8_t *, uint_t); -static dladm_status_t i_dladm_get_secobj_db(const char *, +static dladm_status_t i_dladm_get_secobj_db(dladm_handle_t, const char *, dladm_secobj_class_t *, uint8_t *, uint_t *); -static dladm_status_t i_dladm_unset_secobj_db(const char *); -static dladm_status_t i_dladm_walk_secobj_db(void *, - boolean_t (*)(void *, const char *)); +static dladm_status_t i_dladm_unset_secobj_db(dladm_handle_t, const char *); +static dladm_status_t i_dladm_walk_secobj_db(dladm_handle_t, void *, + boolean_t (*)(dladm_handle_t, void *, + const char *)); typedef struct secobj_class_info { const char *sc_name; @@ -122,10 +123,9 @@ dladm_convert_dldsecobjclass(dld_secobj_class_t dldclass, } dladm_status_t -dladm_set_secobj(const char *obj_name, dladm_secobj_class_t class, - uint8_t *obj_val, uint_t obj_len, uint_t flags) +dladm_set_secobj(dladm_handle_t handle, const char *obj_name, + dladm_secobj_class_t class, uint8_t *obj_val, uint_t obj_len, uint_t flags) { - int fd; dladm_status_t status = DLADM_STATUS_OK; dld_ioc_secobj_set_t secobj_set; dld_secobj_t *objp; @@ -153,30 +153,25 @@ dladm_set_secobj(const char *obj_name, dladm_secobj_class_t class, if ((flags & DLADM_OPT_CREATE) != 0) secobj_set.ss_flags = DLD_SECOBJ_OPT_CREATE; - if ((fd = open(DLD_CONTROL_DEV, O_RDWR)) < 0) - return (dladm_errno2status(errno)); - - if (ioctl(fd, DLDIOC_SECOBJ_SET, &secobj_set) < 0) + if (ioctl(dladm_dld_fd(handle), DLDIOC_SECOBJ_SET, &secobj_set) < 0) status = dladm_errno2status(errno); - (void) close(fd); - if (status != DLADM_STATUS_OK) return (status); persist: if ((flags & DLADM_OPT_PERSIST) != 0) { - status = i_dladm_set_secobj_db(obj_name, class, + status = i_dladm_set_secobj_db(handle, obj_name, class, obj_val, obj_len); } return (status); } dladm_status_t -dladm_get_secobj(const char *obj_name, dladm_secobj_class_t *classp, - uint8_t *obj_val, uint_t *obj_lenp, uint_t flags) +dladm_get_secobj(dladm_handle_t handle, const char *obj_name, + dladm_secobj_class_t *classp, uint8_t *obj_val, uint_t *obj_lenp, + uint_t flags) { - int fd; dladm_status_t status = DLADM_STATUS_OK; dld_ioc_secobj_get_t secobj_get; dld_secobj_t *objp; @@ -187,7 +182,7 @@ dladm_get_secobj(const char *obj_name, dladm_secobj_class_t *classp, return (DLADM_STATUS_BADARG); if ((flags & DLADM_OPT_PERSIST) != 0) { - return (i_dladm_get_secobj_db(obj_name, classp, + return (i_dladm_get_secobj_db(handle, obj_name, classp, obj_val, obj_lenp)); } @@ -195,14 +190,10 @@ dladm_get_secobj(const char *obj_name, dladm_secobj_class_t *classp, objp = &secobj_get.sg_obj; (void) strlcpy(objp->so_name, obj_name, DLD_SECOBJ_NAME_MAX); - if ((fd = open(DLD_CONTROL_DEV, O_RDWR)) < 0) - return (dladm_errno2status(errno)); - secobj_get.sg_size = sizeof (secobj_get); - if (ioctl(fd, DLDIOC_SECOBJ_GET, &secobj_get) < 0) + if (ioctl(dladm_dld_fd(handle), DLDIOC_SECOBJ_GET, &secobj_get) < 0) status = dladm_errno2status(errno); - (void) close(fd); if (objp->so_len > *obj_lenp) return (DLADM_STATUS_TOOSMALL); @@ -215,9 +206,8 @@ dladm_get_secobj(const char *obj_name, dladm_secobj_class_t *classp, } dladm_status_t -dladm_unset_secobj(const char *obj_name, uint_t flags) +dladm_unset_secobj(dladm_handle_t handle, const char *obj_name, uint_t flags) { - int fd; dladm_status_t status = DLADM_STATUS_OK; dld_ioc_secobj_unset_t secobj_unset; @@ -230,38 +220,31 @@ dladm_unset_secobj(const char *obj_name, uint_t flags) bzero(&secobj_unset, sizeof (secobj_unset)); (void) strlcpy(secobj_unset.su_name, obj_name, DLD_SECOBJ_NAME_MAX); - if ((fd = open(DLD_CONTROL_DEV, O_RDWR)) < 0) - return (dladm_errno2status(errno)); - if (ioctl(fd, DLDIOC_SECOBJ_UNSET, &secobj_unset) < 0) + if (ioctl(dladm_dld_fd(handle), DLDIOC_SECOBJ_UNSET, &secobj_unset) < 0) status = dladm_errno2status(errno); - (void) close(fd); if (status != DLADM_STATUS_OK) return (status); persist: if ((flags & DLADM_OPT_PERSIST) != 0) - status = i_dladm_unset_secobj_db(obj_name); + status = i_dladm_unset_secobj_db(handle, obj_name); return (status); } dladm_status_t -dladm_walk_secobj(void *arg, boolean_t (*func)(void *, const char *), - uint_t flags) +dladm_walk_secobj(dladm_handle_t handle, void *arg, + boolean_t (*func)(dladm_handle_t, void *, const char *), uint_t flags) { - int fd = -1; dladm_status_t status = DLADM_STATUS_OK; dld_ioc_secobj_get_t *secobj_getp; dld_secobj_t *objp; size_t secobj_bufsz; if ((flags & DLADM_OPT_PERSIST) != 0) - return (i_dladm_walk_secobj_db(arg, func)); - - if ((fd = open(DLD_CONTROL_DEV, O_RDWR)) < 0) - return (dladm_errno2status(errno)); + return (i_dladm_walk_secobj_db(handle, arg, func)); /* Start with enough room for 10 objects, increase if necessary. */ secobj_bufsz = sizeof (*secobj_getp) + (10 * sizeof (*objp)); @@ -273,7 +256,7 @@ dladm_walk_secobj(void *arg, boolean_t (*func)(void *, const char *), tryagain: secobj_getp->sg_size = secobj_bufsz; - if (ioctl(fd, DLDIOC_SECOBJ_GET, secobj_getp) < 0) { + if (ioctl(dladm_dld_fd(handle), DLDIOC_SECOBJ_GET, secobj_getp) < 0) { if (errno == ENOSPC) { /* Increase the buffer size and try again. */ secobj_bufsz *= 2; @@ -295,13 +278,12 @@ tryagain: objp = (dld_secobj_t *)(secobj_getp + 1); while (secobj_getp->sg_count > 0) { - if (!func(arg, objp->so_name)) + if (!func(handle, arg, objp->so_name)) goto done; secobj_getp->sg_count--; objp++; } done: - (void) close(fd); free(secobj_getp); return (status); } @@ -323,8 +305,8 @@ typedef struct secobj_name { typedef struct secobj_db_state secobj_db_state_t; -typedef boolean_t (*secobj_db_op_t)(struct secobj_db_state *, char *, - secobj_info_t *, dladm_status_t *); +typedef boolean_t (*secobj_db_op_t)(dladm_handle_t, struct secobj_db_state *, + char *, secobj_info_t *, dladm_status_t *); struct secobj_db_state { secobj_db_op_t ss_op; @@ -337,8 +319,8 @@ struct secobj_db_state { */ /* ARGSUSED */ static boolean_t -process_secobj_set(secobj_db_state_t *ssp, char *buf, secobj_info_t *sip, - dladm_status_t *statusp) +process_secobj_set(dladm_handle_t handle, secobj_db_state_t *ssp, char *buf, + secobj_info_t *sip, dladm_status_t *statusp) { char tmpbuf[MAXLINELEN]; char classbuf[DLADM_STRSIZE]; @@ -366,8 +348,8 @@ process_secobj_set(secobj_db_state_t *ssp, char *buf, secobj_info_t *sip, /* ARGSUSED */ static boolean_t -process_secobj_get(secobj_db_state_t *ssp, char *buf, secobj_info_t *sip, - dladm_status_t *statusp) +process_secobj_get(dladm_handle_t handle, secobj_db_state_t *ssp, char *buf, + secobj_info_t *sip, dladm_status_t *statusp) { if (*sip->si_lenp > *ssp->ss_info.si_lenp) { *statusp = DLADM_STATUS_TOOSMALL; @@ -381,8 +363,8 @@ process_secobj_get(secobj_db_state_t *ssp, char *buf, secobj_info_t *sip, /* ARGSUSED */ static boolean_t -process_secobj_unset(secobj_db_state_t *ssp, char *buf, secobj_info_t *sip, - dladm_status_t *statusp) +process_secobj_unset(dladm_handle_t handle, secobj_db_state_t *ssp, char *buf, + secobj_info_t *sip, dladm_status_t *statusp) { /* * Delete line. @@ -393,8 +375,8 @@ process_secobj_unset(secobj_db_state_t *ssp, char *buf, secobj_info_t *sip, /* ARGSUSED */ static boolean_t -process_secobj_walk(secobj_db_state_t *ssp, char *buf, secobj_info_t *sip, - dladm_status_t *statusp) +process_secobj_walk(dladm_handle_t handle, secobj_db_state_t *ssp, char *buf, + secobj_info_t *sip, dladm_status_t *statusp) { secobj_name_t *snp; @@ -414,11 +396,12 @@ process_secobj_walk(secobj_db_state_t *ssp, char *buf, secobj_info_t *sip, /* ARGSUSED */ static boolean_t -process_secobj_init(secobj_db_state_t *ssp, char *buf, secobj_info_t *sip, - dladm_status_t *statusp) +process_secobj_init(dladm_handle_t handle, secobj_db_state_t *ssp, char *buf, + secobj_info_t *sip, dladm_status_t *statusp) { - *statusp = dladm_set_secobj(sip->si_name, *sip->si_classp, sip->si_val, - *sip->si_lenp, DLADM_OPT_ACTIVE | DLADM_OPT_CREATE); + *statusp = dladm_set_secobj(handle, sip->si_name, *sip->si_classp, + sip->si_val, *sip->si_lenp, + DLADM_OPT_ACTIVE | DLADM_OPT_CREATE); return (B_TRUE); } @@ -433,7 +416,7 @@ parse_secobj_val(char *buf, secobj_info_t *sip) } static boolean_t -process_secobj_line(secobj_db_state_t *ssp, char *buf, +process_secobj_line(dladm_handle_t handle, secobj_db_state_t *ssp, char *buf, dladm_status_t *statusp) { secobj_info_t sinfo; @@ -503,7 +486,7 @@ process_secobj_line(secobj_db_state_t *ssp, char *buf, if (parse_secobj_val(str, &sinfo) != 0) goto fail; - return ((*ssp->ss_op)(ssp, buf, &sinfo, statusp)); + return ((*ssp->ss_op)(handle, ssp, buf, &sinfo, statusp)); fail: /* @@ -514,7 +497,7 @@ fail: } static dladm_status_t -process_secobj_db(void *arg, FILE *fp, FILE *nfp) +process_secobj_db(dladm_handle_t handle, void *arg, FILE *fp, FILE *nfp) { secobj_db_state_t *ssp = arg; dladm_status_t status = DLADM_STATUS_OK; @@ -532,7 +515,7 @@ process_secobj_db(void *arg, FILE *fp, FILE *nfp) */ while (fgets(buf, MAXLINELEN, fp) != NULL) { if (cont) - cont = process_secobj_line(ssp, buf, &status); + cont = process_secobj_line(handle, ssp, buf, &status); if (nfp != NULL && buf[0] != '\0' && fputs(buf, nfp) == EOF) { status = dladm_errno2status(errno); @@ -547,7 +530,7 @@ process_secobj_db(void *arg, FILE *fp, FILE *nfp) * If the specified object is not found above, we add the * object to the configuration file. */ - (void) (*ssp->ss_op)(ssp, buf, NULL, &status); + (void) (*ssp->ss_op)(handle, ssp, buf, NULL, &status); if (status == DLADM_STATUS_OK && fputs(buf, nfp) == EOF) status = dladm_errno2status(errno); } @@ -559,13 +542,13 @@ process_secobj_db(void *arg, FILE *fp, FILE *nfp) return (status); } -#define SECOBJ_RW_DB(statep, writeop) \ - (i_dladm_rw_db("/etc/dladm/secobj.conf", S_IRUSR | S_IWUSR, \ +#define SECOBJ_RW_DB(handle, statep, writeop) \ + (i_dladm_rw_db(handle, "/etc/dladm/secobj.conf", S_IRUSR | S_IWUSR, \ process_secobj_db, (statep), (writeop))) static dladm_status_t -i_dladm_set_secobj_db(const char *obj_name, dladm_secobj_class_t class, - uint8_t *obj_val, uint_t obj_len) +i_dladm_set_secobj_db(dladm_handle_t handle, const char *obj_name, + dladm_secobj_class_t class, uint8_t *obj_val, uint_t obj_len) { secobj_db_state_t state; @@ -576,12 +559,12 @@ i_dladm_set_secobj_db(const char *obj_name, dladm_secobj_class_t class, state.ss_info.si_lenp = &obj_len; state.ss_namelist = NULL; - return (SECOBJ_RW_DB(&state, B_TRUE)); + return (SECOBJ_RW_DB(handle, &state, B_TRUE)); } static dladm_status_t -i_dladm_get_secobj_db(const char *obj_name, dladm_secobj_class_t *classp, - uint8_t *obj_val, uint_t *obj_lenp) +i_dladm_get_secobj_db(dladm_handle_t handle, const char *obj_name, + dladm_secobj_class_t *classp, uint8_t *obj_val, uint_t *obj_lenp) { secobj_db_state_t state; @@ -592,11 +575,11 @@ i_dladm_get_secobj_db(const char *obj_name, dladm_secobj_class_t *classp, state.ss_info.si_lenp = obj_lenp; state.ss_namelist = NULL; - return (SECOBJ_RW_DB(&state, B_FALSE)); + return (SECOBJ_RW_DB(handle, &state, B_FALSE)); } static dladm_status_t -i_dladm_unset_secobj_db(const char *obj_name) +i_dladm_unset_secobj_db(dladm_handle_t handle, const char *obj_name) { secobj_db_state_t state; @@ -607,11 +590,12 @@ i_dladm_unset_secobj_db(const char *obj_name) state.ss_info.si_lenp = NULL; state.ss_namelist = NULL; - return (SECOBJ_RW_DB(&state, B_TRUE)); + return (SECOBJ_RW_DB(handle, &state, B_TRUE)); } static dladm_status_t -i_dladm_walk_secobj_db(void *arg, boolean_t (*func)(void *, const char *)) +i_dladm_walk_secobj_db(dladm_handle_t handle, void *arg, + boolean_t (*func)(dladm_handle_t, void *, const char *)) { secobj_db_state_t state; secobj_name_t *snp = NULL, *fsnp; @@ -625,7 +609,7 @@ i_dladm_walk_secobj_db(void *arg, boolean_t (*func)(void *, const char *)) state.ss_info.si_lenp = NULL; state.ss_namelist = &snp; - status = SECOBJ_RW_DB(&state, B_FALSE); + status = SECOBJ_RW_DB(handle, &state, B_FALSE); if (status != DLADM_STATUS_OK) return (status); @@ -633,7 +617,7 @@ i_dladm_walk_secobj_db(void *arg, boolean_t (*func)(void *, const char *)) fsnp = snp; snp = snp->sn_next; if (cont) - cont = func(arg, fsnp->sn_name); + cont = func(handle, arg, fsnp->sn_name); free(fsnp->sn_name); free(fsnp); } @@ -641,7 +625,7 @@ i_dladm_walk_secobj_db(void *arg, boolean_t (*func)(void *, const char *)) } dladm_status_t -dladm_init_secobj(void) +dladm_init_secobj(dladm_handle_t handle) { secobj_db_state_t state; @@ -652,7 +636,7 @@ dladm_init_secobj(void) state.ss_info.si_lenp = NULL; state.ss_namelist = NULL; - return (SECOBJ_RW_DB(&state, B_FALSE)); + return (SECOBJ_RW_DB(handle, &state, B_FALSE)); } boolean_t diff --git a/usr/src/lib/libdlpi/common/libdlpi.c b/usr/src/lib/libdlpi/common/libdlpi.c index f53abef44e..14c4451081 100644 --- a/usr/src/lib/libdlpi/common/libdlpi.c +++ b/usr/src/lib/libdlpi/common/libdlpi.c @@ -96,6 +96,7 @@ dlpi_walk(dlpi_walkfunc_t *fn, void *arg, uint_t flags) struct i_dlpi_walklink_arg warg; struct dirent *d; DIR *dp; + dladm_handle_t handle; warg.fn = fn; warg.arg = arg; @@ -114,8 +115,18 @@ dlpi_walk(dlpi_walkfunc_t *fn, void *arg, uint_t flags) (void) closedir(dp); } else { - (void) dladm_walk(i_dlpi_walk_link, &warg, DATALINK_CLASS_ALL, - DATALINK_ANY_MEDIATYPE, DLADM_OPT_ACTIVE); + /* + * Rather than have libdlpi take the libdladm handle, + * open the handle here. + */ + if (dladm_open(&handle) != DLADM_STATUS_OK) + return; + + (void) dladm_walk(i_dlpi_walk_link, handle, &warg, + DATALINK_CLASS_ALL, DATALINK_ANY_MEDIATYPE, + DLADM_OPT_ACTIVE); + + dladm_close(handle); } } @@ -1062,6 +1073,7 @@ i_dlpi_open(const char *provider, int *fd, uint_t flags, boolean_t style1) char device[DLPI_LINKNAME_MAX]; datalink_id_t linkid; uint_t ppa; + dladm_handle_t handle; /* * This is not a valid style-1 name. It could be "ip" module @@ -1095,14 +1107,22 @@ i_dlpi_open(const char *provider, int *fd, uint_t flags, boolean_t style1) (void) snprintf(device, DLPI_LINKNAME_MAX, "%s%d", driver, ppa >= 1000 ? ppa % 1000 : ppa); - if (dladm_dev2linkid(device, &linkid) == DLADM_STATUS_OK) { + /* open libdladm handle rather than taking it as input */ + if (dladm_open(&handle) != DLADM_STATUS_OK) + return (DLPI_FAILURE); + + if (dladm_dev2linkid(handle, device, &linkid) == + DLADM_STATUS_OK) { dladm_phys_attr_t dpa; - if ((dladm_phys_info(linkid, &dpa, DLADM_OPT_ACTIVE)) == - DLADM_STATUS_OK && !dpa.dp_novanity) { + if ((dladm_phys_info(handle, linkid, &dpa, + DLADM_OPT_ACTIVE)) == DLADM_STATUS_OK && + !dpa.dp_novanity) { + dladm_close(handle); return (DLPI_ENOTSTYLE2); } } + dladm_close(handle); } fallback: |