|
@@ -5756,11 +5756,13 @@ static int airo_set_wap(struct net_device *dev,
|
|
|
Cmd cmd;
|
|
|
Resp rsp;
|
|
|
APListRid APList_rid;
|
|
|
- static const unsigned char bcast[ETH_ALEN] = { 255, 255, 255, 255, 255, 255 };
|
|
|
+ static const u8 any[ETH_ALEN] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
|
|
|
+ static const u8 off[ETH_ALEN] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
|
|
|
|
|
if (awrq->sa_family != ARPHRD_ETHER)
|
|
|
return -EINVAL;
|
|
|
- else if (!memcmp(bcast, awrq->sa_data, ETH_ALEN)) {
|
|
|
+ else if (!memcmp(any, awrq->sa_data, ETH_ALEN) ||
|
|
|
+ !memcmp(off, awrq->sa_data, ETH_ALEN)) {
|
|
|
memset(&cmd, 0, sizeof(cmd));
|
|
|
cmd.cmd=CMD_LOSE_SYNC;
|
|
|
if (down_interruptible(&local->sem))
|
|
@@ -6249,6 +6251,267 @@ static int airo_get_encode(struct net_device *dev,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+/*------------------------------------------------------------------*/
|
|
|
+/*
|
|
|
+ * Wireless Handler : set extended Encryption parameters
|
|
|
+ */
|
|
|
+static int airo_set_encodeext(struct net_device *dev,
|
|
|
+ struct iw_request_info *info,
|
|
|
+ union iwreq_data *wrqu,
|
|
|
+ char *extra)
|
|
|
+{
|
|
|
+ struct airo_info *local = dev->priv;
|
|
|
+ struct iw_point *encoding = &wrqu->encoding;
|
|
|
+ struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;
|
|
|
+ CapabilityRid cap_rid; /* Card capability info */
|
|
|
+ int perm = ( encoding->flags & IW_ENCODE_TEMP ? 0 : 1 );
|
|
|
+ u16 currentAuthType = local->config.authType;
|
|
|
+ int idx, key_len, alg = ext->alg; /* Check encryption mode */
|
|
|
+ wep_key_t key;
|
|
|
+
|
|
|
+ /* Is WEP supported ? */
|
|
|
+ readCapabilityRid(local, &cap_rid, 1);
|
|
|
+ /* Older firmware doesn't support this...
|
|
|
+ if(!(cap_rid.softCap & 2)) {
|
|
|
+ return -EOPNOTSUPP;
|
|
|
+ } */
|
|
|
+ readConfigRid(local, 1);
|
|
|
+
|
|
|
+ /* Determine and validate the key index */
|
|
|
+ idx = encoding->flags & IW_ENCODE_INDEX;
|
|
|
+ if (idx) {
|
|
|
+ if (idx < 1 || idx > ((cap_rid.softCap & 0x80) ? 4:1))
|
|
|
+ return -EINVAL;
|
|
|
+ idx--;
|
|
|
+ } else
|
|
|
+ idx = get_wep_key(local, 0xffff);
|
|
|
+
|
|
|
+ if (encoding->flags & IW_ENCODE_DISABLED)
|
|
|
+ alg = IW_ENCODE_ALG_NONE;
|
|
|
+
|
|
|
+ /* Just setting the transmit key? */
|
|
|
+ if (ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY) {
|
|
|
+ set_wep_key(local, idx, NULL, 0, perm, 1);
|
|
|
+ } else {
|
|
|
+ /* Set the requested key first */
|
|
|
+ memset(key.key, 0, MAX_KEY_SIZE);
|
|
|
+ switch (alg) {
|
|
|
+ case IW_ENCODE_ALG_NONE:
|
|
|
+ key.len = 0;
|
|
|
+ break;
|
|
|
+ case IW_ENCODE_ALG_WEP:
|
|
|
+ if (ext->key_len > MIN_KEY_SIZE) {
|
|
|
+ key.len = MAX_KEY_SIZE;
|
|
|
+ } else if (ext->key_len > 0) {
|
|
|
+ key.len = MIN_KEY_SIZE;
|
|
|
+ } else {
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+ key_len = min (ext->key_len, key.len);
|
|
|
+ memcpy(key.key, ext->key, key_len);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+ /* Send the key to the card */
|
|
|
+ set_wep_key(local, idx, key.key, key.len, perm, 1);
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Read the flags */
|
|
|
+ if(encoding->flags & IW_ENCODE_DISABLED)
|
|
|
+ local->config.authType = AUTH_OPEN; // disable encryption
|
|
|
+ if(encoding->flags & IW_ENCODE_RESTRICTED)
|
|
|
+ local->config.authType = AUTH_SHAREDKEY; // Only Both
|
|
|
+ if(encoding->flags & IW_ENCODE_OPEN)
|
|
|
+ local->config.authType = AUTH_ENCRYPT; // Only Wep
|
|
|
+ /* Commit the changes to flags if needed */
|
|
|
+ if (local->config.authType != currentAuthType)
|
|
|
+ set_bit (FLAG_COMMIT, &local->flags);
|
|
|
+
|
|
|
+ return -EINPROGRESS;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/*------------------------------------------------------------------*/
|
|
|
+/*
|
|
|
+ * Wireless Handler : get extended Encryption parameters
|
|
|
+ */
|
|
|
+static int airo_get_encodeext(struct net_device *dev,
|
|
|
+ struct iw_request_info *info,
|
|
|
+ union iwreq_data *wrqu,
|
|
|
+ char *extra)
|
|
|
+{
|
|
|
+ struct airo_info *local = dev->priv;
|
|
|
+ struct iw_point *encoding = &wrqu->encoding;
|
|
|
+ struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;
|
|
|
+ CapabilityRid cap_rid; /* Card capability info */
|
|
|
+ int idx, max_key_len;
|
|
|
+
|
|
|
+ /* Is it supported ? */
|
|
|
+ readCapabilityRid(local, &cap_rid, 1);
|
|
|
+ if(!(cap_rid.softCap & 2)) {
|
|
|
+ return -EOPNOTSUPP;
|
|
|
+ }
|
|
|
+ readConfigRid(local, 1);
|
|
|
+
|
|
|
+ max_key_len = encoding->length - sizeof(*ext);
|
|
|
+ if (max_key_len < 0)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ idx = encoding->flags & IW_ENCODE_INDEX;
|
|
|
+ if (idx) {
|
|
|
+ if (idx < 1 || idx > ((cap_rid.softCap & 0x80) ? 4:1))
|
|
|
+ return -EINVAL;
|
|
|
+ idx--;
|
|
|
+ } else
|
|
|
+ idx = get_wep_key(local, 0xffff);
|
|
|
+
|
|
|
+ encoding->flags = idx + 1;
|
|
|
+ memset(ext, 0, sizeof(*ext));
|
|
|
+
|
|
|
+ /* Check encryption mode */
|
|
|
+ switch(local->config.authType) {
|
|
|
+ case AUTH_ENCRYPT:
|
|
|
+ encoding->flags = IW_ENCODE_ALG_WEP | IW_ENCODE_ENABLED;
|
|
|
+ break;
|
|
|
+ case AUTH_SHAREDKEY:
|
|
|
+ encoding->flags = IW_ENCODE_ALG_WEP | IW_ENCODE_ENABLED;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ case AUTH_OPEN:
|
|
|
+ encoding->flags = IW_ENCODE_ALG_NONE | IW_ENCODE_DISABLED;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ /* We can't return the key, so set the proper flag and return zero */
|
|
|
+ encoding->flags |= IW_ENCODE_NOKEY;
|
|
|
+ memset(extra, 0, 16);
|
|
|
+
|
|
|
+ /* Copy the key to the user buffer */
|
|
|
+ ext->key_len = get_wep_key(local, idx);
|
|
|
+ if (ext->key_len > 16) {
|
|
|
+ ext->key_len=0;
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/*------------------------------------------------------------------*/
|
|
|
+/*
|
|
|
+ * Wireless Handler : set extended authentication parameters
|
|
|
+ */
|
|
|
+static int airo_set_auth(struct net_device *dev,
|
|
|
+ struct iw_request_info *info,
|
|
|
+ union iwreq_data *wrqu, char *extra)
|
|
|
+{
|
|
|
+ struct airo_info *local = dev->priv;
|
|
|
+ struct iw_param *param = &wrqu->param;
|
|
|
+ u16 currentAuthType = local->config.authType;
|
|
|
+
|
|
|
+ switch (param->flags & IW_AUTH_INDEX) {
|
|
|
+ case IW_AUTH_WPA_VERSION:
|
|
|
+ case IW_AUTH_CIPHER_PAIRWISE:
|
|
|
+ case IW_AUTH_CIPHER_GROUP:
|
|
|
+ case IW_AUTH_KEY_MGMT:
|
|
|
+ case IW_AUTH_RX_UNENCRYPTED_EAPOL:
|
|
|
+ case IW_AUTH_PRIVACY_INVOKED:
|
|
|
+ /*
|
|
|
+ * airo does not use these parameters
|
|
|
+ */
|
|
|
+ break;
|
|
|
+
|
|
|
+ case IW_AUTH_DROP_UNENCRYPTED:
|
|
|
+ if (param->value) {
|
|
|
+ /* Only change auth type if unencrypted */
|
|
|
+ if (currentAuthType == AUTH_OPEN)
|
|
|
+ local->config.authType = AUTH_ENCRYPT;
|
|
|
+ } else {
|
|
|
+ local->config.authType = AUTH_OPEN;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Commit the changes to flags if needed */
|
|
|
+ if (local->config.authType != currentAuthType)
|
|
|
+ set_bit (FLAG_COMMIT, &local->flags);
|
|
|
+ break;
|
|
|
+
|
|
|
+ case IW_AUTH_80211_AUTH_ALG: {
|
|
|
+ /* FIXME: What about AUTH_OPEN? This API seems to
|
|
|
+ * disallow setting our auth to AUTH_OPEN.
|
|
|
+ */
|
|
|
+ if (param->value & IW_AUTH_ALG_SHARED_KEY) {
|
|
|
+ local->config.authType = AUTH_SHAREDKEY;
|
|
|
+ } else if (param->value & IW_AUTH_ALG_OPEN_SYSTEM) {
|
|
|
+ local->config.authType = AUTH_ENCRYPT;
|
|
|
+ } else
|
|
|
+ return -EINVAL;
|
|
|
+ break;
|
|
|
+
|
|
|
+ /* Commit the changes to flags if needed */
|
|
|
+ if (local->config.authType != currentAuthType)
|
|
|
+ set_bit (FLAG_COMMIT, &local->flags);
|
|
|
+ }
|
|
|
+
|
|
|
+ case IW_AUTH_WPA_ENABLED:
|
|
|
+ /* Silently accept disable of WPA */
|
|
|
+ if (param->value > 0)
|
|
|
+ return -EOPNOTSUPP;
|
|
|
+ break;
|
|
|
+
|
|
|
+ default:
|
|
|
+ return -EOPNOTSUPP;
|
|
|
+ }
|
|
|
+ return -EINPROGRESS;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/*------------------------------------------------------------------*/
|
|
|
+/*
|
|
|
+ * Wireless Handler : get extended authentication parameters
|
|
|
+ */
|
|
|
+static int airo_get_auth(struct net_device *dev,
|
|
|
+ struct iw_request_info *info,
|
|
|
+ union iwreq_data *wrqu, char *extra)
|
|
|
+{
|
|
|
+ struct airo_info *local = dev->priv;
|
|
|
+ struct iw_param *param = &wrqu->param;
|
|
|
+ u16 currentAuthType = local->config.authType;
|
|
|
+
|
|
|
+ switch (param->flags & IW_AUTH_INDEX) {
|
|
|
+ case IW_AUTH_DROP_UNENCRYPTED:
|
|
|
+ switch (currentAuthType) {
|
|
|
+ case AUTH_SHAREDKEY:
|
|
|
+ case AUTH_ENCRYPT:
|
|
|
+ param->value = 1;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ param->value = 0;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+ case IW_AUTH_80211_AUTH_ALG:
|
|
|
+ switch (currentAuthType) {
|
|
|
+ case AUTH_SHAREDKEY:
|
|
|
+ param->value = IW_AUTH_ALG_SHARED_KEY;
|
|
|
+ break;
|
|
|
+ case AUTH_ENCRYPT:
|
|
|
+ default:
|
|
|
+ param->value = IW_AUTH_ALG_OPEN_SYSTEM;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+ case IW_AUTH_WPA_ENABLED:
|
|
|
+ param->value = 0;
|
|
|
+ break;
|
|
|
+
|
|
|
+ default:
|
|
|
+ return -EOPNOTSUPP;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
/*------------------------------------------------------------------*/
|
|
|
/*
|
|
|
* Wireless Handler : set Tx-Power
|
|
@@ -7005,6 +7268,15 @@ static const iw_handler airo_handler[] =
|
|
|
(iw_handler) airo_get_encode, /* SIOCGIWENCODE */
|
|
|
(iw_handler) airo_set_power, /* SIOCSIWPOWER */
|
|
|
(iw_handler) airo_get_power, /* SIOCGIWPOWER */
|
|
|
+ (iw_handler) NULL, /* -- hole -- */
|
|
|
+ (iw_handler) NULL, /* -- hole -- */
|
|
|
+ (iw_handler) NULL, /* SIOCSIWGENIE */
|
|
|
+ (iw_handler) NULL, /* SIOCGIWGENIE */
|
|
|
+ (iw_handler) airo_set_auth, /* SIOCSIWAUTH */
|
|
|
+ (iw_handler) airo_get_auth, /* SIOCGIWAUTH */
|
|
|
+ (iw_handler) airo_set_encodeext, /* SIOCSIWENCODEEXT */
|
|
|
+ (iw_handler) airo_get_encodeext, /* SIOCGIWENCODEEXT */
|
|
|
+ (iw_handler) NULL, /* SIOCSIWPMKSA */
|
|
|
};
|
|
|
|
|
|
/* Note : don't describe AIROIDIFC and AIROOLDIDIFC in here.
|