Date: Mon, 16 Sep 2013 08:08:52 GMT From: ccqin@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r257398 - in soc2013/ccqin/head/sys: conf net80211 Message-ID: <201309160808.r8G88qb6091423@socsvn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: ccqin Date: Mon Sep 16 08:08:52 2013 New Revision: 257398 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=257398 Log: Update ieee80211_sample and complete ieee80211_ratectl_none templete. * rename ieee80211_rc_sample* to ieee80211_sample*. this seems more harmonious. * modify ieee80211_sample to let it use the latest net80211-ratectl features. * fix some errors in ieee80211_sample. * complete the ieee80211_ratectl_none templete with new added net80211-ratectl functions. Added: soc2013/ccqin/head/sys/net80211/ieee80211_sample.c - copied, changed from r256825, soc2013/ccqin/head/sys/net80211/ieee80211_rc_sample.c soc2013/ccqin/head/sys/net80211/ieee80211_sample.h - copied, changed from r256825, soc2013/ccqin/head/sys/net80211/ieee80211_rc_sample.h soc2013/ccqin/head/sys/net80211/ieee80211_sample_txsched.h - copied unchanged from r256825, soc2013/ccqin/head/sys/net80211/ieee80211_rc_sample_txsched.h Deleted: soc2013/ccqin/head/sys/net80211/ieee80211_rc_sample.c soc2013/ccqin/head/sys/net80211/ieee80211_rc_sample.h soc2013/ccqin/head/sys/net80211/ieee80211_rc_sample_txsched.h Modified: soc2013/ccqin/head/sys/conf/files soc2013/ccqin/head/sys/net80211/ieee80211_amrr.c soc2013/ccqin/head/sys/net80211/ieee80211_ratectl_none.c Modified: soc2013/ccqin/head/sys/conf/files ============================================================================== --- soc2013/ccqin/head/sys/conf/files Mon Sep 16 06:25:54 2013 (r257397) +++ soc2013/ccqin/head/sys/conf/files Mon Sep 16 08:08:52 2013 (r257398) @@ -3100,6 +3100,7 @@ net80211/ieee80211_ratectl_none.c optional wlan net80211/ieee80211_regdomain.c optional wlan net80211/ieee80211_rssadapt.c optional wlan wlan_rssadapt +net80211/ieee80211_sample.c optional wlan | wlan_sample net80211/ieee80211_scan.c optional wlan net80211/ieee80211_scan_sta.c optional wlan net80211/ieee80211_sta.c optional wlan Modified: soc2013/ccqin/head/sys/net80211/ieee80211_amrr.c ============================================================================== --- soc2013/ccqin/head/sys/net80211/ieee80211_amrr.c Mon Sep 16 06:25:54 2013 (r257397) +++ soc2013/ccqin/head/sys/net80211/ieee80211_amrr.c Mon Sep 16 08:08:52 2013 (r257398) @@ -57,13 +57,10 @@ #define is_enough(amn) \ ((amn)->amn_txcnt > 10) -static void amrr_setinterval(const struct ieee80211vap *, int); static void amrr_init(struct ieee80211vap *, uint32_t); static void amrr_deinit(struct ieee80211vap *); static void amrr_node_init(struct ieee80211_node *); static void amrr_node_deinit(struct ieee80211_node *); -static int amrr_update(struct ieee80211_amrr *, - struct ieee80211_amrr_node *, struct ieee80211_node *); static int amrr_rate(struct ieee80211_node *, void *, uint32_t); static void amrr_rates(struct ieee80211_node *, struct ieee80211_rc_info *); static void amrr_tx_complete(const struct ieee80211vap *, @@ -71,6 +68,7 @@ static void amrr_tx_update(const struct ieee80211vap *, const struct ieee80211_node *, void *, void *, void *); static void amrr_stats(const struct ieee80211vap *); +static void amrr_setinterval(const struct ieee80211vap *, int); static void amrr_sysctlattach(struct ieee80211vap *, struct sysctl_ctx_list *, struct sysctl_oid *); Modified: soc2013/ccqin/head/sys/net80211/ieee80211_ratectl_none.c ============================================================================== --- soc2013/ccqin/head/sys/net80211/ieee80211_ratectl_none.c Mon Sep 16 06:25:54 2013 (r257397) +++ soc2013/ccqin/head/sys/net80211/ieee80211_ratectl_none.c Mon Sep 16 08:08:52 2013 (r257398) @@ -112,6 +112,11 @@ } static void +none_rates(struct ieee80211_node *ni, struct ieee80211_rc_info *rc_info) +{ +} + +static void none_tx_complete(const struct ieee80211vap *vap, const struct ieee80211_node *ni, struct ieee80211_rc_info *rc_info) { @@ -128,6 +133,16 @@ { } +static void +none_stats(const struct ieee80211vap *vap) +{ + struct ieee80211_rc_stat * irs = IEEE80211_RATECTL_STAT(vap); + printf("tx count: %d (ok count: %d, fail count: %d)\n" + "retry count: %d (short retry: %d, long retry: %d)\n", + irs->irs_txcnt, irs->irs_txcnt - irs->irs_failcnt, irs->irs_failcnt, + irs->irs_retrycnt, irs->irs_shortretry, irs->irs_longretry); + /* ... */ +} /* number of references from net80211 layer */ static int nrefs = 0; @@ -140,9 +155,11 @@ .ir_node_init = none_node_init, .ir_node_deinit = none_node_deinit, .ir_rate = none_rate, + .ir_rates = none_rates, .ir_tx_complete = none_tx_complete, .ir_tx_update = none_tx_update, .ir_setinterval = none_setinterval, + .ir_stats = none_stats, }; IEEE80211_RATECTL_MODULE(ratectl_none, 1); IEEE80211_RATECTL_ALG(none, IEEE80211_RATECTL_NONE, none); Copied and modified: soc2013/ccqin/head/sys/net80211/ieee80211_sample.c (from r256825, soc2013/ccqin/head/sys/net80211/ieee80211_rc_sample.c) ============================================================================== --- soc2013/ccqin/head/sys/net80211/ieee80211_rc_sample.c Mon Sep 2 08:00:12 2013 (r256825, copy source) +++ soc2013/ccqin/head/sys/net80211/ieee80211_sample.c Mon Sep 16 08:08:52 2013 (r257398) @@ -38,6 +38,7 @@ #include <net/if.h> #include <net/if_media.h> +#include <net/ethernet.h> #ifdef INET #include <netinet/in.h> @@ -47,21 +48,26 @@ #include <net80211/ieee80211_var.h> #include <net80211/ieee80211_ht.h> #include <net80211/ieee80211_ratectl.h> -#include <net80211/ieee80211_rc_sample.h> -#include <net80211/ieee80211_rc_sample_txsched.h> +#include <net80211/ieee80211_sample.h> +#include <net80211/ieee80211_sample_txsched.h> static void sample_init(struct ieee80211vap *, uint32_t); static void sample_deinit(struct ieee80211vap *); static void sample_node_init(struct ieee80211_node *); static void sample_node_deinit(struct ieee80211_node *); static int sample_rate(struct ieee80211_node *, void *, uint32_t); +static void sample_rates(struct ieee80211_node *, struct ieee80211_rc_info *); static void sample_tx_complete(const struct ieee80211vap *, - const struct ieee80211_node *, int, - void *, void *); + const struct ieee80211_node *, struct ieee80211_rc_info *); static void sample_tx_update(const struct ieee80211vap *vap, const struct ieee80211_node *, void *, void *, void *); +static void sample_stats(const struct ieee80211vap *); static void sample_setinterval(const struct ieee80211vap *, int); +static void sample_sysctlattach(struct ieee80211vap *, + struct sysctl_ctx_list *, struct sysctl_oid *); +static void sample_update_static_rix(struct ieee80211_node *); + /* number of references from net80211 layer */ static int nrefs = 0; @@ -78,6 +84,7 @@ .ir_tx_complete = sample_tx_complete, .ir_tx_update = sample_tx_update, .ir_setinterval = sample_setinterval, + .ir_stats = sample_stats, }; IEEE80211_RATECTL_MODULE(sample, 1); IEEE80211_RATECTL_ALG(sample, IEEE80211_RATECTL_SAMPLE, sample); @@ -136,10 +143,12 @@ #define RATE(_ix) (ni->ni_rates.rs_rates[(_ix)] & IEEE80211_RATE_VAL) #define DOT11RATE(_ix) (rt->info[(_ix)].dot11Rate & IEEE80211_RATE_VAL) #define MCS(_ix) (ni->ni_htrates.rs_rates[_ix] | IEEE80211_RATE_MCS) + struct ieee80211vap *vap = ni->ni_vap; struct ieee80211_sample *sample = vap->iv_rs; struct ieee80211_sample_node *san = NULL; - const struct ieee80211_rate_table *rt = ieee80211_get_ratetable(vap->iv_ic->ic_curchan); + + const struct ieee80211_rate_table *rt = NULL; enum ieee80211_phymode curmode = ieee80211_chan2mode(vap->iv_ic->ic_curchan); int x, y, rix; @@ -156,6 +165,7 @@ san->san_sample = sample; + rt = ieee80211_get_ratetable(vap->iv_ic->ic_curchan); KASSERT(rt != NULL, ("no rate table, mode %u", curmode)); san->sched = mrr_schedules[curmode]; @@ -177,9 +187,6 @@ rix = rt->rateCodeToIndex[MCS(x)]; if (rix == 0xff) continue; - /* skip rates marked broken by hal */ - if (!rt->info[rix].valid) - continue; KASSERT(rix < SAMPLE_MAXRATES, ("mcs %u has rix %d", MCS(x), rix)); san->ratemask |= (uint64_t) 1<<rix; @@ -191,9 +198,6 @@ rix = rt->rateCodeToIndex[RATE(x)]; if (rix == 0xff) continue; - /* skip rates marked broken by hal */ - if (!rt->info[rix].valid) - continue; KASSERT(rix < SAMPLE_MAXRATES, ("rate %u has rix %d", RATE(x), rix)); san->ratemask |= (uint64_t) 1<<rix; @@ -248,7 +252,7 @@ } static int -dot11rate(const ieee80211_rate_table *rt, int rix) +dot11rate(const struct ieee80211_rate_table *rt, int rix) { if (rix < 0) return -1; @@ -257,7 +261,7 @@ } static const char * -dot11rate_label(const ieee80211_rate_table *rt, int rix) +dot11rate_label(const struct ieee80211_rate_table *rt, int rix) { if (rix < 0) return ""; @@ -354,8 +358,8 @@ * Pick a good "random" bit-rate to sample other than the current one. */ static __inline int -pick_sample_rate(const struct ieee80211_node *ni, const ieee80211_rate_table *rt, - int size_bin) +pick_sample_rate(const struct ieee80211_node *ni, + const struct ieee80211_rate_table *rt, int size_bin) { #define DOT11RATE(ix) (rt->info[ix].dot11Rate & IEEE80211_RATE_VAL) #define MCS(ix) (rt->info[ix].dot11Rate | IEEE80211_RATE_MCS) @@ -624,7 +628,7 @@ sample->sample_rate/100)) { rix = pick_sample_rate(ni, rt, size_bin); IEEE80211_NOTE(vap, IEEE80211_MSG_RATECTL, - &ni, "att %d sample_tt %d size %u sample rate %d %s current rate %d %s", + ni, "att %d sample_tt %d size %u sample rate %d %s current rate %d %s", average_tx_time, san->sample_tt[size_bin], bin_to_size(size_bin), @@ -650,13 +654,13 @@ } else if (san->packets_sent[size_bin] < 20) { /* let the bit-rate switch quickly during the first few packets */ IEEE80211_NOTE(vap, - IEEE80211_MSG_RATECTL, &ni, + IEEE80211_MSG_RATECTL, ni, "%s: switching quickly..", __func__); change_rates = 1; } else if (ticks - sample->sample_min_switch > san->ticks_since_switch[size_bin]) { /* min_switch seconds have gone by */ IEEE80211_NOTE(vap, - IEEE80211_MSG_RATECTL, &ni, + IEEE80211_MSG_RATECTL, ni, "%s: min_switch %d > ticks_since_switch %d..", __func__, ticks - sample->sample_min_switch, san->ticks_since_switch[size_bin]); change_rates = 1; @@ -664,7 +668,7 @@ (2*average_tx_time < san->stats[size_bin][san->current_rix[size_bin]].average_tx_time)) { /* the current bit-rate is twice as slow as the best one */ IEEE80211_NOTE(vap, - IEEE80211_MSG_RATECTL, &ni, + IEEE80211_MSG_RATECTL, ni, "%s: 2x att (= %d) < cur_rix att %d", __func__, 2 * average_tx_time, san->stats[size_bin][san->current_rix[size_bin]].average_tx_time); @@ -686,7 +690,7 @@ if ((MCS(best_rix) > MCS(cur_rix)) && (average_tx_time * 8) <= (cur_att * 10)) { IEEE80211_NOTE(vap, - IEEE80211_MSG_RATECTL, &ni, + IEEE80211_MSG_RATECTL, ni, "%s: HT: best_rix 0x%d > cur_rix 0x%x, average_tx_time %d, cur_att %d", __func__, MCS(best_rix), MCS(cur_rix), average_tx_time, cur_att); @@ -700,7 +704,7 @@ if (best_rix != san->current_rix[size_bin]) { IEEE80211_NOTE(vap, IEEE80211_MSG_RATECTL, - &ni, + ni, "%s: size %d switch rate %d (%d/%d) -> %d (%d/%d) after %d packets mrr %d", __func__, bin_to_size(size_bin), @@ -794,7 +798,7 @@ const int size_bin = size_to_bin(frame_size); const int size = bin_to_size(size_bin); - int is_ht40 = ieee80211_ratectl_hascap_cw40(vap, ni); + int is_ht40 = ieee80211_ratectl_hascap_cw40(ni); int tt, tries_so_far; int pct; @@ -827,7 +831,7 @@ MIN(tries3 + tries_so_far, tries) - tries_so_far - 1, is_ht40); } - if (san->stats[size_bin][rix0].total_packets < sample->sanple_smoothing_minpackets) { + if (san->stats[size_bin][rix0].total_packets < sample->sample_smoothing_minpackets) { /* just average the first few packets */ int avg_tx = san->stats[size_bin][rix0].average_tx_time; int packets = san->stats[size_bin][rix0].total_packets; @@ -835,8 +839,8 @@ } else { /* use a ewma */ san->stats[size_bin][rix0].average_tx_time = - ((san->stats[size_bin][rix0].average_tx_time * sample->sanple_smoothing_rate) + - (tt * (100 - sample->sanple_smoothing_rate))) / 100; + ((san->stats[size_bin][rix0].average_tx_time * sample->sample_smoothing_rate) + + (tt * (100 - sample->sample_smoothing_rate))) / 100; } /* @@ -863,7 +867,7 @@ pct = ((nframes - nbad) * 1000) / nframes; if (san->stats[size_bin][rix0].total_packets < - sample->sanple_smoothing_minpackets) { + sample->sample_smoothing_minpackets) { /* just average the first few packets */ int a_pct = (san->stats[size_bin][rix0].packets_acked * 1000) / (san->stats[size_bin][rix0].total_packets); @@ -871,8 +875,8 @@ } else { /* use a ewma */ san->stats[size_bin][rix0].ewma_pct = - ((san->stats[size_bin][rix0].ewma_pct * sample->sanple_smoothing_rate) + - (pct * (100 - sample->sanple_smoothing_rate))) / 100; + ((san->stats[size_bin][rix0].ewma_pct * sample->sample_smoothing_rate) + + (pct * (100 - sample->sample_smoothing_rate))) / 100; } if (rix0 == san->current_sample_rix[size_bin]) { @@ -883,25 +887,22 @@ static void sample_tx_complete(const struct ieee80211vap *vap, - const struct ieee80211_node *ni, int ok, - void *arg1, void *arg2) + const struct ieee80211_node *ni, struct ieee80211_rc_info *rc_info) { struct ieee80211_sample_node *san = ni->ni_rctls; - const struct ieee80211_rate_table *rt = ieee80211_get_ratetable(vap->iv_ic->ic_curchan); - - /* XXX need to change arg2 to pointer of ieee80211_rc_info */ - struct ieee80211_rc_info *rc_info = (struct ieee80211_rc_info*)arg2; - + const struct ieee80211_rate_table *rt = NULL; + struct ieee80211_rc_series *rc = NULL; int final_rix, short_tries, long_tries; int nframes, nbad; int frame_size, mrr; + rt = ieee80211_get_ratetable(vap->iv_ic->ic_curchan); + rc = rc_info->iri_rc; /* update per vap statistics */ ieee80211_ratectl_update_stat(vap, rc_info); final_rix = rt->rateCodeToIndex[rc_info->iri_txrate]; short_tries = rc_info->iri_shortretry; - /* XXX why plus 1 here? */ long_tries = rc_info->iri_longretry + 1; nframes = rc_info->iri_txcnt; @@ -911,6 +912,7 @@ mrr = 0; if (nframes == 0) { + /* XXX need some msg out */ return; } @@ -944,7 +946,6 @@ } else { int finalTSIdx = rc_info->iri_finaltsi; - int i; /* * NB: series > 0 are not penalized for failure @@ -1008,18 +1009,11 @@ static void sample_setinterval(const struct ieee80211vap *vap, int msecs) { - struct ieee80211_sample *sample = vap->iv_rs; - int t; - - if (msecs < 100) - msecs = 100; - t = msecs_to_ticks(msecs); /* ieee80211_sample doesn't have the sample_interval field by now */ - // sample->sample_interval = (t < 1) ? 1 : t; } static void -sample_stats(void *arg, struct ieee80211_node *ni) +sample_stats_node(void *arg, struct ieee80211_node *ni) { struct ieee80211vap *vap = ni->ni_vap; struct ieee80211_sample_node *san = ni->ni_rctls; @@ -1071,20 +1065,16 @@ } } } - -static int -sample_sysctl_stats(SYSCTL_HANDLER_ARGS) +static void +sample_stats(const struct ieee80211vap *vap) { - struct ieee80211vap *vap = arg1; struct ieee80211com *ic = vap->iv_ifp->if_l2com; - int error, v; - - v = 0; - error = sysctl_handle_int(oidp, &v, 0, req); - if (error || !req->newptr) - return error; - ieee80211_iterate_nodes(&ic->ic_sta, sample_stats, NULL); - return 0; + struct ieee80211_rc_stat * irs = IEEE80211_RATECTL_STAT(vap); + printf("tx count: %d (ok count: %d, fail count: %d)\n" + "retry count: %d (short retry: %d, long retry: %d)\n", + irs->irs_txcnt, irs->irs_txcnt - irs->irs_failcnt, irs->irs_failcnt, + irs->irs_retrycnt, irs->irs_shortretry, irs->irs_longretry); + ieee80211_iterate_nodes(&ic->ic_sta, sample_stats_node, NULL); } static int @@ -1134,8 +1124,4 @@ "sample_rate", CTLTYPE_INT | CTLFLAG_RW, vap, 0, sample_sysctl_sample_rate, "I", "sample: percent air time devoted to sampling new rates (%%)"); - /* XXX max_successive_failures, stale_failure_timeout, min_switch */ - SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(tree), OID_AUTO, - "sample_stats", CTLTYPE_INT | CTLFLAG_RW, vap, 0, - sample_sysctl_stats, "I", "sample: print statistics"); } Copied and modified: soc2013/ccqin/head/sys/net80211/ieee80211_sample.h (from r256825, soc2013/ccqin/head/sys/net80211/ieee80211_rc_sample.h) ============================================================================== --- soc2013/ccqin/head/sys/net80211/ieee80211_rc_sample.h Mon Sep 2 08:00:12 2013 (r256825, copy source) +++ soc2013/ccqin/head/sys/net80211/ieee80211_sample.h Mon Sep 16 08:08:52 2013 (r257398) @@ -143,25 +143,28 @@ return NUM_PACKET_SIZE_BINS-1; } -static uint32_t sample_pkt_txtime(const struct ieee80211_rate_table *rt, +static uint32_t sample_pkt_tx_time(const struct ieee80211_rate_table *rt, uint32_t frameLen, uint16_t rateix, int isht40, int isShortPreamble) { - uint8_t rc; - int numStreams; + uint8_t rate = rt->info[rateix].dot11Rate; + uint32_t tx_time = 0; - rc = rt->info[rateix].rateCode; - - /* Legacy rate? Return the old way */ - if (! IS_HT_RATE(rc)) - return ieee80211_compute_duration(rt, frameLen, rateix, isShortPreamble); - - /* 11n frame - extract out the number of spatial streams */ - numStreams = HT_RC_2_STREAMS(rc); - KASSERT(numStreams > 0 && numStreams <= 4, - ("number of spatial streams needs to be 1..3: MCS rate 0x%x!", - rateix)); + if (rt->info[rateix].phy == IEEE80211_T_HT) { + int numStreams; + /* 11n frame - extract out the number of spatial streams */ + rate |= IEEE80211_RATE_MCS; + numStreams = HT_RC_2_STREAMS(rate); + KASSERT(numStreams > 0 && numStreams <= 4, + ("number of spatial streams needs to be 1..3: MCS rate 0x%x!", + rateix)); + tx_time = ieee80211_compute_duration_ht(frameLen, rate, numStreams, isht40, isShortPreamble); + } else { + /* Legacy rate? Return the old way */ + rate &= IEEE80211_RATE_VAL; + tx_time = ieee80211_compute_duration(rt, frameLen, rate, isShortPreamble); + } - return ieee80211_compute_duration_ht(frameLen, rc, numStreams, isht40, isShortPreamble); + return tx_time; } #define WIFI_CW_MIN 31 @@ -183,9 +186,9 @@ int rts, cts; int tt, x, cw, cix; - int tt = 0; - int x = 0; - int cw = WIFI_CW_MIN; + tt = 0; + x = 0; + cw = WIFI_CW_MIN; KASSERT(rt != NULL, ("no rate table, mode %u", curmode)); @@ -194,7 +197,7 @@ rix, rt->rateCount, curmode); return 0; } - cix = rt->info[rix].controlRate; + cix = rt->info[rix].ctlRateIndex; /* * XXX getting mac/phy level timings should be fixed for turbo * rates, and there is probably a way to get this from the @@ -242,7 +245,7 @@ if (0xff == protrix) protrix = 0; - cix = rt->info[protrix].controlRate; + cix = rt->info[protrix].ctlRateIndex; } if (0 /*length > ic->ic_rtsthreshold */) { @@ -250,7 +253,6 @@ } if (rts || cts) { - int ctsrate; int ctsduration = 0; /* NB: this is intentionally not a runtime check */ @@ -258,12 +260,11 @@ ("bogus cix %d, max %u, mode %u\n", cix, rt->rateCount, curmode)); - ctsrate = rt->info[cix].rateCode | rt->info[cix].shortPreamble; if (rts) /* SIFS + CTS */ ctsduration += rt->info[cix].spAckDuration; /* XXX assumes short preamble */ - ctsduration += sample_pkt_txtime(rt, length, rix, is_ht40, 0); + ctsduration += sample_pkt_tx_time(rt, length, rix, is_ht40, 0); if (cts) /* SIFS + ACK */ ctsduration += rt->info[cix].spAckDuration; @@ -273,7 +274,7 @@ tt += t_difs; /* XXX assumes short preamble */ - tt += (long_retries+1)*sample_pkt_txtime(rt, length, rix, is_ht40, 0); + tt += (long_retries+1)*sample_pkt_tx_time(rt, length, rix, is_ht40, 0); tt += (long_retries+1)*(t_sifs + rt->info[rix].spAckDuration); Copied: soc2013/ccqin/head/sys/net80211/ieee80211_sample_txsched.h (from r256825, soc2013/ccqin/head/sys/net80211/ieee80211_rc_sample_txsched.h) ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ soc2013/ccqin/head/sys/net80211/ieee80211_sample_txsched.h Mon Sep 16 08:08:52 2013 (r257398, copy of r256825, soc2013/ccqin/head/sys/net80211/ieee80211_rc_sample_txsched.h) @@ -0,0 +1,241 @@ +/* $FreeBSD: head/sys/dev/ath/ath_rate/sample/tx_schedules.h 240384 2012-08-15 07:50:42Z adrian $*/ + +/*- + * Copyright (c) 2005 John Bicket + * Copyright (c) 2013 Chenchong Qin <ccqin@FreeBSD.org> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer, + * without modification. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + * similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any + * redistribution must be conditioned upon including a substantially + * similar Disclaimer requirement for further binary redistribution. + * 3. Neither the names of the above-listed copyright holders nor the names + * of any contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * Alternatively, this software may be distributed under the terms of the + * GNU General Public License ("GPL") version 2 as published by the Free + * Software Foundation. + * + * NO WARRANTY + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, + * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGES. + * + */ +#ifndef _NET80211_IEEE80211_RATECTL_SAMPLE_TXSCHEDULES_H_ +#define _NET80211_IEEE80211_RATECTL_SAMPLE_TXSCHEDULES_H_ + +#include <sys/cdefs.h> + +#define A(_r) \ + (((_r) == 6) ? 0 : (((_r) == 9) ? 1 : (((_r) == 12) ? 2 : \ + (((_r) == 18) ? 3 : (((_r) == 24) ? 4 : (((_r) == 36) ? 5 : \ + (((_r) == 48) ? 6 : (((_r) == 54) ? 7 : 0)))))))) +static const struct txschedule series_11a[] = { + { 3,A( 6), 3,A( 6), 0,A( 6), 0,A( 6) }, /* 6Mb/s */ + { 4,A( 9), 3,A( 6), 4,A( 6), 0,A( 6) }, /* 9Mb/s */ + { 4,A(12), 3,A( 6), 4,A( 6), 0,A( 6) }, /* 12Mb/s */ + { 4,A(18), 3,A( 12), 4,A( 6), 2,A( 6) }, /* 18Mb/s */ + { 4,A(24), 3,A( 18), 4,A( 12), 2,A( 6) }, /* 24Mb/s */ + { 4,A(36), 3,A( 24), 4,A( 18), 2,A( 6) }, /* 36Mb/s */ + { 4,A(48), 3,A( 36), 4,A( 24), 2,A(12) }, /* 48Mb/s */ + { 4,A(54), 3,A( 48), 4,A( 36), 2,A(24) } /* 54Mb/s */ +}; + +#define NA1(_r) \ + (((_r) == 6.5) ? 8 : (((_r) == 13) ? 9 : (((_r) == 19.5)? 10 : \ + (((_r) == 26) ? 11 : (((_r) == 39) ? 12 : (((_r) == 52) ? 13 : \ + (((_r) == 58.5)? 14 : (((_r) == 65) ? 15 : 0)))))))) +#define NA2(_r) \ + (((_r) == 13) ? 16 : (((_r) == 26) ? 17 : (((_r) == 39) ? 18 : \ + (((_r) == 52) ? 19 : (((_r) == 78) ? 20 : (((_r) == 104)? 21 : \ + (((_r) == 117)? 22 : (((_r) == 130)? 23 : 0)))))))) +#define NA3(_r) \ + (((_r) == 19.5) ? 24 : (((_r) == 39) ? 25 : (((_r) == 58.5) ? 26 : \ + (((_r) == 78) ? 27 : (((_r) == 117) ? 28 : (((_r) == 156) ? 29 : \ + (((_r) == 175.5) ? 30 : (((_r) == 195)? 31 : 0)))))))) +static const struct txschedule series_11na[] = { + { 3,A( 6), 3,A( 6), 0,A( 6), 0,A( 6) }, /* 6Mb/s */ + { 4,A( 9), 3,A( 6), 4,A( 6), 0,A( 6) }, /* 9Mb/s */ + { 4,A(12), 3,A( 6), 4,A( 6), 0,A( 6) }, /* 12Mb/s */ + { 4,A(18), 3,A( 12), 4,A( 6), 2,A( 6) }, /* 18Mb/s */ + { 4,A(24), 3,A( 18), 4,A( 12), 2,A( 6) }, /* 24Mb/s */ + { 4,A(36), 3,A( 24), 4,A( 18), 2,A( 6) }, /* 36Mb/s */ + { 4,A(48), 3,A( 36), 4,A( 24), 2,A(12) }, /* 48Mb/s */ + { 4,A(54), 3,A( 48), 4,A( 36), 2,A(24) }, /* 54Mb/s */ + + /* 1 stream rates */ + + { 3,NA1( 6.5), 3,NA1( 6.5), 0,NA1( 6.5), 0,NA1(6.5) }, /* 6.5Mb/s */ + { 4,NA1( 13), 3,NA1( 6.5), 4,NA1( 6.5), 0,NA1(6.5) }, /* 13Mb/s */ + { 4,NA1(19.5), 3,NA1( 6.5), 4,NA1( 6.5), 0,NA1(6.5) }, /*19.5Mb/s */ + { 4,NA1( 26), 3,NA1(19.5), 4,NA1( 6.5), 2,NA1(6.5) }, /* 26Mb/s */ + { 4,NA1( 39), 3,NA1( 26), 4,NA1(19.5), 2,NA1(6.5) }, /* 39Mb/s */ + { 4,NA1( 52), 3,NA1( 39), 4,NA1( 26), 2,NA1(6.5) }, /* 52Mb/s */ + { 4,NA1(58.5), 3,NA1( 52), 4,NA1( 39), 2,NA1( 13) }, /*58.5Mb/s */ + { 4,NA1( 65), 3,NA1(58.5), 4,NA1( 52), 2,NA1( 13) }, /* 65Mb/s */ + + /* 2 stream rates */ + + { 3,NA2( 13), 3,NA2( 13), 0,NA2( 13), 0,NA2( 13) }, /* 13Mb/s */ + { 4,NA2( 26), 3,NA2( 13), 4,NA2( 13), 0,NA2( 13) }, /* 26Mb/s */ + { 4,NA2( 39), 3,NA2( 26), 4,NA2( 13), 2,NA2( 13) }, /* 39Mb/s */ + { 4,NA2( 52), 3,NA2( 39), 4,NA2( 26), 2,NA2( 13) }, /* 52Mb/s */ + { 4,NA2( 78), 3,NA2( 52), 4,NA2( 39), 2,NA2( 13) }, /* 78Mb/s */ + { 4,NA2( 104), 3,NA2( 78), 4,NA2( 52), 2,NA2( 13) }, /* 104Mb/s */ + { 4,NA2( 117), 3,NA2( 104), 4,NA2( 78), 2,NA2( 26) }, /* 117Mb/s */ + { 4,NA2( 130), 3,NA2( 117), 4,NA2( 104), 2,NA2( 26) }, /* 130Mb/s */ + + /* 3 stream rates */ + + { 3,NA3(19.5), 3,NA3(19.5), 0,NA3(19.5), 0,NA3(19.5) }, /* 19Mb/s */ + { 3,NA3( 39), 3,NA3(19.5), 0,NA3(19.5), 0,NA3(19.5) }, /* 39Mb/s */ + { 3,NA3(58.5), 3,NA3( 39), 0,NA3(19.5), 0,NA3(19.5) }, /* 58Mb/s */ + { 3,NA3( 78), 3,NA3(58.5), 0,NA3( 39), 0,NA3(19.5) }, /* 78Mb/s */ + { 3,NA3( 117), 3,NA3( 78), 0,NA3(58.5), 0,NA3(19.5) }, /* 117Mb/s */ + { 3,NA3( 156), 3,NA3( 117), 0,NA3( 78), 0,NA3(19.5) }, /* 156Mb/s */ + { 3,NA3(175.5), 3,NA3( 156), 0,NA3( 117), 0,NA3( 39) }, /* 175Mb/s */ + { 3,NA3( 195), 3,NA3( 195), 0,NA3( 156), 0,NA3(58.5) }, /* 195Mb/s */ +}; +#undef A +#undef NA3 +#undef NA2 +#undef NA1 + +#define G(_r) \ + (((_r) == 1) ? 0 : (((_r) == 2) ? 1 : (((_r) == 5.5) ? 2 : \ + (((_r) == 11) ? 3 : (((_r) == 6) ? 4 : (((_r) == 9) ? 5 : \ + (((_r) == 12) ? 6 : (((_r) == 18) ? 7 : (((_r) == 24) ? 8 : \ + (((_r) == 36) ? 9 : (((_r) == 48) ? 10 : (((_r) == 54) ? 11 : 0)))))))))))) +static const struct txschedule series_11g[] = { + { 3,G( 1), 3,G( 1), 0,G( 1), 0,G( 1) }, /* 1Mb/s */ + { 4,G( 2), 3,G( 1), 4,G( 1), 0,G( 1) }, /* 2Mb/s */ + { 4,G(5.5),3,G( 2), 4,G( 1), 2,G( 1) }, /* 5.5Mb/s */ + { 4,G(11), 3,G(5.5), 4,G( 2), 2,G( 1) }, /* 11Mb/s */ + { 4,G( 6), 3,G(5.5), 4,G( 2), 2,G( 1) }, /* 6Mb/s */ + { 4,G( 9), 3,G( 6), 4,G(5.5), 2,G( 1) }, /* 9Mb/s */ + { 4,G(12), 3,G( 11), 4,G(5.5), 2,G( 1) }, /* 12Mb/s */ + { 4,G(18), 3,G( 12), 4,G( 11), 2,G( 1) }, /* 18Mb/s */ + { 4,G(24), 3,G( 18), 4,G( 12), 2,G( 1) }, /* 24Mb/s */ + { 4,G(36), 3,G( 24), 4,G( 18), 2,G( 1) }, /* 36Mb/s */ + { 4,G(48), 3,G( 36), 4,G( 24), 2,G( 1) }, /* 48Mb/s */ + { 4,G(54), 3,G( 48), 4,G( 36), 2,G( 1) } /* 54Mb/s */ +}; + +#define NG1(_r) \ + (((_r) == 6.5) ? 12 : (((_r) == 13) ? 13 : (((_r) == 19.5)? 14 : \ + (((_r) == 26) ? 15 : (((_r) == 39) ? 16 : (((_r) == 52) ? 17 : \ + (((_r) == 58.5)? 18 : (((_r) == 65) ? 19 : 0)))))))) +#define NG2(_r) \ + (((_r) == 13) ? 20 : (((_r) == 26) ? 21 : (((_r) == 39) ? 22 : \ + (((_r) == 52) ? 23 : (((_r) == 78) ? 24 : (((_r) == 104) ? 25 : \ + (((_r) == 117) ? 26 : (((_r) == 130)? 27 : 0)))))))) +#define NG3(_r) \ + (((_r) == 19.5) ? 28 : (((_r) == 39) ? 29 : (((_r) == 58.5) ? 30 : \ + (((_r) == 78) ? 31 : (((_r) == 117) ? 32 : (((_r) == 156) ? 33 : \ + (((_r) == 175.5) ? 34 : (((_r) == 195)? 35 : 0)))))))) + +static const struct txschedule series_11ng[] = { + { 3,G( 1), 3,G( 1), 0,G( 1), 0,G( 1) }, /* 1Mb/s */ + { 4,G( 2), 3,G( 1), 4,G( 1), 0,G( 1) }, /* 2Mb/s */ + { 4,G(5.5),3,G( 2), 4,G( 1), 2,G( 1) }, /* 5.5Mb/s */ + { 4,G(11), 3,G(5.5), 4,G( 2), 2,G( 1) }, /* 11Mb/s */ + { 4,G( 6), 3,G(5.5), 4,G( 2), 2,G( 1) }, /* 6Mb/s */ + { 4,G( 9), 3,G( 6), 4,G(5.5), 2,G( 1) }, /* 9Mb/s */ + { 4,G(12), 3,G( 11), 4,G(5.5), 2,G( 1) }, /* 12Mb/s */ + { 4,G(18), 3,G( 12), 4,G( 11), 2,G( 1) }, /* 18Mb/s */ + { 4,G(24), 3,G( 18), 4,G( 12), 2,G( 1) }, /* 24Mb/s */ + { 4,G(36), 3,G( 24), 4,G( 18), 2,G( 1) }, /* 36Mb/s */ + { 4,G(48), 3,G( 36), 4,G( 24), 2,G( 1) }, /* 48Mb/s */ + { 4,G(54), 3,G( 48), 4,G( 36), 2,G( 1) }, /* 54Mb/s */ + + /* 1 stream rates */ + + { 3,NG1( 6.5), 3,NG1( 6.5), 0,NG1( 6.5), 0,NG1(6.5) }, /* 6.5Mb/s */ + { 4,NG1( 13), 3,NG1( 6.5), 4,NG1( 6.5), 0,NG1(6.5) }, /* 13Mb/s */ + { 4,NG1(19.5), 3,NG1( 6.5), 4,NG1( 6.5), 0,NG1(6.5) }, /*19.5Mb/s */ + { 4,NG1( 26), 3,NG1(19.5), 4,NG1( 6.5), 2,NG1(6.5) }, /* 26Mb/s */ + { 4,NG1( 39), 3,NG1( 26), 4,NG1(19.5), 2,NG1(6.5) }, /* 39Mb/s */ + { 4,NG1( 52), 3,NG1( 39), 4,NG1( 26), 2,NG1(6.5) }, /* 52Mb/s */ + { 4,NG1(58.5), 3,NG1( 52), 4,NG1( 39), 2,NG1( 13) }, /*58.5Mb/s */ + { 4,NG1( 65), 3,NG1(58.5), 4,NG1( 52), 2,NG1( 13) }, /* 65Mb/s */ + + /* 2 stream rates */ + + { 3,NG2( 13), 3,NG2( 13), 0,NG2( 13), 0,NG2( 13) }, /* 13Mb/s */ + { 4,NG2( 26), 3,NG2( 13), 4,NG2( 13), 0,NG2( 13) }, /* 26Mb/s */ + { 4,NG2( 39), 3,NG2( 26), 4,NG2( 13), 2,NG2( 13) }, /* 39Mb/s */ + { 4,NG2( 52), 3,NG2( 39), 4,NG2( 26), 2,NG2( 13) }, /* 52Mb/s */ + { 4,NG2( 78), 3,NG2( 52), 4,NG2( 39), 2,NG2( 13) }, /* 78Mb/s */ + { 4,NG2( 104), 3,NG2( 78), 4,NG2( 52), 2,NG2( 13) }, /* 104Mb/s */ + { 4,NG2( 117), 3,NG2( 104), 4,NG2( 78), 2,NG2( 26) }, /* 117Mb/s */ + { 4,NG2( 130), 3,NG2( 117), 4,NG2( 104), 2,NG2( 26) }, /* 130Mb/s */ + + /* 3 stream rates */ + + { 3,NG3(19.5), 3,NG3(19.5), 0,NG3(19.5), 0,NG3(19.5) }, /* 19Mb/s */ + { 3,NG3( 39), 3,NG3(19.5), 0,NG3(19.5), 0,NG3(19.5) }, /* 39Mb/s */ + { 3,NG3(58.5), 3,NG3( 39), 0,NG3(19.5), 0,NG3(19.5) }, /* 58Mb/s */ + { 3,NG3( 78), 3,NG3(58.5), 0,NG3( 39), 0,NG3(19.5) }, /* 78Mb/s */ + { 3,NG3( 117), 3,NG3( 78), 0,NG3(58.5), 0,NG3(19.5) }, /* 117Mb/s */ + { 3,NG3( 156), 3,NG3( 117), 0,NG3( 78), 0,NG3(19.5) }, /* 156Mb/s */ + { 3,NG3(175.5), 3,NG3( 156), 0,NG3( 117), 0,NG3( 39) }, /* 175Mb/s */ + { 3,NG3( 195), 3,NG3( 195), 0,NG3( 156), 0,NG3(58.5) }, /* 195Mb/s */ + +}; +#undef G +#undef NG3 +#undef NG2 +#undef NG1 + +#define H(_r) \ + (((_r) == 3) ? 0 : (((_r) == 4.5) ? 1 : (((_r) == 6) ? 2 : \ + (((_r) == 9) ? 3 : (((_r) == 12) ? 4 : (((_r) == 18) ? 5 : \ + (((_r) == 24) ? 6 : (((_r) == 27) ? 7 : 0)))))))) +static const struct txschedule series_half[] = { + { 3,H( 3), 3,H( 3), 0,H( 3), 0,H( 3) }, /* 3Mb/s */ + { 4,H(4.5),3,H( 3), 4,H( 3), 0,H( 3) }, /* 4.5Mb/s */ + { 4,H( 6), 3,H( 3), 4,H( 3), 0,H( 3) }, /* 6Mb/s */ + { 4,H( 9), 3,H( 6), 4,H( 3), 2,H( 3) }, /* 9Mb/s */ + { 4,H(12), 3,H( 9), 4,H( 6), 2,H( 3) }, /* 12Mb/s */ + { 4,H(18), 3,H( 12), 4,H( 9), 2,H( 3) }, /* 18Mb/s */ + { 4,H(24), 3,H( 18), 4,H( 12), 2,H( 6) }, /* 24Mb/s */ + { 4,H(27), 3,H( 24), 4,H( 18), 2,H(12) } /* 27Mb/s */ +}; +#undef H + +#ifdef Q +#undef Q +#endif +#define Q(_r) \ + (((_r) == 1.5) ? 0 : (((_r) ==2.25) ? 1 : (((_r) == 3) ? 2 : \ + (((_r) == 4.5) ? 3 : (((_r) == 6) ? 4 : (((_r) == 9) ? 5 : \ + (((_r) == 12) ? 6 : (((_r) == 13.5)? 7 : 0)))))))) +static const struct txschedule series_quarter[] = { + { 3,Q( 1.5),3,Q(1.5), 0,Q(1.5), 0,Q(1.5) }, /* 1.5Mb/s */ + { 4,Q(2.25),3,Q(1.5), 4,Q(1.5), 0,Q(1.5) }, /*2.25Mb/s */ + { 4,Q( 3),3,Q(1.5), 4,Q(1.5), 0,Q(1.5) }, /* 3Mb/s */ + { 4,Q( 4.5),3,Q( 3), 4,Q(1.5), 2,Q(1.5) }, /* 4.5Mb/s */ + { 4,Q( 6),3,Q(4.5), 4,Q( 3), 2,Q(1.5) }, /* 6Mb/s */ + { 4,Q( 9),3,Q( 6), 4,Q(4.5), 2,Q(1.5) }, /* 9Mb/s */ + { 4,Q( 12),3,Q( 9), 4,Q( 6), 2,Q( 3) }, /* 12Mb/s */ + { 4,Q(13.5),3,Q( 12), 4,Q( 9), 2,Q( 6) } /*13.5Mb/s */ +}; +#undef Q + +#endif /* _NET80211_IEEE80211_RATECTL_SAMPLE_TXSCHEDULES_H_ */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201309160808.r8G88qb6091423>