summaryrefslogtreecommitdiff
path: root/usr/src/lib/libdladm/common/libdlwlan.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/lib/libdladm/common/libdlwlan.c')
-rw-r--r--usr/src/lib/libdladm/common/libdlwlan.c1358
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));
}