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 <s3er...@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;
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to