o Send management frames at the lowest possible rate.

o Include rate in the Rx radiotap code.
o Fix RSSI value in the Rx path.
o Minor tweaks.
This commit is contained in:
Damien Bergamini 2005-11-29 20:55:53 +00:00
parent 53b5c4604a
commit 3d5dc80e4d
3 changed files with 43 additions and 8 deletions

View File

@ -113,6 +113,7 @@ Static void ural_next_scan(void *);
Static void ural_task(void *); Static void ural_task(void *);
Static int ural_newstate(struct ieee80211com *, Static int ural_newstate(struct ieee80211com *,
enum ieee80211_state, int); enum ieee80211_state, int);
Static int ural_rxrate(struct ural_rx_desc *);
Static void ural_txeof(usbd_xfer_handle, usbd_private_handle, Static void ural_txeof(usbd_xfer_handle, usbd_private_handle,
usbd_status); usbd_status);
Static void ural_rxeof(usbd_xfer_handle, usbd_private_handle, Static void ural_rxeof(usbd_xfer_handle, usbd_private_handle,
@ -825,6 +826,37 @@ ural_newstate(struct ieee80211com *ic, enum ieee80211_state nstate, int arg)
#define RAL_CTS_SIZE 14 /* 10 + 4(FCS) */ #define RAL_CTS_SIZE 14 /* 10 + 4(FCS) */
#define RAL_SIFS 10 #define RAL_SIFS 10
/*
* This function is only used by the Rx radiotap code.
*/
Static int
ural_rxrate(struct ural_rx_desc *desc)
{
if (le32toh(desc->flags) & RAL_RX_OFDM) {
/* reverse function of ural_plcp_signal */
switch (desc->rate) {
case 0xb: return 12;
case 0xf: return 18;
case 0xa: return 24;
case 0xe: return 36;
case 0x9: return 48;
case 0xd: return 72;
case 0x8: return 96;
case 0xc: return 108;
}
} else {
if (desc->rate == 10)
return 2;
if (desc->rate == 20)
return 4;
if (desc->rate == 55)
return 11;
if (desc->rate == 110)
return 22;
}
return 2; /* should not get there */
}
Static void Static void
ural_txeof(usbd_xfer_handle xfer, usbd_private_handle priv, usbd_status status) ural_txeof(usbd_xfer_handle xfer, usbd_private_handle priv, usbd_status status)
{ {
@ -924,6 +956,7 @@ ural_rxeof(usbd_xfer_handle xfer, usbd_private_handle priv, usbd_status status)
struct ural_rx_radiotap_header *tap = &sc->sc_rxtap; struct ural_rx_radiotap_header *tap = &sc->sc_rxtap;
tap->wr_flags = 0; tap->wr_flags = 0;
tap->wr_rate = ural_rxrate(desc);
tap->wr_chan_freq = htole16(ic->ic_ibss_chan->ic_freq); tap->wr_chan_freq = htole16(ic->ic_ibss_chan->ic_freq);
tap->wr_chan_flags = htole16(ic->ic_ibss_chan->ic_flags); tap->wr_chan_flags = htole16(ic->ic_ibss_chan->ic_flags);
tap->wr_antenna = sc->rx_ant; tap->wr_antenna = sc->rx_ant;
@ -1094,7 +1127,7 @@ ural_tx_bcn(struct ural_softc *sc, struct mbuf *m0, struct ieee80211_node *ni)
uint8_t *buf; uint8_t *buf;
int xferlen, rate; int xferlen, rate;
rate = IEEE80211_IS_CHAN_5GHZ(ni->ni_chan) ? 12 : 4; rate = IEEE80211_IS_CHAN_5GHZ(ni->ni_chan) ? 12 : 2;
xfer = usbd_alloc_xfer(sc->sc_udev); xfer = usbd_alloc_xfer(sc->sc_udev);
if (xfer == NULL) if (xfer == NULL)
@ -1151,7 +1184,7 @@ ural_tx_mgt(struct ural_softc *sc, struct mbuf *m0, struct ieee80211_node *ni)
data = &sc->tx_data[0]; data = &sc->tx_data[0];
desc = (struct ural_tx_desc *)data->buf; desc = (struct ural_tx_desc *)data->buf;
rate = IEEE80211_IS_CHAN_5GHZ(ic->ic_curchan) ? 12 : 4; rate = IEEE80211_IS_CHAN_5GHZ(ic->ic_curchan) ? 12 : 2;
data->m = m0; data->m = m0;
data->ni = ni; data->ni = ni;
@ -2140,6 +2173,9 @@ ural_stop(void *priv)
ural_free_tx_list(sc); ural_free_tx_list(sc);
} }
#define URAL_AMRR_MIN_SUCCESS_THRESHOLD 1
#define URAL_AMRR_MAX_SUCCESS_THRESHOLD 10
Static void Static void
ural_amrr_start(struct ural_softc *sc, struct ieee80211_node *ni) ural_amrr_start(struct ural_softc *sc, struct ieee80211_node *ni)
{ {
@ -2151,8 +2187,8 @@ ural_amrr_start(struct ural_softc *sc, struct ieee80211_node *ni)
amrr->success = 0; amrr->success = 0;
amrr->recovery = 0; amrr->recovery = 0;
amrr->success_threshold = 1;
amrr->txcnt = amrr->retrycnt = 0; amrr->txcnt = amrr->retrycnt = 0;
amrr->success_threshold = URAL_AMRR_MIN_SUCCESS_THRESHOLD;
/* set rate to some reasonable initial value */ /* set rate to some reasonable initial value */
for (i = ni->ni_rates.rs_nrates - 1; for (i = ni->ni_rates.rs_nrates - 1;
@ -2226,10 +2262,6 @@ ural_amrr_update(usbd_xfer_handle xfer, usbd_private_handle priv,
* not provide per-frame stats, we can't do per-node rate adaptation and * not provide per-frame stats, we can't do per-node rate adaptation and
* thus automatic rate adaptation is only enabled in STA operating mode. * thus automatic rate adaptation is only enabled in STA operating mode.
*/ */
#define URAL_AMRR_MIN_SUCCESS_THRESHOLD 1
#define URAL_AMRR_MAX_SUCCESS_THRESHOLD 10
#define is_success(amrr) \ #define is_success(amrr) \
((amrr)->retrycnt < (amrr)->txcnt / 10) ((amrr)->retrycnt < (amrr)->txcnt / 10)
#define is_failure(amrr) \ #define is_failure(amrr) \

View File

@ -176,10 +176,11 @@ struct ural_tx_desc {
struct ural_rx_desc { struct ural_rx_desc {
uint32_t flags; uint32_t flags;
#define RAL_RX_CRC_ERROR (1 << 5) #define RAL_RX_CRC_ERROR (1 << 5)
#define RAL_RX_OFDM (1 << 6)
#define RAL_RX_PHY_ERROR (1 << 7) #define RAL_RX_PHY_ERROR (1 << 7)
uint8_t rate;
uint8_t rssi; uint8_t rssi;
uint8_t rate;
uint16_t reserved; uint16_t reserved;
uint32_t iv; uint32_t iv;

View File

@ -23,6 +23,7 @@
struct ural_rx_radiotap_header { struct ural_rx_radiotap_header {
struct ieee80211_radiotap_header wr_ihdr; struct ieee80211_radiotap_header wr_ihdr;
uint8_t wr_flags; uint8_t wr_flags;
uint8_t wr_rate;
uint16_t wr_chan_freq; uint16_t wr_chan_freq;
uint16_t wr_chan_flags; uint16_t wr_chan_flags;
uint8_t wr_antenna; uint8_t wr_antenna;
@ -31,6 +32,7 @@ struct ural_rx_radiotap_header {
#define RAL_RX_RADIOTAP_PRESENT \ #define RAL_RX_RADIOTAP_PRESENT \
((1 << IEEE80211_RADIOTAP_FLAGS) | \ ((1 << IEEE80211_RADIOTAP_FLAGS) | \
(1 << IEEE80211_RADIOTAP_RATE) | \
(1 << IEEE80211_RADIOTAP_CHANNEL) | \ (1 << IEEE80211_RADIOTAP_CHANNEL) | \
(1 << IEEE80211_RADIOTAP_ANTENNA) | \ (1 << IEEE80211_RADIOTAP_ANTENNA) | \
(1 << IEEE80211_RADIOTAP_DB_ANTSIGNAL)) (1 << IEEE80211_RADIOTAP_DB_ANTSIGNAL))