| Main index | Section 9 | Options |
#include <net80211/ieee80211_amrr.h>
ieee80211_amrr requires per-vap state and per-node state for each station it is to select rates for. The API's are designed for drivers to pre-allocate state in the driver-private extension areas of each vap and node. For example the ral(4) driver defines a vap as:
struct rt2560_vap {
struct ieee80211vap ral_vap;
struct ieee80211_beacon_offsets ral_bo;
struct ieee80211_amrr amrr;
int (*ral_newstate)(struct ieee80211vap *,
enum ieee80211_state, int);
};
The amrr structure member holds the per-vap state for ieee80211_amrr and ral(4) initializes it in the vap create method with:
ieee80211_amrr_init(&rvp->amrr, vap,
IEEE80211_AMRR_MIN_SUCCESS_THRESHOLD,
IEEE80211_AMRR_MAX_SUCCESS_THRESHOLD,
500 /* ms */);
The node is defined as:
struct rt2560_node {
struct ieee80211_node ni;
struct ieee80211_amrr_node amrr;
};
with initialization done in the driver's iv_newassoc method:
static void
rt2560_newassoc(struct ieee80211_node *ni, int isnew)
{
struct ieee80211vap *vap = ni->ni_vap;
ieee80211_amrr_node_init(&RT2560_VAP(vap)->amrr,
&RT2560_NODE(ni)->amrr, ni);
}
Once ieee80211_amrr state is setup, transmit rates are requested by calling ieee80211_amrr_choose() in the transmit path; e.g.:
tp = &vap->iv_txparms[ieee80211_chan2mode(ni->ni_chan)];
if (IEEE80211_IS_MULTICAST(wh->i_addr1)) {
rate = tp->mcastrate;
} else if (m0->m_flags & M_EAPOL) {
rate = tp->mgmtrate;
} else if (tp->ucastrate != IEEE80211_FIXED_RATE_NONE) {
rate = tp->ucastrate;
} else {
(void) ieee80211_amrr_choose(ni, &RT2560_NODE(ni)->amrr);
rate = ni->ni_txrate;
}
Note a rate is chosen only for unicast data frames when a fixed transmit rate is not configured; the other cases are handled with the net80211 transmit parameters. Note also that ieee80211_amrr_choose() writes the chosen rate in ni_txrate; this eliminates copying the value as it is exported to user applications so they can display the current transmit rate in status.
The remaining work a driver must do is feed status back to ieee80211_amrr when a frame transmit completes using ieee80211_amrr_tx_complete(). Drivers that poll a device to retrieve statistics can use ieee80211_amrr_tx_update() (instead or in addition).
| IEEE8021_AMRR (9) | August 4, 2009 |
| Main index | Section 9 | Options |
Please direct any comments about this manual page service to Ben Bullock. Privacy policy.
