svn commit: r280082 - head/sys/dev/wpi
Adrian Chadd
adrian at FreeBSD.org
Sun Mar 15 20:50:25 UTC 2015
Author: adrian
Date: Sun Mar 15 20:50:23 2015
New Revision: 280082
URL: https://svnweb.freebsd.org/changeset/base/280082
Log:
Use a static buffer in wpi_cmd - rather than alloc/free'ing the
beacon buffer frequently.
PR: kern/197143
Submitted by: Andriy Voskoboinyk <s3erios at gmail.com>
Modified:
head/sys/dev/wpi/if_wpi.c
head/sys/dev/wpi/if_wpivar.h
Modified: head/sys/dev/wpi/if_wpi.c
==============================================================================
--- head/sys/dev/wpi/if_wpi.c Sun Mar 15 20:48:32 2015 (r280081)
+++ head/sys/dev/wpi/if_wpi.c Sun Mar 15 20:50:23 2015 (r280082)
@@ -586,7 +586,6 @@ wpi_vap_create(struct ieee80211com *ic,
const uint8_t mac[IEEE80211_ADDR_LEN])
{
struct wpi_vap *wvp;
- struct wpi_buf *bcn;
struct ieee80211vap *vap;
if (!TAILQ_EMPTY(&ic->ic_vaps)) /* only one at a time */
@@ -599,9 +598,6 @@ wpi_vap_create(struct ieee80211com *ic,
vap = &wvp->vap;
ieee80211_vap_setup(ic, vap, name, unit, opmode, flags, bssid, mac);
- bcn = &wvp->wv_bcbuf;
- bcn->data = NULL;
-
/* Override with driver methods. */
wvp->newstate = vap->iv_newstate;
vap->iv_key_alloc = wpi_key_alloc;
@@ -622,13 +618,10 @@ static void
wpi_vap_delete(struct ieee80211vap *vap)
{
struct wpi_vap *wvp = WPI_VAP(vap);
- struct wpi_buf *bcn = &wvp->wv_bcbuf;
ieee80211_ratectl_deinit(vap);
ieee80211_vap_detach(vap);
- if (bcn->data != NULL)
- free(bcn->data, M_DEVBUF);
free(wvp, M_80211_VAP);
}
@@ -2322,6 +2315,8 @@ wpi_cmd2(struct wpi_softc *sc, struct wp
WPI_TXQ_LOCK(sc);
+ KASSERT(buf->size <= sizeof(buf->data), ("buffer overflow"));
+
DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_BEGIN, __func__);
if (sc->txq_active == 0) {
@@ -2454,8 +2449,8 @@ wpi_tx_data(struct wpi_softc *sc, struct
struct ieee80211_channel *chan;
struct ieee80211_frame *wh;
struct ieee80211_key *k = NULL;
- struct wpi_cmd_data tx;
struct wpi_buf tx_data;
+ struct wpi_cmd_data *tx = (struct wpi_cmd_data *)&tx_data.data;
uint32_t flags;
uint16_t qos;
uint8_t tid, type;
@@ -2548,7 +2543,7 @@ wpi_tx_data(struct wpi_softc *sc, struct
flags |= WPI_TX_FULL_TXOP;
}
- memset(&tx, 0, sizeof (struct wpi_cmd_data));
+ memset(tx, 0, sizeof (struct wpi_cmd_data));
if (type == IEEE80211_FC0_TYPE_MGT) {
uint8_t subtype = wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK;
@@ -2557,13 +2552,13 @@ wpi_tx_data(struct wpi_softc *sc, struct
flags |= WPI_TX_INSERT_TSTAMP;
if (subtype == IEEE80211_FC0_SUBTYPE_ASSOC_REQ ||
subtype == IEEE80211_FC0_SUBTYPE_REASSOC_REQ)
- tx.timeout = htole16(3);
+ tx->timeout = htole16(3);
else
- tx.timeout = htole16(2);
+ tx->timeout = htole16(2);
}
if (ismcast || type != IEEE80211_FC0_TYPE_DATA)
- tx.id = WPI_ID_BROADCAST;
+ tx->id = WPI_ID_BROADCAST;
else {
if (wn->id == WPI_ID_UNDEFINED) {
device_printf(sc->sc_dev,
@@ -2572,38 +2567,37 @@ wpi_tx_data(struct wpi_softc *sc, struct
goto fail;
}
- tx.id = wn->id;
+ tx->id = wn->id;
}
if (type != IEEE80211_FC0_TYPE_MGT)
- tx.data_ntries = tp->maxretry;
+ tx->data_ntries = tp->maxretry;
if (k != NULL && !swcrypt) {
switch (k->wk_cipher->ic_cipher) {
case IEEE80211_CIPHER_AES_CCM:
- tx.security = WPI_CIPHER_CCMP;
+ tx->security = WPI_CIPHER_CCMP;
break;
default:
break;
}
- memcpy(tx.key, k->wk_key, k->wk_keylen);
+ memcpy(tx->key, k->wk_key, k->wk_keylen);
}
- tx.len = htole16(totlen);
- tx.flags = htole32(flags);
- tx.plcp = rate2plcp(rate);
- tx.tid = tid;
- tx.lifetime = htole32(WPI_LIFETIME_INFINITE);
- tx.ofdm_mask = 0xff;
- tx.cck_mask = 0x0f;
- tx.rts_ntries = 7;
+ tx->len = htole16(totlen);
+ tx->flags = htole32(flags);
+ tx->plcp = rate2plcp(rate);
+ tx->tid = tid;
+ tx->lifetime = htole32(WPI_LIFETIME_INFINITE);
+ tx->ofdm_mask = 0xff;
+ tx->cck_mask = 0x0f;
+ tx->rts_ntries = 7;
- tx_data.data = &tx;
tx_data.ni = ni;
tx_data.m = m;
- tx_data.size = sizeof(tx);
+ tx_data.size = sizeof(struct wpi_cmd_data);
tx_data.code = WPI_CMD_TX_DATA;
tx_data.ac = ac;
@@ -2619,8 +2613,8 @@ wpi_tx_data_raw(struct wpi_softc *sc, st
{
struct ieee80211vap *vap = ni->ni_vap;
struct ieee80211_frame *wh;
- struct wpi_cmd_data tx;
struct wpi_buf tx_data;
+ struct wpi_cmd_data *tx = (struct wpi_cmd_data *)&tx_data.data;
uint32_t flags;
uint8_t type;
int ac, rate, totlen;
@@ -2653,7 +2647,7 @@ wpi_tx_data_raw(struct wpi_softc *sc, st
ieee80211_radiotap_tx(vap, m);
}
- memset(&tx, 0, sizeof (struct wpi_cmd_data));
+ memset(tx, 0, sizeof (struct wpi_cmd_data));
if (type == IEEE80211_FC0_TYPE_MGT) {
uint8_t subtype = wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK;
@@ -2662,23 +2656,22 @@ wpi_tx_data_raw(struct wpi_softc *sc, st
flags |= WPI_TX_INSERT_TSTAMP;
if (subtype == IEEE80211_FC0_SUBTYPE_ASSOC_REQ ||
subtype == IEEE80211_FC0_SUBTYPE_REASSOC_REQ)
- tx.timeout = htole16(3);
+ tx->timeout = htole16(3);
else
- tx.timeout = htole16(2);
+ tx->timeout = htole16(2);
}
- tx.len = htole16(totlen);
- tx.flags = htole32(flags);
- tx.plcp = rate2plcp(rate);
- tx.id = WPI_ID_BROADCAST;
- tx.lifetime = htole32(WPI_LIFETIME_INFINITE);
- tx.rts_ntries = params->ibp_try1;
- tx.data_ntries = params->ibp_try0;
+ tx->len = htole16(totlen);
+ tx->flags = htole32(flags);
+ tx->plcp = rate2plcp(rate);
+ tx->id = WPI_ID_BROADCAST;
+ tx->lifetime = htole32(WPI_LIFETIME_INFINITE);
+ tx->rts_ntries = params->ibp_try1;
+ tx->data_ntries = params->ibp_try0;
- tx_data.data = &tx;
tx_data.ni = ni;
tx_data.m = m;
- tx_data.size = sizeof(tx);
+ tx_data.size = sizeof(struct wpi_cmd_data);
tx_data.code = WPI_CMD_TX_DATA;
tx_data.ac = ac;
@@ -3933,13 +3926,11 @@ wpi_auth(struct wpi_softc *sc, struct ie
static int
wpi_setup_beacon(struct wpi_softc *sc, struct ieee80211_node *ni)
{
- struct ifnet *ifp = sc->sc_ifp;
- struct ieee80211com *ic = ifp->if_l2com;
- struct ieee80211vap *vap = ni->ni_vap;
- struct wpi_vap *wvp = WPI_VAP(vap);
+ struct ieee80211com *ic = sc->sc_ifp->if_l2com;
+ struct wpi_vap *wvp = WPI_VAP(ni->ni_vap);
struct wpi_buf *bcn = &wvp->wv_bcbuf;
struct ieee80211_beacon_offsets bo;
- struct wpi_cmd_beacon *cmd;
+ struct wpi_cmd_beacon *cmd = (struct wpi_cmd_beacon *)&bcn->data;
struct mbuf *m;
int totlen;
@@ -3956,30 +3947,16 @@ wpi_setup_beacon(struct wpi_softc *sc, s
}
totlen = m->m_pkthdr.len;
- if (bcn->data == NULL) {
- cmd = malloc(sizeof(struct wpi_cmd_beacon), M_DEVBUF,
- M_NOWAIT | M_ZERO);
-
- if (cmd == NULL) {
- device_printf(sc->sc_dev,
- "could not allocate buffer for beacon command\n");
- m_freem(m);
- return ENOMEM;
- }
-
- cmd->id = WPI_ID_BROADCAST;
- cmd->ofdm_mask = 0xff;
- cmd->cck_mask = 0x0f;
- cmd->lifetime = htole32(WPI_LIFETIME_INFINITE);
- cmd->flags = htole32(WPI_TX_AUTO_SEQ | WPI_TX_INSERT_TSTAMP);
-
- bcn->data = cmd;
- bcn->ni = NULL;
- bcn->code = WPI_CMD_SET_BEACON;
- bcn->ac = 4;
- bcn->size = sizeof(struct wpi_cmd_beacon);
- } else
- cmd = bcn->data;
+ cmd->id = WPI_ID_BROADCAST;
+ cmd->ofdm_mask = 0xff;
+ cmd->cck_mask = 0x0f;
+ cmd->lifetime = htole32(WPI_LIFETIME_INFINITE);
+ cmd->flags = htole32(WPI_TX_AUTO_SEQ | WPI_TX_INSERT_TSTAMP);
+
+ bcn->ni = NULL;
+ bcn->code = WPI_CMD_SET_BEACON;
+ bcn->ac = 4;
+ bcn->size = sizeof(struct wpi_cmd_beacon);
cmd->len = htole16(totlen);
cmd->plcp = (ic->ic_curmode == IEEE80211_MODE_11A) ?
Modified: head/sys/dev/wpi/if_wpivar.h
==============================================================================
--- head/sys/dev/wpi/if_wpivar.h Sun Mar 15 20:48:32 2015 (r280081)
+++ head/sys/dev/wpi/if_wpivar.h Sun Mar 15 20:50:23 2015 (r280082)
@@ -112,7 +112,7 @@ struct wpi_power_group {
};
struct wpi_buf {
- void *data;
+ uint8_t data[56]; /* sizeof(struct wpi_cmd_beacon) */
struct ieee80211_node *ni;
struct mbuf *m;
size_t size;
More information about the svn-src-all
mailing list