/*
* Copyright 2010 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
/*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* Alternatively, this software may be distributed under the terms of the
* GNU General Public License ("GPL") version 2 as published by the Free
* Software Foundation.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/mac_provider.h>
#include <inet/wifi_ioctl.h>
#include "net80211_impl.h"
static int wl_set_essid(struct ieee80211com *, const void *);
static void wl_get_essid(struct ieee80211com *, void *);
static int wl_set_bssid(struct ieee80211com *, const void *);
static void wl_get_bssid(struct ieee80211com *, void *);
static int wl_set_bsstype(struct ieee80211com *, const void *);
static void wl_get_bsstype(struct ieee80211com *, void *);
static void wl_get_linkstatus(struct ieee80211com *, void *);
static int wl_set_desrates(struct ieee80211com *, const void *);
static void wl_get_desrates(struct ieee80211com *, void *);
static int wl_set_authmode(struct ieee80211com *, const void *);
static void wl_get_authmode(struct ieee80211com *, void *);
static int wl_set_encrypt(struct ieee80211com *, const void *);
static void wl_get_encrypt(struct ieee80211com *, void *);
static void wl_get_rssi(struct ieee80211com *, void *);
static int wl_set_phy(struct ieee80211com *, const void *);
static int wl_get_phy(struct ieee80211com *, void *);
static void wl_get_capability(struct ieee80211com *, void *);
static int wl_set_wpa(struct ieee80211com *, const void *);
static void wl_get_wpa(struct ieee80211com *, void *);
static void wl_get_scanresults(struct ieee80211com *, void *);
static void wl_get_esslist(struct ieee80211com *, void *);
static int wl_set_wepkey(struct ieee80211com *, const void *);
static int wl_set_optie(struct ieee80211com *, const void *);
static int wl_set_delkey(struct ieee80211com *, const void *);
static int wl_set_mlme(struct ieee80211com *, const void *);
static int wl_set_wpakey(struct ieee80211com *, const void *);
static void wl_get_suprates(struct ieee80211com *, void *);
static int wl_set_createibss(struct ieee80211com *, const void *);
static void wl_get_createibss(struct ieee80211com *, void *);
static size_t
{
size_t i;
for (i = 0; i < n && s[i] != '\0'; i++)
/* noop */;
return (i);
}
/*
* Initialize an output message block by copying from an
* input message block. The message is of type wldp_t.
* mp input message block
* buflen length of wldp_buf
*/
static void
{
}
/*
* Allocate and initialize an output message.
*/
static mblk_t *
{
int size;
if (cmd == WLAN_GET_PARAM)
ieee80211_err("wifi_getoutbuf: allocb %d bytes failed!\n",
size);
return (NULL);
}
return (mp1);
}
static int
{
int err = 0;
return (ENOMEM);
switch (cmd) {
case WLAN_GET_PARAM:
break;
case WLAN_SET_PARAM:
break;
default:
break;
}
return (err);
}
static int
{
int err = 0;
return (ENOMEM);
switch (cmd) {
case WLAN_GET_PARAM:
break;
case WLAN_SET_PARAM:
"set bssid=%s\n",
break;
default:
break;
}
return (err);
}
static int
{
char *nodename;
err = 0;
return (ENOMEM);
switch (cmd) {
case WLAN_GET_PARAM:
break;
case WLAN_SET_PARAM:
ieee80211_err("wifi_cfg_nodename: "
"node name too long, %u\n",
break;
}
nodename[IEEE80211_NWID_LEN] = 0;
"wifi_cfg_nodename: set nodename %s, len=%d\n",
if (len > 0)
if (len < IEEE80211_NWID_LEN)
break;
default:
break;
}
return (err);
}
static int
{
int err = 0;
return (ENOMEM);
switch (cmd) {
case WLAN_GET_PARAM:
break;
case WLAN_SET_PARAM:
break;
default:
break;
} /* switch (cmd) */
return (err);
}
static int
{
int err = 0;
return (ENOMEM);
switch (cmd) {
case WLAN_GET_PARAM:
break;
case WLAN_SET_PARAM:
ieee80211_err("wifi_cfg_wepkey: "
"parameter too short, %d, expected %d\n",
break;
}
break;
default:
break;
}
return (err);
}
static int
{
int err = 0;
return (ENOMEM);
switch (cmd) {
case WLAN_GET_PARAM:
0 : ic->ic_def_txkey;
break;
case WLAN_SET_PARAM:
if (*iw_kid >= MAX_NWEPKEYS) {
ieee80211_err("wifi_cfg_keyid: "
"keyid too large, %u\n", *iw_kid);
} else {
"set keyid=%u\n", *iw_kid);
}
break;
default:
break;
}
return (err);
}
static int
{
int err = 0;
return (ENOMEM);
switch (cmd) {
case WLAN_GET_PARAM:
break;
case WLAN_SET_PARAM:
break;
default:
break;
}
return (err);
}
static int
{
int err = 0;
return (ENOMEM);
switch (cmd) {
case WLAN_GET_PARAM:
break;
case WLAN_SET_PARAM:
break;
default:
break;
}
return (err);
}
static int
{
int err = 0;
return (ENOMEM);
switch (cmd) {
case WLAN_GET_PARAM:
break;
case WLAN_SET_PARAM:
break;
break;
default:
break;
}
return (err);
}
static int
{
int err = 0;
return (ENOMEM);
switch (cmd) {
case WLAN_GET_PARAM:
break;
case WLAN_SET_PARAM:
break;
default:
break;
}
return (err);
}
static int
{
int err = 0;
return (ENOMEM);
switch (cmd) {
case WLAN_GET_PARAM:
break;
case WLAN_SET_PARAM:
break;
default:
break;
}
return (err);
}
static int
{
err = 0;
/* rate value (wl_rates_rates) is of type char */
sizeof (char) * IEEE80211_MODE_MAX * IEEE80211_RATE_MAXSIZE;
return (ENOMEM);
switch (cmd) {
case WLAN_GET_PARAM:
break;
case WLAN_SET_PARAM:
break;
default:
break;
}
return (err);
}
static int
{
int err;
err = 0;
return (ENOMEM);
switch (cmd) {
case WLAN_GET_PARAM:
break;
case WLAN_SET_PARAM:
break;
default:
break;
}
return (err);
}
/*
* Rescale device's RSSI value to (0, 15) as required by WiFi
* driver IOCTLs (PSARC/2003/722)
*/
static wl_rssi_t
{
if (rssi == 0)
rssi = 0;
else
return (rssi);
}
static int
{
int err = 0;
return (ENOMEM);
switch (cmd) {
case WLAN_GET_PARAM:
break;
case WLAN_SET_PARAM:
break;
default:
return (EINVAL);
}
return (err);
}
/*
* maximum scan wait time in second.
* Time spent on scaning one channel is usually 100~200ms. The maximum
* number of channels defined in wifi_ioctl.h is 99 (MAX_CHANNEL_NUM).
* As a result the maximum total scan time is defined as below in ms.
*/
static void
{
delta, TR_CLOCK_TICK) != 0) {
break;
}
}
}
/*
* Callback function used by ieee80211_iterate_nodes() in
* wifi_cfg_esslist() to get info of each node in a node table
* arg output buffer, pointer to wl_ess_list_t
* in each node in the node table
*/
static void
{
sizeof (wl_ess_list_t);
return;
/* skip newly allocated NULL bss node */
return;
/* physical (FH, DS, ERP) parameters */
} else {
switch (in->in_phytype) {
case IEEE80211_T_FH: {
break;
}
case IEEE80211_T_DS: {
break;
}
case IEEE80211_T_OFDM: {
break;
} /* case IEEE80211_T_OFDM */
} /* switch in->in_phytype */
}
/* supported rates */
/*
* The number of supported rates might exceed
* MAX_SCAN_SUPPORT_RATES. Fill in highest rates
* first so userland command could properly show
* maximum speed of AP
*/
for (i = 0; i < nrates; i++) {
conf->wl_supported_rates[i] =
}
aps->wl_ess_list_num++;
}
static int
{
int err = 0;
NULL) {
return (ENOMEM);
}
switch (cmd) {
case WLAN_GET_PARAM:
ow_aps->wl_ess_list_num = 0;
break;
case WLAN_SET_PARAM:
break;
default:
break;
}
return (err);
}
/*
* Scan the network for all available ESSs.
* IEEE80211_F_SCANONLY is set when current state is INIT. And
* with this flag, after scan the state will be changed back to
* INIT. The reason is at the end of SCAN stage, the STA will
* consequently connect to an AP. Then it looks unreasonable that
* for a disconnected device, A SCAN command causes it connected.
* So the state is changed back to INIT.
*/
static int
{
/*
* Do not scan when current state is RUN. The reason is
* when connected, STA is on the same channel as AP. But
* to do scan, STA have to switch to each available channel,
* send probe request and wait certian time for probe
* will cause data loss.
*/
if (ostate == IEEE80211_S_RUN)
return (0);
if (ostate == IEEE80211_S_INIT)
/* Don't wait on WPA mode */
/* wait scan complete */
}
wifi_setupoutmsg(mp, 0);
return (0);
}
static void
{
int i;
ic->ic_des_esslen = 0;
ic->ic_def_txkey = 0;
for (i = 0; i < MAX_NWEPKEYS; i++) {
}
}
static int
{
wifi_setupoutmsg(mp, 0);
return (ENETRESET);
}
static int
{
}
wifi_setupoutmsg(mp, 0);
return (0);
}
/*
* Get the capabilities of drivers.
*/
static int
{
int err = 0;
return (ENOMEM);
switch (cmd) {
case WLAN_GET_PARAM:
break;
case WLAN_SET_PARAM:
break;
default:
break;
}
return (err);
}
/*
* Operating on WPA mode.
*/
static int
{
int err = 0;
return (ENOMEM);
switch (cmd) {
case WLAN_GET_PARAM:
break;
case WLAN_SET_PARAM:
break;
default:
break;
}
return (err);
}
/*
* WPA daemon set the WPA keys.
* The WPA keys are negotiated with APs through wpa service.
*/
static int
{
int err = 0;
return (ENOMEM);
switch (cmd) {
case WLAN_GET_PARAM:
break;
case WLAN_SET_PARAM:
break;
default:
break;
}
return (err);
}
/*
* Delete obsolete keys - keys are dynamically exchanged between APs
* and wpa daemon.
*/
static int
{
int err = 0;
return (ENOMEM);
switch (cmd) {
case WLAN_GET_PARAM:
break;
case WLAN_SET_PARAM:
break;
default:
break;
}
return (err);
}
/*
* The OPTIE will be used in the association request.
*/
static int
{
int err = 0;
return (ENOMEM);
switch (cmd) {
case WLAN_GET_PARAM:
break;
case WLAN_SET_PARAM:
break;
default:
break;
}
return (err);
}
/*
* we use a different ID to filter out those APs of WPA mode.
*/
static int
{
int err = 0;
NULL) {
return (ENOMEM);
}
switch (cmd) {
case WLAN_GET_PARAM:
/* filter out non-WPA APs */
continue;
}
ap_num ++;
}
break;
case WLAN_SET_PARAM:
break;
default:
break;
}
return (err);
}
/*
* Manually control the state of AUTH | DEAUTH | DEASSOC | ASSOC
*/
static int
{
int err = 0;
return (ENOMEM);
switch (cmd) {
case WLAN_GET_PARAM:
break;
case WLAN_SET_PARAM:
break;
default:
break;
}
return (err);
}
static int
{
int err = 0;
ieee80211_err("wifi_cfg_getset: "
return (EINVAL);
}
/* Commands */
case WL_SCAN:
break;
case WL_LOAD_DEFAULTS:
break;
case WL_DISASSOCIATE:
break;
/* Parameters */
case WL_ESSID:
break;
case WL_BSSID:
break;
case WL_NODE_NAME:
break;
case WL_PHY_CONFIG:
break;
case WL_WEP_KEY_TAB:
break;
case WL_WEP_KEY_ID:
break;
case WL_AUTH_MODE:
break;
case WL_ENCRYPTION:
break;
case WL_BSS_TYPE:
break;
case WL_CREATE_IBSS:
break;
case WL_DESIRED_RATES:
break;
case WL_LINKSTATUS:
break;
case WL_ESS_LIST:
break;
case WL_SUPPORTED_RATES:
break;
case WL_RSSI:
break;
/*
* WPA IOCTLs
*/
case WL_CAPABILITY:
break;
case WL_WPA:
break;
case WL_KEY:
break;
case WL_DELKEY:
break;
case WL_SETOPTIE:
break;
case WL_SCANRESULTS:
break;
case WL_MLME:
break;
default:
wifi_setupoutmsg(mp1, 0);
break;
}
return (err);
}
/*
* Typically invoked by drivers in response to requests for
* information or to change settings from the userland.
*
* Return value should be checked by WiFi drivers. Return 0
* on success. Otherwise, return non-zero value to indicate
* the error. Driver should operate as below when the return
* error is:
* ENETRESET Reset wireless network and re-start to join a
* WLAN. ENETRESET is returned when a configuration
* parameter has been changed.
* When acknowledge a M_IOCTL message, thie error
* is ignored.
*/
int
{
ieee80211_err("ieee80211_ioctl: ioctl buffer too short, %u\n",
return (EINVAL);
}
/*
* Validate the command
*/
switch (cmd) {
case WLAN_SET_PARAM:
case WLAN_COMMAND:
break;
case WLAN_GET_PARAM:
break;
default:
"unknown cmd 0x%x\n", cmd);
return (EINVAL);
}
return (err);
}
/* sanity check */
return (EINVAL);
}
/* assuming single data block */
}
/* ignore ENETRESET when acknowledge the M_IOCTL message */
else
return (err);
}
/*
* The following routines are for brussels support
*/
/*
* MAC_PROP_WL_ESSID
*/
static int
{
int err = 0;
char *essid;
ieee80211_err("wl_set_essid: "
"essid too long, %u, max %u\n",
return (err);
}
essid[IEEE80211_NWID_LEN] = 0;
"set essid=%s length=%d\n",
if (ic->ic_des_esslen != 0)
return (err);
}
static void
{
char *essid;
if (essid[0] == '\0')
}
/*
* MAC_PROP_WL_BSSID
*/
static int
{
"set bssid=%s\n",
return (ENETRESET);
}
static void
{
else
}
/*
* MAC_PROP_WL_BSSTYP
*/
static int
{
int err = 0;
"set bsstype=%u\n", *iw_opmode);
switch (*iw_opmode) {
case WL_BSS_BSS:
break;
case WL_BSS_IBSS:
break;
}
break;
default:
ieee80211_err("wl_set_bsstype: "
"unknown opmode\n");
break;
}
return (err);
}
static void
{
case IEEE80211_M_STA:
break;
case IEEE80211_M_IBSS:
break;
default:
break;
}
}
/*
* MAC_PROP_WL_LINKSTATUS
*/
static void
{
}
}
/*
* MAC_PROP_WL_DESIRED_RATESa
*/
static int
{
int err = 0;
int i, j;
return (err);
"set desired rate=%u\n", drate);
if (drate == 0) {
}
return (err);
}
/*
* Set desired rate. The desired rate is for data transfer
* and usally is checked and used when driver changes to
* RUN state.
* If the driver is in AUTH | ASSOC | RUN state, desired
* rate is checked anainst rates supported by current ESS.
* If it's supported and current state is AUTH|ASSOC, nothing
* needs to be done by driver since the desired rate will
* be enabled when the device changes to RUN state. And
* when current state is RUN, Re-associate with the ESS to
* enable the desired rate.
*/
break;
}
/* supported */
IEEE80211_S_ASSOC, 0);
}
return (err);
}
}
/*
* In INIT or SCAN state
* check if the desired rate is supported by device
*/
for (i = 0; i < IEEE80211_MODE_MAX; i++) {
break;
}
}
if (isfound)
break;
}
if (!isfound) {
ieee80211_err("wl_set_desrates: "
"invald rate %d\n", drate);
return (err);
}
return (err);
}
static void
{
ow_rates.wl_rates_rates[0] =
}
/*
* MAC_PROP_AUTH_MODE
*/
static int
{
int err = 0;
return (err);
"set authmode=%u\n", *iw_auth);
switch (*iw_auth) {
case WL_OPENSYSTEM:
case WL_SHAREDKEY:
break;
default:
ieee80211_err("wl_set_authmode: "
"unknown authmode %u\n", *iw_auth);
break;
}
return (err);
}
static void
{
}
/*
* MAC_PROP_WL_ENCRYPTION
*/
static int
{
int err = 0;
"set encryption=%u\n", *iw_encryp);
if (*iw_encryp == WL_NOENCRYPTION)
flags &= ~IEEE80211_F_PRIVACY;
else
}
return (err);
}
static void
{
*ow_encryp = WL_ENC_WPA;
}
/*
* MAC_PROP_WL_RSSI
*/
static void
{
}
/*
* MAC_PROP_WL_PHY_CONFIG
*/
static int
{
int err = 0;
"set channel=%d\n", ch);
return (err);
} else {
}
case IEEE80211_S_INIT:
case IEEE80211_S_SCAN:
break;
default:
/*
* If hte desired channel has changed (to something
* other than any) and we're not already scanning,
* then kick the state machine.
*/
break;
}
return (err);
}
static int
{
int err = 0;
/* get current phy parameters: FH|DS|ERP */
} else {
switch (ic->ic_phytype) {
case IEEE80211_T_FH: {
break;
}
case IEEE80211_T_DS: {
break;
}
case IEEE80211_T_OFDM: {
break;
}
default:
ieee80211_err("wl_get_phy: "
break;
}
}
return (err);
}
/*
* MAC_PROP_WL_CAPABILITY
*/
static void
{
}
/*
* MAC_PROP_WL_WPA
*/
static int
{
int err = 0;
/* enable wpa mode */
} else {
}
return (err);
}
static void
{
}
/*
* MAC_PROP_WL_SCANRESULTS
*/
static void
{
int ap_num;
int len;
ap_num = 0;
/* filter out non-wpa APs */
continue;
}
ap_num++;
}
}
/*
* MAC_PROP_WL_ESS_LIST
*/
static void
{
ess_list->wl_ess_list_num = 0;
}
/*
* MAC_PROP_WL_WEP_KEY
*/
static int
{
int err = 0;
uint16_t i;
/* set all valid keys */
for (i = 0; i < MAX_NWEPKEYS; i++) {
continue;
if (klen > IEEE80211_KEYBUF_SIZE) {
ieee80211_err("wl_set_wepkey: "
"invalid wepkey length, %u\n", klen);
continue; /* continue to set other keys */
}
if (klen == 0)
continue;
/*
* Set key contents. Only WEP is supported
*/
"set key %u, len=%u\n", i, klen);
ieee80211_err("wl_set_wepkey: "
"abort, create key failed. id=%u\n", i);
continue;
}
== 0) {
ieee80211_err("wl_set_wepkey: "
"set key failed len=%u\n", klen);
}
}
if (err == 0)
return (err);
}
/*
* MAC_PROP_WL_SETOPTIE
*/
static int
{
int err = 0;
char *ie;
ieee80211_err("wl_set_optie: opmode err\n");
return (err);
}
ieee80211_err("wl_set_optie: optie is too long\n");
return (err);
}
"wl_set_optie:ic_opt_ie!=NULL\n");
}
return (err);
}
/*
* MAC_PROP_WL_DELKEY
*/
static int
{
int err = 0;
int kid;
if (kid == IEEE80211_KEYIX_NONE ||
kid >= IEEE80211_WEP_NKID) {
ieee80211_err("wl_set_delkey: incorrect keyix\n");
return (err);
} else {
(void) ieee80211_crypto_delkey(ic,
}
return (err);
}
/*
* MAC_PROP_WL_MLME
*/
static int
{
int err = 0;
case IEEE80211_MLME_DISASSOC:
case IEEE80211_MLME_DEAUTH:
/*
* Mask ic_flags of IEEE80211_F_WPA to disable
* ieee80211_notify temporarily.
*/
}
break;
case IEEE80211_MLME_ASSOC:
ieee80211_err("wifi_cfg_setmlme: opmode err\n");
break;
}
if (ic->ic_des_esslen != 0) {
/*
* Desired ssid specified; must match both bssid and
* ssid to distinguish ap advertising multiple ssid's.
*/
ic->ic_des_essid);
} else {
/*
* Normal case; just match bssid.
*/
mlme->im_macaddr);
}
ieee80211_err("wifi_cfg_setmlme: "
"no matched node\n");
break;
}
break;
default:
break;
}
return (err);
}
/*
* MAC_PROP_WL_WPA_KEY
*/
static int
{
int err = 0;
/*
* cipher support is verified by ieee80211_crypt_newkey
* this also checks ik.ik_keylen > sizeof(wk->wk_key)
*/
ieee80211_err("wl_set_wpakey: key is too long\n");
return (err);
}
ieee80211_err("wl_set_wpakey: incorrect keyix\n");
return (err);
} else {
/*
* Globle slots start off w/o any assigned key index.
* Force one here for consistency with WEPKEY.
*/
}
/* MIC presence is implied by cipher type */
}
} else {
}
return (err);
}
/*
* MAC_PROP_WL_SUP_RATE
*/
static void
{
int i, j, k, l;
wl_rates->wl_rates_num = 0;
for (i = 0; i < IEEE80211_MODE_MAX; i++) {
continue;
/* sort & skip duplicated rates */
for (k = 0; k < wl_rates->wl_rates_num; k++) {
break;
}
/* skip duplicated rates */
continue;
/* sort */
for (l = wl_rates->wl_rates_num; l > k; l--)
wl_rates->wl_rates_num++;
}
}
}
/*
* MAC_PROP_WL_CREATE_IBSS
*/
static int
{
int err = 0;
"set createibss=%u\n", *iw_ibss);
return (err);
}
if (*iw_ibss) {
/*
* Yech, slot time may change depending on the
* operating mode so reset it to be sure
* everything is setup appropriately.
*/
}
} else {
}
}
return (err);
}
static void
{
}
/*
* Typically invoked by drivers in response to request for
* information or to change settings from the userland.
*
* Return value should be checked by WiFI drivers. Return 0
* on success. Otherwise, return non-zero value to indicate
* the error. Driver should operate as below when the return
* error is:
* ENETRESET Reset wireless network and re-start to join a
* WLAN, ENETRESET is returned when a configuration
* parameter has been changed.
* When acknowledge a M_IOCTL message, this error
* is ignored
*/
/* ARGSUSED */
int
{
int err = 0;
switch (wldp_pr_num) {
/* mac_prop_id */
case MAC_PROP_WL_ESSID:
break;
case MAC_PROP_WL_BSSID:
break;
case MAC_PROP_WL_PHY_CONFIG:
break;
case MAC_PROP_WL_KEY_TAB:
break;
case MAC_PROP_WL_AUTH_MODE:
break;
case MAC_PROP_WL_ENCRYPTION:
break;
case MAC_PROP_WL_BSSTYPE:
break;
break;
case MAC_PROP_WL_WPA:
break;
case MAC_PROP_WL_KEY:
break;
case MAC_PROP_WL_DELKEY:
break;
case MAC_PROP_WL_SETOPTIE:
break;
case MAC_PROP_WL_MLME:
break;
case MAC_PROP_WL_CREATE_IBSS:
break;
case MAC_PROP_WL_LINKSTATUS:
case MAC_PROP_WL_ESS_LIST:
case MAC_PROP_WL_RSSI:
case MAC_PROP_WL_CAPABILITY:
case MAC_PROP_WL_SCANRESULTS:
ieee80211_err("ieee80211_setprop: opmode err\n");
break;
default:
ieee80211_err("ieee80211_setprop: opmode not support\n");
break;
}
return (err);
}
/* ARGSUSED */
int
{
int err = 0;
switch (wldp_pr_num) {
/* mac_prop_id */
case MAC_PROP_WL_ESSID:
break;
case MAC_PROP_WL_BSSID:
break;
case MAC_PROP_WL_PHY_CONFIG:
break;
case MAC_PROP_WL_AUTH_MODE:
break;
case MAC_PROP_WL_ENCRYPTION:
break;
case MAC_PROP_WL_BSSTYPE:
break;
break;
case MAC_PROP_WL_LINKSTATUS:
break;
case MAC_PROP_WL_ESS_LIST:
break;
break;
case MAC_PROP_WL_RSSI:
break;
case MAC_PROP_WL_CAPABILITY:
break;
case MAC_PROP_WL_WPA:
break;
case MAC_PROP_WL_SCANRESULTS:
break;
case MAC_PROP_WL_CREATE_IBSS:
break;
case MAC_PROP_WL_KEY_TAB:
case MAC_PROP_WL_KEY:
case MAC_PROP_WL_DELKEY:
case MAC_PROP_WL_SETOPTIE:
case MAC_PROP_WL_MLME:
ieee80211_err("ieee80211_setprop: opmode err\n");
break;
default:
ieee80211_err("ieee80211_setprop: opmode not support\n");
break;
}
return (err);
}
{
/*
* otherwise by the driver.
*/
switch (wldp_pr_num) {
case MAC_PROP_WL_LINKSTATUS:
case MAC_PROP_WL_ESS_LIST:
case MAC_PROP_WL_RSSI:
case MAC_PROP_WL_CAPABILITY:
case MAC_PROP_WL_SCANRESULTS:
case MAC_PROP_WL_CREATE_IBSS:
}
}