示例#1
0
static int qtnf_start_ap(struct wiphy *wiphy, struct net_device *dev,
			 struct cfg80211_ap_settings *settings)
{
	struct qtnf_vif *vif = qtnf_netdev_get_priv(dev);
	int ret;

	ret = qtnf_cmd_send_start_ap(vif, settings);
	if (ret)
		pr_err("VIF%u.%u: failed to start AP\n", vif->mac->macid,
		       vif->vifid);

	return ret;
}
示例#2
0
文件: cfg80211.c 项目: mkrufky/linux
static int qtnf_start_ap(struct wiphy *wiphy, struct net_device *dev,
			 struct cfg80211_ap_settings *settings)
{
	struct qtnf_vif *vif = qtnf_netdev_get_priv(dev);
	struct qtnf_wmac *mac = wiphy_priv(wiphy);
	struct qtnf_bss_config *bss_cfg;
	int ret;

	if (!cfg80211_chandef_identical(&mac->chandef, &settings->chandef)) {
		memcpy(&mac->chandef, &settings->chandef, sizeof(mac->chandef));
		if (vif->vifid != 0)
			pr_warn("%s: unexpected chan %u (%u MHz)\n", dev->name,
				settings->chandef.chan->hw_value,
				settings->chandef.chan->center_freq);
	}

	bss_cfg = &vif->bss_cfg;
	memset(bss_cfg, 0, sizeof(*bss_cfg));

	bss_cfg->bcn_period = settings->beacon_interval;
	bss_cfg->dtim = settings->dtim_period;
	bss_cfg->auth_type = settings->auth_type;
	bss_cfg->privacy = settings->privacy;

	bss_cfg->ssid_len = settings->ssid_len;
	memcpy(&bss_cfg->ssid, settings->ssid, bss_cfg->ssid_len);

	memcpy(&bss_cfg->crypto, &settings->crypto,
	       sizeof(struct cfg80211_crypto_settings));

	ret = qtnf_cmd_send_config_ap(vif);
	if (ret) {
		pr_err("VIF%u.%u: failed to push config to FW\n",
		       vif->mac->macid, vif->vifid);
		goto out;
	}

	if (!(vif->bss_status & QTNF_STATE_AP_CONFIG)) {
		pr_err("VIF%u.%u: AP config failed in FW\n", vif->mac->macid,
		       vif->vifid);
		ret = -EFAULT;
		goto out;
	}

	ret = qtnf_mgmt_set_appie(vif, &settings->beacon);
	if (ret) {
		pr_err("VIF%u.%u: failed to add IEs to beacon\n",
		       vif->mac->macid, vif->vifid);
		goto out;
	}

	ret = qtnf_cmd_send_start_ap(vif);
	if (ret) {
		pr_err("VIF%u.%u: failed to start AP\n", vif->mac->macid,
		       vif->vifid);
		goto out;
	}

	if (!(vif->bss_status & QTNF_STATE_AP_START)) {
		pr_err("VIF%u.%u: FW failed to start AP operation\n",
		       vif->mac->macid, vif->vifid);
		ret = -EFAULT;
	}

out:
	return ret;
}