diff options
author | sam <sam@FreeBSD.org> | 2006-01-02 16:57:20 +0000 |
---|---|---|
committer | sam <sam@FreeBSD.org> | 2006-01-02 16:57:20 +0000 |
commit | f48869deccd8e549ef01af18f876abc423257689 (patch) | |
tree | b13743634da486c054ce81eb1e4dd2b75b03d96c /sys/net80211/ieee80211_output.c | |
parent | aeef1b925008eef31fdc571053ea6177fd85d879 (diff) | |
download | FreeBSD-src-f48869deccd8e549ef01af18f876abc423257689.zip FreeBSD-src-f48869deccd8e549ef01af18f876abc423257689.tar.gz |
update erp information element in the beacon frame to reflect
changes in the bss
Reviewed by: avatar
Obtained from: atheros
MFC after: 2 weeks
Diffstat (limited to 'sys/net80211/ieee80211_output.c')
-rw-r--r-- | sys/net80211/ieee80211_output.c | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/sys/net80211/ieee80211_output.c b/sys/net80211/ieee80211_output.c index ebcf6ec..fa2d529 100644 --- a/sys/net80211/ieee80211_output.c +++ b/sys/net80211/ieee80211_output.c @@ -1490,8 +1490,10 @@ ieee80211_beacon_alloc(struct ieee80211com *ic, struct ieee80211_node *ni, } if (ic->ic_flags & IEEE80211_F_WPA) frm = ieee80211_add_wpa(frm, ic); - if (ic->ic_curmode == IEEE80211_MODE_11G) + if (ic->ic_curmode == IEEE80211_MODE_11G) { + bo->bo_erp = frm; frm = ieee80211_add_erp(frm, ic); + } efrm = ieee80211_add_xrates(frm, rs); bo->bo_trailer_len = efrm - bo->bo_trailer; m->m_pkthdr.len = m->m_len = efrm - mtod(m, u_int8_t *); @@ -1616,10 +1618,13 @@ ieee80211_beacon_update(struct ieee80211com *ic, struct ieee80211_node *ni, } if (timlen != bo->bo_tim_len) { /* copy up/down trailer */ - ovbcopy(bo->bo_trailer, tie->tim_bitmap+timlen, + int adjust = tie->tim_bitmap+timlen + - bo->bo_trailer; + ovbcopy(bo->bo_trailer, bo->bo_trailer+adjust, bo->bo_trailer_len); - bo->bo_trailer = tie->tim_bitmap+timlen; - bo->bo_wme = bo->bo_trailer; + bo->bo_trailer += adjust; + bo->bo_wme += adjust; + bo->bo_erp += adjust; bo->bo_tim_len = timlen; /* update information element */ @@ -1646,6 +1651,13 @@ ieee80211_beacon_update(struct ieee80211com *ic, struct ieee80211_node *ni, tie->tim_bitctl |= 1; else tie->tim_bitctl &= ~1; + if (ic->ic_flags_ext & IEEE80211_FEXT_ERPUPDATE) { + /* + * ERP element needs updating. + */ + (void) ieee80211_add_erp(bo->bo_erp, ic); + ic->ic_flags_ext &= ~IEEE80211_FEXT_ERPUPDATE; + } } IEEE80211_BEACON_UNLOCK(ic); |