summaryrefslogtreecommitdiffstats
path: root/freebsd/sys/net80211/ieee80211_rssadapt.c
diff options
context:
space:
mode:
Diffstat (limited to 'freebsd/sys/net80211/ieee80211_rssadapt.c')
-rw-r--r--freebsd/sys/net80211/ieee80211_rssadapt.c33
1 files changed, 27 insertions, 6 deletions
diff --git a/freebsd/sys/net80211/ieee80211_rssadapt.c b/freebsd/sys/net80211/ieee80211_rssadapt.c
index f05af298..52f81a99 100644
--- a/freebsd/sys/net80211/ieee80211_rssadapt.c
+++ b/freebsd/sys/net80211/ieee80211_rssadapt.c
@@ -119,12 +119,13 @@ static void
rssadapt_setinterval(const struct ieee80211vap *vap, int msecs)
{
struct ieee80211_rssadapt *rs = vap->iv_rs;
- int t;
+
+ if (!rs)
+ return;
if (msecs < 100)
msecs = 100;
- t = msecs_to_ticks(msecs);
- rs->interval = (t < 1) ? 1 : t;
+ rs->interval = msecs_to_ticks(msecs);
}
static void
@@ -179,6 +180,12 @@ rssadapt_node_init(struct ieee80211_node *ni)
struct ieee80211_rssadapt *rsa = vap->iv_rs;
const struct ieee80211_rateset *rs = &ni->ni_rates;
+ if (!rsa) {
+ 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 = ra =
IEEE80211_MALLOC(sizeof(struct ieee80211_rssadapt_node),
@@ -233,10 +240,18 @@ rssadapt_rate(struct ieee80211_node *ni, void *arg __unused, uint32_t iarg)
{
struct ieee80211_rssadapt_node *ra = ni->ni_rctls;
u_int pktlen = iarg;
- const struct ieee80211_rateset *rs = &ra->ra_rates;
+ const struct ieee80211_rateset *rs;
uint16_t (*thrs)[IEEE80211_RATE_SIZE];
int rix, rssi;
+ /* XXX should return -1 here, but drivers may not expect this... */
+ if (!ra)
+ {
+ ni->ni_txrate = ni->ni_rates.rs_rates[0];
+ return 0;
+ }
+
+ rs = &ra->ra_rates;
if ((ticks - ra->ra_ticks) > ra->ra_rs->interval) {
rssadapt_updatestats(ra);
ra->ra_ticks = ticks;
@@ -322,6 +337,9 @@ rssadapt_tx_complete(const struct ieee80211_node *ni,
struct ieee80211_rssadapt_node *ra = ni->ni_rctls;
int pktlen, rssi;
+ if (!ra)
+ return;
+
if ((status->flags &
(IEEE80211_RATECTL_STATUS_PKTLEN|IEEE80211_RATECTL_STATUS_RSSI)) !=
(IEEE80211_RATECTL_STATUS_PKTLEN|IEEE80211_RATECTL_STATUS_RSSI))
@@ -346,9 +364,12 @@ rssadapt_sysctl_interval(SYSCTL_HANDLER_ARGS)
{
struct ieee80211vap *vap = arg1;
struct ieee80211_rssadapt *rs = vap->iv_rs;
- int msecs = ticks_to_msecs(rs->interval);
- int error;
+ int msecs, error;
+
+ if (!rs)
+ return ENOMEM;
+ msecs = ticks_to_msecs(rs->interval);
error = sysctl_handle_int(oidp, &msecs, 0, req);
if (error || !req->newptr)
return error;