svn commit: r184274 - head/sys/net80211

Sam Leffler sam at FreeBSD.org
Sat Oct 25 16:32:25 PDT 2008


Author: sam
Date: Sat Oct 25 23:32:24 2008
New Revision: 184274
URL: http://svn.freebsd.org/changeset/base/184274

Log:
  change ieee80211_sta_join to take an explicit channel instead of
  using the value in the scan parameters; this will be used to fix
  issues with 11b operation

Modified:
  head/sys/net80211/ieee80211_ioctl.c
  head/sys/net80211/ieee80211_node.c
  head/sys/net80211/ieee80211_node.h
  head/sys/net80211/ieee80211_scan_sta.c

Modified: head/sys/net80211/ieee80211_ioctl.c
==============================================================================
--- head/sys/net80211/ieee80211_ioctl.c	Sat Oct 25 23:31:20 2008	(r184273)
+++ head/sys/net80211/ieee80211_ioctl.c	Sat Oct 25 23:32:24 2008	(r184274)
@@ -1463,7 +1463,7 @@ setmlme_assoc(struct ieee80211vap *vap, 
 	if (lookup.se == NULL)
 		return ENOENT;
 	mlmedebug(vap, mac, IEEE80211_MLME_ASSOC, 0);
-	if (!ieee80211_sta_join(vap, lookup.se))
+	if (!ieee80211_sta_join(vap, lookup.se->se_chan, lookup.se))
 		return EIO;		/* XXX unique but could be better */
 	return 0;
 }

Modified: head/sys/net80211/ieee80211_node.c
==============================================================================
--- head/sys/net80211/ieee80211_node.c	Sat Oct 25 23:31:20 2008	(r184273)
+++ head/sys/net80211/ieee80211_node.c	Sat Oct 25 23:32:24 2008	(r184274)
@@ -687,7 +687,7 @@ ieee80211_sta_join1(struct ieee80211_nod
 }
 
 int
-ieee80211_sta_join(struct ieee80211vap *vap,
+ieee80211_sta_join(struct ieee80211vap *vap, struct ieee80211_channel *chan,
 	const struct ieee80211_scan_entry *se)
 {
 	struct ieee80211com *ic = vap->iv_ic;
@@ -709,7 +709,7 @@ ieee80211_sta_join(struct ieee80211vap *
 	ni->ni_tstamp.tsf = se->se_tstamp.tsf;
 	ni->ni_intval = se->se_intval;
 	ni->ni_capinfo = se->se_capinfo;
-	ni->ni_chan = se->se_chan;
+	ni->ni_chan = chan;
 	ni->ni_timoff = se->se_timoff;
 	ni->ni_fhdwell = se->se_fhdwell;
 	ni->ni_fhindex = se->se_fhindex;

Modified: head/sys/net80211/ieee80211_node.h
==============================================================================
--- head/sys/net80211/ieee80211_node.h	Sat Oct 25 23:31:20 2008	(r184273)
+++ head/sys/net80211/ieee80211_node.h	Sat Oct 25 23:32:24 2008	(r184274)
@@ -282,7 +282,7 @@ void	ieee80211_sync_curchan(struct ieee8
 void	ieee80211_setcurchan(struct ieee80211com *, struct ieee80211_channel *);
 int	ieee80211_ibss_merge(struct ieee80211_node *);
 struct ieee80211_scan_entry;
-int	ieee80211_sta_join(struct ieee80211vap *,
+int	ieee80211_sta_join(struct ieee80211vap *, struct ieee80211_channel *,
 		const struct ieee80211_scan_entry *);
 void	ieee80211_sta_leave(struct ieee80211_node *);
 void	ieee80211_node_deauth(struct ieee80211_node *, int);

Modified: head/sys/net80211/ieee80211_scan_sta.c
==============================================================================
--- head/sys/net80211/ieee80211_scan_sta.c	Sat Oct 25 23:31:20 2008	(r184273)
+++ head/sys/net80211/ieee80211_scan_sta.c	Sat Oct 25 23:32:24 2008	(r184274)
@@ -1014,6 +1014,7 @@ sta_pick_bss(struct ieee80211_scan_state
 {
 	struct sta_table *st = ss->ss_priv;
 	struct sta_entry *selbs;
+	struct ieee80211_channel *chan;
 
 	KASSERT(vap->iv_opmode == IEEE80211_M_STA,
 		("wrong mode %u", vap->iv_opmode));
@@ -1056,7 +1057,10 @@ notfound:
 	selbs = select_bss(ss, vap, IEEE80211_MSG_SCAN);
 	if (ss->ss_flags & IEEE80211_SCAN_NOJOIN)
 		return (selbs != NULL);
-	if (selbs == NULL || !ieee80211_sta_join(vap, &selbs->base))
+	if (selbs == NULL)
+		goto notfound;
+	chan = selbs->base.se_chan;
+	if (!ieee80211_sta_join(vap, chan, &selbs->base))
 		goto notfound;
 	return 1;				/* terminate scan */
 }
@@ -1138,12 +1142,16 @@ sta_roam_check(struct ieee80211_scan_sta
 		se->base.se_rssi = curRssi;
 		selbs = select_bss(ss, vap, IEEE80211_MSG_ROAM);
 		if (selbs != NULL && selbs != se) {
+			struct ieee80211_channel *chan;
+
 			IEEE80211_DPRINTF(vap,
 			    IEEE80211_MSG_ROAM | IEEE80211_MSG_DEBUG,
 			    "%s: ROAM: curRate %u, roamRate %u, "
 			    "curRssi %d, roamRssi %d\n", __func__,
 			    curRate, roamRate, curRssi, roamRssi);
-			ieee80211_sta_join(vap, &selbs->base);
+
+			chan = selbs->base.se_chan;
+			(void) ieee80211_sta_join(vap, chan, &selbs->base);
 		}
 	}
 }
@@ -1419,7 +1427,10 @@ notfound:
 	selbs = select_bss(ss, vap, IEEE80211_MSG_SCAN);
 	if (ss->ss_flags & IEEE80211_SCAN_NOJOIN)
 		return (selbs != NULL);
-	if (selbs == NULL || !ieee80211_sta_join(vap, &selbs->base))
+	if (selbs == NULL)
+		goto notfound;
+	chan = selbs->base.se_chan;
+	if (!ieee80211_sta_join(vap, chan, &selbs->base))
 		goto notfound;
 	return 1;				/* terminate scan */
 }


More information about the svn-src-all mailing list