Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+2 −2
Original line number Original line Diff line number Diff line
@@ -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;
+27 −27
Original line number Original line Diff line number Diff line
@@ -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)


	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)


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,
		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,
	*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,
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)
	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)
			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)
	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)
}
}


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,
	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)
		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,
{
{
	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,
		     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,
	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,
	/* 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,
	} 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 */
+1 −1
Original line number Original line Diff line number Diff line
@@ -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",
+1 −1
Original line number Original line Diff line number Diff line
@@ -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;
+3 −3
Original line number Original line Diff line number Diff line
@@ -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;