Update rtw(4) for the new IBSS merge idiom, where ieee80211_ibss_merge()
does not return ENETRESET if the driver should change its BSSID, but it makes a RUN->RUN transition, instead.
This commit is contained in:
parent
a44e108963
commit
6910fdde2a
@ -1,4 +1,4 @@
|
|||||||
/* $NetBSD: rtw.c,v 1.62 2005/12/29 21:08:26 dyoung Exp $ */
|
/* $NetBSD: rtw.c,v 1.63 2005/12/29 22:23:52 dyoung Exp $ */
|
||||||
/*-
|
/*-
|
||||||
* Copyright (c) 2004, 2005 David Young. All rights reserved.
|
* Copyright (c) 2004, 2005 David Young. All rights reserved.
|
||||||
*
|
*
|
||||||
@ -34,7 +34,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__KERNEL_RCSID(0, "$NetBSD: rtw.c,v 1.62 2005/12/29 21:08:26 dyoung Exp $");
|
__KERNEL_RCSID(0, "$NetBSD: rtw.c,v 1.63 2005/12/29 22:23:52 dyoung Exp $");
|
||||||
|
|
||||||
#include "bpfilter.h"
|
#include "bpfilter.h"
|
||||||
|
|
||||||
@ -3643,25 +3643,6 @@ rtw_tsf_extend(struct rtw_regs *regs, uint32_t rstamp)
|
|||||||
return ((uint64_t)tsfth << 32) | rstamp;
|
return ((uint64_t)tsfth << 32) | rstamp;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
rtw_ibss_merge(struct rtw_softc *sc, struct ieee80211_node *ni, uint32_t rstamp)
|
|
||||||
{
|
|
||||||
uint8_t tppoll;
|
|
||||||
|
|
||||||
if (le64toh(ni->ni_tstamp.tsf) < rtw_tsf_extend(&sc->sc_regs, rstamp))
|
|
||||||
return;
|
|
||||||
if (ieee80211_ibss_merge(ni) == ENETRESET) {
|
|
||||||
/* Stop beacon queue. Kick state machine to synchronize
|
|
||||||
* with the new IBSS.
|
|
||||||
*/
|
|
||||||
tppoll = RTW_READ8(&sc->sc_regs, RTW_TPPOLL);
|
|
||||||
tppoll |= RTW_TPPOLL_SBQ;
|
|
||||||
RTW_WRITE8(&sc->sc_regs, RTW_TPPOLL, tppoll);
|
|
||||||
(void)ieee80211_new_state(&sc->sc_ic, IEEE80211_S_RUN, -1);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
rtw_recv_mgmt(struct ieee80211com *ic, struct mbuf *m,
|
rtw_recv_mgmt(struct ieee80211com *ic, struct mbuf *m,
|
||||||
struct ieee80211_node *ni, int subtype, int rssi, uint32_t rstamp)
|
struct ieee80211_node *ni, int subtype, int rssi, uint32_t rstamp)
|
||||||
@ -3674,10 +3655,12 @@ rtw_recv_mgmt(struct ieee80211com *ic, struct mbuf *m,
|
|||||||
switch (subtype) {
|
switch (subtype) {
|
||||||
case IEEE80211_FC0_SUBTYPE_PROBE_RESP:
|
case IEEE80211_FC0_SUBTYPE_PROBE_RESP:
|
||||||
case IEEE80211_FC0_SUBTYPE_BEACON:
|
case IEEE80211_FC0_SUBTYPE_BEACON:
|
||||||
if (ic->ic_opmode != IEEE80211_M_IBSS ||
|
if (ic->ic_opmode == IEEE80211_M_IBSS &&
|
||||||
ic->ic_state != IEEE80211_S_RUN)
|
ic->ic_state == IEEE80211_S_RUN) {
|
||||||
return;
|
uint64_t tsf = rtw_tsf_extend(&sc->sc_regs, rstamp);
|
||||||
rtw_ibss_merge(sc, ni, rstamp);
|
if (le64toh(ni->ni_tstamp.tsf) >= tsf)
|
||||||
|
(void)ieee80211_ibss_merge(ni);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
Loading…
Reference in New Issue
Block a user