Commit 6f101ef0 authored by Chun-Yeow Yeoh's avatar Chun-Yeow Yeoh Committed by Johannes Berg

mac80211: use put_unaligned_le16 in mesh_plink_frame_tx

Use put_unaligned_le16 in mesh_plink_frame_tx.
Signed-off-by: default avatarChun-Yeow Yeoh <yeohchunyeow@gmail.com>
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 2a901468
...@@ -532,8 +532,8 @@ static void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo) ...@@ -532,8 +532,8 @@ static void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo)
STATION_INFO_PEER_PM | STATION_INFO_PEER_PM |
STATION_INFO_NONPEER_PM; STATION_INFO_NONPEER_PM;
sinfo->llid = le16_to_cpu(sta->llid); sinfo->llid = sta->llid;
sinfo->plid = le16_to_cpu(sta->plid); sinfo->plid = sta->plid;
sinfo->plink_state = sta->plink_state; sinfo->plink_state = sta->plink_state;
if (test_sta_flag(sta, WLAN_STA_TOFFSET_KNOWN)) { if (test_sta_flag(sta, WLAN_STA_TOFFSET_KNOWN)) {
sinfo->filled |= STATION_INFO_T_OFFSET; sinfo->filled |= STATION_INFO_T_OFFSET;
......
...@@ -55,7 +55,7 @@ static const char * const mplevents[] = { ...@@ -55,7 +55,7 @@ static const char * const mplevents[] = {
static int mesh_plink_frame_tx(struct ieee80211_sub_if_data *sdata, static int mesh_plink_frame_tx(struct ieee80211_sub_if_data *sdata,
enum ieee80211_self_protected_actioncode action, enum ieee80211_self_protected_actioncode action,
u8 *da, __le16 llid, __le16 plid, __le16 reason); u8 *da, u16 llid, u16 plid, u16 reason);
/* We only need a valid sta if user configured a minimum rssi_threshold. */ /* We only need a valid sta if user configured a minimum rssi_threshold. */
...@@ -246,7 +246,7 @@ u32 mesh_plink_deactivate(struct sta_info *sta) ...@@ -246,7 +246,7 @@ u32 mesh_plink_deactivate(struct sta_info *sta)
spin_lock_bh(&sta->lock); spin_lock_bh(&sta->lock);
changed = __mesh_plink_deactivate(sta); changed = __mesh_plink_deactivate(sta);
sta->reason = cpu_to_le16(WLAN_REASON_MESH_PEER_CANCELED); sta->reason = WLAN_REASON_MESH_PEER_CANCELED;
mesh_plink_frame_tx(sdata, WLAN_SP_MESH_PEERING_CLOSE, mesh_plink_frame_tx(sdata, WLAN_SP_MESH_PEERING_CLOSE,
sta->sta.addr, sta->llid, sta->plid, sta->sta.addr, sta->llid, sta->plid,
sta->reason); sta->reason);
...@@ -257,7 +257,7 @@ u32 mesh_plink_deactivate(struct sta_info *sta) ...@@ -257,7 +257,7 @@ u32 mesh_plink_deactivate(struct sta_info *sta)
static int mesh_plink_frame_tx(struct ieee80211_sub_if_data *sdata, static int mesh_plink_frame_tx(struct ieee80211_sub_if_data *sdata,
enum ieee80211_self_protected_actioncode action, enum ieee80211_self_protected_actioncode action,
u8 *da, __le16 llid, __le16 plid, __le16 reason) u8 *da, u16 llid, u16 plid, u16 reason)
{ {
struct ieee80211_local *local = sdata->local; struct ieee80211_local *local = sdata->local;
struct sk_buff *skb; struct sk_buff *skb;
...@@ -305,7 +305,7 @@ static int mesh_plink_frame_tx(struct ieee80211_sub_if_data *sdata, ...@@ -305,7 +305,7 @@ static int mesh_plink_frame_tx(struct ieee80211_sub_if_data *sdata,
if (action == WLAN_SP_MESH_PEERING_CONFIRM) { if (action == WLAN_SP_MESH_PEERING_CONFIRM) {
/* AID */ /* AID */
pos = skb_put(skb, 2); pos = skb_put(skb, 2);
memcpy(pos + 2, &plid, 2); put_unaligned_le16(plid, pos + 2);
} }
if (ieee80211_add_srates_ie(sdata, skb, true, band) || if (ieee80211_add_srates_ie(sdata, skb, true, band) ||
ieee80211_add_ext_srates_ie(sdata, skb, true, band) || ieee80211_add_ext_srates_ie(sdata, skb, true, band) ||
...@@ -347,14 +347,14 @@ static int mesh_plink_frame_tx(struct ieee80211_sub_if_data *sdata, ...@@ -347,14 +347,14 @@ static int mesh_plink_frame_tx(struct ieee80211_sub_if_data *sdata,
*pos++ = ie_len; *pos++ = ie_len;
memcpy(pos, &peering_proto, 2); memcpy(pos, &peering_proto, 2);
pos += 2; pos += 2;
memcpy(pos, &llid, 2); put_unaligned_le16(llid, pos);
pos += 2; pos += 2;
if (include_plid) { if (include_plid) {
memcpy(pos, &plid, 2); put_unaligned_le16(plid, pos);
pos += 2; pos += 2;
} }
if (action == WLAN_SP_MESH_PEERING_CLOSE) { if (action == WLAN_SP_MESH_PEERING_CLOSE) {
memcpy(pos, &reason, 2); put_unaligned_le16(reason, pos);
pos += 2; pos += 2;
} }
...@@ -534,7 +534,7 @@ void mesh_neighbour_update(struct ieee80211_sub_if_data *sdata, ...@@ -534,7 +534,7 @@ void mesh_neighbour_update(struct ieee80211_sub_if_data *sdata,
static void mesh_plink_timer(unsigned long data) static void mesh_plink_timer(unsigned long data)
{ {
struct sta_info *sta; struct sta_info *sta;
__le16 llid, plid, reason; u16 reason = 0;
struct ieee80211_sub_if_data *sdata; struct ieee80211_sub_if_data *sdata;
struct mesh_config *mshcfg; struct mesh_config *mshcfg;
enum ieee80211_self_protected_actioncode action = 0; enum ieee80211_self_protected_actioncode action = 0;
...@@ -558,9 +558,6 @@ static void mesh_plink_timer(unsigned long data) ...@@ -558,9 +558,6 @@ static void mesh_plink_timer(unsigned long data)
mpl_dbg(sta->sdata, mpl_dbg(sta->sdata,
"Mesh plink timer for %pM fired on state %s\n", "Mesh plink timer for %pM fired on state %s\n",
sta->sta.addr, mplstates[sta->plink_state]); sta->sta.addr, mplstates[sta->plink_state]);
reason = 0;
llid = sta->llid;
plid = sta->plid;
sdata = sta->sdata; sdata = sta->sdata;
mshcfg = &sdata->u.mesh.mshcfg; mshcfg = &sdata->u.mesh.mshcfg;
...@@ -582,12 +579,12 @@ static void mesh_plink_timer(unsigned long data) ...@@ -582,12 +579,12 @@ static void mesh_plink_timer(unsigned long data)
action = WLAN_SP_MESH_PEERING_OPEN; action = WLAN_SP_MESH_PEERING_OPEN;
break; break;
} }
reason = cpu_to_le16(WLAN_REASON_MESH_MAX_RETRIES); reason = WLAN_REASON_MESH_MAX_RETRIES;
/* fall through on else */ /* fall through on else */
case NL80211_PLINK_CNF_RCVD: case NL80211_PLINK_CNF_RCVD:
/* confirm timer */ /* confirm timer */
if (!reason) if (!reason)
reason = cpu_to_le16(WLAN_REASON_MESH_CONFIRM_TIMEOUT); reason = WLAN_REASON_MESH_CONFIRM_TIMEOUT;
sta->plink_state = NL80211_PLINK_HOLDING; sta->plink_state = NL80211_PLINK_HOLDING;
mod_plink_timer(sta, mshcfg->dot11MeshHoldingTimeout); mod_plink_timer(sta, mshcfg->dot11MeshHoldingTimeout);
action = WLAN_SP_MESH_PEERING_CLOSE; action = WLAN_SP_MESH_PEERING_CLOSE;
...@@ -603,7 +600,7 @@ static void mesh_plink_timer(unsigned long data) ...@@ -603,7 +600,7 @@ static void mesh_plink_timer(unsigned long data)
spin_unlock_bh(&sta->lock); spin_unlock_bh(&sta->lock);
if (action) if (action)
mesh_plink_frame_tx(sdata, action, sta->sta.addr, mesh_plink_frame_tx(sdata, action, sta->sta.addr,
llid, plid, reason); sta->llid, sta->plid, reason);
} }
static inline void mesh_plink_timer_set(struct sta_info *sta, int timeout) static inline void mesh_plink_timer_set(struct sta_info *sta, int timeout)
...@@ -616,7 +613,7 @@ static inline void mesh_plink_timer_set(struct sta_info *sta, int timeout) ...@@ -616,7 +613,7 @@ static inline void mesh_plink_timer_set(struct sta_info *sta, int timeout)
} }
static bool llid_in_use(struct ieee80211_sub_if_data *sdata, static bool llid_in_use(struct ieee80211_sub_if_data *sdata,
__le16 llid) u16 llid)
{ {
struct ieee80211_local *local = sdata->local; struct ieee80211_local *local = sdata->local;
bool in_use = false; bool in_use = false;
...@@ -634,7 +631,7 @@ static bool llid_in_use(struct ieee80211_sub_if_data *sdata, ...@@ -634,7 +631,7 @@ static bool llid_in_use(struct ieee80211_sub_if_data *sdata,
return in_use; return in_use;
} }
static __le16 mesh_get_new_llid(struct ieee80211_sub_if_data *sdata) static u16 mesh_get_new_llid(struct ieee80211_sub_if_data *sdata)
{ {
u16 llid; u16 llid;
...@@ -642,9 +639,9 @@ static __le16 mesh_get_new_llid(struct ieee80211_sub_if_data *sdata) ...@@ -642,9 +639,9 @@ static __le16 mesh_get_new_llid(struct ieee80211_sub_if_data *sdata)
get_random_bytes(&llid, sizeof(llid)); get_random_bytes(&llid, sizeof(llid));
/* for mesh PS we still only have the AID range for TIM bits */ /* for mesh PS we still only have the AID range for TIM bits */
llid = (llid % IEEE80211_MAX_AID) + 1; llid = (llid % IEEE80211_MAX_AID) + 1;
} while (llid_in_use(sdata, cpu_to_le16(llid))); } while (llid_in_use(sdata, llid));
return cpu_to_le16(llid); return llid;
} }
u32 mesh_plink_open(struct sta_info *sta) u32 mesh_plink_open(struct sta_info *sta)
...@@ -695,9 +692,8 @@ static void mesh_plink_close(struct ieee80211_sub_if_data *sdata, ...@@ -695,9 +692,8 @@ static void mesh_plink_close(struct ieee80211_sub_if_data *sdata,
{ {
struct mesh_config *mshcfg = &sdata->u.mesh.mshcfg; struct mesh_config *mshcfg = &sdata->u.mesh.mshcfg;
__le16 reason = (event == CLS_ACPT) ? u16 reason = (event == CLS_ACPT) ?
cpu_to_le16(WLAN_REASON_MESH_CLOSE) : WLAN_REASON_MESH_CLOSE : WLAN_REASON_MESH_CONFIG;
cpu_to_le16(WLAN_REASON_MESH_CONFIG);
sta->reason = reason; sta->reason = reason;
sta->plink_state = NL80211_PLINK_HOLDING; sta->plink_state = NL80211_PLINK_HOLDING;
...@@ -892,7 +888,7 @@ mesh_plink_get_event(struct ieee80211_sub_if_data *sdata, ...@@ -892,7 +888,7 @@ mesh_plink_get_event(struct ieee80211_sub_if_data *sdata,
struct sta_info *sta, struct sta_info *sta,
struct ieee802_11_elems *elems, struct ieee802_11_elems *elems,
enum ieee80211_self_protected_actioncode ftype, enum ieee80211_self_protected_actioncode ftype,
__le16 llid, __le16 plid) u16 llid, u16 plid)
{ {
enum plink_event event = PLINK_UNDEFINED; enum plink_event event = PLINK_UNDEFINED;
u8 ie_len = elems->peering_len; u8 ie_len = elems->peering_len;
...@@ -990,7 +986,8 @@ mesh_process_plink_frame(struct ieee80211_sub_if_data *sdata, ...@@ -990,7 +986,8 @@ mesh_process_plink_frame(struct ieee80211_sub_if_data *sdata,
enum ieee80211_self_protected_actioncode ftype; enum ieee80211_self_protected_actioncode ftype;
u32 changed = 0; u32 changed = 0;
u8 ie_len = elems->peering_len; u8 ie_len = elems->peering_len;
__le16 plid, llid = 0; __le16 _plid, _llid;
u16 plid, llid = 0;
if (!elems->peering) { if (!elems->peering) {
mpl_dbg(sdata, mpl_dbg(sdata,
...@@ -1024,10 +1021,13 @@ mesh_process_plink_frame(struct ieee80211_sub_if_data *sdata, ...@@ -1024,10 +1021,13 @@ mesh_process_plink_frame(struct ieee80211_sub_if_data *sdata,
/* Note the lines below are correct, the llid in the frame is the plid /* Note the lines below are correct, the llid in the frame is the plid
* from the point of view of this host. * from the point of view of this host.
*/ */
memcpy(&plid, PLINK_GET_LLID(elems->peering), 2); memcpy(&_plid, PLINK_GET_LLID(elems->peering), sizeof(__le16));
plid = le16_to_cpu(_plid);
if (ftype == WLAN_SP_MESH_PEERING_CONFIRM || if (ftype == WLAN_SP_MESH_PEERING_CONFIRM ||
(ftype == WLAN_SP_MESH_PEERING_CLOSE && ie_len == 8)) (ftype == WLAN_SP_MESH_PEERING_CLOSE && ie_len == 8)) {
memcpy(&llid, PLINK_GET_PLID(elems->peering), 2); memcpy(&_llid, PLINK_GET_PLID(elems->peering), sizeof(__le16));
llid = le16_to_cpu(_llid);
}
/* WARNING: Only for sta pointer, is dropped & re-acquired */ /* WARNING: Only for sta pointer, is dropped & re-acquired */
rcu_read_lock(); rcu_read_lock();
...@@ -1056,7 +1056,7 @@ mesh_process_plink_frame(struct ieee80211_sub_if_data *sdata, ...@@ -1056,7 +1056,7 @@ mesh_process_plink_frame(struct ieee80211_sub_if_data *sdata,
} else if (!sta && event == OPN_RJCT) { } else if (!sta && event == OPN_RJCT) {
mesh_plink_frame_tx(sdata, WLAN_SP_MESH_PEERING_CLOSE, mesh_plink_frame_tx(sdata, WLAN_SP_MESH_PEERING_CLOSE,
mgmt->sa, 0, plid, mgmt->sa, 0, plid,
cpu_to_le16(WLAN_REASON_MESH_CONFIG)); WLAN_REASON_MESH_CONFIG);
goto unlock_rcu; goto unlock_rcu;
} else if (!sta || event == PLINK_UNDEFINED) { } else if (!sta || event == PLINK_UNDEFINED) {
/* something went wrong */ /* something went wrong */
......
...@@ -578,7 +578,7 @@ void ieee80211_mps_frame_release(struct sta_info *sta, ...@@ -578,7 +578,7 @@ void ieee80211_mps_frame_release(struct sta_info *sta,
if (sta->plink_state == NL80211_PLINK_ESTAB) if (sta->plink_state == NL80211_PLINK_ESTAB)
has_buffered = ieee80211_check_tim(elems->tim, elems->tim_len, has_buffered = ieee80211_check_tim(elems->tim, elems->tim_len,
le16_to_cpu(sta->llid)); sta->llid);
if (has_buffered) if (has_buffered)
mps_dbg(sta->sdata, "%pM indicates buffered frames\n", mps_dbg(sta->sdata, "%pM indicates buffered frames\n",
......
...@@ -631,7 +631,7 @@ void sta_info_recalc_tim(struct sta_info *sta) ...@@ -631,7 +631,7 @@ void sta_info_recalc_tim(struct sta_info *sta)
} else if (ieee80211_vif_is_mesh(&sta->sdata->vif)) { } else if (ieee80211_vif_is_mesh(&sta->sdata->vif)) {
ps = &sta->sdata->u.mesh.ps; ps = &sta->sdata->u.mesh.ps;
/* TIM map only for 1 <= PLID <= IEEE80211_MAX_AID */ /* TIM map only for 1 <= PLID <= IEEE80211_MAX_AID */
id = le16_to_cpu(sta->plid) % (IEEE80211_MAX_AID + 1); id = sta->plid % (IEEE80211_MAX_AID + 1);
#endif #endif
} else { } else {
return; return;
......
...@@ -390,9 +390,9 @@ struct sta_info { ...@@ -390,9 +390,9 @@ struct sta_info {
* Mesh peer link attributes * Mesh peer link attributes
* TODO: move to a sub-structure that is referenced with pointer? * TODO: move to a sub-structure that is referenced with pointer?
*/ */
__le16 llid; u16 llid;
__le16 plid; u16 plid;
__le16 reason; u16 reason;
u8 plink_retries; u8 plink_retries;
bool ignore_plink_timer; bool ignore_plink_timer;
enum nl80211_plink_state plink_state; enum nl80211_plink_state plink_state;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment