mac80211: update adjusting TBTT bit in beacon
This regression was introduced in "mac80211: cache mesh beacon". mesh_sync_offset_adjust_tbtt() was assuming that the beacon would be rebuilt in every single pre-tbtt interrupt, but now the beacon update happens on the workqueue, and it must be ready for immediate delivery to the driver. Save a pointer to the meshconf IE in the beacon_data (this works because both the IE pointer and beacon buffer are protected by the same rcu_{dereference,assign_pointer}()) for quick updates during pre-tbtt. This is faster and a little prettier than iterating over the elements to find the meshconf IE every time. Signed-off-by: Thomas Pedersen <thomas@cozybit.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:

committed by
Johannes Berg

parent
d43c6b6e6f
commit
43552be1da
@@ -259,6 +259,9 @@ int mesh_add_meshconf_ie(struct ieee80211_sub_if_data *sdata,
|
||||
*pos++ = WLAN_EID_MESH_CONFIG;
|
||||
*pos++ = meshconf_len;
|
||||
|
||||
/* save a pointer for quick updates in pre-tbtt */
|
||||
ifmsh->meshconf_offset = pos - skb->data;
|
||||
|
||||
/* Active path selection protocol ID */
|
||||
*pos++ = ifmsh->mesh_pp_id;
|
||||
/* Active path selection metric ID */
|
||||
@@ -723,6 +726,8 @@ ieee80211_mesh_build_beacon(struct ieee80211_if_mesh *ifmsh)
|
||||
|
||||
bcn->tail_len = skb->len;
|
||||
memcpy(bcn->tail, skb->data, bcn->tail_len);
|
||||
bcn->meshconf = (struct ieee80211_meshconf_ie *)
|
||||
(bcn->tail + ifmsh->meshconf_offset);
|
||||
|
||||
dev_kfree_skb(skb);
|
||||
rcu_assign_pointer(ifmsh->beacon, bcn);
|
||||
|
Reference in New Issue
Block a user