Re: dynamic RTS threshold in 11n mode

2019-02-27 Thread Stefan Sperling
On Wed, Feb 27, 2019 at 12:06:32PM +0100, Solene Rapenne wrote:
> Copy a file over NFS (3 times)
> 
> Before patch: 20.51 / 19.74 / 19.74 seconds
> After  patch: 14.48 / 15.03 / 14.49 seconds
> 
> It gets 25% faster!

Nice :)

> Ping -c100 -i0.2 on local network
> 
> Before patch: 2.398/3.869/10.290/1.347 ms
> After  patch: 2.470/3.245/5.608/0.492 ms

Ping times can vary widely and also depend on concurrent transmissions
made by other devices. But the trend looks good, and it is expected
that we're now causing less latency on the channel ourselves.

> 3 differents file get from NFS (once because after it in cache, not
> sure if test is relevant or reliable):
> 
> Before patch: file1 11.39 / file2 12.21 / file3 6.47 seconds
> After  patch: file1 12.44 / file2 12.50 / file3 7.26 seconds
> 
> This test show a small slowdown while other tests show a big
> improvement.

It should be faster in general, but we'll still flip RTS on if the
MiRA heuristic believes it makes sense and that can lead to periods of
time during which performance drops again. We might still need to tweak
this heuristic in the future. There are a lot of details the paper does
not explain. We'll have to figure out what works best in practice.

Thanks for testing! The diff has been committed earlier today.



Re: dynamic RTS threshold in 11n mode

2019-02-27 Thread Solene Rapenne
On Tue, Feb 26, 2019 at 03:33:23PM +0100, Stefan Sperling wrote:
> On Tue, Feb 26, 2019 at 03:04:35PM +0100, Stefan Sperling wrote:
> > This diff makes the RTS threshold dynamic in 11n mode.
> > I am looking for tests with iwn(4), iwm(4), and athn(4) drivers.
> > 
> > When there's a lot of competition for air time, RTS can do more harm than
> > good because we end up causing more RTS/CTS frames on the air than actual
> > data frames. So a fixed RTS threshold really doesn't make a lot of sense.
> > 
> > This diff implements a heuristic for setting this threshold, based on 
> > section
> > 5.2 of the MiRa paper. It should improve Tx throughput on busy channels 
> > which
> > are especially common in the 2GHz band. In my testing it helps quite a bit.
> > 
> > This diff won't change the situation in 11a/b/g modes, and it might
> > not make a difference if there are 11a/b/g networks in range.
> 
> I realized the previous diff might take some time to raise throughput,
> so please try this one instead. The difference is just that the previous
> diff starts out with RTS threshold enabled, while this one starts out with
> RTS threshold disabled. This should make results look better for people
> doing quick tests rather than looking at long-term effects.  :-)
> 
> diff f727f040295e17987bfffe9c9952e45fd6ad7859 /usr/src
> blob - 7cf96bf074b3eef4d9fbb85c9253bac7e5550fd7
> file + sys/dev/ic/ar5008.c
> --- sys/dev/ic/ar5008.c
> +++ sys/dev/ic/ar5008.c
> @@ -1514,11 +1514,16 @@ ar5008_tx(struct athn_softc *sc, struct mbuf *m, struc
>   if (!IEEE80211_IS_MULTICAST(wh->i_addr1) &&
>   (wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) ==
>   IEEE80211_FC0_TYPE_DATA) {
> + int rtsthres = ic->ic_rtsthreshold;
>   enum ieee80211_htprot htprot;
> - 
> +
> + if (ni->ni_flags & IEEE80211_NODE_HT)
> + rtsthres = ieee80211_mira_get_rts_threshold(>mn,
> + ic, ni, totlen);
>   htprot = (ic->ic_bss->ni_htop1 & IEEE80211_HTOP1_PROT_MASK);
> +
>   /* NB: Group frames are sent using CCK in 802.11b/g. */
> - if (totlen > ic->ic_rtsthreshold) {
> + if (totlen > rtsthres) {
>   ds->ds_ctl0 |= AR_TXC0_RTS_ENABLE;
>   } else if (((ic->ic_flags & IEEE80211_F_USEPROT) &&
>   athn_rates[ridx[0]].phy == IEEE80211_T_OFDM) ||
> blob - 7d7f0697a2b609f4a6e0fab09ede9a480baa7bd3
> file + sys/dev/pci/if_iwm.c
> --- sys/dev/pci/if_iwm.c
> +++ sys/dev/pci/if_iwm.c
> @@ -4216,7 +4216,7 @@ iwm_tx(struct iwm_softc *sc, struct mbuf *m, struct ie
>   bus_dma_segment_t *seg;
>   uint8_t tid, type;
>   int i, totlen, err, pad;
> - int hdrlen2;
> + int hdrlen2, rtsthres = ic->ic_rtsthreshold;
>  
>   wh = mtod(m, struct ieee80211_frame *);
>   hdrlen = ieee80211_get_hdrlen(wh);
> @@ -4292,9 +4292,13 @@ iwm_tx(struct iwm_softc *sc, struct mbuf *m, struct ie
>   flags |= IWM_TX_CMD_FLG_ACK;
>   }
>  
> + if (ni->ni_flags & IEEE80211_NODE_HT)
> + rtsthres = ieee80211_mira_get_rts_threshold(>in_mn, ic, ni,
> + totlen + IEEE80211_CRC_LEN);
> +
>   if (type == IEEE80211_FC0_TYPE_DATA &&
>   !IEEE80211_IS_MULTICAST(wh->i_addr1) &&
> - (totlen + IEEE80211_CRC_LEN > ic->ic_rtsthreshold ||
> + (totlen + IEEE80211_CRC_LEN > rtsthres ||
>   (ic->ic_flags & IEEE80211_F_USEPROT)))
>   flags |= IWM_TX_CMD_FLG_PROT_REQUIRE;
>  
> blob - 1dab60807c0709735799436e7a4a8e2d8d9f1ff9
> file + sys/dev/pci/if_iwn.c
> --- sys/dev/pci/if_iwn.c
> +++ sys/dev/pci/if_iwn.c
> @@ -3069,8 +3069,13 @@ iwn_tx(struct iwn_softc *sc, struct mbuf *m, struct ie
>  
>   /* Check if frame must be protected using RTS/CTS or CTS-to-self. */
>   if (!IEEE80211_IS_MULTICAST(wh->i_addr1)) {
> + int rtsthres = ic->ic_rtsthreshold;
> + if (ni->ni_flags & IEEE80211_NODE_HT)
> + rtsthres = ieee80211_mira_get_rts_threshold(>mn,
> + ic, ni, totlen + IEEE80211_CRC_LEN);
> +
>   /* NB: Group frames are sent using CCK in 802.11b/g/n (2GHz). */
> - if (totlen + IEEE80211_CRC_LEN > ic->ic_rtsthreshold) {
> + if (totlen + IEEE80211_CRC_LEN > rtsthres) {
>   flags |= IWN_TX_NEED_RTS;
>   } else if ((ic->ic_flags & IEEE80211_F_USEPROT) &&
>   ridx >= IWN_RIDX_OFDM

Re: dynamic RTS threshold in 11n mode

2019-02-26 Thread Stefan Sperling
On Tue, Feb 26, 2019 at 03:04:35PM +0100, Stefan Sperling wrote:
> This diff makes the RTS threshold dynamic in 11n mode.
> I am looking for tests with iwn(4), iwm(4), and athn(4) drivers.
> 
> When there's a lot of competition for air time, RTS can do more harm than
> good because we end up causing more RTS/CTS frames on the air than actual
> data frames. So a fixed RTS threshold really doesn't make a lot of sense.
> 
> This diff implements a heuristic for setting this threshold, based on section
> 5.2 of the MiRa paper. It should improve Tx throughput on busy channels which
> are especially common in the 2GHz band. In my testing it helps quite a bit.
> 
> This diff won't change the situation in 11a/b/g modes, and it might
> not make a difference if there are 11a/b/g networks in range.

I realized the previous diff might take some time to raise throughput,
so please try this one instead. The difference is just that the previous
diff starts out with RTS threshold enabled, while this one starts out with
RTS threshold disabled. This should make results look better for people
doing quick tests rather than looking at long-term effects.  :-)

diff f727f040295e17987bfffe9c9952e45fd6ad7859 /usr/src
blob - 7cf96bf074b3eef4d9fbb85c9253bac7e5550fd7
file + sys/dev/ic/ar5008.c
--- sys/dev/ic/ar5008.c
+++ sys/dev/ic/ar5008.c
@@ -1514,11 +1514,16 @@ ar5008_tx(struct athn_softc *sc, struct mbuf *m, struc
if (!IEEE80211_IS_MULTICAST(wh->i_addr1) &&
(wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) ==
IEEE80211_FC0_TYPE_DATA) {
+   int rtsthres = ic->ic_rtsthreshold;
enum ieee80211_htprot htprot;
-   
+
+   if (ni->ni_flags & IEEE80211_NODE_HT)
+   rtsthres = ieee80211_mira_get_rts_threshold(>mn,
+   ic, ni, totlen);
htprot = (ic->ic_bss->ni_htop1 & IEEE80211_HTOP1_PROT_MASK);
+
/* NB: Group frames are sent using CCK in 802.11b/g. */
-   if (totlen > ic->ic_rtsthreshold) {
+   if (totlen > rtsthres) {
ds->ds_ctl0 |= AR_TXC0_RTS_ENABLE;
} else if (((ic->ic_flags & IEEE80211_F_USEPROT) &&
athn_rates[ridx[0]].phy == IEEE80211_T_OFDM) ||
blob - 7d7f0697a2b609f4a6e0fab09ede9a480baa7bd3
file + sys/dev/pci/if_iwm.c
--- sys/dev/pci/if_iwm.c
+++ sys/dev/pci/if_iwm.c
@@ -4216,7 +4216,7 @@ iwm_tx(struct iwm_softc *sc, struct mbuf *m, struct ie
bus_dma_segment_t *seg;
uint8_t tid, type;
int i, totlen, err, pad;
-   int hdrlen2;
+   int hdrlen2, rtsthres = ic->ic_rtsthreshold;
 
wh = mtod(m, struct ieee80211_frame *);
hdrlen = ieee80211_get_hdrlen(wh);
@@ -4292,9 +4292,13 @@ iwm_tx(struct iwm_softc *sc, struct mbuf *m, struct ie
flags |= IWM_TX_CMD_FLG_ACK;
}
 
+   if (ni->ni_flags & IEEE80211_NODE_HT)
+   rtsthres = ieee80211_mira_get_rts_threshold(>in_mn, ic, ni,
+   totlen + IEEE80211_CRC_LEN);
+
if (type == IEEE80211_FC0_TYPE_DATA &&
!IEEE80211_IS_MULTICAST(wh->i_addr1) &&
-   (totlen + IEEE80211_CRC_LEN > ic->ic_rtsthreshold ||
+   (totlen + IEEE80211_CRC_LEN > rtsthres ||
(ic->ic_flags & IEEE80211_F_USEPROT)))
flags |= IWM_TX_CMD_FLG_PROT_REQUIRE;
 
blob - 1dab60807c0709735799436e7a4a8e2d8d9f1ff9
file + sys/dev/pci/if_iwn.c
--- sys/dev/pci/if_iwn.c
+++ sys/dev/pci/if_iwn.c
@@ -3069,8 +3069,13 @@ iwn_tx(struct iwn_softc *sc, struct mbuf *m, struct ie
 
/* Check if frame must be protected using RTS/CTS or CTS-to-self. */
if (!IEEE80211_IS_MULTICAST(wh->i_addr1)) {
+   int rtsthres = ic->ic_rtsthreshold;
+   if (ni->ni_flags & IEEE80211_NODE_HT)
+   rtsthres = ieee80211_mira_get_rts_threshold(>mn,
+   ic, ni, totlen + IEEE80211_CRC_LEN);
+
/* NB: Group frames are sent using CCK in 802.11b/g/n (2GHz). */
-   if (totlen + IEEE80211_CRC_LEN > ic->ic_rtsthreshold) {
+   if (totlen + IEEE80211_CRC_LEN > rtsthres) {
flags |= IWN_TX_NEED_RTS;
} else if ((ic->ic_flags & IEEE80211_F_USEPROT) &&
ridx >= IWN_RIDX_OFDM6) {
blob - 4edd26a5fde82a9d9ddfd31e0bd075c0f59d2143
file + sys/net80211/ieee80211_mira.c
--- sys/net80211/ieee80211_mira.c
+++ sys/net80211/ieee80211_mira.c
@@ -85,6 +85,9 @@ int   ieee80211_mira_valid_tx_mcs(struct ieee80211com *,
 uint32_t ieee80211_mira_valid_rates(struct ieee80211com *,
struct ieee80211_node *);
 uint32_t ieee80211_mira_mcs_below(struct ieee80211_mira_node *, int, int);
+void   ieee80211_mira_set_rts_threshold(struct ieee80211

dynamic RTS threshold in 11n mode

2019-02-26 Thread Stefan Sperling
This diff makes the RTS threshold dynamic in 11n mode.
I am looking for tests with iwn(4), iwm(4), and athn(4) drivers.

When there's a lot of competition for air time, RTS can do more harm than
good because we end up causing more RTS/CTS frames on the air than actual
data frames. So a fixed RTS threshold really doesn't make a lot of sense.

This diff implements a heuristic for setting this threshold, based on section
5.2 of the MiRa paper. It should improve Tx throughput on busy channels which
are especially common in the 2GHz band. In my testing it helps quite a bit.

This diff won't change the situation in 11a/b/g modes, and it might
not make a difference if there are 11a/b/g networks in range.

diff f727f040295e17987bfffe9c9952e45fd6ad7859 /usr/src
blob - 7cf96bf074b3eef4d9fbb85c9253bac7e5550fd7
file + sys/dev/ic/ar5008.c
--- sys/dev/ic/ar5008.c
+++ sys/dev/ic/ar5008.c
@@ -1514,11 +1514,16 @@ ar5008_tx(struct athn_softc *sc, struct mbuf *m, struc
if (!IEEE80211_IS_MULTICAST(wh->i_addr1) &&
(wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) ==
IEEE80211_FC0_TYPE_DATA) {
+   int rtsthres = ic->ic_rtsthreshold;
enum ieee80211_htprot htprot;
-   
+
+   if (ni->ni_flags & IEEE80211_NODE_HT)
+   rtsthres = ieee80211_mira_get_rts_threshold(>mn,
+   ic, ni, totlen);
htprot = (ic->ic_bss->ni_htop1 & IEEE80211_HTOP1_PROT_MASK);
+
/* NB: Group frames are sent using CCK in 802.11b/g. */
-   if (totlen > ic->ic_rtsthreshold) {
+   if (totlen > rtsthres) {
ds->ds_ctl0 |= AR_TXC0_RTS_ENABLE;
} else if (((ic->ic_flags & IEEE80211_F_USEPROT) &&
athn_rates[ridx[0]].phy == IEEE80211_T_OFDM) ||
blob - 7d7f0697a2b609f4a6e0fab09ede9a480baa7bd3
file + sys/dev/pci/if_iwm.c
--- sys/dev/pci/if_iwm.c
+++ sys/dev/pci/if_iwm.c
@@ -4216,7 +4216,7 @@ iwm_tx(struct iwm_softc *sc, struct mbuf *m, struct ie
bus_dma_segment_t *seg;
uint8_t tid, type;
int i, totlen, err, pad;
-   int hdrlen2;
+   int hdrlen2, rtsthres = ic->ic_rtsthreshold;
 
wh = mtod(m, struct ieee80211_frame *);
hdrlen = ieee80211_get_hdrlen(wh);
@@ -4292,9 +4292,13 @@ iwm_tx(struct iwm_softc *sc, struct mbuf *m, struct ie
flags |= IWM_TX_CMD_FLG_ACK;
}
 
+   if (ni->ni_flags & IEEE80211_NODE_HT)
+   rtsthres = ieee80211_mira_get_rts_threshold(>in_mn, ic, ni,
+   totlen + IEEE80211_CRC_LEN);
+
if (type == IEEE80211_FC0_TYPE_DATA &&
!IEEE80211_IS_MULTICAST(wh->i_addr1) &&
-   (totlen + IEEE80211_CRC_LEN > ic->ic_rtsthreshold ||
+   (totlen + IEEE80211_CRC_LEN > rtsthres ||
(ic->ic_flags & IEEE80211_F_USEPROT)))
flags |= IWM_TX_CMD_FLG_PROT_REQUIRE;
 
blob - 1dab60807c0709735799436e7a4a8e2d8d9f1ff9
file + sys/dev/pci/if_iwn.c
--- sys/dev/pci/if_iwn.c
+++ sys/dev/pci/if_iwn.c
@@ -3069,8 +3069,13 @@ iwn_tx(struct iwn_softc *sc, struct mbuf *m, struct ie
 
/* Check if frame must be protected using RTS/CTS or CTS-to-self. */
if (!IEEE80211_IS_MULTICAST(wh->i_addr1)) {
+   int rtsthres = ic->ic_rtsthreshold;
+   if (ni->ni_flags & IEEE80211_NODE_HT)
+   rtsthres = ieee80211_mira_get_rts_threshold(>mn,
+   ic, ni, totlen + IEEE80211_CRC_LEN);
+
/* NB: Group frames are sent using CCK in 802.11b/g/n (2GHz). */
-   if (totlen + IEEE80211_CRC_LEN > ic->ic_rtsthreshold) {
+   if (totlen + IEEE80211_CRC_LEN > rtsthres) {
flags |= IWN_TX_NEED_RTS;
} else if ((ic->ic_flags & IEEE80211_F_USEPROT) &&
ridx >= IWN_RIDX_OFDM6) {
blob - 4edd26a5fde82a9d9ddfd31e0bd075c0f59d2143
file + sys/net80211/ieee80211_mira.c
--- sys/net80211/ieee80211_mira.c
+++ sys/net80211/ieee80211_mira.c
@@ -85,6 +85,9 @@ int   ieee80211_mira_valid_tx_mcs(struct ieee80211com *,
 uint32_t ieee80211_mira_valid_rates(struct ieee80211com *,
struct ieee80211_node *);
 uint32_t ieee80211_mira_mcs_below(struct ieee80211_mira_node *, int, int);
+void   ieee80211_mira_set_rts_threshold(struct ieee80211_mira_node *,
+   struct ieee80211com *, struct ieee80211_node *);
+void   ieee80211_mira_reset_collision_stats(struct ieee80211_mira_node *);
 
 /* We use fixed point arithmetic with 64 bit integers. */
 #define MIRA_FP_SHIFT  21
@@ -309,7 +312,7 @@ ieee80211_mira_ack_rate(struct ieee80211_node *ni)
 {
/* 
 * Assume the ACK was sent at a mandatory ERP OFDM rate.
-* In the worst case, the firmware has retried at non-HT rates,
+* In the worst

Re: dynamic RTS threshold in 11n mode

2017-03-11 Thread Stefan Sperling
On Sat, Mar 11, 2017 at 08:55:54AM +0900, Stefan Sperling wrote:
> On Sat, Mar 04, 2017 at 10:04:51PM +0100, Stefan Sperling wrote:
> > This diff makes the RTS threshold dynamic in 11n mode.
> > It flips the RTS threshold between DEFAULT (512 bytes) and MAX (the
> > maximum size of a non-aggregated 802.11 frame).
> 
> Things have been working fine for me with this diff.
> Any concerns about putting it in?

This diff is causing throughput regressions in some environments so
I am shelving it for now.



Re: dynamic RTS threshold in 11n mode

2017-03-10 Thread Stefan Sperling
On Sat, Mar 04, 2017 at 10:04:51PM +0100, Stefan Sperling wrote:
> This diff makes the RTS threshold dynamic in 11n mode.
> It flips the RTS threshold between DEFAULT (512 bytes) and MAX (the
> maximum size of a non-aggregated 802.11 frame).

Things have been working fine for me with this diff.
Any concerns about putting it in?

> The decision whether to use RTS is implemented as a heuristic described
> in the MiRA paper.
> 
> MiRa enables RTS if there are retries with almost no loss, indicating
> competition with other APs and clients. It leaves RTS disabled if
> there is a lot of loss, indicating we are too far away from the AP
> or using a bad Tx rate which won't cover the distance.
> 
> Because an athn(4) hostap needs a per-client threshold I am introducing
> ni_rtsthreshold in struct ieee80211_node. This could completely replace
> the ic_rtsthreshold in struct ieee80211com eventually. For now I am only
> switching 11n capable drivers over to ni_rtsthreshold.
> 
> I am interested in test reports.
> When testing this please look for changes in both latency and throughput
> and let me know if you think it behaves better or worse with this diff.
> 
> Index: dev/ic/ar5008.c
> ===
> RCS file: /cvs/src/sys/dev/ic/ar5008.c,v
> retrieving revision 1.42
> diff -u -p -r1.42 ar5008.c
> --- dev/ic/ar5008.c   1 Feb 2017 12:45:56 -   1.42
> +++ dev/ic/ar5008.c   4 Mar 2017 15:29:02 -
> @@ -1513,7 +1513,7 @@ ar5008_tx(struct athn_softc *sc, struct 
>   
>   htprot = (ic->ic_bss->ni_htop1 & IEEE80211_HTOP1_PROT_MASK);
>   /* NB: Group frames are sent using CCK in 802.11b/g. */
> - if (totlen > ic->ic_rtsthreshold) {
> + if (totlen > ni->ni_rtsthreshold) {
>   ds->ds_ctl0 |= AR_TXC0_RTS_ENABLE;
>   } else if (((ic->ic_flags & IEEE80211_F_USEPROT) &&
>   athn_rates[ridx[0]].phy == IEEE80211_T_OFDM) ||
> Index: dev/ic/ath.c
> ===
> RCS file: /cvs/src/sys/dev/ic/ath.c,v
> retrieving revision 1.112
> diff -u -p -r1.112 ath.c
> --- dev/ic/ath.c  22 Jan 2017 10:17:37 -  1.112
> +++ dev/ic/ath.c  4 Mar 2017 15:29:23 -
> @@ -2259,7 +2259,7 @@ ath_tx_start(struct ath_softc *sc, struc
>   if (IEEE80211_IS_MULTICAST(wh->i_addr1)) {
>   flags |= HAL_TXDESC_NOACK;  /* no ack on broad/multicast */
>   sc->sc_stats.ast_tx_noack++;
> - } else if (pktlen > ic->ic_rtsthreshold) {
> + } else if (pktlen > ni->ni_rtsthreshold) {
>   flags |= HAL_TXDESC_RTSENA; /* RTS based on frame length */
>   sc->sc_stats.ast_tx_rts++;
>   }
> Index: dev/pci/if_iwm.c
> ===
> RCS file: /cvs/src/sys/dev/pci/if_iwm.c,v
> retrieving revision 1.165
> diff -u -p -r1.165 if_iwm.c
> --- dev/pci/if_iwm.c  20 Feb 2017 15:38:04 -  1.165
> +++ dev/pci/if_iwm.c  4 Mar 2017 15:30:11 -
> @@ -4038,7 +4038,7 @@ iwm_tx(struct iwm_softc *sc, struct mbuf
>  
>   if (type == IEEE80211_FC0_TYPE_DATA &&
>   !IEEE80211_IS_MULTICAST(wh->i_addr1) &&
> - (totlen + IEEE80211_CRC_LEN > ic->ic_rtsthreshold ||
> + (totlen + IEEE80211_CRC_LEN > ni->ni_rtsthreshold ||
>   (ic->ic_flags & IEEE80211_F_USEPROT)))
>   flags |= IWM_TX_CMD_FLG_PROT_REQUIRE;
>  
> Index: dev/pci/if_iwn.c
> ===
> RCS file: /cvs/src/sys/dev/pci/if_iwn.c,v
> retrieving revision 1.184
> diff -u -p -r1.184 if_iwn.c
> --- dev/pci/if_iwn.c  20 Feb 2017 15:38:04 -  1.184
> +++ dev/pci/if_iwn.c  4 Mar 2017 15:30:02 -
> @@ -2992,7 +2992,7 @@ iwn_tx(struct iwn_softc *sc, struct mbuf
>   /* Check if frame must be protected using RTS/CTS or CTS-to-self. */
>   if (!IEEE80211_IS_MULTICAST(wh->i_addr1)) {
>   /* NB: Group frames are sent using CCK in 802.11b/g/n (2GHz). */
> - if (totlen + IEEE80211_CRC_LEN > ic->ic_rtsthreshold) {
> + if (totlen + IEEE80211_CRC_LEN > ni->ni_rtsthreshold) {
>   flags |= IWN_TX_NEED_RTS;
>   } else if ((ic->ic_flags & IEEE80211_F_USEPROT) &&
>   ridx >= IWN_RIDX_OFDM6) {
> Index: net80211/ieee80211_mira.c
> ===
> RCS file: /cvs/src/sys/net80211/ieee80211_mira.c,v
> retrieving revision 1.10
> diff -u -p