Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 20 Nov 2003 19:19:17 -0800 (PST)
From:      Sam Leffler <sam@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 42868 for review
Message-ID:  <200311210319.hAL3JHFr033355@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=42868

Change 42868 by sam@sam_ebb on 2003/11/20 19:18:33

	o import netbsd pspoll support
	o add missing htole's from netbsd

Affected files ...

.. //depot/projects/netperf/sys/dev/wi/if_wavelan_ieee.h#2 edit
.. //depot/projects/netperf/sys/dev/wi/if_wi.c#15 edit

Differences ...

==== //depot/projects/netperf/sys/dev/wi/if_wavelan_ieee.h#2 (text+ko) ====

@@ -239,6 +239,7 @@
 #define WI_RID_ROAMING_MODE	0xFC2D
 #define WI_RID_OWN_BEACON_INT	0xFC33 /* beacon xmit time for BSS creation */
 #define WI_RID_CNF_DBM_ADJUST	0xFC46
+#define WI_RID_SET_TIM		0xFC40
 #define WI_RID_DBM_ADJUST	0xFC46 /* RSSI - WI_RID_DBM_ADJUST ~ dBm */
 #define WI_RID_BASIC_RATE	0xFCB3
 #define WI_RID_SUPPORT_RATE	0xFCB4

==== //depot/projects/netperf/sys/dev/wi/if_wi.c#15 (text+ko) ====

@@ -148,6 +148,7 @@
 static int  wi_write_rid(struct wi_softc *, int, void *, int);
 
 static int  wi_newstate(struct ieee80211com *, enum ieee80211_state, int);
+static int  wi_set_tim(struct ieee80211com *, int, int);
 
 static int  wi_scan_ap(struct wi_softc *, u_int16_t, u_int16_t);
 static void wi_scan_result(struct wi_softc *, int, int);
@@ -469,6 +470,7 @@
 	/* override state transition method */
 	sc->sc_newstate = ic->ic_newstate;
 	ic->ic_newstate = wi_newstate;
+	ic->ic_set_tim = wi_set_tim;
 	ieee80211_media_init(ifp, wi_media_change, wi_media_status);
 
 #if NBPFILTER > 0
@@ -866,8 +868,7 @@
 	memset(&frmhdr, 0, sizeof(frmhdr));
 	cur = sc->sc_txnext;
 	for (;;) {
-		IF_POLL(&ic->ic_mgtq, m0);
-		if (m0 != NULL) {
+		if (IF_POLL(&ic->ic_mgtq, m0)) {
 			if (sc->sc_txd[cur].d_len != 0) {
 				ifp->if_flags |= IFF_OACTIVE;
 				break;
@@ -889,6 +890,29 @@
 			    (caddr_t)&frmhdr.wi_ehdr);
 			frmhdr.wi_ehdr.ether_type = 0;
                         wh = mtod(m0, struct ieee80211_frame *);
+		} else if (IF_POLL(&ic->ic_pwrsaveq, m0)) {
+			/* 
+			 * Should these packets be processed after the
+			 * regular packets or before?  Since they are being
+			 * probed for, they are probably less time critical
+			 * than other packets, but, on the other hand,
+			 * we want the power saving nodes to go back to
+			 * sleep as quickly as possible to save power...
+			 */
+			if (ic->ic_state != IEEE80211_S_RUN)
+				break;
+			if (sc->sc_txd[cur].d_len != 0) {
+				ifp->if_flags |= IFF_OACTIVE;
+				break;
+			}
+			IF_DEQUEUE(&ic->ic_pwrsaveq, m0);
+			ni = (struct ieee80211_node *)m0->m_pkthdr.rcvif;
+			m0->m_pkthdr.rcvif = NULL;
+
+                        wh = mtod(m0, struct ieee80211_frame *);
+			m_copydata(m0, 4, ETHER_ADDR_LEN * 2,
+			    (caddr_t)&frmhdr.wi_ehdr);
+			frmhdr.wi_ehdr.ether_type = 0;	/* XXX?? */
 		} else {
 			if (ic->ic_state != IEEE80211_S_RUN)
 				break;
@@ -915,6 +939,27 @@
                         wh = mtod(m0, struct ieee80211_frame *);
 			if (ic->ic_flags & IEEE80211_F_WEPON)
 				wh->i_fc[1] |= IEEE80211_FC1_WEP;
+			if (ic->ic_opmode == IEEE80211_M_HOSTAP &&
+			    !IEEE80211_IS_MULTICAST(wh->i_addr1) &&
+			    (wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) ==
+			    IEEE80211_FC0_TYPE_DATA) {
+				if (ni->ni_associd == 0) {
+					m_freem(m0);
+					if (ni != ic->ic_bss)
+						ieee80211_free_node(ic, ni);
+					ifp->if_oerrors++;
+					continue;
+				}
+				if (ni->ni_pwrsave & IEEE80211_PS_SLEEP) {
+					/*
+					 * Node is in power-save sleep state,
+					 * stash the packet on the save q for
+					 * transmission later.
+					 */
+					ieee80211_pwrsave(ic, ni, m0);
+					continue; /* don't free node. */
+				}
+			}
 
 		}
 #if NBPFILTER > 0
@@ -932,10 +977,6 @@
 			}
 			frmhdr.wi_tx_ctl |= htole16(WI_TXCNTL_NOCRYPT);
 		}
-		m_copydata(m0, 0, sizeof(struct ieee80211_frame),
-		    (caddr_t)&frmhdr.wi_whdr);
-		m_adj(m0, sizeof(struct ieee80211_frame));
-		frmhdr.wi_dat_len = htole16(m0->m_pkthdr.len);
 #if NBPFILTER > 0
 		if (sc->sc_drvbpf) {
 			struct mbuf *mb;
@@ -951,8 +992,12 @@
 			}
 		}
 #endif
+		m_copydata(m0, 0, sizeof(struct ieee80211_frame),
+		    (caddr_t)&frmhdr.wi_whdr);
+		m_adj(m0, sizeof(struct ieee80211_frame));
+		frmhdr.wi_dat_len = htole16(m0->m_pkthdr.len);
 		if (IFF_DUMPPKTS(ifp))
-			wi_dump_pkt(&frmhdr, NULL, -1);
+			wi_dump_pkt(&frmhdr, ni, -1);
 		fid = sc->sc_txd[cur].d_fid;
 		off = sizeof(frmhdr);
 		error = wi_write_bap(sc, fid, 0, &frmhdr, sizeof(frmhdr)) != 0
@@ -2704,6 +2749,18 @@
 }
 
 static int
+wi_set_tim(struct ieee80211com *ic, int aid, int which)
+{
+	struct wi_softc *sc = ic->ic_softc;
+
+	aid &= ~0xc000;
+	if (which)
+		aid |= 0x8000;
+
+	return wi_write_val(sc, WI_RID_SET_TIM, aid);
+}
+
+static int
 wi_scan_ap(struct wi_softc *sc, u_int16_t chanmask, u_int16_t txrate)
 {
 	int error = 0;
@@ -2716,8 +2773,8 @@
 		(void)wi_cmd(sc, WI_CMD_INQUIRE, WI_INFO_SCAN_RESULTS, 0, 0);
 		break;
 	case WI_INTERSIL:
-		val[0] = chanmask;	/* channel */
-		val[1] = txrate;	/* tx rate */
+		val[0] = htole16(chanmask);	/* channel */
+		val[1] = htole16(txrate);	/* tx rate */
 		error = wi_write_rid(sc, WI_RID_SCAN_REQ, val, sizeof(val));
 		break;
 	case WI_SYMBOL:



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