static int iw_get_encodeext(struct net_device *netdev, struct iw_request_info *info, union iwreq_data *data, char *extra) { return ieee80211_wx_get_encodeext(zd_netdev_ieee80211(netdev), info, data, extra); }
static void set_security(struct net_device *netdev, struct ieee80211_security *sec) { struct ieee80211_device *ieee = zd_netdev_ieee80211(netdev); struct ieee80211_security *secinfo = &ieee->sec; int keyidx; dev_dbg_f(zd_mac_dev(zd_netdev_mac(netdev)), "\n"); for (keyidx = 0; keyidx<WEP_KEYS; keyidx++) if (sec->flags & (1<<keyidx)) { secinfo->encode_alg[keyidx] = sec->encode_alg[keyidx]; secinfo->key_sizes[keyidx] = sec->key_sizes[keyidx]; memcpy(secinfo->keys[keyidx], sec->keys[keyidx], SCM_KEY_LEN); } if (sec->flags & SEC_ACTIVE_KEY) { secinfo->active_key = sec->active_key; dev_dbg_f(zd_mac_dev(zd_netdev_mac(netdev)), " .active_key = %d\n", sec->active_key); } if (sec->flags & SEC_UNICAST_GROUP) { secinfo->unicast_uses_group = sec->unicast_uses_group; dev_dbg_f(zd_mac_dev(zd_netdev_mac(netdev)), " .unicast_uses_group = %d\n", sec->unicast_uses_group); } if (sec->flags & SEC_LEVEL) { secinfo->level = sec->level; dev_dbg_f(zd_mac_dev(zd_netdev_mac(netdev)), " .level = %d\n", sec->level); } if (sec->flags & SEC_ENABLED) { secinfo->enabled = sec->enabled; dev_dbg_f(zd_mac_dev(zd_netdev_mac(netdev)), " .enabled = %d\n", sec->enabled); } if (sec->flags & SEC_ENCRYPT) { secinfo->encrypt = sec->encrypt; dev_dbg_f(zd_mac_dev(zd_netdev_mac(netdev)), " .encrypt = %d\n", sec->encrypt); } if (sec->flags & SEC_AUTH_MODE) { secinfo->auth_mode = sec->auth_mode; dev_dbg_f(zd_mac_dev(zd_netdev_mac(netdev)), " .auth_mode = %d\n", sec->auth_mode); } }
static void cs_set_control(struct zd_mac *mac, struct zd_ctrlset *cs, struct ieee80211_hdr_4addr *header) { struct ieee80211softmac_device *softmac = ieee80211_priv(mac->netdev); unsigned int tx_length = le16_to_cpu(cs->tx_length); u16 fctl = le16_to_cpu(header->frame_ctl); u16 ftype = WLAN_FC_GET_TYPE(fctl); u16 stype = WLAN_FC_GET_STYPE(fctl); /* * CONTROL TODO: * - if backoff needed, enable bit 0 * - if burst (backoff not needed) disable bit 0 */ cs->control = 0; /* First fragment */ if (WLAN_GET_SEQ_FRAG(le16_to_cpu(header->seq_ctl)) == 0) cs->control |= ZD_CS_NEED_RANDOM_BACKOFF; /* Multicast */ if (is_multicast_ether_addr(header->addr1)) cs->control |= ZD_CS_MULTICAST; /* PS-POLL */ if (stype == IEEE80211_STYPE_PSPOLL) cs->control |= ZD_CS_PS_POLL_FRAME; /* Unicast data frames over the threshold should have RTS */ if (!is_multicast_ether_addr(header->addr1) && ftype != IEEE80211_FTYPE_MGMT && tx_length > zd_netdev_ieee80211(mac->netdev)->rts) cs->control |= ZD_CS_RTS; /* Use CTS-to-self protection if required */ if (ZD_CS_TYPE(cs->modulation) == ZD_CS_OFDM && ieee80211softmac_protection_needed(softmac)) { /* FIXME: avoid sending RTS *and* self-CTS, is that correct? */ cs->control &= ~ZD_CS_RTS; cs->control |= ZD_CS_SELF_CTS; } /* FIXME: Management frame? */ }
int zd_mac_init(struct zd_mac *mac, struct net_device *netdev, struct usb_interface *intf) { struct ieee80211_device *ieee = zd_netdev_ieee80211(netdev); memset(mac, 0, sizeof(*mac)); spin_lock_init(&mac->lock); mac->netdev = netdev; INIT_DELAYED_WORK(&mac->set_rts_cts_work, set_rts_cts_work); INIT_DELAYED_WORK(&mac->set_basic_rates_work, set_basic_rates_work); skb_queue_head_init(&mac->rx_queue); tasklet_init(&mac->rx_tasklet, do_rx, (unsigned long)mac); tasklet_disable(&mac->rx_tasklet); ieee_init(ieee); softmac_init(ieee80211_priv(netdev)); zd_chip_init(&mac->chip, netdev, intf); housekeeping_init(mac); INIT_WORK(&mac->set_multicast_hash_work, set_multicast_hash_handler); return 0; }