diff options
Diffstat (limited to 'usr/src/lib/libdladm/common/libdlwlan.c')
-rw-r--r-- | usr/src/lib/libdladm/common/libdlwlan.c | 1358 |
1 files changed, 362 insertions, 996 deletions
diff --git a/usr/src/lib/libdladm/common/libdlwlan.c b/usr/src/lib/libdladm/common/libdlwlan.c index 3819dd5050..6597b84ce0 100644 --- a/usr/src/lib/libdladm/common/libdlwlan.c +++ b/usr/src/lib/libdladm/common/libdlwlan.c @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2007 Sun Microsystems, Inc. All rights reserved. + * Copyright 2008 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -28,163 +28,96 @@ #include <libintl.h> #include <stdio.h> #include <stdlib.h> -#include <stddef.h> #include <unistd.h> #include <fcntl.h> +#include <stddef.h> #include <string.h> #include <stropts.h> #include <libdevinfo.h> #include <net/if.h> #include <net/if_dl.h> #include <net/if_types.h> +#include <libdlpi.h> +#include <libdllink.h> #include <libscf.h> #include <libdlwlan.h> +#include <libdladm_impl.h> #include <libdlwlan_impl.h> #include <net/wpa.h> -typedef struct val_desc { - char *vd_name; - uint_t vd_val; -} val_desc_t; - -struct prop_desc; - -typedef dladm_status_t wl_pd_getf_t(int, wldp_t *, char **, uint_t *); -typedef dladm_status_t wl_pd_setf_t(int, wldp_t *, val_desc_t *, uint_t); -typedef dladm_status_t wl_pd_checkf_t(int, wldp_t *, struct prop_desc *, - char **, uint_t, val_desc_t **); -typedef struct prop_desc { - char *pd_name; - val_desc_t pd_defval; - val_desc_t *pd_modval; - uint_t pd_nmodval; - wl_pd_setf_t *pd_set; - wl_pd_getf_t *pd_getmod; - wl_pd_getf_t *pd_get; - wl_pd_checkf_t *pd_check; -} prop_desc_t; - -static int wpa_instance_create(const char *, void *); -static int wpa_instance_delete(const char *); - -static int do_get_bsstype(int, wldp_t *); -static int do_get_essid(int, wldp_t *); -static int do_get_bssid(int, wldp_t *); -static int do_get_signal(int, wldp_t *); -static int do_get_encryption(int, wldp_t *); -static int do_get_authmode(int, wldp_t *); -static int do_get_linkstatus(int, wldp_t *); -static int do_get_esslist(int, wldp_t *); -static int do_get_rate(int, wldp_t *); -static int do_get_phyconf(int, wldp_t *); -static int do_get_powermode(int, wldp_t *); -static int do_get_radio(int, wldp_t *); -static int do_get_mode(int, wldp_t *); -static int do_get_capability(int, wldp_t *); -static int do_get_wpamode(int, wldp_t *); - -static int do_set_bsstype(int, wldp_t *, dladm_wlan_bsstype_t *); -static int do_set_authmode(int, wldp_t *, dladm_wlan_auth_t *); -static int do_set_encryption(int, wldp_t *, dladm_wlan_secmode_t *); -static int do_set_essid(int, wldp_t *, dladm_wlan_essid_t *); -static int do_set_createibss(int, wldp_t *, boolean_t *); -static int do_set_key(int, wldp_t *, dladm_wlan_key_t *, uint_t); -static int do_set_rate(int, wldp_t *, dladm_wlan_rates_t *); -static int do_set_powermode(int, wldp_t *, dladm_wlan_powermode_t *); -static int do_set_radio(int, wldp_t *, dladm_wlan_radio_t *); -static int do_set_channel(int, wldp_t *, dladm_wlan_channel_t *); - -static int open_link(const char *); -static int do_scan(int, wldp_t *); -static int do_disconnect(const char *, int, wldp_t *); -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 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, wldp_t *); +static dladm_status_t do_get_essid(datalink_id_t, wldp_t *); +static dladm_status_t do_get_bssid(datalink_id_t, wldp_t *); +static dladm_status_t do_get_signal(datalink_id_t, wldp_t *); +static dladm_status_t do_get_encryption(datalink_id_t, wldp_t *); +static dladm_status_t do_get_authmode(datalink_id_t, wldp_t *); +static dladm_status_t do_get_linkstatus(datalink_id_t, wldp_t *); +static dladm_status_t do_get_esslist(datalink_id_t, wldp_t *); +static dladm_status_t do_get_rate(datalink_id_t, wldp_t *); +static dladm_status_t do_get_mode(datalink_id_t, wldp_t *); +static dladm_status_t do_get_capability(datalink_id_t, wldp_t *); +static dladm_status_t do_get_wpamode(datalink_id_t, wldp_t *); + +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 do_scan(datalink_id_t, wldp_t *); +static dladm_status_t do_connect(datalink_id_t, wldp_t *, dladm_wlan_attr_t *, + boolean_t, void *, uint_t, int); +static dladm_status_t do_disconnect(datalink_id_t, wldp_t *); +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 wl_pd_getf_t do_get_rate_mod, do_get_rate_prop, do_get_channel_prop, - do_get_powermode_prop, do_get_radio_prop; -static wl_pd_setf_t do_set_rate_prop, do_set_powermode_prop, - do_set_radio_prop; -static wl_pd_checkf_t do_check_prop, do_check_rate; +static dladm_status_t dladm_wlan_validate(datalink_id_t); static val_desc_t linkstatus_vals[] = { - { "disconnected", DLADM_WLAN_LINKSTATUS_DISCONNECTED }, - { "connected", DLADM_WLAN_LINKSTATUS_CONNECTED } + { "disconnected", DLADM_WLAN_LINK_DISCONNECTED }, + { "connected", DLADM_WLAN_LINK_CONNECTED } }; static val_desc_t secmode_vals[] = { - { "none", DLADM_WLAN_SECMODE_NONE }, - { "wep", DLADM_WLAN_SECMODE_WEP }, - { "wpa", DLADM_WLAN_SECMODE_WPA } + { "none", DLADM_WLAN_SECMODE_NONE }, + { "wep", DLADM_WLAN_SECMODE_WEP }, + { "wpa", DLADM_WLAN_SECMODE_WPA } }; static val_desc_t strength_vals[] = { - { "very weak", DLADM_WLAN_STRENGTH_VERY_WEAK }, - { "weak", DLADM_WLAN_STRENGTH_WEAK }, - { "good", DLADM_WLAN_STRENGTH_GOOD }, - { "very good", DLADM_WLAN_STRENGTH_VERY_GOOD }, - { "excellent", DLADM_WLAN_STRENGTH_EXCELLENT } + { "very weak", DLADM_WLAN_STRENGTH_VERY_WEAK }, + { "weak", DLADM_WLAN_STRENGTH_WEAK }, + { "good", DLADM_WLAN_STRENGTH_GOOD }, + { "very good", DLADM_WLAN_STRENGTH_VERY_GOOD}, + { "excellent", DLADM_WLAN_STRENGTH_EXCELLENT} }; static val_desc_t mode_vals[] = { - { "a", DLADM_WLAN_MODE_80211A }, - { "b", DLADM_WLAN_MODE_80211B }, - { "g", DLADM_WLAN_MODE_80211G }, + { "a", DLADM_WLAN_MODE_80211A }, + { "b", DLADM_WLAN_MODE_80211B }, + { "g", DLADM_WLAN_MODE_80211G }, }; static val_desc_t auth_vals[] = { - { "open", DLADM_WLAN_AUTH_OPEN }, - { "shared", DLADM_WLAN_AUTH_SHARED } + { "open", DLADM_WLAN_AUTH_OPEN }, + { "shared", DLADM_WLAN_AUTH_SHARED } }; static val_desc_t bsstype_vals[] = { - { "bss", DLADM_WLAN_BSSTYPE_BSS }, - { "ibss", DLADM_WLAN_BSSTYPE_IBSS }, - { "any", DLADM_WLAN_BSSTYPE_ANY } -}; - -static val_desc_t radio_vals[] = { - { "on", DLADM_WLAN_RADIO_ON }, - { "off", DLADM_WLAN_RADIO_OFF } -}; - -static val_desc_t powermode_vals[] = { - { "off", DLADM_WLAN_PM_OFF }, - { "fast", DLADM_WLAN_PM_FAST }, - { "max", DLADM_WLAN_PM_MAX } + { "bss", DLADM_WLAN_BSSTYPE_BSS }, + { "ibss", DLADM_WLAN_BSSTYPE_IBSS }, + { "any", DLADM_WLAN_BSSTYPE_ANY } }; -#define VALCNT(vals) (sizeof ((vals)) / sizeof (val_desc_t)) -static prop_desc_t prop_table[] = { - - { "channel", { NULL, 0 }, NULL, 0, - NULL, NULL, do_get_channel_prop, do_check_prop}, - - { "powermode", { "off", DLADM_WLAN_PM_OFF }, powermode_vals, - VALCNT(powermode_vals), - do_set_powermode_prop, NULL, - do_get_powermode_prop, do_check_prop}, - - { "radio", { "on", DLADM_WLAN_RADIO_ON }, radio_vals, - VALCNT(radio_vals), - do_set_radio_prop, NULL, - do_get_radio_prop, do_check_prop}, - - { "speed", { "", 0 }, NULL, 0, - do_set_rate_prop, do_get_rate_mod, - do_get_rate_prop, do_check_rate} -}; -/* - * Unfortunately, MAX_SCAN_SUPPORT_RATES is too small to allow all - * rates to be retrieved. However, we cannot increase it at this - * time because it will break binary comatibility with unbundled - * WiFi drivers and utilities. So for now we define an additional - * constant, MAX_SUPPORT_RATES, to allow all rates to be retrieved. - */ -#define MAX_SUPPORT_RATES 64 -#define DLADM_WLAN_MAX_PROPS (sizeof (prop_table) / sizeof (prop_desc_t)) #define IS_CONNECTED(gbuf) \ ((*(wl_linkstatus_t *)((gbuf)->wldp_buf) == WL_CONNECTED)) @@ -209,38 +142,6 @@ dladm_wlan_wlresult2status(wldp_t *gbuf) return (DLADM_STATUS_FAILED); } -static int -open_link(const char *link) -{ - char linkname[MAXPATHLEN]; - wldp_t *gbuf; - int fd; - - if (link == NULL) - return (-1); - - (void) snprintf(linkname, MAXPATHLEN, "/dev/%s", link); - if ((fd = open(linkname, O_RDWR)) < 0) - return (-1); - - if ((gbuf = malloc(MAX_BUF_LEN)) == NULL) { - (void) close(fd); - return (-1); - } - - /* - * Check to see if the link is wireless. - */ - if (do_get_bsstype(fd, gbuf) < 0) { - free(gbuf); - (void) close(fd); - return (-1); - } - - free(gbuf); - return (fd); -} - static dladm_wlan_mode_t do_convert_mode(wl_phy_conf_t *phyp) { @@ -259,8 +160,8 @@ do_convert_mode(wl_phy_conf_t *phyp) return (DLADM_WLAN_MODE_NONE); } -static boolean_t -do_convert_chan(wl_phy_conf_t *phyp, uint32_t *channelp) +boolean_t +i_dladm_wlan_convert_chan(wl_phy_conf_t *phyp, uint32_t *channelp) { wl_fhss_t *wlfp = &phyp->wl_phy_fhss_conf; wl_ofdm_t *wlop = &phyp->wl_phy_ofdm_conf; @@ -326,16 +227,16 @@ fill_wlan_attr(wl_ess_conf_t *wlp, dladm_wlan_attr_t *attrp) if (attrp->wa_speed > 0) attrp->wa_valid |= DLADM_WLAN_ATTR_SPEED; - if (do_convert_chan((wl_phy_conf_t *)&wlp->wl_phy_conf, + if (i_dladm_wlan_convert_chan((wl_phy_conf_t *)&wlp->wl_phy_conf, &attrp->wa_channel)) attrp->wa_valid |= DLADM_WLAN_ATTR_CHANNEL; } dladm_status_t -dladm_wlan_scan(const char *link, void *arg, +dladm_wlan_scan(datalink_id_t linkid, void *arg, boolean_t (*func)(void *, dladm_wlan_attr_t *)) { - int fd, i; + int i; uint32_t count; wl_ess_conf_t *wlp; wldp_t *gbuf; @@ -343,34 +244,28 @@ dladm_wlan_scan(const char *link, void *arg, dladm_status_t status; boolean_t connected; - if ((fd = open_link(link)) < 0) - return (DLADM_STATUS_LINKINVAL); + if ((status = dladm_wlan_validate(linkid)) != DLADM_STATUS_OK) + goto done; if ((gbuf = malloc(MAX_BUF_LEN)) == NULL) { status = DLADM_STATUS_NOMEM; goto done; } - if (do_get_linkstatus(fd, gbuf) < 0) { - status = DLADM_STATUS_FAILED; + if ((status = do_get_linkstatus(linkid, gbuf)) != DLADM_STATUS_OK) goto done; - } connected = IS_CONNECTED(gbuf); - if (do_scan(fd, gbuf) < 0) { - status = DLADM_STATUS_FAILED; + if ((status = do_scan(linkid, gbuf)) != DLADM_STATUS_OK) goto done; - } if (func == NULL) { status = DLADM_STATUS_OK; goto done; } - if (do_get_esslist(fd, gbuf) < 0) { - status = DLADM_STATUS_FAILED; + if ((status = do_get_esslist(linkid, gbuf)) != DLADM_STATUS_OK) goto done; - } wlp = ((wl_ess_list_t *)gbuf->wldp_buf)->wl_ess_list_ess; count = ((wl_ess_list_t *)(gbuf->wldp_buf))->wl_ess_list_num; @@ -382,18 +277,16 @@ dladm_wlan_scan(const char *link, void *arg, } if (!connected) { - if (do_get_linkstatus(fd, gbuf) < 0) { - status = DLADM_STATUS_FAILED; + status = do_get_linkstatus(linkid, gbuf); + if (status != DLADM_STATUS_OK) goto done; - } if (IS_CONNECTED(gbuf)) - (void) do_disconnect(link, fd, gbuf); + (void) do_disconnect(linkid, gbuf); } status = DLADM_STATUS_OK; done: free(gbuf); - (void) close(fd); return (status); } @@ -507,51 +400,61 @@ append: #define IEEE80211_C_WPA 0x01800000 static dladm_status_t -do_connect(const char *link, int fd, wldp_t *gbuf, dladm_wlan_attr_t *attrp, +do_connect(datalink_id_t linkid, wldp_t *gbuf, dladm_wlan_attr_t *attrp, boolean_t create_ibss, void *keys, uint_t key_count, int timeout) { - dladm_wlan_secmode_t secmode; - dladm_wlan_auth_t authmode; - dladm_wlan_bsstype_t bsstype; - dladm_wlan_essid_t essid; - boolean_t essid_valid = B_FALSE; - dladm_wlan_channel_t channel; - hrtime_t start; - wl_capability_t *caps; + dladm_wlan_secmode_t secmode; + dladm_wlan_auth_t authmode; + dladm_wlan_bsstype_t bsstype; + dladm_wlan_essid_t essid; + boolean_t essid_valid = B_FALSE; + dladm_status_t status; + dladm_wlan_channel_t channel; + hrtime_t start; + wl_capability_t *caps; if ((attrp->wa_valid & DLADM_WLAN_ATTR_CHANNEL) != 0) { channel = attrp->wa_channel; - if (do_set_channel(fd, gbuf, &channel) < 0) + status = do_set_channel(linkid, &channel); + if (status != DLADM_STATUS_OK) goto fail; } secmode = ((attrp->wa_valid & DLADM_WLAN_ATTR_SECMODE) != 0) ? attrp->wa_secmode : DLADM_WLAN_SECMODE_NONE; - if (do_set_encryption(fd, gbuf, &secmode) < 0) + if ((status = do_set_encryption(linkid, &secmode)) != DLADM_STATUS_OK) goto fail; authmode = ((attrp->wa_valid & DLADM_WLAN_ATTR_AUTH) != 0) ? attrp->wa_auth : DLADM_WLAN_AUTH_OPEN; - if (do_set_authmode(fd, gbuf, &authmode) < 0) + if ((status = do_set_authmode(linkid, &authmode)) != DLADM_STATUS_OK) goto fail; bsstype = ((attrp->wa_valid & DLADM_WLAN_ATTR_BSSTYPE) != 0) ? attrp->wa_bsstype : DLADM_WLAN_BSSTYPE_BSS; - if (do_set_bsstype(fd, gbuf, &bsstype) < 0) + if ((status = do_set_bsstype(linkid, &bsstype)) != DLADM_STATUS_OK) goto fail; if (secmode == DLADM_WLAN_SECMODE_WEP) { - if (keys == NULL || key_count == 0 || key_count > MAX_NWEPKEYS) - return (DLADM_STATUS_BADARG); - if (do_set_key(fd, gbuf, keys, key_count) < 0) + if (keys == NULL || key_count == 0 || + key_count > MAX_NWEPKEYS) { + status = DLADM_STATUS_BADARG; + goto fail; + } + status = do_set_key(linkid, keys, key_count); + if (status != DLADM_STATUS_OK) goto fail; } else if (secmode == DLADM_WLAN_SECMODE_WPA) { - if (keys == NULL || key_count == 0 || key_count > MAX_NWEPKEYS) - return (DLADM_STATUS_BADARG); - if (do_get_capability(fd, gbuf) < 0) + if (keys == NULL || key_count == 0 || + key_count > MAX_NWEPKEYS) { + status = DLADM_STATUS_BADARG; + goto fail; + } + status = do_get_capability(linkid, gbuf); + if (status != DLADM_STATUS_OK) goto fail; caps = (wl_capability_t *)(gbuf->wldp_buf); if ((caps->caps & IEEE80211_C_WPA) == 0) @@ -559,10 +462,12 @@ do_connect(const char *link, int fd, wldp_t *gbuf, dladm_wlan_attr_t *attrp, } if (create_ibss) { - if (do_set_channel(fd, gbuf, &channel) < 0) + status = do_set_channel(linkid, &channel); + if (status != DLADM_STATUS_OK) goto fail; - if (do_set_createibss(fd, gbuf, &create_ibss) < 0) + status = do_set_createibss(linkid, &create_ibss); + if (status != DLADM_STATUS_OK) goto fail; if ((attrp->wa_valid & DLADM_WLAN_ATTR_ESSID) == 0) { @@ -576,9 +481,12 @@ do_connect(const char *link, int fd, wldp_t *gbuf, dladm_wlan_attr_t *attrp, essid_valid = B_TRUE; } - if (!essid_valid) - return (DLADM_STATUS_FAILED); - if (do_set_essid(fd, gbuf, &essid) < 0) + if (!essid_valid) { + status = DLADM_STATUS_FAILED; + goto fail; + } + + if ((status = do_set_essid(linkid, &essid)) != DLADM_STATUS_OK) goto fail; /* @@ -586,11 +494,12 @@ do_connect(const char *link, int fd, wldp_t *gbuf, dladm_wlan_attr_t *attrp, * we need call do_set_essid() first, then call wpa_instance_create(). */ if (secmode == DLADM_WLAN_SECMODE_WPA && keys != NULL) - (void) wpa_instance_create(link, keys); + (void) wpa_instance_create(linkid, keys); start = gethrtime(); for (;;) { - if (do_get_linkstatus(fd, gbuf) < 0) + status = do_get_linkstatus(linkid, gbuf); + if (status != DLADM_STATUS_OK) goto fail; if (IS_CONNECTED(gbuf)) @@ -598,38 +507,38 @@ do_connect(const char *link, int fd, wldp_t *gbuf, dladm_wlan_attr_t *attrp, (void) poll(NULL, 0, DLADM_WLAN_CONNECT_POLLRATE); if ((timeout >= 0) && (gethrtime() - start) / - NANOSEC >= timeout) - return (DLADM_STATUS_TIMEDOUT); + NANOSEC >= timeout) { + status = DLADM_STATUS_TIMEDOUT; + goto fail; + } } - return (DLADM_STATUS_OK); + status = DLADM_STATUS_OK; fail: - return (dladm_wlan_wlresult2status(gbuf)); + return (status); } dladm_status_t -dladm_wlan_connect(const char *link, dladm_wlan_attr_t *attrp, +dladm_wlan_connect(datalink_id_t linkid, dladm_wlan_attr_t *attrp, int timeout, void *keys, uint_t key_count, uint_t flags) { - int fd, i; + int i; wldp_t *gbuf = NULL; connect_state_t state = {0, NULL, NULL}; attr_node_t *nodep = NULL; boolean_t create_ibss, set_authmode; dladm_wlan_attr_t **wl_list = NULL; - dladm_status_t status = DLADM_STATUS_FAILED; + dladm_status_t status; - if ((fd = open_link(link)) < 0) - return (DLADM_STATUS_LINKINVAL); + if ((status = dladm_wlan_validate(linkid)) != DLADM_STATUS_OK) + goto done; if ((gbuf = malloc(MAX_BUF_LEN)) == NULL) { status = DLADM_STATUS_NOMEM; goto done; } - if (do_get_linkstatus(fd, gbuf) < 0) { - status = DLADM_STATUS_FAILED; + if ((status = do_get_linkstatus(linkid, gbuf)) != DLADM_STATUS_OK) goto done; - } if (IS_CONNECTED(gbuf)) { status = DLADM_STATUS_ISCONN; @@ -646,8 +555,8 @@ dladm_wlan_connect(const char *link, 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(link, fd, gbuf, attrp, - create_ibss, keys, key_count, timeout); + status = do_connect(linkid, gbuf, attrp, create_ibss, keys, + key_count, timeout); goto done; } @@ -655,7 +564,7 @@ dladm_wlan_connect(const char *link, dladm_wlan_attr_t *attrp, state.cs_list = NULL; state.cs_count = 0; - status = dladm_wlan_scan(link, &state, connect_cb); + status = dladm_wlan_scan(linkid, &state, connect_cb); if (status != DLADM_STATUS_OK) goto done; @@ -664,8 +573,8 @@ dladm_wlan_connect(const char *link, dladm_wlan_attr_t *attrp, status = DLADM_STATUS_NOTFOUND; goto done; } - status = do_connect(link, fd, gbuf, attrp, create_ibss, - keys, key_count, timeout); + status = do_connect(linkid, gbuf, attrp, create_ibss, keys, + key_count, timeout); goto done; } @@ -686,7 +595,7 @@ dladm_wlan_connect(const char *link, dladm_wlan_attr_t *attrp, for (i = 0; i < state.cs_count; i++) { dladm_wlan_attr_t *ap = wl_list[i]; - status = do_connect(link, fd, gbuf, ap, create_ibss, keys, + status = do_connect(linkid, gbuf, ap, create_ibss, keys, key_count, timeout); if (status == DLADM_STATUS_OK) break; @@ -694,15 +603,15 @@ dladm_wlan_connect(const char *link, 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(link, fd, gbuf, ap, create_ibss, - keys, key_count, timeout); + status = do_connect(linkid, gbuf, ap, create_ibss, keys, + key_count, timeout); if (status == DLADM_STATUS_OK) break; } } done: if ((status != DLADM_STATUS_OK) && (status != DLADM_STATUS_ISCONN)) - (void) do_disconnect(link, fd, gbuf); + (void) do_disconnect(linkid, gbuf); while (state.cs_list != NULL) { nodep = state.cs_list; @@ -711,44 +620,36 @@ done: } free(gbuf); free(wl_list); - (void) close(fd); return (status); } dladm_status_t -dladm_wlan_disconnect(const char *link) +dladm_wlan_disconnect(datalink_id_t linkid) { - int fd; wldp_t *gbuf; dladm_status_t status; - if ((fd = open_link(link)) < 0) - return (DLADM_STATUS_BADARG); + if ((status = dladm_wlan_validate(linkid)) != DLADM_STATUS_OK) + return (status); if ((gbuf = malloc(MAX_BUF_LEN)) == NULL) { status = DLADM_STATUS_NOMEM; goto done; } - if (do_get_linkstatus(fd, gbuf) < 0) { - status = DLADM_STATUS_FAILED; + if ((status = do_get_linkstatus(linkid, gbuf)) != DLADM_STATUS_OK) goto done; - } if (!IS_CONNECTED(gbuf)) { status = DLADM_STATUS_NOTCONN; goto done; } - if (do_disconnect(link, fd, gbuf) < 0) { - status = DLADM_STATUS_FAILED; + if ((status = do_disconnect(linkid, gbuf)) != DLADM_STATUS_OK) goto done; - } - if (do_get_linkstatus(fd, gbuf) < 0) { - status = DLADM_STATUS_FAILED; + if ((status = do_get_linkstatus(linkid, gbuf)) != DLADM_STATUS_OK) goto done; - } if (IS_CONNECTED(gbuf)) { status = DLADM_STATUS_FAILED; @@ -758,85 +659,12 @@ dladm_wlan_disconnect(const char *link) status = DLADM_STATUS_OK; done: free(gbuf); - (void) close(fd); return (status); } -typedef struct dladm_wlan_linkname { - char wl_name[MAXNAMELEN]; - struct dladm_wlan_linkname *wl_next; -} dladm_wlan_linkname_t; - -typedef struct dladm_wlan_walk { - dladm_wlan_linkname_t *ww_list; - dladm_status_t ww_status; -} dladm_wlan_walk_t; - -/* ARGSUSED */ -static int -append_linkname(di_node_t node, di_minor_t minor, void *arg) -{ - dladm_wlan_walk_t *statep = arg; - dladm_wlan_linkname_t **lastp = &statep->ww_list; - dladm_wlan_linkname_t *wlp = *lastp; - char name[MAXNAMELEN]; - - (void) snprintf(name, MAXNAMELEN, "%s%d", - di_driver_name(node), di_instance(node)); - - while (wlp != NULL) { - if (strcmp(wlp->wl_name, name) == 0) - return (DI_WALK_CONTINUE); - - lastp = &wlp->wl_next; - wlp = wlp->wl_next; - } - if ((wlp = malloc(sizeof (*wlp))) == NULL) { - statep->ww_status = DLADM_STATUS_NOMEM; - return (DI_WALK_CONTINUE); - } - - (void) strlcpy(wlp->wl_name, name, MAXNAMELEN); - wlp->wl_next = NULL; - *lastp = wlp; - - return (DI_WALK_CONTINUE); -} - -dladm_status_t -dladm_wlan_walk(void *arg, boolean_t (*func)(void *, const char *)) -{ - di_node_t root; - dladm_wlan_walk_t state; - dladm_wlan_linkname_t *wlp, *wlp_next; - boolean_t cont = B_TRUE; - - if ((root = di_init("/", DINFOCACHE)) == DI_NODE_NIL) - return (DLADM_STATUS_FAILED); - - state.ww_list = NULL; - state.ww_status = DLADM_STATUS_OK; - (void) di_walk_minor(root, DDI_NT_NET_WIFI, DI_CHECK_ALIAS, - &state, append_linkname); - di_fini(root); - - for (wlp = state.ww_list; wlp != NULL; wlp = wlp_next) { - /* - * NOTE: even if (*func)() returns B_FALSE, the loop continues - * since all memory must be freed. - */ - if (cont) - cont = (*func)(arg, wlp->wl_name); - wlp_next = wlp->wl_next; - free(wlp); - } - return (state.ww_status); -} - dladm_status_t -dladm_wlan_get_linkattr(const char *link, dladm_wlan_linkattr_t *attrp) +dladm_wlan_get_linkattr(datalink_id_t linkid, dladm_wlan_linkattr_t *attrp) { - int fd; wldp_t *gbuf; wl_rssi_t signal; wl_bss_type_t bsstype; @@ -844,13 +672,13 @@ dladm_wlan_get_linkattr(const char *link, dladm_wlan_linkattr_t *attrp) wl_encryption_t encryption; wl_rates_t *ratesp; dladm_wlan_attr_t *wl_attrp; - dladm_status_t status = DLADM_STATUS_FAILED; + dladm_status_t status; if (attrp == NULL) return (DLADM_STATUS_BADARG); - if ((fd = open_link(link)) < 0) - return (DLADM_STATUS_LINKINVAL); + if ((status = dladm_wlan_validate(linkid)) != DLADM_STATUS_OK) + goto done; if ((gbuf = malloc(MAX_BUF_LEN)) == NULL) { status = DLADM_STATUS_NOMEM; @@ -860,17 +688,16 @@ dladm_wlan_get_linkattr(const char *link, dladm_wlan_linkattr_t *attrp) (void) memset(attrp, 0, sizeof (*attrp)); wl_attrp = &attrp->la_wlan_attr; - if (do_get_linkstatus(fd, gbuf) < 0) + if ((status = do_get_linkstatus(linkid, gbuf)) != DLADM_STATUS_OK) goto done; attrp->la_valid |= DLADM_WLAN_LINKATTR_STATUS; - if (!IS_CONNECTED(gbuf)) { - attrp->la_status = DLADM_WLAN_LINKSTATUS_DISCONNECTED; - } else { - attrp->la_status = DLADM_WLAN_LINKSTATUS_CONNECTED; - } + if (!IS_CONNECTED(gbuf)) + attrp->la_status = DLADM_WLAN_LINK_DISCONNECTED; + else + attrp->la_status = DLADM_WLAN_LINK_CONNECTED; - if (do_get_essid(fd, gbuf) < 0) + if ((status = do_get_essid(linkid, gbuf)) != DLADM_STATUS_OK) goto done; (void) strlcpy(wl_attrp->wa_essid.we_bytes, @@ -879,7 +706,7 @@ dladm_wlan_get_linkattr(const char *link, dladm_wlan_linkattr_t *attrp) wl_attrp->wa_valid |= DLADM_WLAN_ATTR_ESSID; - if (do_get_bssid(fd, gbuf) < 0) + if ((status = do_get_bssid(linkid, gbuf)) != DLADM_STATUS_OK) goto done; (void) memcpy(wl_attrp->wa_bssid.wb_bytes, gbuf->wldp_buf, @@ -887,13 +714,13 @@ dladm_wlan_get_linkattr(const char *link, dladm_wlan_linkattr_t *attrp) wl_attrp->wa_valid |= DLADM_WLAN_ATTR_BSSID; - if (attrp->la_status == DLADM_WLAN_LINKSTATUS_DISCONNECTED) { + if (attrp->la_status == DLADM_WLAN_LINK_DISCONNECTED) { attrp->la_valid |= DLADM_WLAN_LINKATTR_WLAN; status = DLADM_STATUS_OK; goto done; } - if (do_get_encryption(fd, gbuf) < 0) + if ((status = do_get_encryption(linkid, gbuf)) != DLADM_STATUS_OK) goto done; encryption = *(wl_encryption_t *)(gbuf->wldp_buf); @@ -914,14 +741,14 @@ dladm_wlan_get_linkattr(const char *link, dladm_wlan_linkattr_t *attrp) break; } - if (do_get_signal(fd, gbuf) < 0) + if ((status = do_get_signal(linkid, gbuf)) != DLADM_STATUS_OK) goto done; signal = *(wl_rssi_t *)(gbuf->wldp_buf); wl_attrp->wa_valid |= DLADM_WLAN_ATTR_STRENGTH; wl_attrp->wa_strength = DLADM_WLAN_SIGNAL2STRENGTH(signal); - if (do_get_rate(fd, gbuf) < 0) + if ((status = do_get_rate(linkid, gbuf)) != DLADM_STATUS_OK) goto done; ratesp = (wl_rates_t *)(gbuf->wldp_buf); @@ -936,7 +763,7 @@ dladm_wlan_get_linkattr(const char *link, dladm_wlan_linkattr_t *attrp) wl_attrp->wa_valid |= DLADM_WLAN_ATTR_SPEED; } - if (do_get_authmode(fd, gbuf) < 0) + if ((status = do_get_authmode(linkid, gbuf)) != DLADM_STATUS_OK) goto done; authmode = *(wl_authmode_t *)(gbuf->wldp_buf); @@ -954,7 +781,7 @@ dladm_wlan_get_linkattr(const char *link, dladm_wlan_linkattr_t *attrp) break; } - if (do_get_bsstype(fd, gbuf) < 0) + if ((status = do_get_bsstype(linkid, gbuf)) != DLADM_STATUS_OK) goto done; bsstype = *(wl_bss_type_t *)(gbuf->wldp_buf); @@ -975,7 +802,7 @@ dladm_wlan_get_linkattr(const char *link, dladm_wlan_linkattr_t *attrp) break; } - if (do_get_mode(fd, gbuf) < 0) + if ((status = do_get_mode(linkid, gbuf)) != DLADM_STATUS_OK) goto done; wl_attrp->wa_mode = do_convert_mode((wl_phy_conf_t *)(gbuf->wldp_buf)); @@ -988,231 +815,30 @@ dladm_wlan_get_linkattr(const char *link, dladm_wlan_linkattr_t *attrp) done: free(gbuf); - (void) close(fd); return (status); } -boolean_t -dladm_wlan_is_valid(const char *link) -{ - int fd = open_link(link); - - if (fd < 0) - return (B_FALSE); - - (void) close(fd); - return (B_TRUE); -} - -/* ARGSUSED */ -static dladm_status_t -do_check_prop(int fd, wldp_t *guf, prop_desc_t *pdp, char **prop_val, - uint_t val_cnt, val_desc_t **vdpp) -{ - int i; - val_desc_t *vdp; - - if (pdp->pd_nmodval == 0) - return (DLADM_STATUS_PROPRDONLY); - - if (val_cnt != 1) - return (DLADM_STATUS_BADVALCNT); - - for (i = 0; i < pdp->pd_nmodval; i++) - if (strcasecmp(*prop_val, pdp->pd_modval[i].vd_name) == 0) - break; - - if (i == pdp->pd_nmodval) - return (DLADM_STATUS_BADVAL); - - vdp = malloc(sizeof (val_desc_t)); - if (vdp == NULL) - return (DLADM_STATUS_NOMEM); - - (void) memcpy(vdp, &pdp->pd_modval[i], sizeof (val_desc_t)); - *vdpp = vdp; - return (DLADM_STATUS_OK); -} - static dladm_status_t -do_set_prop(int fd, wldp_t *gbuf, prop_desc_t *pdp, - char **prop_val, uint_t val_cnt) +dladm_wlan_validate(datalink_id_t linkid) { + wldp_t *gbuf; dladm_status_t status; - val_desc_t *vdp = NULL; - uint_t cnt; - - if (pdp->pd_set == NULL) - return (DLADM_STATUS_PROPRDONLY); - - if (prop_val != NULL) { - status = pdp->pd_check(fd, gbuf, pdp, prop_val, - val_cnt, &vdp); - - if (status != DLADM_STATUS_OK) - return (status); - - cnt = val_cnt; - } else { - if (pdp->pd_defval.vd_name == NULL) - return (DLADM_STATUS_NOTSUP); - - if ((vdp = malloc(sizeof (val_desc_t))) == NULL) - return (DLADM_STATUS_NOMEM); - - *vdp = pdp->pd_defval; - cnt = 1; - } - status = pdp->pd_set(fd, gbuf, vdp, cnt); - if (status == DLADM_STATUS_OK) { - /* - * Some ioctls return 0 but store error code in - * wldp_result. Need to fix them. - */ - if (gbuf->wldp_result != WL_SUCCESS) - status = dladm_wlan_wlresult2status(gbuf); - } - free(vdp); - return (status); -} - -dladm_status_t -dladm_wlan_set_prop(const char *link, const char *prop_name, - char **prop_val, uint_t val_cnt, char **errprop) -{ - int fd, i; - wldp_t *gbuf = NULL; - boolean_t found = B_FALSE; - dladm_status_t status = DLADM_STATUS_OK; - - if ((prop_name == NULL && prop_val != NULL) || - (prop_val != NULL && val_cnt == 0)) - return (DLADM_STATUS_BADARG); - - if ((fd = open_link(link)) < 0) - return (DLADM_STATUS_LINKINVAL); if ((gbuf = malloc(MAX_BUF_LEN)) == NULL) { status = DLADM_STATUS_NOMEM; goto done; } - for (i = 0; i < DLADM_WLAN_MAX_PROPS; i++) { - prop_desc_t *pdp = &prop_table[i]; - dladm_status_t s; - - if (prop_name != NULL && - (strcasecmp(prop_name, pdp->pd_name) != 0)) - continue; - - found = B_TRUE; - s = do_set_prop(fd, gbuf, pdp, prop_val, val_cnt); - - if (prop_name != NULL) { - status = s; - break; - } else { - if (s != DLADM_STATUS_OK && - s != DLADM_STATUS_NOTSUP) { - if (errprop != NULL) - *errprop = pdp->pd_name; - status = s; - break; - } - } - } - if (!found) - status = DLADM_STATUS_NOTFOUND; -done: - free(gbuf); - (void) close(fd); - return (status); -} - -/* ARGSUSED */ -dladm_status_t -dladm_wlan_walk_prop(const char *link, void *arg, - boolean_t (*func)(void *, const char *)) -{ - int i; - - for (i = 0; i < DLADM_WLAN_MAX_PROPS; i++) { - if (!func(arg, prop_table[i].pd_name)) - break; - } - return (DLADM_STATUS_OK); -} - -dladm_status_t -dladm_wlan_get_prop(const char *link, dladm_prop_type_t type, - const char *prop_name, char **prop_val, uint_t *val_cnt) -{ - int fd; - int i; - wldp_t *gbuf; - dladm_status_t status; - uint_t cnt; - prop_desc_t *pdp; - - if (prop_val == NULL || val_cnt == NULL || *val_cnt == 0) - return (DLADM_STATUS_BADARG); - - for (i = 0; i < DLADM_WLAN_MAX_PROPS; i++) - if (strcasecmp(prop_name, prop_table[i].pd_name) == 0) - break; - - if (i == DLADM_WLAN_MAX_PROPS) - return (DLADM_STATUS_NOTFOUND); - - if ((fd = open_link(link)) < 0) - return (DLADM_STATUS_LINKINVAL); - - if ((gbuf = malloc(MAX_BUF_LEN)) == NULL) { - status = DLADM_STATUS_NOMEM; + /* + * Check to see if the link is wireless. + */ + if ((status = do_get_bsstype(linkid, gbuf)) != DLADM_STATUS_OK) { + status = DLADM_STATUS_LINKINVAL; goto done; } - pdp = &prop_table[i]; - status = DLADM_STATUS_OK; - switch (type) { - case DLADM_PROP_VAL_CURRENT: - status = pdp->pd_get(fd, gbuf, prop_val, val_cnt); - break; - - case DLADM_PROP_VAL_DEFAULT: - if (pdp->pd_defval.vd_name == NULL) { - status = DLADM_STATUS_NOTSUP; - break; - } - (void) strcpy(*prop_val, pdp->pd_defval.vd_name); - *val_cnt = 1; - break; - - case DLADM_PROP_VAL_MODIFIABLE: - if (pdp->pd_getmod != NULL) { - status = pdp->pd_getmod(fd, gbuf, prop_val, val_cnt); - break; - } - cnt = pdp->pd_nmodval; - if (cnt == 0) { - status = DLADM_STATUS_NOTSUP; - } else if (cnt > *val_cnt) { - status = DLADM_STATUS_TOOSMALL; - } else { - for (i = 0; i < cnt; i++) { - (void) strcpy(prop_val[i], - pdp->pd_modval[i].vd_name); - } - *val_cnt = cnt; - } - break; - default: - status = DLADM_STATUS_BADARG; - break; - } done: free(gbuf); - (void) close(fd); return (status); } @@ -1422,19 +1048,45 @@ dladm_wlan_str2linkstatus(const char *str, dladm_wlan_linkstatus_t *linkstatus) { uint_t val; - if (!find_val_by_name(str, linkstatus_vals, VALCNT(linkstatus_vals), - &val)) + if (!find_val_by_name(str, linkstatus_vals, + VALCNT(linkstatus_vals), &val)) { return (DLADM_STATUS_BADARG); + } *linkstatus = (dladm_wlan_linkstatus_t)val; return (DLADM_STATUS_OK); } -static int -do_ioctl(int fd, wldp_t *gbuf, uint_t id, size_t len, uint_t cmd, size_t cmdlen) +dladm_status_t +i_dladm_wlan_ioctl(datalink_id_t linkid, wldp_t *gbuf, uint_t id, size_t len, + uint_t cmd, size_t cmdlen) { - int rc; + char linkname[MAXPATHLEN]; + int fd, rc; struct strioctl stri; + uint32_t flags; + dladm_status_t status; + uint32_t media; + char link[MAXLINKNAMELEN]; + + if ((status = dladm_datalink_id2info(linkid, &flags, NULL, &media, + link, MAXLINKNAMELEN)) != DLADM_STATUS_OK) { + return (status); + } + + if (media != DL_WIFI) + return (DLADM_STATUS_BADARG); + + if (!(flags & DLADM_OPT_ACTIVE)) + return (DLADM_STATUS_TEMPONLY); + + /* + * dlpi_open() is not used here because libdlpi depends on libdladm, + * and we do not want to introduce recursive dependencies. + */ + (void) snprintf(linkname, MAXPATHLEN, "/dev/net/%s", link); + if ((fd = open(linkname, O_RDWR)) < 0) + return (DLADM_STATUS_LINKINVAL); gbuf->wldp_type = NET_802_11; gbuf->wldp_id = id; @@ -1446,250 +1098,140 @@ do_ioctl(int fd, wldp_t *gbuf, uint_t id, size_t len, uint_t cmd, size_t cmdlen) stri.ic_len = cmdlen; if ((rc = ioctl(fd, I_STR, &stri)) != 0) { - if (rc > 0) - errno = rc; - return (-1); + if (rc > 0) { + /* + * Non-negative return value indicates the specific + * operation failed and the reason for the failure + * was stored in gbuf->wldp_result. + */ + status = dladm_wlan_wlresult2status(gbuf); + } else { + /* + * Negative return value indicates the ioctl failed. + */ + status = dladm_errno2status(errno); + } } - return (0); + (void) close(fd); + return (status); } -static int -do_get_ioctl(int fd, wldp_t *gbuf, uint_t id) +dladm_status_t +i_dladm_wlan_get_ioctl(datalink_id_t linkid, wldp_t *gbuf, uint_t id) { (void) memset(gbuf, 0, MAX_BUF_LEN); - return (do_ioctl(fd, gbuf, id, MAX_BUF_LEN, WLAN_GET_PARAM, - MAX_BUF_LEN)); + return (i_dladm_wlan_ioctl(linkid, gbuf, id, MAX_BUF_LEN, + WLAN_GET_PARAM, MAX_BUF_LEN)); } -static int -do_set_ioctl(int fd, wldp_t *gbuf, uint_t id, void *buf, uint_t buflen) +dladm_status_t +i_dladm_wlan_set_ioctl(datalink_id_t linkid, uint_t id, void *buf, + uint_t buflen) { + wldp_t *gbuf; + dladm_status_t status = DLADM_STATUS_OK; + + if ((gbuf = malloc(MAX_BUF_LEN)) == NULL) + return (DLADM_STATUS_NOMEM); + (void) memset(gbuf, 0, MAX_BUF_LEN); (void) memcpy(gbuf->wldp_buf, buf, buflen); buflen += WIFI_BUF_OFFSET; - return (do_ioctl(fd, gbuf, id, buflen, WLAN_SET_PARAM, buflen)); + status = i_dladm_wlan_ioctl(linkid, gbuf, id, buflen, + WLAN_SET_PARAM, buflen); + + free(gbuf); + return (status); } -static int -do_cmd_ioctl(int fd, wldp_t *gbuf, uint_t cmd) +static dladm_status_t +do_cmd_ioctl(datalink_id_t linkid, wldp_t *gbuf, uint_t cmd) { (void) memset(gbuf, 0, MAX_BUF_LEN); - return (do_ioctl(fd, gbuf, cmd, sizeof (wldp_t), WLAN_COMMAND, - sizeof (wldp_t))); + return (i_dladm_wlan_ioctl(linkid, gbuf, cmd, sizeof (wldp_t), + WLAN_COMMAND, sizeof (wldp_t))); } -static int -do_scan(int fd, wldp_t *gbuf) +static dladm_status_t +do_scan(datalink_id_t linkid, wldp_t *gbuf) { - return (do_cmd_ioctl(fd, gbuf, WL_SCAN)); + return (do_cmd_ioctl(linkid, gbuf, WL_SCAN)); } -static int -do_disconnect(const char *link, int fd, wldp_t *gbuf) +static dladm_status_t +do_disconnect(datalink_id_t linkid, wldp_t *gbuf) { - if (do_get_wpamode(fd, gbuf) == 0 && ((wl_wpa_t *)(gbuf-> - wldp_buf))->wpa_flag > 0) - (void) wpa_instance_delete(link); + if (do_get_wpamode(linkid, gbuf) == 0 && + ((wl_wpa_t *)(gbuf->wldp_buf))->wpa_flag > 0) + (void) wpa_instance_delete(linkid); - return (do_cmd_ioctl(fd, gbuf, WL_DISASSOCIATE)); + return (do_cmd_ioctl(linkid, gbuf, WL_DISASSOCIATE)); } -static int -do_get_esslist(int fd, wldp_t *gbuf) +static dladm_status_t +do_get_esslist(datalink_id_t linkid, wldp_t *gbuf) { (void) memset(gbuf, 0, MAX_BUF_LEN); - return (do_ioctl(fd, gbuf, WL_ESS_LIST, MAX_BUF_LEN, + return (i_dladm_wlan_ioctl(linkid, gbuf, WL_ESS_LIST, MAX_BUF_LEN, WLAN_GET_PARAM, sizeof (wldp_t))); } -static int -do_get_bssid(int fd, wldp_t *gbuf) -{ - return (do_get_ioctl(fd, gbuf, WL_BSSID)); -} - -static int -do_get_essid(int fd, wldp_t *gbuf) -{ - return (do_get_ioctl(fd, gbuf, WL_ESSID)); -} - -static int -do_get_bsstype(int fd, wldp_t *gbuf) -{ - return (do_get_ioctl(fd, gbuf, WL_BSS_TYPE)); -} - -static int -do_get_linkstatus(int fd, wldp_t *gbuf) -{ - return (do_get_ioctl(fd, gbuf, WL_LINKSTATUS)); -} - -static int -do_get_rate(int fd, wldp_t *gbuf) -{ - return (do_get_ioctl(fd, gbuf, WL_DESIRED_RATES)); -} - -static int -do_get_phyconf(int fd, wldp_t *gbuf) -{ - return (do_get_ioctl(fd, gbuf, WL_PHY_CONFIG)); -} - -static int -do_get_powermode(int fd, wldp_t *gbuf) -{ - return (do_get_ioctl(fd, gbuf, WL_POWER_MODE)); -} - -static int -do_get_radio(int fd, wldp_t *gbuf) -{ - return (do_get_ioctl(fd, gbuf, WL_RADIO)); -} - -static int -do_get_authmode(int fd, wldp_t *gbuf) -{ - return (do_get_ioctl(fd, gbuf, WL_AUTH_MODE)); -} - -static int -do_get_encryption(int fd, wldp_t *gbuf) +static dladm_status_t +do_get_bssid(datalink_id_t linkid, wldp_t *gbuf) { - return (do_get_ioctl(fd, gbuf, WL_ENCRYPTION)); + return (i_dladm_wlan_get_ioctl(linkid, gbuf, WL_BSSID)); } -static int -do_get_signal(int fd, wldp_t *gbuf) +static dladm_status_t +do_get_essid(datalink_id_t linkid, wldp_t *gbuf) { - return (do_get_ioctl(fd, gbuf, WL_RSSI)); + return (i_dladm_wlan_get_ioctl(linkid, gbuf, WL_ESSID)); } -static int -do_get_mode(int fd, wldp_t *gbuf) +static dladm_status_t +do_get_bsstype(datalink_id_t linkid, wldp_t *gbuf) { - return (do_get_ioctl(fd, gbuf, WL_PHY_CONFIG)); + return (i_dladm_wlan_get_ioctl(linkid, gbuf, WL_BSS_TYPE)); } static dladm_status_t -do_get_rate_common(wldp_t *gbuf, char **prop_val, uint_t *val_cnt) +do_get_linkstatus(datalink_id_t linkid, wldp_t *gbuf) { - wl_rates_t *wrp = (wl_rates_t *)gbuf->wldp_buf; - uint_t cnt = wrp->wl_rates_num; - uint_t i; - - if (cnt > *val_cnt) - return (DLADM_STATUS_TOOSMALL); - if (wrp->wl_rates_rates[0] == 0) { - prop_val[0][0] = '\0'; - *val_cnt = 1; - return (DLADM_STATUS_OK); - } - - for (i = 0; i < cnt; i++) { - (void) snprintf(prop_val[i], DLADM_STRSIZE, "%.*f", - wrp->wl_rates_rates[i] % 2, - (float)wrp->wl_rates_rates[i] / 2); - } - *val_cnt = cnt; - return (DLADM_STATUS_OK); + return (i_dladm_wlan_get_ioctl(linkid, gbuf, WL_LINKSTATUS)); } static dladm_status_t -do_get_rate_prop(int fd, wldp_t *gbuf, char **prop_val, uint_t *val_cnt) +do_get_rate(datalink_id_t linkid, wldp_t *gbuf) { - if (do_get_rate(fd, gbuf) < 0) - return (dladm_wlan_wlresult2status(gbuf)); - - return (do_get_rate_common(gbuf, prop_val, val_cnt)); + return (i_dladm_wlan_get_ioctl(linkid, gbuf, WL_DESIRED_RATES)); } static dladm_status_t -do_get_rate_mod(int fd, wldp_t *gbuf, char **prop_val, uint_t *val_cnt) +do_get_authmode(datalink_id_t linkid, wldp_t *gbuf) { - if (do_get_ioctl(fd, gbuf, WL_SUPPORTED_RATES) < 0) - return (DLADM_STATUS_FAILED); - - return (do_get_rate_common(gbuf, prop_val, val_cnt)); + return (i_dladm_wlan_get_ioctl(linkid, gbuf, WL_AUTH_MODE)); } static dladm_status_t -do_get_channel_prop(int fd, wldp_t *gbuf, char **prop_val, uint_t *val_cnt) +do_get_encryption(datalink_id_t linkid, wldp_t *gbuf) { - uint32_t channel; - - if (do_get_phyconf(fd, gbuf) < 0) - return (dladm_wlan_wlresult2status(gbuf)); - - if (!do_convert_chan((wl_phy_conf_t *)gbuf->wldp_buf, &channel)) - return (DLADM_STATUS_NOTFOUND); - - (void) snprintf(*prop_val, DLADM_STRSIZE, "%u", channel); - *val_cnt = 1; - - return (DLADM_STATUS_OK); + return (i_dladm_wlan_get_ioctl(linkid, gbuf, WL_ENCRYPTION)); } static dladm_status_t -do_get_powermode_prop(int fd, wldp_t *gbuf, char **prop_val, uint_t *val_cnt) +do_get_signal(datalink_id_t linkid, wldp_t *gbuf) { - wl_ps_mode_t *mode; - const char *s; - - if (do_get_powermode(fd, gbuf) < 0) - return (dladm_wlan_wlresult2status(gbuf)); - - mode = (wl_ps_mode_t *)(gbuf->wldp_buf); - switch (mode->wl_ps_mode) { - case WL_PM_AM: - s = "off"; - break; - case WL_PM_MPS: - s = "max"; - break; - case WL_PM_FAST: - s = "fast"; - break; - default: - return (DLADM_STATUS_NOTFOUND); - } - (void) snprintf(*prop_val, DLADM_STRSIZE, "%s", s); - *val_cnt = 1; - - return (DLADM_STATUS_OK); + return (i_dladm_wlan_get_ioctl(linkid, gbuf, WL_RSSI)); } static dladm_status_t -do_get_radio_prop(int fd, wldp_t *gbuf, char **prop_val, uint_t *val_cnt) +do_get_mode(datalink_id_t linkid, wldp_t *gbuf) { - wl_radio_t radio; - const char *s; - - if (do_get_radio(fd, gbuf) < 0) - return (dladm_wlan_wlresult2status(gbuf)); - - radio = *(wl_radio_t *)(gbuf->wldp_buf); - switch (radio) { - case B_TRUE: - s = "on"; - break; - case B_FALSE: - s = "off"; - break; - default: - return (DLADM_STATUS_NOTFOUND); - } - (void) snprintf(*prop_val, DLADM_STRSIZE, "%s", s); - *val_cnt = 1; - - return (DLADM_STATUS_OK); + return (i_dladm_wlan_get_ioctl(linkid, gbuf, WL_PHY_CONFIG)); } -static int -do_set_bsstype(int fd, wldp_t *gbuf, dladm_wlan_bsstype_t *bsstype) +static dladm_status_t +do_set_bsstype(datalink_id_t linkid, dladm_wlan_bsstype_t *bsstype) { wl_bss_type_t ibsstype; @@ -1704,12 +1246,12 @@ do_set_bsstype(int fd, wldp_t *gbuf, dladm_wlan_bsstype_t *bsstype) ibsstype = WL_BSS_ANY; break; } - return (do_set_ioctl(fd, gbuf, WL_BSS_TYPE, &ibsstype, + return (i_dladm_wlan_set_ioctl(linkid, WL_BSS_TYPE, &ibsstype, sizeof (ibsstype))); } -static int -do_set_authmode(int fd, wldp_t *gbuf, dladm_wlan_auth_t *auth) +static dladm_status_t +do_set_authmode(datalink_id_t linkid, dladm_wlan_auth_t *auth) { wl_authmode_t auth_mode; @@ -1721,14 +1263,14 @@ do_set_authmode(int fd, wldp_t *gbuf, dladm_wlan_auth_t *auth) auth_mode = WL_SHAREDKEY; break; default: - return (-1); + return (DLADM_STATUS_NOTSUP); } - return (do_set_ioctl(fd, gbuf, WL_AUTH_MODE, &auth_mode, + return (i_dladm_wlan_set_ioctl(linkid, WL_AUTH_MODE, &auth_mode, sizeof (auth_mode))); } -static int -do_set_encryption(int fd, wldp_t *gbuf, dladm_wlan_secmode_t *secmode) +static dladm_status_t +do_set_encryption(datalink_id_t linkid, dladm_wlan_secmode_t *secmode) { wl_encryption_t encryption; @@ -1742,14 +1284,14 @@ do_set_encryption(int fd, wldp_t *gbuf, dladm_wlan_secmode_t *secmode) case DLADM_WLAN_SECMODE_WPA: return (0); default: - return (-1); + return (DLADM_STATUS_NOTSUP); } - return (do_set_ioctl(fd, gbuf, WL_ENCRYPTION, &encryption, + return (i_dladm_wlan_set_ioctl(linkid, WL_ENCRYPTION, &encryption, sizeof (encryption))); } -static int -do_set_key(int fd, wldp_t *gbuf, dladm_wlan_key_t *keys, +static dladm_status_t +do_set_key(datalink_id_t linkid, dladm_wlan_key_t *keys, uint_t key_count) { int i; @@ -1758,7 +1300,7 @@ do_set_key(int fd, wldp_t *gbuf, dladm_wlan_key_t *keys, dladm_wlan_key_t *kp; if (key_count == 0 || key_count > MAX_NWEPKEYS || keys == NULL) - return (-1); + return (DLADM_STATUS_BADARG); (void) memset(wepkey_tab, 0, sizeof (wepkey_tab)); for (i = 0; i < MAX_NWEPKEYS; i++) @@ -1767,10 +1309,10 @@ do_set_key(int fd, wldp_t *gbuf, dladm_wlan_key_t *keys, for (i = 0; i < key_count; i++) { kp = &keys[i]; if (kp->wk_idx == 0 || kp->wk_idx > MAX_NWEPKEYS) - return (-1); + return (DLADM_STATUS_BADARG); if (kp->wk_len != DLADM_WLAN_WEPKEY64_LEN && kp->wk_len != DLADM_WLAN_WEPKEY128_LEN) - return (-1); + return (DLADM_STATUS_BADARG); wkp = &wepkey_tab[kp->wk_idx - 1]; wkp->wl_wep_operation = WL_ADD; @@ -1778,12 +1320,12 @@ do_set_key(int fd, wldp_t *gbuf, dladm_wlan_key_t *keys, (void) memcpy(wkp->wl_wep_key, kp->wk_val, kp->wk_len); } - return (do_set_ioctl(fd, gbuf, WL_WEP_KEY_TAB, &wepkey_tab, + return (i_dladm_wlan_set_ioctl(linkid, WL_WEP_KEY_TAB, &wepkey_tab, sizeof (wepkey_tab))); } -static int -do_set_essid(int fd, wldp_t *gbuf, dladm_wlan_essid_t *essid) +static dladm_status_t +do_set_essid(datalink_id_t linkid, dladm_wlan_essid_t *essid) { wl_essid_t iessid; @@ -1794,186 +1336,34 @@ do_set_essid(int fd, wldp_t *gbuf, dladm_wlan_essid_t *essid) (void) strlcpy(iessid.wl_essid_essid, essid->we_bytes, sizeof (iessid.wl_essid_essid)); } else { - return (-1); - } - return (do_set_ioctl(fd, gbuf, WL_ESSID, &iessid, sizeof (iessid))); -} - -/* ARGSUSED */ -static dladm_status_t -do_check_rate(int fd, wldp_t *gbuf, prop_desc_t *pdp, char **prop_val, - uint_t val_cnt, val_desc_t **vdpp) -{ - int i; - uint_t modval_cnt = MAX_SUPPORT_RATES; - char *buf, **modval; - dladm_status_t status; - val_desc_t *vdp = NULL; - - if (val_cnt != 1) - return (DLADM_STATUS_BADVALCNT); - - buf = malloc((sizeof (char *) + DLADM_STRSIZE) * MAX_SUPPORT_RATES); - if (buf == NULL) { - status = DLADM_STATUS_NOMEM; - goto done; - } - - modval = (char **)(void *)buf; - for (i = 0; i < MAX_SUPPORT_RATES; i++) { - modval[i] = buf + sizeof (char *) * MAX_SUPPORT_RATES + - i * DLADM_STRSIZE; - } - - status = do_get_rate_mod(fd, gbuf, modval, &modval_cnt); - if (status != DLADM_STATUS_OK) - goto done; - - vdp = malloc(sizeof (val_desc_t)); - if (vdp == NULL) { - status = DLADM_STATUS_NOMEM; - goto done; - } - - for (i = 0; i < modval_cnt; i++) { - if (strcasecmp(*prop_val, modval[i]) == 0) { - vdp->vd_val = (uint_t)(atof(*prop_val) * 2); - status = DLADM_STATUS_OK; - *vdpp = vdp; - vdp = NULL; - break; - } - } - if (i == modval_cnt) - status = DLADM_STATUS_BADVAL; -done: - free(buf); - free(vdp); - return (status); -} - -static dladm_status_t -do_set_rate_prop(int fd, wldp_t *gbuf, val_desc_t *vdp, uint_t val_cnt) -{ - dladm_wlan_rates_t rates; - - if (val_cnt != 1) - return (DLADM_STATUS_BADVALCNT); - - rates.wr_cnt = 1; - rates.wr_rates[0] = vdp[0].vd_val; - - if (do_set_rate(fd, gbuf, &rates) < 0) - return (dladm_wlan_wlresult2status(gbuf)); - - return (DLADM_STATUS_OK); -} - -static int -do_set_rate(int fd, wldp_t *gbuf, dladm_wlan_rates_t *rates) -{ - int i; - uint_t len; - wl_rates_t *wrp = (wl_rates_t *)gbuf->wldp_buf; - - (void) memset(gbuf, 0, MAX_BUF_LEN); - - for (i = 0; i < rates->wr_cnt; i++) - wrp->wl_rates_rates[i] = rates->wr_rates[i]; - wrp->wl_rates_num = rates->wr_cnt; - - len = offsetof(wl_rates_t, wl_rates_rates) + - (rates->wr_cnt * sizeof (char)) + WIFI_BUF_OFFSET; - return (do_ioctl(fd, gbuf, WL_DESIRED_RATES, len, WLAN_SET_PARAM, len)); -} - -/* ARGSUSED */ -static dladm_status_t -do_set_powermode_prop(int fd, wldp_t *gbuf, val_desc_t *vdp, uint_t val_cnt) -{ - dladm_wlan_powermode_t powermode = (dladm_wlan_powermode_t)vdp->vd_val; - - if (do_set_powermode(fd, gbuf, &powermode) < 0) - return (dladm_wlan_wlresult2status(gbuf)); - - return (DLADM_STATUS_OK); -} - -static int -do_set_powermode(int fd, wldp_t *gbuf, dladm_wlan_powermode_t *pm) -{ - wl_ps_mode_t ps_mode; - - (void) memset(&ps_mode, 0xff, sizeof (ps_mode)); - - switch (*pm) { - case DLADM_WLAN_PM_OFF: - ps_mode.wl_ps_mode = WL_PM_AM; - break; - case DLADM_WLAN_PM_MAX: - ps_mode.wl_ps_mode = WL_PM_MPS; - break; - case DLADM_WLAN_PM_FAST: - ps_mode.wl_ps_mode = WL_PM_FAST; - break; - default: - return (-1); + return (DLADM_STATUS_BADARG); } - return (do_set_ioctl(fd, gbuf, WL_POWER_MODE, &ps_mode, - sizeof (ps_mode))); + return (i_dladm_wlan_set_ioctl(linkid, WL_ESSID, &iessid, + sizeof (iessid))); } -/* ARGSUSED */ static dladm_status_t -do_set_radio_prop(int fd, wldp_t *gbuf, val_desc_t *vdp, uint_t val_cnt) -{ - dladm_wlan_radio_t radio = (dladm_wlan_radio_t)vdp->vd_val; - - if (do_set_radio(fd, gbuf, &radio) < 0) - return (dladm_wlan_wlresult2status(gbuf)); - - return (DLADM_STATUS_OK); -} - -static int -do_set_radio(int fd, wldp_t *gbuf, dladm_wlan_radio_t *radio) -{ - wl_radio_t r; - - switch (*radio) { - case DLADM_WLAN_RADIO_ON: - r = B_TRUE; - break; - case DLADM_WLAN_RADIO_OFF: - r = B_FALSE; - break; - default: - return (-1); - } - return (do_set_ioctl(fd, gbuf, WL_RADIO, &r, sizeof (r))); -} - -static int -do_set_channel(int fd, wldp_t *gbuf, dladm_wlan_channel_t *channel) +do_set_channel(datalink_id_t linkid, dladm_wlan_channel_t *channel) { wl_phy_conf_t phy_conf; if (*channel > MAX_CHANNEL_NUM) - return (-1); + return (DLADM_STATUS_BADVAL); (void) memset(&phy_conf, 0xff, sizeof (phy_conf)); phy_conf.wl_phy_dsss_conf.wl_dsss_channel = *channel; - return (do_set_ioctl(fd, gbuf, WL_PHY_CONFIG, &phy_conf, + return (i_dladm_wlan_set_ioctl(linkid, WL_PHY_CONFIG, &phy_conf, sizeof (phy_conf))); } -static int -do_set_createibss(int fd, wldp_t *gbuf, boolean_t *create_ibss) +static dladm_status_t +do_set_createibss(datalink_id_t linkid, boolean_t *create_ibss) { wl_create_ibss_t cr = (wl_create_ibss_t)(*create_ibss); - return (do_set_ioctl(fd, gbuf, WL_CREATE_IBSS, &cr, sizeof (cr))); + return (i_dladm_wlan_set_ioctl(linkid, WL_CREATE_IBSS, + &cr, sizeof (cr))); } static void @@ -1984,55 +1374,21 @@ generate_essid(dladm_wlan_essid_t *essid) random()); } -static int -do_get_capability(int fd, wldp_t *gbuf) -{ - return (do_get_ioctl(fd, gbuf, WL_CAPABILITY)); -} - -static int -do_get_wpamode(int fd, wldp_t *gbuf) -{ - return (do_get_ioctl(fd, gbuf, WL_WPA)); -} - static dladm_status_t -ioctl_get(const char *link, int id, void *gbuf) +do_get_capability(datalink_id_t linkid, wldp_t *gbuf) { - int fd; - - if ((fd = open_link(link)) < 0) - return (DLADM_STATUS_LINKINVAL); - (void) do_get_ioctl(fd, gbuf, id); - - (void) close(fd); - return (dladm_wlan_wlresult2status(gbuf)); + return (i_dladm_wlan_get_ioctl(linkid, gbuf, WL_CAPABILITY)); } static dladm_status_t -ioctl_set(const char *link, int id, void *buf, uint_t buflen) +do_get_wpamode(datalink_id_t linkid, wldp_t *gbuf) { - int fd; - wldp_t *gbuf; - dladm_status_t status; - - if ((gbuf = malloc(MAX_BUF_LEN)) == NULL) - return (DLADM_STATUS_NOMEM); - - if ((fd = open_link(link)) < 0) - return (DLADM_STATUS_LINKINVAL); - (void) do_set_ioctl(fd, gbuf, id, buf, buflen); - - (void) close(fd); - status = dladm_wlan_wlresult2status(gbuf); - free(gbuf); - - return (status); + return (i_dladm_wlan_get_ioctl(linkid, gbuf, WL_WPA)); } dladm_status_t -dladm_wlan_wpa_get_sr(const char *link, dladm_wlan_ess_t *sr, uint_t escnt, - uint_t *estot) +dladm_wlan_wpa_get_sr(datalink_id_t linkid, dladm_wlan_ess_t *sr, + uint_t escnt, uint_t *estot) { int i, n; wldp_t *gbuf; @@ -2042,7 +1398,7 @@ dladm_wlan_wpa_get_sr(const char *link, dladm_wlan_ess_t *sr, uint_t escnt, if ((gbuf = malloc(MAX_BUF_LEN)) == NULL) return (DLADM_STATUS_NOMEM); - status = ioctl_get(link, WL_SCANRESULTS, gbuf); + status = i_dladm_wlan_get_ioctl(linkid, gbuf, WL_SCANRESULTS); if (status == DLADM_STATUS_OK) { es = (wl_wpa_ess_t *)(gbuf->wldp_buf); @@ -2066,8 +1422,7 @@ dladm_wlan_wpa_get_sr(const char *link, dladm_wlan_ess_t *sr, uint_t escnt, } dladm_status_t -dladm_wlan_wpa_set_ie(const char *link, uint8_t *wpa_ie, - uint_t wpa_ie_len) +dladm_wlan_wpa_set_ie(datalink_id_t linkid, uint8_t *wpa_ie, uint_t wpa_ie_len) { wl_wpa_ie_t *ie; uint_t len; @@ -2084,41 +1439,43 @@ dladm_wlan_wpa_set_ie(const char *link, uint8_t *wpa_ie, ie->wpa_ie_len = wpa_ie_len; (void) memcpy(ie->wpa_ie, wpa_ie, wpa_ie_len); - status = ioctl_set(link, WL_SETOPTIE, ie, len); + status = i_dladm_wlan_set_ioctl(linkid, WL_SETOPTIE, ie, len); free(ie); return (status); } dladm_status_t -dladm_wlan_wpa_set_wpa(const char *link, boolean_t flag) +dladm_wlan_wpa_set_wpa(datalink_id_t linkid, boolean_t flag) { - wl_wpa_t wpa; + wl_wpa_t wpa; wpa.wpa_flag = flag; - return (ioctl_set(link, WL_WPA, &wpa, sizeof (wl_wpa_t))); + return (i_dladm_wlan_set_ioctl(linkid, WL_WPA, &wpa, + sizeof (wl_wpa_t))); } dladm_status_t -dladm_wlan_wpa_del_key(const char *link, uint_t key_idx, +dladm_wlan_wpa_del_key(datalink_id_t linkid, uint_t key_idx, const dladm_wlan_bssid_t *addr) { - wl_del_key_t wk; + wl_del_key_t wk; wk.idk_keyix = key_idx; if (addr != NULL) (void) memcpy((char *)wk.idk_macaddr, addr->wb_bytes, DLADM_WLAN_BSSID_LEN); - return (ioctl_set(link, WL_DELKEY, &wk, sizeof (wl_del_key_t))); + return (i_dladm_wlan_set_ioctl(linkid, WL_DELKEY, &wk, + sizeof (wl_del_key_t))); } dladm_status_t -dladm_wlan_wpa_set_key(const char *link, dladm_wlan_cipher_t cipher, +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) { - wl_key_t wk; + wl_key_t wk; (void) memset(&wk, 0, sizeof (wl_key_t)); switch (cipher) { @@ -2155,11 +1512,11 @@ dladm_wlan_wpa_set_key(const char *link, 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 (ioctl_set(link, WL_KEY, &wk, sizeof (wl_key_t))); + return (i_dladm_wlan_set_ioctl(linkid, WL_KEY, &wk, sizeof (wl_key_t))); } dladm_status_t -dladm_wlan_wpa_set_mlme(const char *link, dladm_wlan_mlme_op_t op, +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) { wl_mlme_t mlme; @@ -2180,7 +1537,8 @@ dladm_wlan_wpa_set_mlme(const char *link, dladm_wlan_mlme_op_t op, (void) memcpy(mlme.im_macaddr, bssid->wb_bytes, DLADM_WLAN_BSSID_LEN); - return (ioctl_set(link, WL_MLME, &mlme, sizeof (wl_mlme_t))); + return (i_dladm_wlan_set_ioctl(linkid, WL_MLME, &mlme, + sizeof (wl_mlme_t))); } /* @@ -2204,7 +1562,7 @@ add_property_group_to_instance(scf_handle_t *handle, scf_instance_t *instance, return (pg); } -static int +static dladm_status_t add_new_property(scf_handle_t *handle, const char *prop_name, scf_type_t type, const char *val, scf_transaction_t *tx) { @@ -2228,7 +1586,7 @@ add_new_property(scf_handle_t *handle, const char *prop_name, if (scf_entry_add_value(entry, value) != 0) goto out; - return (DLADM_WLAN_SVC_SUCCESS); + return (DLADM_STATUS_OK); out: if (value != NULL) @@ -2236,18 +1594,15 @@ out: if (entry != NULL) scf_entry_destroy(entry); - return (DLADM_WLAN_SVC_FAILURE); + return (DLADM_STATUS_FAILED); } -/* - * DLADM_WLAN_SVC_APP_FAILURE means allocate buffer failed. - */ -static int +static dladm_status_t add_pg_method(scf_handle_t *handle, scf_instance_t *instance, const char *pg_name, const char *flags) { int rv, size; - int status = DLADM_WLAN_SVC_FAILURE; + dladm_status_t status = DLADM_STATUS_FAILED; char *command = NULL; scf_transaction_t *tran = NULL; scf_propertygroup_t *pg; @@ -2264,7 +1619,7 @@ add_pg_method(scf_handle_t *handle, scf_instance_t *instance, size = strlen(SVC_METHOD) + strlen(" ") + strlen(flags) + 1; command = malloc(size); if (command == NULL) { - status = DLADM_WLAN_SVC_APP_FAILURE; + status = DLADM_STATUS_NOMEM; goto out; } (void) snprintf(command, size, "%s %s", SVC_METHOD, flags); @@ -2274,15 +1629,14 @@ add_pg_method(scf_handle_t *handle, scf_instance_t *instance, goto out; if (add_new_property(handle, SCF_PROPERTY_EXEC, - SCF_TYPE_ASTRING, command, tran) != - DLADM_WLAN_SVC_SUCCESS) { + SCF_TYPE_ASTRING, command, tran) != DLADM_STATUS_OK) { goto out; } rv = scf_transaction_commit(tran); switch (rv) { case 1: - status = DLADM_WLAN_SVC_SUCCESS; + status = DLADM_STATUS_OK; goto out; case 0: scf_transaction_destroy_children(tran); @@ -2311,11 +1665,11 @@ out: return (status); } -static int +static dladm_status_t do_create_instance(scf_handle_t *handle, scf_service_t *svc, const char *instance_name, const char *command) { - int status = DLADM_WLAN_SVC_FAILURE; + dladm_status_t status = DLADM_STATUS_FAILED; char *buf; ssize_t max_fmri_len; scf_instance_t *instance; @@ -2327,12 +1681,12 @@ do_create_instance(scf_handle_t *handle, scf_service_t *svc, if (scf_service_add_instance(svc, instance_name, instance) != 0) { if (scf_error() == SCF_ERROR_EXISTS) /* Let the caller deal with the duplicate instance */ - status = DLADM_WLAN_SVC_INSTANCE_EXISTS; + status = DLADM_STATUS_EXIST; goto out; } if (add_pg_method(handle, instance, "start", - command) != DLADM_WLAN_SVC_SUCCESS) { + command) != DLADM_STATUS_OK) { goto out; } @@ -2346,7 +1700,7 @@ do_create_instance(scf_handle_t *handle, scf_service_t *svc, (smf_enable_instance(buf, SMF_TEMPORARY) != 0)) { goto out; } - status = DLADM_WLAN_SVC_SUCCESS; + status = DLADM_STATUS_OK; } out: @@ -2355,10 +1709,10 @@ out: return (status); } -static int +static dladm_status_t create_instance(const char *instance_name, const char *command) { - int status = DLADM_WLAN_SVC_FAILURE; + dladm_status_t status = DLADM_STATUS_FAILED; scf_service_t *svc = NULL; scf_handle_t *handle = NULL; @@ -2430,10 +1784,10 @@ wait_until_disabled(scf_handle_t *handle, char *fmri) } } -static int +static dladm_status_t delete_instance(const char *instance_name) { - int status = DLADM_WLAN_SVC_FAILURE; + dladm_status_t status = DLADM_STATUS_FAILED; char *buf; ssize_t max_fmri_len; scf_scope_t *scope = NULL; @@ -2468,7 +1822,7 @@ delete_instance(const char *instance_name) scf_error_t scf_errnum = scf_error(); if (scf_errnum == SCF_ERROR_NOT_FOUND) - status = DLADM_WLAN_SVC_SUCCESS; + status = DLADM_STATUS_OK; scf_instance_destroy(instance); goto out; @@ -2503,7 +1857,7 @@ delete_instance(const char *instance_name) scf_instance_destroy(instance); - status = DLADM_WLAN_SVC_SUCCESS; + status = DLADM_STATUS_OK; out: if (svc != NULL) @@ -2520,33 +1874,39 @@ out: return (status); } -/* - * DLADM_WLAN_SVC_APP_FAILURE means allocate buffer failed. - */ -static int -wpa_instance_create(const char *instance_name, void *key) +static dladm_status_t +wpa_instance_create(datalink_id_t linkid, void *key) { - int status = DLADM_WLAN_SVC_FAILURE; + dladm_status_t status = DLADM_STATUS_FAILED; char *command = NULL; char *wk_name = ((dladm_wlan_key_t *)key)->wk_name; int size; + char instance_name[MAXLINKNAMELEN]; + + /* + * 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)); + if (status != DLADM_STATUS_OK) + goto out; size = strlen(instance_name) + strlen(" -i -k ") + strlen(wk_name) + 1; command = malloc(size); if (command == NULL) { - status = DLADM_WLAN_SVC_APP_FAILURE; + status = DLADM_STATUS_NOMEM; goto out; } (void) snprintf(command, size, "-i %s -k %s", instance_name, wk_name); status = create_instance(instance_name, command); - if (status == DLADM_WLAN_SVC_INSTANCE_EXISTS) { + if (status == DLADM_STATUS_EXIST) { /* * Delete the existing instance and create a new instance * with the supplied arguments. */ if ((status = delete_instance(instance_name)) == - DLADM_WLAN_SVC_SUCCESS) { + DLADM_STATUS_OK) { status = create_instance(instance_name, command); } } @@ -2558,12 +1918,18 @@ out: return (status); } -static int -wpa_instance_delete(const char *instance_name) +static dladm_status_t +wpa_instance_delete(datalink_id_t linkid) { - int status; + char instance_name[MAXLINKNAMELEN]; - status = delete_instance(instance_name); + /* + * 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) + return (DLADM_STATUS_FAILED); - return (status); + return (delete_instance(instance_name)); } |