Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 4 Jun 2015 06:30:40 +0000 (UTC)
From:      Adrian Chadd <adrian@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r283980 - head/sys/net80211
Message-ID:  <201506040630.t546Uelc061867@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: adrian
Date: Thu Jun  4 06:30:39 2015
New Revision: 283980
URL: https://svnweb.freebsd.org/changeset/base/283980

Log:
  First pass of adding transmit parameters as an option for outbound
  802.11 mbufs.
  
  The raw transmit path currently doesn't make it easy to queue
  these frames:
  
  * there's no node reference stored in the mbuf, like for the normal
    path, and
  * the bpf supplied raw transmit parameters (rate, rts/cts, etc)
    are passed in as an argument, not as an mbuf tag.
  
  In order to support driver queuing of these frames, we need to
  be able to put the above into the mbuf before the driver gets it,
  so the driver /can/ put it into a queue if needed.
  
  Use an mbuf tag and for now just verbatim copy the bpf parameters
  into it.  Later on it may grow to include more options but this
  will do for now.
  
  Why would you want to queue raw frames? Well, in the case of
  iwn(4), we can't send the firmware frames to transmit before
  we hear a beacon - the firmware will consider passive channels
  as unavailable until it hears a beacon.  The firmware "passive"
  channel state is cleared upon each RXON command, which is sent to
  update association status.  So, when we attempt association and
  authorisation, the RXON command causes the firmware to clear out
  what it's already seen, and so we have to wait for a beacon before
  we can transmit.
  
  Before people get overly excited - this alone doesn't "fix" 5GHz
  operation - it just makes it (more) possible.
  
  The aim here is to convert all the drivers over to use a raw_xmit()
  API that doesn't include the node and params - instead they'd get
  those from the mbuf.  Then raw_xmit() becomes just a side-channel
  version of the normal transmit path for management traffic.
  
  MFC after:	2 weeks
  Sponsored by:	Norse Corp, Inc.

Modified:
  head/sys/net80211/ieee80211_freebsd.c
  head/sys/net80211/ieee80211_freebsd.h

Modified: head/sys/net80211/ieee80211_freebsd.c
==============================================================================
--- head/sys/net80211/ieee80211_freebsd.c	Thu Jun  4 05:37:07 2015	(r283979)
+++ head/sys/net80211/ieee80211_freebsd.c	Thu Jun  4 06:30:39 2015	(r283980)
@@ -474,6 +474,40 @@ ieee80211_add_callback(struct mbuf *m,
 	return 1;
 }
 
+int
+ieee80211_add_xmit_params(struct mbuf *m,
+    const struct ieee80211_bpf_params *params)
+{
+	struct m_tag *mtag;
+	struct ieee80211_tx_params *tx;
+
+	mtag = m_tag_alloc(MTAG_ABI_NET80211, NET80211_TAG_XMIT_PARAMS,
+	    sizeof(struct ieee80211_tx_params), M_NOWAIT);
+	if (mtag == NULL)
+		return (0);
+
+	tx = (struct ieee80211_tx_params *)(mtag+1);
+	memcpy(&tx->params, params, sizeof(struct ieee80211_bpf_params));
+	m_tag_prepend(m, mtag);
+	return (1);
+}
+
+int
+ieee80211_get_xmit_params(struct mbuf *m,
+    struct ieee80211_bpf_params *params)
+{
+	struct m_tag *mtag;
+	struct ieee80211_tx_params *tx;
+
+	mtag = m_tag_locate(m, MTAG_ABI_NET80211, NET80211_TAG_XMIT_PARAMS,
+	    NULL);
+	if (mtag == NULL)
+		return (-1);
+	tx = (struct ieee80211_tx_params *)(mtag + 1);
+	memcpy(params, &tx->params, sizeof(struct ieee80211_bpf_params));
+	return (0);
+}
+
 void
 ieee80211_process_callback(struct ieee80211_node *ni,
 	struct mbuf *m, int status)

Modified: head/sys/net80211/ieee80211_freebsd.h
==============================================================================
--- head/sys/net80211/ieee80211_freebsd.h	Thu Jun  4 05:37:07 2015	(r283979)
+++ head/sys/net80211/ieee80211_freebsd.h	Thu Jun  4 06:30:39 2015	(r283980)
@@ -327,6 +327,9 @@ int	ieee80211_add_callback(struct mbuf *
 		void (*func)(struct ieee80211_node *, void *, int), void *arg);
 void	ieee80211_process_callback(struct ieee80211_node *, struct mbuf *, int);
 
+#define	NET80211_TAG_XMIT_PARAMS	1
+/* See below; this is after the bpf_params definition */
+
 struct ieee80211com;
 int	ieee80211_parent_xmitpkt(struct ieee80211com *, struct mbuf *);
 int	ieee80211_vap_xmitpkt(struct ieee80211vap *, struct mbuf *);
@@ -607,6 +610,14 @@ struct ieee80211_bpf_params {
 	uint8_t		ibp_rate3;	/* series 4 IEEE tx rate */
 };
 
+struct ieee80211_tx_params {
+	struct ieee80211_bpf_params params;
+};
+int	ieee80211_add_xmit_params(struct mbuf *m,
+	    const struct ieee80211_bpf_params *);
+int	ieee80211_get_xmit_params(struct mbuf *m,
+	    struct ieee80211_bpf_params *);
+
 /*
  * Malloc API.  Other BSD operating systems have slightly
  * different malloc/free namings (eg DragonflyBSD.)



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201506040630.t546Uelc061867>