git: 34f8e38ea7a5 - stable/13 - LinuxKPI: 802.11: factor out lkpi_lsta_alloc() from lkpi_ic_node_alloc()
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Sun, 27 Mar 2022 20:14:06 UTC
The branch stable/13 has been updated by bz:
URL: https://cgit.FreeBSD.org/src/commit/?id=34f8e38ea7a5fccdf7f5de2cdcfabbdf68825480
commit 34f8e38ea7a5fccdf7f5de2cdcfabbdf68825480
Author: Bjoern A. Zeeb <bz@FreeBSD.org>
AuthorDate: 2022-03-22 15:14:31 +0000
Commit: Bjoern A. Zeeb <bz@FreeBSD.org>
CommitDate: 2022-03-27 18:09:04 +0000
LinuxKPI: 802.11: factor out lkpi_lsta_alloc() from lkpi_ic_node_alloc()
Split lkpi_ic_node_alloc() into two functions to make the code simpler
and to allow lkpi_lsta_alloc() to be re-used from another part of the
code related to (*iv_update_bss)().
Sponsored by: The FreeBSD Foundation
(cherry picked from commit 4f61ef8b78b25761b1b859ce39213f92fcbb24ce)
---
sys/compat/linuxkpi/common/src/linux_80211.c | 178 ++++++++++++++-------------
1 file changed, 95 insertions(+), 83 deletions(-)
diff --git a/sys/compat/linuxkpi/common/src/linux_80211.c b/sys/compat/linuxkpi/common/src/linux_80211.c
index ceb9c626c507..fd5d18bca5d4 100644
--- a/sys/compat/linuxkpi/common/src/linux_80211.c
+++ b/sys/compat/linuxkpi/common/src/linux_80211.c
@@ -112,6 +112,20 @@ SYSCTL_INT(_compat_linuxkpi, OID_AUTO, debug_80211, CTLFLAG_RWTUN,
/* This is DSAP | SSAP | CTRL | ProtoID/OrgCode{3}. */
const uint8_t rfc1042_header[6] = { 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00 };
+const uint8_t tid_to_mac80211_ac[] = {
+ IEEE80211_AC_BE,
+ IEEE80211_AC_BK,
+ IEEE80211_AC_BK,
+ IEEE80211_AC_BE,
+ IEEE80211_AC_VI,
+ IEEE80211_AC_VI,
+ IEEE80211_AC_VO,
+ IEEE80211_AC_VO,
+#if 0
+ IEEE80211_AC_VO, /* We treat MGMT as TID 8, which is set as AC_VO */
+#endif
+};
+
const struct cfg80211_ops linuxkpi_mac80211cfgops = {
/*
* XXX TODO need a "glue layer" to link cfg80211 ops to
@@ -125,6 +139,79 @@ static struct lkpi_sta *lkpi_find_lsta_by_ni(struct lkpi_vif *,
static void lkpi_80211_txq_task(void *, int);
static void lkpi_ieee80211_free_skb_mbuf(void *);
+static struct lkpi_sta *
+lkpi_lsta_alloc(struct ieee80211vap *vap, const uint8_t mac[IEEE80211_ADDR_LEN],
+ struct ieee80211_hw *hw, struct ieee80211_node *ni)
+{
+ struct lkpi_sta *lsta;
+ struct lkpi_vif *lvif;
+ struct ieee80211_vif *vif;
+ struct ieee80211_sta *sta;
+ int tid;
+
+ lsta = malloc(sizeof(*lsta) + hw->sta_data_size, M_LKPI80211,
+ M_NOWAIT | M_ZERO);
+ if (lsta == NULL)
+ return (NULL);
+
+ lsta->added_to_drv = false;
+ lsta->state = IEEE80211_STA_NOTEXIST;
+#if 0
+ /*
+ * This needs to be done in node_init() as ieee80211_alloc_node()
+ * will initialise the refcount after us.
+ */
+ lsta->ni = ieee80211_ref_node(ni);
+#endif
+ /* The back-pointer "drv_data" to net80211_node let's us get lsta. */
+ ni->ni_drv_data = lsta;
+
+ lvif = VAP_TO_LVIF(vap);
+ vif = LVIF_TO_VIF(lvif);
+ sta = LSTA_TO_STA(lsta);
+
+ IEEE80211_ADDR_COPY(sta->addr, mac);
+ for (tid = 0; tid < nitems(sta->txq); tid++) {
+ struct lkpi_txq *ltxq;
+
+ /*
+ * We are neither limiting ourselves to hw.queues here,
+ * nor do we check if driver wants IEEE80211_NUM_TIDS queue.
+ */
+
+ ltxq = malloc(sizeof(*ltxq) + hw->txq_data_size,
+ M_LKPI80211, M_NOWAIT | M_ZERO);
+ if (ltxq == NULL)
+ goto cleanup;
+ ltxq->seen_dequeue = false;
+ skb_queue_head_init(<xq->skbq);
+ /* iwlwifi//mvm/sta.c::tid_to_mac80211_ac[] */
+ if (tid == IEEE80211_NUM_TIDS) {
+ IMPROVE();
+ ltxq->txq.ac = IEEE80211_AC_VO;
+ } else {
+ ltxq->txq.ac = tid_to_mac80211_ac[tid & 7];
+ }
+ ltxq->txq.tid = tid;
+ ltxq->txq.sta = sta;
+ ltxq->txq.vif = vif;
+ sta->txq[tid] = <xq->txq;
+ }
+
+ /* Deferred TX path. */
+ mtx_init(&lsta->txq_mtx, "lsta_txq", NULL, MTX_DEF);
+ TASK_INIT(&lsta->txq_task, 0, lkpi_80211_txq_task, lsta);
+ mbufq_init(&lsta->txq, IFQ_MAXLEN);
+
+ return (lsta);
+
+cleanup:
+ for (; tid >= 0; tid--)
+ free(sta->txq[tid], M_LKPI80211);
+ free(lsta, M_LKPI80211);
+ return (NULL);
+}
+
static enum nl80211_band
lkpi_net80211_chan_to_nl80211_band(struct ieee80211_channel *c)
{
@@ -564,20 +651,6 @@ lkpi_update_mcast_filter(struct ieee80211com *ic, bool force)
__func__, &mc_list, mc_list.count));
}
-const uint8_t tid_to_mac80211_ac[] = {
- IEEE80211_AC_BE,
- IEEE80211_AC_BK,
- IEEE80211_AC_BK,
- IEEE80211_AC_BE,
- IEEE80211_AC_VI,
- IEEE80211_AC_VI,
- IEEE80211_AC_VO,
- IEEE80211_AC_VO,
-#if 0
- IEEE80211_AC_VO, /* We treat MGMT as TID 8, which is set as AC_VO */
-#endif
-};
-
static void
lkpi_stop_hw_scan(struct lkpi_hw *lhw, struct ieee80211_vif *vif)
{
@@ -2161,91 +2234,30 @@ lkpi_ic_node_alloc(struct ieee80211vap *vap,
{
struct ieee80211com *ic;
struct lkpi_hw *lhw;
+ struct ieee80211_node *ni;
struct ieee80211_hw *hw;
struct lkpi_sta *lsta;
- struct ieee80211_sta *sta;
- struct lkpi_vif *lvif;
- struct ieee80211_vif *vif;
- struct ieee80211_node *ni;
- int tid;
ic = vap->iv_ic;
lhw = ic->ic_softc;
/* We keep allocations de-coupled so we can deal with the two worlds. */
- if (lhw->ic_node_alloc != NULL) {
- ni = lhw->ic_node_alloc(vap, mac);
- if (ni == NULL)
- return (NULL);
- }
+ if (lhw->ic_node_alloc == NULL)
+ return (NULL);
+
+ ni = lhw->ic_node_alloc(vap, mac);
+ if (ni == NULL)
+ return (NULL);
hw = LHW_TO_HW(lhw);
- lsta = malloc(sizeof(*lsta) + hw->sta_data_size, M_LKPI80211,
- M_NOWAIT | M_ZERO);
+ lsta = lkpi_lsta_alloc(vap, mac, hw, ni);
if (lsta == NULL) {
if (lhw->ic_node_free != NULL)
lhw->ic_node_free(ni);
return (NULL);
}
- lsta->added_to_drv = false;
- lsta->state = IEEE80211_STA_NOTEXIST;
-#if 0
- /*
- * This needs to be done in node_init() as ieee80211_alloc_node()
- * will initialise the refcount after us.
- */
- lsta->ni = ieee80211_ref_node(ni);
-#endif
- /* The back-pointer "drv_data" to net80211_node let's us get lsta. */
- ni->ni_drv_data = lsta;
-
- lvif = VAP_TO_LVIF(vap);
- vif = LVIF_TO_VIF(lvif);
- sta = LSTA_TO_STA(lsta);
-
- IEEE80211_ADDR_COPY(sta->addr, mac);
- for (tid = 0; tid < nitems(sta->txq); tid++) {
- struct lkpi_txq *ltxq;
-
- /*
- * We are neither limiting ourselves to hw.queues here,
- * nor do we check if driver wants IEEE80211_NUM_TIDS queue.
- */
-
- ltxq = malloc(sizeof(*ltxq) + hw->txq_data_size,
- M_LKPI80211, M_NOWAIT | M_ZERO);
- if (ltxq == NULL)
- goto cleanup;
- ltxq->seen_dequeue = false;
- skb_queue_head_init(<xq->skbq);
- /* iwlwifi//mvm/sta.c::tid_to_mac80211_ac[] */
- if (tid == IEEE80211_NUM_TIDS) {
- IMPROVE();
- ltxq->txq.ac = IEEE80211_AC_VO;
- } else {
- ltxq->txq.ac = tid_to_mac80211_ac[tid & 7];
- }
- ltxq->txq.tid = tid;
- ltxq->txq.sta = sta;
- ltxq->txq.vif = vif;
- sta->txq[tid] = <xq->txq;
- }
-
- /* Deferred TX path. */
- mtx_init(&lsta->txq_mtx, "lsta_txq", NULL, MTX_DEF);
- TASK_INIT(&lsta->txq_task, 0, lkpi_80211_txq_task, lsta);
- mbufq_init(&lsta->txq, IFQ_MAXLEN);
-
return (ni);
-
-cleanup:
- for (; tid >= 0; tid--)
- free(sta->txq[tid], M_LKPI80211);
- free(lsta, M_LKPI80211);
- if (lhw->ic_node_free != NULL)
- lhw->ic_node_free(ni);
- return (NULL);
}
static int