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

📄 sample.c

📁 linux下的wifi源码,可以直接编译测试运行..希望大家能有作用
💻 C
📖 第 1 页 / 共 3 页
字号:
static voidath_rate_findrate(struct ath_softc *sc, struct ath_node *an,	int shortPreamble, size_t frameLen,	u_int8_t *rix, int *try0, u_int8_t *txrate){	struct sample_node *sn = ATH_NODE_SAMPLE(an);	struct sample_softc *ssc = ATH_SOFTC_SAMPLE(sc);	struct ieee80211com *ic = &sc->sc_ic;	unsigned int size_bin, mrr, change_rates;	int ndx, best_ndx;	unsigned average_tx_time;	if (sn->num_rates <= 0) {		printk(KERN_WARNING "%s: no rates for %s?\n",		       dev_info, 		       ether_sprintf(an->an_node.ni_macaddr));		return;	}	mrr = sc->sc_mrretry && !(ic->ic_flags & IEEE80211_F_USEPROT) && ENABLE_MRR;	size_bin = size_to_bin(frameLen);	best_ndx = best_rate_ndx(sn, size_bin, !mrr);	if (best_ndx >= 0)		average_tx_time = sn->stats[size_bin][best_ndx].average_tx_time;	else		average_tx_time = 0;		if (sn->static_rate_ndx != -1) {		ndx = sn->static_rate_ndx;		*try0 = ATH_TXMAXTRY;	} else {		*try0 = mrr ? 2 : ATH_TXMAXTRY;				if (sn->sample_tt[size_bin] < average_tx_time * (sn->packets_since_sample[size_bin] * ssc->ath_sample_rate / 100)) {			/*			 * we want to limit the time measuring the performance			 * of other bit-rates to ath_sample_rate% of the			 * total transmission time.			 */			ndx = pick_sample_ndx(sn, size_bin);			if (ndx != sn->current_rate[size_bin])				sn->current_sample_ndx[size_bin] = ndx;			else				sn->current_sample_ndx[size_bin] = -1;			sn->packets_since_sample[size_bin] = 0;		} else {			change_rates = 0;			if (!sn->packets_sent[size_bin] || best_ndx == -1) {				/* no packet has been sent successfully yet, so				 * pick an rssi-appropriate bit-rate. We know if				 * the rssi is very low that the really high				 * bit rates will not work.				 */				int initial_rate = 72;				if (an->an_avgrssi > 50) {					initial_rate = 108; /* 54 mbps */				} else if (an->an_avgrssi > 30) {					initial_rate = 72; /* 36 mbps */				} else {					initial_rate = 22; /* 11 mbps */				}				for (ndx = sn->num_rates-1; ndx > 0; ndx--) {					/* 					 * pick the highest rate <= initial_rate/2 Mbps					 * that hasn't failed.					 */					if (sn->rates[ndx].rate <= initial_rate && 					    sn->stats[size_bin][ndx].successive_failures == 0)						break;				}				change_rates = 1;				best_ndx = ndx;			} else if (sn->packets_sent[size_bin] < 20) {				/* let the bit-rate switch quickly during the first few packets */				change_rates = 1;			} else if (jiffies - ((HZ * MIN_SWITCH_MS) / 1000) > sn->jiffies_since_switch[size_bin]) {				/* 2 seconds have gone by */				change_rates = 1;			} else if (average_tx_time * 2 < sn->stats[size_bin][sn->current_rate[size_bin]].average_tx_time) {				/* the current bit-rate is twice as slow as the best one */				change_rates = 1;			}			sn->packets_since_sample[size_bin]++;						if (change_rates) {				if (best_ndx != sn->current_rate[size_bin]) {					DPRINTF(sc, "%s: %s size %u switch rate %u (%u/%u) -> %u (%u/%u) after %u packets mrr %u\n",						dev_info,						ether_sprintf(an->an_node.ni_macaddr),						packet_size_bins[size_bin],						sn->rates[sn->current_rate[size_bin]].rate,						sn->stats[size_bin][sn->current_rate[size_bin]].average_tx_time,						sn->stats[size_bin][sn->current_rate[size_bin]].perfect_tx_time,						sn->rates[best_ndx].rate,						sn->stats[size_bin][best_ndx].average_tx_time,						sn->stats[size_bin][best_ndx].perfect_tx_time,						sn->packets_since_switch[size_bin],						mrr);				}				sn->packets_since_switch[size_bin] = 0;				sn->current_rate[size_bin] = best_ndx;				sn->jiffies_since_switch[size_bin] = jiffies;			}			ndx = sn->current_rate[size_bin];			sn->packets_since_switch[size_bin]++;			if (size_bin == 0) {	    			/* 	    			 * set the visible txrate for this node			         * to the rate of small packets			         */				an->an_node.ni_txrate = ndx;			}		}	}	KASSERT(ndx >= 0 && ndx < sn->num_rates, 		("%s: bad ndx (%u/%u) for %s?\n",		 dev_info, ndx, sn->num_rates, 		 ether_sprintf(an->an_node.ni_macaddr)));			*rix = sn->rates[ndx].rix;	if (shortPreamble)		*txrate = sn->rates[ndx].shortPreambleRateCode;	else		*txrate = sn->rates[ndx].rateCode;	sn->packets_sent[size_bin]++;}static voidath_rate_setupxtxdesc(struct ath_softc *sc, struct ath_node *an,	struct ath_desc *ds, int shortPreamble, size_t frame_size, u_int8_t rix){	struct sample_node *sn = ATH_NODE_SAMPLE(an);	unsigned int size_bin;	int ndx;	int rateCode;	size_bin = size_to_bin(frame_size);	ndx = sn->current_rate[size_bin]; /* retry at the current bit-rate */		if (!sn->stats[size_bin][ndx].packets_acked)		ndx = 0;  /* use the lowest bit-rate */	if (shortPreamble)		rateCode = sn->rates[ndx].shortPreambleRateCode;	else		rateCode = sn->rates[ndx].rateCode;	ath_hal_setupxtxdesc(sc->sc_ah, ds, 			     rateCode, 3, 	        /* series 1 */			     sn->rates[0].rateCode, 3, 	/* series 2 */			     0, 0	                /* series 3 */			    );}static void update_stats(struct ath_softc *sc, struct ath_node *an, 	int frame_size,	int ndx0, int tries0,	int ndx1, int tries1,	int ndx2, int tries2,	int ndx3, int tries3,	int short_tries, int tries, int status){	const HAL_RATE_TABLE *rt = sc->sc_currates;	struct sample_node *sn = ATH_NODE_SAMPLE(an);	struct sample_softc *ssc = ATH_SOFTC_SAMPLE(sc);	unsigned int tt = 0;	unsigned int tries_so_far = 0;	unsigned int size_bin;	unsigned int size;	unsigned int rate;	size_bin = size_to_bin(frame_size);	size = bin_to_size(size_bin);	rate = sn->rates[ndx0].rate;	if (!rt->info[ndx0].rateKbps) {		/* 		 * sometimes we get feedback back for packets we didn't send. 		 * just ignore these packets.		 */		return;	}	tt += calc_usecs_unicast_packet(sc, size, sn->rates[ndx0].rix, 		short_tries-1, 		MIN(tries0, tries) - 1);	tries_so_far += tries0;	if (tries1 && tries0 < tries) {		tt += calc_usecs_unicast_packet(sc, size, sn->rates[ndx1].rix, 			short_tries - 1, 			MIN(tries1 + tries_so_far, tries) - tries_so_far - 1);	}	tries_so_far += tries1;	if (tries2 && tries0 + tries1 < tries) {		tt += calc_usecs_unicast_packet(sc, size, sn->rates[ndx2].rix, 			short_tries - 1,			MIN(tries2 + tries_so_far, tries) - tries_so_far - 1);	}	tries_so_far += tries2;	if (tries3 && tries0 + tries1 + tries2 < tries) {		tt += calc_usecs_unicast_packet(sc, size, sn->rates[ndx3].rix, 			short_tries - 1, 			MIN(tries3 + tries_so_far, tries) - tries_so_far - 1);	}		if (sn->stats[size_bin][ndx0].total_packets < (100 / (100 - ssc->ath_smoothing_rate))) {		/* just average the first few packets */		unsigned int avg_tx = sn->stats[size_bin][ndx0].average_tx_time;		unsigned int packets = sn->stats[size_bin][ndx0].total_packets;		sn->stats[size_bin][ndx0].average_tx_time =			(tt + (avg_tx * packets)) / (packets + 1);	} else {		/* use a ewma */		sn->stats[size_bin][ndx0].average_tx_time = 			((sn->stats[size_bin][ndx0].average_tx_time * ssc->ath_smoothing_rate) + 			 (tt * (100 - ssc->ath_smoothing_rate))) / 100;	}		if (status) {		unsigned int y;		sn->stats[size_bin][ndx0].successive_failures++;		for (y = size_bin + 1; y < NUM_PACKET_SIZE_BINS; y++) {			/* also say larger packets failed since we			 * assume if a small packet fails at a lower			 * bit-rate then a larger one will also.			 */			sn->stats[y][ndx0].successive_failures++;			sn->stats[y][ndx0].last_tx = jiffies;			sn->stats[y][ndx0].tries += tries;			sn->stats[y][ndx0].total_packets++;		}	} else {		sn->stats[size_bin][ndx0].packets_acked++;		sn->stats[size_bin][ndx0].successive_failures = 0;	}	sn->stats[size_bin][ndx0].tries += tries;	sn->stats[size_bin][ndx0].last_tx = jiffies;	sn->stats[size_bin][ndx0].total_packets++;	if (ndx0 == sn->current_sample_ndx[size_bin]) {		DPRINTF(sc, "%s: %s size %u sample rate %u tries (%u/%u) tt %u avg_tt (%u/%u) status %u\n", 			dev_info, ether_sprintf(an->an_node.ni_macaddr), 			size, rate, short_tries, tries, tt, 			sn->stats[size_bin][ndx0].average_tx_time,			sn->stats[size_bin][ndx0].perfect_tx_time,			status);		sn->sample_tt[size_bin] = tt;		sn->current_sample_ndx[size_bin] = -1;	}}static voidath_rate_tx_complete(struct ath_softc *sc,	struct ath_node *an, const struct ath_desc *ds){	struct sample_node *sn = ATH_NODE_SAMPLE(an);	struct ieee80211com *ic = &sc->sc_ic;	const struct ar5212_desc *ads = (const struct ar5212_desc *)&ds->ds_ctl0;	unsigned int final_rate;	unsigned int short_tries;	unsigned int long_tries;	unsigned int frame_size;	unsigned int mrr;	final_rate = sc->sc_hwmap[ds->ds_txstat.ts_rate &~ HAL_TXSTAT_ALTRATE].ieeerate;	short_tries = ds->ds_txstat.ts_shortretry + 1;	long_tries = ds->ds_txstat.ts_longretry + 1;	frame_size = ds->ds_ctl0 & 0x0fff; /* low-order 12 bits of ds_ctl0 */	if (frame_size == 0)		frame_size = 1500;	if (sn->num_rates <= 0) {		DPRINTF(sc, "%s: %s %s no rates yet\n", dev_info, 			ether_sprintf(an->an_node.ni_macaddr), __func__);		return;	}	mrr = sc->sc_mrretry && !(ic->ic_flags & IEEE80211_F_USEPROT) && ENABLE_MRR;	if (sc->sc_mrretry && ds->ds_txstat.ts_status) {		/* this packet failed */		DPRINTF(sc, "%s: %s size %u rate/try %u/%u %u/%u %u/%u %u/%u status %s retries (%u/%u)\n", 			dev_info,			ether_sprintf(an->an_node.ni_macaddr),			bin_to_size(size_to_bin(frame_size)),			sc->sc_hwmap[ads->xmit_rate0].ieeerate, ads->xmit_tries0,			sc->sc_hwmap[ads->xmit_rate1].ieeerate, ads->xmit_tries1,			sc->sc_hwmap[ads->xmit_rate2].ieeerate, ads->xmit_tries2,			sc->sc_hwmap[ads->xmit_rate3].ieeerate, ads->xmit_tries3,			ds->ds_txstat.ts_status ? "FAIL" : "OK",			short_tries, 			long_tries);	}	if (!mrr || !(ds->ds_txstat.ts_rate & HAL_TXSTAT_ALTRATE)) {		/* only one rate was used */		int ndx = rate_to_ndx(sn, final_rate);		if (ndx >= 0 && ndx < sn->num_rates) {			update_stats(sc, an, frame_size, 				ndx, long_tries,				0, 0,				0, 0,				0, 0,				short_tries, long_tries, ds->ds_txstat.ts_status);		}	} else {		unsigned int rate[4], tries[4];		int ndx[4];		int finalTSIdx = ads->final_ts_index;		/*		 * Process intermediate rates that failed.		 */		rate[0] = sc->sc_hwmap[ads->xmit_rate0].ieeerate;		tries[0] = ads->xmit_tries0;		ndx[0] = rate_to_ndx(sn, rate[0]);				rate[1] = sc->sc_hwmap[ads->xmit_rate1].ieeerate;		tries[1] = ads->xmit_tries1;		ndx[1] = rate_to_ndx(sn, rate[1]);				rate[2] = sc->sc_hwmap[ads->xmit_rate2].ieeerate;		tries[2] = ads->xmit_tries2;		ndx[2] = rate_to_ndx(sn, rate[2]);				rate[3] = sc->sc_hwmap[ads->xmit_rate3].ieeerate;		tries[3] = ads->xmit_tries3;		ndx[3] = rate_to_ndx(sn, rate[3]);		#if 0		DPRINTF(sc, "%s: %s size %u finaltsidx %u tries %u status %u rate/try %u/%u %u/%u %u/%u %u/%u\n", 			dev_info, ether_sprintf(an->an_node.ni_macaddr),			bin_to_size(size_to_bin(frame_size)),			finalTSIdx,			long_tries, 			ds->ds_txstat.ts_status,			rate[0], tries[0],			rate[1], tries[1],			rate[2], tries[2],			rate[3], tries[3]);#endif		if (tries[0])			update_stats(sc, an, frame_size, 				ndx[0], tries[0], 				ndx[1], tries[1], 				ndx[2], tries[2], 				ndx[3], tries[3], 				short_tries, ds->ds_txstat.ts_longretry + 1, 				long_tries > tries[0]);				if (tries[1] && finalTSIdx > 0)

⌨️ 快捷键说明

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