net/mac80211/mesh_plink: Convert timers to use timer_setup()
Subsystems (3)
PATCH v2 1/1 net/mac80211/mesh_plink: Convert timers to use timer_setup()
In preparation for unconditionally passing the struct timer_list pointer to all timer callbacks, switch to using the new timer_setup() and from_timer() to pass the timer pointer explicitly. This requires adding a pointer back to the sta_info since container_of() can't resolve the sta_info.
---
This requires commit 686fef928bba ("timer: Prepare to change timer callback argument type") in v4.14-rc3, but should be otherwise stand-alone.
v2:
- make mesh_plink_timer non-static and use it in timer_setup() call directly.
--- net/mac80211/mesh.h | 1 + net/mac80211/mesh_plink.c | 10 ++++------ net/mac80211/sta_info.c | 4 +++- net/mac80211/sta_info.h | 2 ++ 4 files changed, 10 insertions(+), 7 deletions(-)
net/mac80211/mesh.h +1 -0
@@ -275,6 +275,7 @@ void mesh_neighbour_update(struct ieee80211_sub_if_data *sdata, u8 *hw_addr, struct ieee802_11_elems *ie);bool mesh_peer_accepts_plinks (struct ieee802_11_elems *ie);u32 mesh_accept_plinks_update (struct ieee80211_sub_if_data *sdata); +void mesh_plink_timer (struct timer_list *t);void mesh_plink_broken (struct sta_info *sta);u32 mesh_plink_deactivate (struct sta_info *sta);u32 mesh_plink_open (struct sta_info *sta);
net/mac80211/mesh_plink.c +4 -6
@@ -604,8 +604,9 @@ void mesh_neighbour_update(struct ieee80211_sub_if_data *sdata,ieee80211_mbss_info_change_notify (sdata, changed); } -static void mesh_plink_timer (unsigned long data) +void mesh_plink_timer (struct timer_list *t) { +struct mesh_sta *mesh =from_timer (mesh, t, plink_timer);struct sta_info *sta;u16 reason =0 ;struct ieee80211_sub_if_data *sdata;
@@ -617,7 +618,7 @@ static void mesh_plink_timer(unsigned long data)* del_timer_sync() this timer after having made sure * it cannot be readded (by deleting the plink.) */ - sta = (struct sta_info *) data; + sta = mesh->plink_sta;if (sta->sdata->local->quiescing)return ;
@@ -697,11 +698,8 @@ static void mesh_plink_timer(unsigned long data)static inline void mesh_plink_timer_set (struct sta_info *sta,u32 timeout) { - sta->mesh->plink_timer.expires = jiffies +msecs_to_jiffies (timeout); - sta->mesh->plink_timer.data = (unsigned long ) sta; - sta->mesh->plink_timer.function = mesh_plink_timer; sta->mesh->plink_timeout = timeout; -add_timer (&sta->mesh->plink_timer); +mod_timer (&sta->mesh->plink_timer, jiffies +msecs_to_jiffies (timeout)); } static bool llid_in_use(struct ieee80211_sub_if_data *sdata,
net/mac80211/sta_info.c +3 -1
@@ -329,10 +329,12 @@ struct sta_info *sta_info_alloc(struct ieee80211_sub_if_data *sdata, sta->mesh =kzalloc (sizeof (*sta->mesh), gfp);if (!sta->mesh) goto free; + sta->mesh->plink_sta = sta;spin_lock_init (&sta->mesh->plink_lock);if (ieee80211_vif_is_mesh (&sdata->vif) && !sdata->u.mesh.user_mpm) -init_timer (&sta->mesh->plink_timer); +timer_setup (&sta->mesh->plink_timer, mesh_plink_timer, +0 ); sta->mesh->nonpeer_pm = NL80211_MESH_POWER_ACTIVE; }#endif
net/mac80211/sta_info.h +2 -0
@@ -344,6 +344,7 @@ DECLARE_EWMA(mesh_fail_avg, 20, 8)* @plink_state: peer link state * @plink_timeout: timeout of peer link * @plink_timer: peer link watch timer +* @plink_sta: peer link watch timer's sta_info * @t_offset: timing offset relative to this host * @t_offset_setpoint: reference timing offset of this sta to be used when * calculating clockdrift
@@ -356,6 +357,7 @@ DECLARE_EWMA(mesh_fail_avg, 20, 8)*/ struct mesh_sta {struct timer_list plink_timer; +struct sta_info *plink_sta;s64 t_offset;s64 t_offset_setpoint;
Signature · 6 lines
2.7.4 -- Kees Cook Pixel Security
Quoted 8 lines · Kees Cook
In preparation for unconditionally passing the struct
timer_listpointer to
all timer callbacks, switch to using the newtimer_setup()andfrom_timer()
to pass the timer pointer explicitly. This requires adding a pointer back
to thesta_infosincecontainer_of()can't resolve thesta_info.
Applied, thanks. (The change did land in net-next, and I merged that in to merge this)
johannes