⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 11d.c

📁 linux内核源码
💻 C
📖 第 1 页 / 共 2 页
字号:
	nr_subband = (countryinfo->len - COUNTRY_CODE_LEN) /	    sizeof(struct ieeetypes_subbandset);	for (j = 0, lastchan = 0; j < nr_subband; j++) {		if (countryinfo->subband[j].firstchan <= lastchan) {			/*Step2&3. Check First Chan Num increment and no overlap */			lbs_deb_11d("chan %d>%d, overlap\n",			       countryinfo->subband[j].firstchan, lastchan);			continue;		}		firstchan = countryinfo->subband[j].firstchan;		nrchan = countryinfo->subband[j].nrchan;		for (i = 0; idx < MAX_NO_OF_CHAN && i < nrchan; i++) {			/*step4: channel is supported? */			if (!wlan_get_chan_11d(band, firstchan, i, &curchan)) {				/* Chan is not found in UN table */				lbs_deb_11d("chan is not supported: %d \n", i);				break;			}			lastchan = curchan;			if (wlan_region_chan_supported_11d			    (region, band, curchan)) {				/*step5: Check if curchan is supported by mrvl in region */				parsed_region_chan->chanpwr[idx].chan = curchan;				parsed_region_chan->chanpwr[idx].pwr =				    countryinfo->subband[j].maxtxpwr;				idx++;			} else {				/*not supported and ignore the chan */				lbs_deb_11d(				       "i %d, chan %d unsupported in region %x, band %d\n",				       i, curchan, region, band);			}		}		/*Step6: Add other checking if any */	}	parsed_region_chan->nr_chan = idx;	lbs_deb_11d("nrchan=%x\n", parsed_region_chan->nr_chan);	lbs_deb_hex(LBS_DEB_11D, "parsed_region_chan", (u8 *) parsed_region_chan,		2 + COUNTRY_CODE_LEN + sizeof(struct parsed_region_chan_11d) * idx);done:	lbs_deb_enter(LBS_DEB_11D);	return 0;}/** *  @brief This function calculates the scan type for channels *  @param chan                 chan number *  @param parsed_region_chan   pointer to parsed_region_chan_11d *  @return 	                PASSIVE if chan is unknown; ACTIVE if chan is known*/u8 libertas_get_scan_type_11d(u8 chan,			  struct parsed_region_chan_11d * parsed_region_chan){	u8 scan_type = CMD_SCAN_TYPE_PASSIVE;	lbs_deb_enter(LBS_DEB_11D);	if (wlan_channel_known_11d(chan, parsed_region_chan)) {		lbs_deb_11d("found, do active scan\n");		scan_type = CMD_SCAN_TYPE_ACTIVE;	} else {		lbs_deb_11d("not found, do passive scan\n");	}	lbs_deb_leave_args(LBS_DEB_11D, "ret scan_type %d", scan_type);	return scan_type;}void libertas_init_11d(wlan_private * priv){	priv->adapter->enable11d = 0;	memset(&(priv->adapter->parsed_region_chan), 0,	       sizeof(struct parsed_region_chan_11d));	return;}/** *  @brief This function sets DOMAIN INFO to FW *  @param priv       pointer to wlan_private *  @return 	      0; -1*/static int set_domain_info_11d(wlan_private * priv){	int ret;	if (!priv->adapter->enable11d) {		lbs_deb_11d("dnld domain Info with 11d disabled\n");		return 0;	}	ret = libertas_prepare_and_send_command(priv, CMD_802_11D_DOMAIN_INFO,				    CMD_ACT_SET,				    CMD_OPTION_WAITFORRSP, 0, NULL);	if (ret)		lbs_deb_11d("fail to dnld domain info\n");	return ret;}/** *  @brief This function setups scan channels *  @param priv       pointer to wlan_private *  @param band       band *  @return 	      0*/int libertas_set_universaltable(wlan_private * priv, u8 band){	wlan_adapter *adapter = priv->adapter;	u16 size = sizeof(struct chan_freq_power);	u16 i = 0;	memset(adapter->universal_channel, 0,	       sizeof(adapter->universal_channel));	adapter->universal_channel[i].nrcfp =	    sizeof(channel_freq_power_UN_BG) / size;	lbs_deb_11d("BG-band nrcfp %d\n",	       adapter->universal_channel[i].nrcfp);	adapter->universal_channel[i].CFP = channel_freq_power_UN_BG;	adapter->universal_channel[i].valid = 1;	adapter->universal_channel[i].region = UNIVERSAL_REGION_CODE;	adapter->universal_channel[i].band = band;	i++;	return 0;}/** *  @brief This function implements command CMD_802_11D_DOMAIN_INFO *  @param priv       pointer to wlan_private *  @param cmd        pointer to cmd buffer *  @param cmdno      cmd ID *  @param cmdOption  cmd action *  @return 	      0*/int libertas_cmd_802_11d_domain_info(wlan_private * priv,				 struct cmd_ds_command *cmd, u16 cmdno,				 u16 cmdoption){	struct cmd_ds_802_11d_domain_info *pdomaininfo =	    &cmd->params.domaininfo;	struct mrvlietypes_domainparamset *domain = &pdomaininfo->domain;	wlan_adapter *adapter = priv->adapter;	u8 nr_subband = adapter->domainreg.nr_subband;	lbs_deb_enter(LBS_DEB_11D);	lbs_deb_11d("nr_subband=%x\n", nr_subband);	cmd->command = cpu_to_le16(cmdno);	pdomaininfo->action = cpu_to_le16(cmdoption);	if (cmdoption == CMD_ACT_GET) {		cmd->size =		    cpu_to_le16(sizeof(pdomaininfo->action) + S_DS_GEN);		lbs_deb_hex(LBS_DEB_11D, "802_11D_DOMAIN_INFO", (u8 *) cmd,			(int)(cmd->size));		goto done;	}	domain->header.type = cpu_to_le16(TLV_TYPE_DOMAIN);	memcpy(domain->countrycode, adapter->domainreg.countrycode,	       sizeof(domain->countrycode));	domain->header.len =	    cpu_to_le16(nr_subband * sizeof(struct ieeetypes_subbandset) +			     sizeof(domain->countrycode));	if (nr_subband) {		memcpy(domain->subband, adapter->domainreg.subband,		       nr_subband * sizeof(struct ieeetypes_subbandset));		cmd->size = cpu_to_le16(sizeof(pdomaininfo->action) +					     le16_to_cpu(domain->header.len) +					     sizeof(struct mrvlietypesheader) +					     S_DS_GEN);	} else {		cmd->size =		    cpu_to_le16(sizeof(pdomaininfo->action) + S_DS_GEN);	}	lbs_deb_hex(LBS_DEB_11D, "802_11D_DOMAIN_INFO", (u8 *) cmd, le16_to_cpu(cmd->size));done:	lbs_deb_enter(LBS_DEB_11D);	return 0;}/** *  @brief This function parses countryinfo from AP and download country info to FW *  @param priv    pointer to wlan_private *  @param resp    pointer to command response buffer *  @return 	   0; -1 */int libertas_ret_802_11d_domain_info(wlan_private * priv,				 struct cmd_ds_command *resp){	struct cmd_ds_802_11d_domain_info *domaininfo = &resp->params.domaininforesp;	struct mrvlietypes_domainparamset *domain = &domaininfo->domain;	u16 action = le16_to_cpu(domaininfo->action);	s16 ret = 0;	u8 nr_subband = 0;	lbs_deb_enter(LBS_DEB_11D);	lbs_deb_hex(LBS_DEB_11D, "domain info resp", (u8 *) resp,		(int)le16_to_cpu(resp->size));	nr_subband = (le16_to_cpu(domain->header.len) - COUNTRY_CODE_LEN) /		      sizeof(struct ieeetypes_subbandset);	lbs_deb_11d("domain info resp: nr_subband %d\n", nr_subband);	if (nr_subband > MRVDRV_MAX_SUBBAND_802_11D) {		lbs_deb_11d("Invalid Numrer of Subband returned!!\n");		return -1;	}	switch (action) {	case CMD_ACT_SET:	/*Proc Set action */		break;	case CMD_ACT_GET:		break;	default:		lbs_deb_11d("Invalid action:%d\n", domaininfo->action);		ret = -1;		break;	}	lbs_deb_leave_args(LBS_DEB_11D, "ret %d", ret);	return ret;}/** *  @brief This function parses countryinfo from AP and download country info to FW *  @param priv    pointer to wlan_private *  @return 	   0; -1 */int libertas_parse_dnld_countryinfo_11d(wlan_private * priv,                                        struct bss_descriptor * bss){	int ret;	wlan_adapter *adapter = priv->adapter;	lbs_deb_enter(LBS_DEB_11D);	if (priv->adapter->enable11d) {		memset(&adapter->parsed_region_chan, 0,		       sizeof(struct parsed_region_chan_11d));		ret = parse_domain_info_11d(&bss->countryinfo, 0,					       &adapter->parsed_region_chan);		if (ret == -1) {			lbs_deb_11d("error parsing domain_info from AP\n");			goto done;		}		memset(&adapter->domainreg, 0,		       sizeof(struct wlan_802_11d_domain_reg));		generate_domain_info_11d(&adapter->parsed_region_chan,				      &adapter->domainreg);		ret = set_domain_info_11d(priv);		if (ret) {			lbs_deb_11d("error setting domain info\n");			goto done;		}	}	ret = 0;done:	lbs_deb_leave_args(LBS_DEB_11D, "ret %d", ret);	return ret;}/** *  @brief This function generates 11D info from user specified regioncode and download to FW *  @param priv    pointer to wlan_private *  @return 	   0; -1 */int libertas_create_dnld_countryinfo_11d(wlan_private * priv){	int ret;	wlan_adapter *adapter = priv->adapter;	struct region_channel *region_chan;	u8 j;	lbs_deb_enter(LBS_DEB_11D);	lbs_deb_11d("curbssparams.band %d\n", adapter->curbssparams.band);	if (priv->adapter->enable11d) {		/* update parsed_region_chan_11; dnld domaininf to FW */		for (j = 0; j < sizeof(adapter->region_channel) /		     sizeof(adapter->region_channel[0]); j++) {			region_chan = &adapter->region_channel[j];			lbs_deb_11d("%d region_chan->band %d\n", j,			       region_chan->band);			if (!region_chan || !region_chan->valid			    || !region_chan->CFP)				continue;			if (region_chan->band != adapter->curbssparams.band)				continue;			break;		}		if (j >= sizeof(adapter->region_channel) /		    sizeof(adapter->region_channel[0])) {			lbs_deb_11d("region_chan not found, band %d\n",			       adapter->curbssparams.band);			ret = -1;			goto done;		}		memset(&adapter->parsed_region_chan, 0,		       sizeof(struct parsed_region_chan_11d));		wlan_generate_parsed_region_chan_11d(region_chan,						     &adapter->						     parsed_region_chan);		memset(&adapter->domainreg, 0,		       sizeof(struct wlan_802_11d_domain_reg));		generate_domain_info_11d(&adapter->parsed_region_chan,					 &adapter->domainreg);		ret = set_domain_info_11d(priv);		if (ret) {			lbs_deb_11d("error setting domain info\n");			goto done;		}	}	ret = 0;done:	lbs_deb_leave_args(LBS_DEB_11D, "ret %d", ret);	return ret;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -