summaryrefslogtreecommitdiffstats
path: root/freebsd/sys/net80211/ieee80211_amrr.c
diff options
context:
space:
mode:
Diffstat (limited to 'freebsd/sys/net80211/ieee80211_amrr.c')
-rw-r--r--freebsd/sys/net80211/ieee80211_amrr.c43
1 files changed, 37 insertions, 6 deletions
diff --git a/freebsd/sys/net80211/ieee80211_amrr.c b/freebsd/sys/net80211/ieee80211_amrr.c
index 42e9ac1a..a827f470 100644
--- a/freebsd/sys/net80211/ieee80211_amrr.c
+++ b/freebsd/sys/net80211/ieee80211_amrr.c
@@ -104,12 +104,13 @@ static void
amrr_setinterval(const struct ieee80211vap *vap, int msecs)
{
struct ieee80211_amrr *amrr = vap->iv_rs;
- int t;
+
+ if (!amrr)
+ return;
if (msecs < 100)
msecs = 100;
- t = msecs_to_ticks(msecs);
- amrr->amrr_interval = (t < 1) ? 1 : t;
+ amrr->amrr_interval = msecs_to_ticks(msecs);
}
static void
@@ -168,6 +169,12 @@ amrr_node_init(struct ieee80211_node *ni)
struct ieee80211_amrr_node *amn;
uint8_t rate;
+ if (!amrr) {
+ if_printf(vap->iv_ifp, "ratectl structure was not allocated, "
+ "per-node structure allocation skipped\n");
+ return;
+ }
+
if (ni->ni_rctls == NULL) {
ni->ni_rctls = amn = IEEE80211_MALLOC(sizeof(struct ieee80211_amrr_node),
M_80211_RATECTL, IEEE80211_M_NOWAIT | IEEE80211_M_ZERO);
@@ -329,10 +336,19 @@ static int
amrr_rate(struct ieee80211_node *ni, void *arg __unused, uint32_t iarg __unused)
{
struct ieee80211_amrr_node *amn = ni->ni_rctls;
- struct ieee80211_amrr *amrr = amn->amn_amrr;
+ struct ieee80211_amrr *amrr;
const struct ieee80211_rateset *rs = NULL;
int rix;
+ /* XXX should return -1 here, but drivers may not expect this... */
+ if (!amn)
+ {
+ ni->ni_txrate = ni->ni_rates.rs_rates[0];
+ return 0;
+ }
+
+ amrr = amn->amn_amrr;
+
/* 11n or not? Pick the right rateset */
if (amrr_node_is_11n(ni)) {
/* XXX ew */
@@ -371,6 +387,9 @@ amrr_tx_complete(const struct ieee80211_node *ni,
struct ieee80211_amrr_node *amn = ni->ni_rctls;
int retries;
+ if (!amn)
+ return;
+
retries = 0;
if (status->flags & IEEE80211_RATECTL_STATUS_LONG_RETRY)
retries = status->long_retries;
@@ -388,6 +407,9 @@ amrr_tx_update_cb(void *arg, struct ieee80211_node *ni)
struct ieee80211_amrr_node *amn = ni->ni_rctls;
int txcnt, success, retrycnt;
+ if (!amn)
+ return;
+
txcnt = stats->nframes;
success = stats->nsuccess;
retrycnt = 0;
@@ -422,9 +444,12 @@ amrr_sysctl_interval(SYSCTL_HANDLER_ARGS)
{
struct ieee80211vap *vap = arg1;
struct ieee80211_amrr *amrr = vap->iv_rs;
- int msecs = ticks_to_msecs(amrr->amrr_interval);
- int error;
+ int msecs, error;
+
+ if (!amrr)
+ return ENOMEM;
+ msecs = ticks_to_msecs(amrr->amrr_interval);
error = sysctl_handle_int(oidp, &msecs, 0, req);
if (error || !req->newptr)
return error;
@@ -438,6 +463,9 @@ amrr_sysctlattach(struct ieee80211vap *vap,
{
struct ieee80211_amrr *amrr = vap->iv_rs;
+ if (!amrr)
+ return;
+
SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
"amrr_rate_interval", CTLTYPE_INT | CTLFLAG_RW, vap,
0, amrr_sysctl_interval, "I", "amrr operation interval (ms)");
@@ -459,6 +487,9 @@ amrr_node_stats(struct ieee80211_node *ni, struct sbuf *s)
/* XXX TODO: check locking? */
+ if (!amn)
+ return;
+
/* XXX TODO: this should be a method */
if (amrr_node_is_11n(ni)) {
rs = (struct ieee80211_rateset *) &ni->ni_htrates;