static int hostap_set_rate(struct net_device *dev) { struct hostap_interface *iface; local_info_t *local; int ret, basic_rates; iface = netdev_priv(dev); local = iface->local; basic_rates = local->basic_rates & local->tx_rate_control; if (!basic_rates || basic_rates != local->basic_rates) { printk(KERN_INFO "%s: updating basic rate set automatically " "to match with the new supported rate set\n", dev->name); if (!basic_rates) basic_rates = local->tx_rate_control; local->basic_rates = basic_rates; if (hostap_set_word(dev, HFA384X_RID_CNFBASICRATES, basic_rates)) printk(KERN_WARNING "%s: failed to set " "cnfBasicRates\n", dev->name); } ret = (hostap_set_word(dev, HFA384X_RID_TXRATECONTROL, local->tx_rate_control) || hostap_set_word(dev, HFA384X_RID_CNFSUPPORTEDRATES, local->tx_rate_control) || local->func->reset_port(dev)); if (ret) { printk(KERN_WARNING "%s: TXRateControl/cnfSupportedRates " "setting to 0x%x failed\n", dev->name, local->tx_rate_control); } /* Update TX rate configuration for all STAs based on new operational * rate set. */ hostap_update_rates(local); return ret; }
/* TODO: to be further implemented as soon as Prism2 fully supports * GroupAddresses and correct documentation is available */ void hostap_set_multicast_list_queue(void *data) { struct net_device *dev = (struct net_device *) data; local_info_t *local = (local_info_t *) dev->priv; if (hostap_set_word(dev, HFA384X_RID_PROMISCUOUSMODE, local->is_promisc)) { printk(KERN_INFO "%s: %sabling promiscuous mode failed\n", dev->name, local->is_promisc ? "en" : "dis"); } #ifndef NEW_MODULE_CODE MOD_DEC_USE_COUNT; #endif }
static int prism2_ioctl_siwsens(struct net_device *dev, struct iw_request_info *info, struct iw_param *sens, char *extra) { struct hostap_interface *iface; local_info_t *local; iface = netdev_priv(dev); local = iface->local; /* Set the desired AP density */ if (sens->value < 1 || sens->value > 3) return -EINVAL; if (hostap_set_word(dev, HFA384X_RID_CNFSYSTEMSCALE, sens->value) || local->func->reset_port(dev)) return -EINVAL; return 0; }
static int prism2_ioctl_siwfreq(struct net_device *dev, struct iw_request_info *info, struct iw_freq *freq, char *extra) { struct hostap_interface *iface; local_info_t *local; iface = netdev_priv(dev); local = iface->local; /* freq => chan. */ if (freq->e == 1 && freq->m / 100000 >= freq_list[0] && freq->m / 100000 <= freq_list[FREQ_COUNT - 1]) { int ch; int fr = freq->m / 100000; for (ch = 0; ch < FREQ_COUNT; ch++) { if (fr == freq_list[ch]) { freq->e = 0; freq->m = ch + 1; break; } } } if (freq->e != 0 || freq->m < 1 || freq->m > FREQ_COUNT || !(local->channel_mask & (1 << (freq->m - 1)))) return -EINVAL; local->channel = freq->m; /* channel is used in prism2_setup_rids() */ if (hostap_set_word(dev, HFA384X_RID_CNFOWNCHANNEL, local->channel) || local->func->reset_port(dev)) return -EINVAL; return 0; }
int hostap_set_encryption(local_info_t *local) { u16 val; int i, keylen, len, idx; char keybuf[WEP_KEY_LEN + 1]; enum { NONE, WEP, OTHER } encrypt_type; if (local->crypt == NULL || local->crypt->ops == NULL) encrypt_type = NONE; else if (strcmp(local->crypt->ops->name, "WEP") == 0) encrypt_type = WEP; else encrypt_type = OTHER; if (local->func->get_rid(local->dev, HFA384X_RID_CNFWEPFLAGS, &val, 2, 1) < 0) { printk(KERN_DEBUG "Could not read current WEP flags.\n"); goto fail; } le16_to_cpus(&val); if (encrypt_type != NONE) val |= HFA384X_WEPFLAGS_PRIVACYINVOKED; else val &= ~HFA384X_WEPFLAGS_PRIVACYINVOKED; if (local->open_wep || encrypt_type == NONE || (local->ieee_802_1x && local->host_decrypt)) val &= ~HFA384X_WEPFLAGS_EXCLUDEUNENCRYPTED; else val |= HFA384X_WEPFLAGS_EXCLUDEUNENCRYPTED; if (encrypt_type != NONE && (encrypt_type == OTHER || local->host_encrypt)) val |= HFA384X_WEPFLAGS_HOSTENCRYPT; else val &= ~HFA384X_WEPFLAGS_HOSTENCRYPT; if (encrypt_type != NONE && (encrypt_type == OTHER || local->host_decrypt)) val |= HFA384X_WEPFLAGS_HOSTDECRYPT; else val &= ~HFA384X_WEPFLAGS_HOSTDECRYPT; if (hostap_set_word(local->dev, HFA384X_RID_CNFWEPFLAGS, val)) { printk(KERN_DEBUG "Could not write new WEP flags (0x%x)\n", val); goto fail; } if (encrypt_type != WEP) return 0; /* 104-bit support seems to require that all the keys are set to the * same keylen */ keylen = 6; /* first 5 octets */ idx = local->crypt->ops->get_key_idx(local->crypt->priv); len = local->crypt->ops->get_key(idx, keybuf, sizeof(keybuf), local->crypt->priv); if (idx >= 0 && idx < WEP_KEYS && len > 5) keylen = WEP_KEY_LEN + 1; /* first 13 octets */ for (i = 0; i < WEP_KEYS; i++) { memset(keybuf, 0, sizeof(keybuf)); (void) local->crypt->ops->get_key(i, keybuf, sizeof(keybuf), local->crypt->priv); if (local->func->set_rid(local->dev, HFA384X_RID_CNFDEFAULTKEY0 + i, keybuf, keylen)) { printk(KERN_DEBUG "Could not set key %d (len=%d)\n", i, keylen); goto fail; } } if (hostap_set_word(local->dev, HFA384X_RID_CNFWEPDEFAULTKEYID, idx)) { printk(KERN_DEBUG "Could not set default keyid %d\n", idx); goto fail; } return 0; fail: printk(KERN_DEBUG "%s: encryption setup failed\n", local->dev->name); return -1; }