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 | |
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')
-rw-r--r-- | sys/net80211/ieee80211_node.c | 3 | ||||
-rw-r--r-- | sys/net80211/ieee80211_output.c | 20 | ||||
-rw-r--r-- | sys/net80211/ieee80211_proto.h | 1 | ||||
-rw-r--r-- | sys/net80211/ieee80211_var.h | 1 |
4 files changed, 21 insertions, 4 deletions
diff --git a/sys/net80211/ieee80211_node.c b/sys/net80211/ieee80211_node.c index 254317ca..a26f860 100644 --- a/sys/net80211/ieee80211_node.c +++ b/sys/net80211/ieee80211_node.c @@ -2028,6 +2028,8 @@ ieee80211_node_join_11g(struct ieee80211com *ic, struct ieee80211_node *ni) ic->ic_flags |= IEEE80211_F_USEBARKER; ic->ic_flags &= ~IEEE80211_F_SHPREAMBLE; } + if (ic->ic_nonerpsta == 1) + ic->ic_flags_ext |= IEEE80211_FEXT_ERPUPDATE; } else ni->ni_flags |= IEEE80211_NODE_ERP; } @@ -2143,6 +2145,7 @@ ieee80211_node_leave_11g(struct ieee80211com *ic, struct ieee80211_node *ni) ic->ic_flags |= IEEE80211_F_SHPREAMBLE; ic->ic_flags &= ~IEEE80211_F_USEBARKER; } + ic->ic_flags_ext |= IEEE80211_FEXT_ERPUPDATE; } } } 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); diff --git a/sys/net80211/ieee80211_proto.h b/sys/net80211/ieee80211_proto.h index ea05da8..4b8f6b4 100644 --- a/sys/net80211/ieee80211_proto.h +++ b/sys/net80211/ieee80211_proto.h @@ -237,6 +237,7 @@ struct ieee80211_beacon_offsets { u_int8_t *bo_trailer; /* start of fixed-size trailer */ u_int16_t bo_tim_len; /* atim/dtim length in bytes */ u_int16_t bo_trailer_len; /* trailer length in bytes */ + u_int8_t *bo_erp; /* start of ERP element */ }; struct mbuf *ieee80211_beacon_alloc(struct ieee80211com *, struct ieee80211_node *, struct ieee80211_beacon_offsets *); diff --git a/sys/net80211/ieee80211_var.h b/sys/net80211/ieee80211_var.h index aecde3c..11aaacf 100644 --- a/sys/net80211/ieee80211_var.h +++ b/sys/net80211/ieee80211_var.h @@ -246,6 +246,7 @@ struct ieee80211com { #define IEEE80211_FEXT_WDS 0x00000001 /* CONF: 4 addr allowed */ /* 0x00000006 reserved */ #define IEEE80211_FEXT_BGSCAN 0x00000008 /* STATUS: enable full bgscan completion */ +#define IEEE80211_FEXT_ERPUPDATE 0x00000200 /* STATUS: update ERP element */ /* ic_caps */ #define IEEE80211_C_WEP 0x00000001 /* CAPABILITY: WEP available */ |