static int qtnf_connect(struct wiphy *wiphy, struct net_device *dev, struct cfg80211_connect_params *sme) { struct qtnf_vif *vif = qtnf_netdev_get_priv(dev); int ret; if (vif->wdev.iftype != NL80211_IFTYPE_STATION) return -EOPNOTSUPP; if (vif->sta_state != QTNF_STA_DISCONNECTED) return -EBUSY; if (sme->bssid) ether_addr_copy(vif->bssid, sme->bssid); else eth_zero_addr(vif->bssid); ret = qtnf_cmd_send_connect(vif, sme); if (ret) { pr_err("VIF%u.%u: failed to connect\n", vif->mac->macid, vif->vifid); return ret; } vif->sta_state = QTNF_STA_CONNECTING; return 0; }
static int qtnf_connect(struct wiphy *wiphy, struct net_device *dev, struct cfg80211_connect_params *sme) { struct qtnf_vif *vif = qtnf_netdev_get_priv(dev); struct qtnf_wmac *mac = wiphy_priv(wiphy); struct cfg80211_chan_def chandef; struct qtnf_bss_config *bss_cfg; int ret; if (vif->wdev.iftype != NL80211_IFTYPE_STATION) return -EOPNOTSUPP; if (vif->sta_state != QTNF_STA_DISCONNECTED) return -EBUSY; bss_cfg = &vif->bss_cfg; memset(bss_cfg, 0, sizeof(*bss_cfg)); if (sme->channel) { /* FIXME: need to set proper nl80211_channel_type value */ cfg80211_chandef_create(&chandef, sme->channel, NL80211_CHAN_HT20); /* fall-back to minimal safe chandef description */ if (!cfg80211_chandef_valid(&chandef)) cfg80211_chandef_create(&chandef, sme->channel, NL80211_CHAN_HT20); memcpy(&mac->chandef, &chandef, sizeof(mac->chandef)); } bss_cfg->ssid_len = sme->ssid_len; memcpy(&bss_cfg->ssid, sme->ssid, bss_cfg->ssid_len); bss_cfg->auth_type = sme->auth_type; bss_cfg->privacy = sme->privacy; bss_cfg->mfp = sme->mfp; if ((sme->bg_scan_period > 0) && (sme->bg_scan_period <= QTNF_MAX_BG_SCAN_PERIOD)) bss_cfg->bg_scan_period = sme->bg_scan_period; else if (sme->bg_scan_period == -1) bss_cfg->bg_scan_period = QTNF_DEFAULT_BG_SCAN_PERIOD; else bss_cfg->bg_scan_period = 0; /* disabled */ bss_cfg->connect_flags = 0; if (sme->flags & ASSOC_REQ_DISABLE_HT) bss_cfg->connect_flags |= QLINK_STA_CONNECT_DISABLE_HT; if (sme->flags & ASSOC_REQ_DISABLE_VHT) bss_cfg->connect_flags |= QLINK_STA_CONNECT_DISABLE_VHT; if (sme->flags & ASSOC_REQ_USE_RRM) bss_cfg->connect_flags |= QLINK_STA_CONNECT_USE_RRM; memcpy(&bss_cfg->crypto, &sme->crypto, sizeof(bss_cfg->crypto)); if (sme->bssid) ether_addr_copy(bss_cfg->bssid, sme->bssid); else eth_zero_addr(bss_cfg->bssid); ret = qtnf_cmd_send_connect(vif, sme); if (ret) { pr_err("VIF%u.%u: failed to connect\n", vif->mac->macid, vif->vifid); return ret; } vif->sta_state = QTNF_STA_CONNECTING; return 0; }