diff options
| author | John W. Linville <linville@tuxdriver.com> | 2011-08-29 14:52:20 -0400 | 
|---|---|---|
| committer | John W. Linville <linville@tuxdriver.com> | 2011-08-29 14:52:20 -0400 | 
| commit | ba6e5eb107b4b26444cb67ce6fb8eb0973a97964 (patch) | |
| tree | 9377baf652e0cd8360372020b0386e238d07a30d /net/mac80211/mesh_plink.c | |
| parent | f3116f62cb56ef5efd172371fab688bb27529f69 (diff) | |
| parent | a508a6ea234571e0e7d1e9f2455fc1eca54d1fef (diff) | |
| download | olio-linux-3.10-ba6e5eb107b4b26444cb67ce6fb8eb0973a97964.tar.xz olio-linux-3.10-ba6e5eb107b4b26444cb67ce6fb8eb0973a97964.zip  | |
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next into for-davem
Diffstat (limited to 'net/mac80211/mesh_plink.c')
| -rw-r--r-- | net/mac80211/mesh_plink.c | 239 | 
1 files changed, 123 insertions, 116 deletions
diff --git a/net/mac80211/mesh_plink.c b/net/mac80211/mesh_plink.c index f4adc091788..1a00d0f701c 100644 --- a/net/mac80211/mesh_plink.c +++ b/net/mac80211/mesh_plink.c @@ -19,35 +19,18 @@  #define mpl_dbg(fmt, args...)	do { (void)(0); } while (0)  #endif -#define PLINK_GET_LLID(p) (p + 4) -#define PLINK_GET_PLID(p) (p + 6) +#define PLINK_GET_LLID(p) (p + 2) +#define PLINK_GET_PLID(p) (p + 4)  #define mod_plink_timer(s, t) (mod_timer(&s->plink_timer, \  				jiffies + HZ * t / 1000)) -/* Peer link cancel reasons, all subject to ANA approval */ -#define MESH_LINK_CANCELLED			2 -#define MESH_MAX_NEIGHBORS			3 -#define MESH_CAPABILITY_POLICY_VIOLATION	4 -#define MESH_CLOSE_RCVD				5 -#define MESH_MAX_RETRIES			6 -#define MESH_CONFIRM_TIMEOUT			7 -#define MESH_SECURITY_ROLE_NEGOTIATION_DIFFERS	8 -#define MESH_SECURITY_AUTHENTICATION_IMPOSSIBLE	9 -#define MESH_SECURITY_FAILED_VERIFICATION	10 -  #define dot11MeshMaxRetries(s) (s->u.mesh.mshcfg.dot11MeshMaxRetries)  #define dot11MeshRetryTimeout(s) (s->u.mesh.mshcfg.dot11MeshRetryTimeout)  #define dot11MeshConfirmTimeout(s) (s->u.mesh.mshcfg.dot11MeshConfirmTimeout)  #define dot11MeshHoldingTimeout(s) (s->u.mesh.mshcfg.dot11MeshHoldingTimeout)  #define dot11MeshMaxPeerLinks(s) (s->u.mesh.mshcfg.dot11MeshMaxPeerLinks) -enum plink_frame_type { -	PLINK_OPEN = 1, -	PLINK_CONFIRM, -	PLINK_CLOSE -}; -  enum plink_event {  	PLINK_UNDEFINED,  	OPN_ACPT, @@ -157,16 +140,16 @@ void mesh_plink_deactivate(struct sta_info *sta)  }  static int mesh_plink_frame_tx(struct ieee80211_sub_if_data *sdata, -		enum plink_frame_type action, u8 *da, __le16 llid, __le16 plid, -		__le16 reason) { +		enum ieee80211_self_protected_actioncode action, +		u8 *da, __le16 llid, __le16 plid, __le16 reason) {  	struct ieee80211_local *local = sdata->local;  	struct sk_buff *skb = dev_alloc_skb(local->hw.extra_tx_headroom + 400 +  			sdata->u.mesh.ie_len);  	struct ieee80211_mgmt *mgmt;  	bool include_plid = false; -	static const u8 meshpeeringproto[] = { 0x00, 0x0F, 0xAC, 0x2A }; +	int ie_len = 4; +	u16 peering_proto = 0;  	u8 *pos; -	int ie_len;  	if (!skb)  		return -1; @@ -175,63 +158,75 @@ static int mesh_plink_frame_tx(struct ieee80211_sub_if_data *sdata,  	 * common action part (1)  	 */  	mgmt = (struct ieee80211_mgmt *) -		skb_put(skb, 25 + sizeof(mgmt->u.action.u.plink_action)); -	memset(mgmt, 0, 25 + sizeof(mgmt->u.action.u.plink_action)); +		skb_put(skb, 25 + sizeof(mgmt->u.action.u.self_prot)); +	memset(mgmt, 0, 25 + sizeof(mgmt->u.action.u.self_prot));  	mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |  					  IEEE80211_STYPE_ACTION);  	memcpy(mgmt->da, da, ETH_ALEN);  	memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN);  	memcpy(mgmt->bssid, sdata->vif.addr, ETH_ALEN); -	mgmt->u.action.category = WLAN_CATEGORY_MESH_ACTION; -	mgmt->u.action.u.plink_action.action_code = action; +	mgmt->u.action.category = WLAN_CATEGORY_SELF_PROTECTED; +	mgmt->u.action.u.self_prot.action_code = action; -	if (action == PLINK_CLOSE) -		mgmt->u.action.u.plink_action.aux = reason; -	else { -		mgmt->u.action.u.plink_action.aux = cpu_to_le16(0x0); -		if (action == PLINK_CONFIRM) { -			pos = skb_put(skb, 4); -			/* two-byte status code followed by two-byte AID */ -			memset(pos, 0, 2); +	if (action != WLAN_SP_MESH_PEERING_CLOSE) { +		/* capability info */ +		pos = skb_put(skb, 2); +		memset(pos, 0, 2); +		if (action == WLAN_SP_MESH_PEERING_CONFIRM) { +			/* AID */ +			pos = skb_put(skb, 2);  			memcpy(pos + 2, &plid, 2);  		} -		mesh_mgmt_ies_add(skb, sdata); +		if (mesh_add_srates_ie(skb, sdata) || +		    mesh_add_ext_srates_ie(skb, sdata) || +		    mesh_add_rsn_ie(skb, sdata) || +		    mesh_add_meshid_ie(skb, sdata) || +		    mesh_add_meshconf_ie(skb, sdata)) +			return -1; +	} else {	/* WLAN_SP_MESH_PEERING_CLOSE */ +		if (mesh_add_meshid_ie(skb, sdata)) +			return -1;  	} -	/* Add Peer Link Management element */ +	/* Add Mesh Peering Management element */  	switch (action) { -	case PLINK_OPEN: -		ie_len = 6; +	case WLAN_SP_MESH_PEERING_OPEN:  		break; -	case PLINK_CONFIRM: -		ie_len = 8; +	case WLAN_SP_MESH_PEERING_CONFIRM: +		ie_len += 2;  		include_plid = true;  		break; -	case PLINK_CLOSE: -	default: -		if (!plid) -			ie_len = 8; -		else { -			ie_len = 10; +	case WLAN_SP_MESH_PEERING_CLOSE: +		if (plid) { +			ie_len += 2;  			include_plid = true;  		} +		ie_len += 2;	/* reason code */  		break; +	default: +		return -EINVAL;  	} +	if (WARN_ON(skb_tailroom(skb) < 2 + ie_len)) +		return -ENOMEM; +  	pos = skb_put(skb, 2 + ie_len); -	*pos++ = WLAN_EID_PEER_LINK; +	*pos++ = WLAN_EID_PEER_MGMT;  	*pos++ = ie_len; -	memcpy(pos, meshpeeringproto, sizeof(meshpeeringproto)); -	pos += 4; +	memcpy(pos, &peering_proto, 2); +	pos += 2;  	memcpy(pos, &llid, 2); +	pos += 2;  	if (include_plid) { -		pos += 2;  		memcpy(pos, &plid, 2); -	} -	if (action == PLINK_CLOSE) {  		pos += 2; +	} +	if (action == WLAN_SP_MESH_PEERING_CLOSE) {  		memcpy(pos, &reason, 2); +		pos += 2;  	} +	if (mesh_add_vendor_ies(skb, sdata)) +		return -1;  	ieee80211_tx_skb(sdata, skb);  	return 0; @@ -322,21 +317,21 @@ static void mesh_plink_timer(unsigned long data)  			++sta->plink_retries;  			mod_plink_timer(sta, sta->plink_timeout);  			spin_unlock_bh(&sta->lock); -			mesh_plink_frame_tx(sdata, PLINK_OPEN, sta->sta.addr, llid, -					    0, 0); +			mesh_plink_frame_tx(sdata, WLAN_SP_MESH_PEERING_OPEN, +					    sta->sta.addr, llid, 0, 0);  			break;  		} -		reason = cpu_to_le16(MESH_MAX_RETRIES); +		reason = cpu_to_le16(WLAN_REASON_MESH_MAX_RETRIES);  		/* fall through on else */  	case NL80211_PLINK_CNF_RCVD:  		/* confirm timer */  		if (!reason) -			reason = cpu_to_le16(MESH_CONFIRM_TIMEOUT); +			reason = cpu_to_le16(WLAN_REASON_MESH_CONFIRM_TIMEOUT);  		sta->plink_state = NL80211_PLINK_HOLDING;  		mod_plink_timer(sta, dot11MeshHoldingTimeout(sdata));  		spin_unlock_bh(&sta->lock); -		mesh_plink_frame_tx(sdata, PLINK_CLOSE, sta->sta.addr, llid, plid, -				    reason); +		mesh_plink_frame_tx(sdata, WLAN_SP_MESH_PEERING_CLOSE, +				    sta->sta.addr, llid, plid, reason);  		break;  	case NL80211_PLINK_HOLDING:  		/* holding timer */ @@ -396,7 +391,7 @@ int mesh_plink_open(struct sta_info *sta)  	mpl_dbg("Mesh plink: starting establishment with %pM\n",  		sta->sta.addr); -	return mesh_plink_frame_tx(sdata, PLINK_OPEN, +	return mesh_plink_frame_tx(sdata, WLAN_SP_MESH_PEERING_OPEN,  				   sta->sta.addr, llid, 0, 0);  } @@ -422,7 +417,7 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m  	struct ieee802_11_elems elems;  	struct sta_info *sta;  	enum plink_event event; -	enum plink_frame_type ftype; +	enum ieee80211_self_protected_actioncode ftype;  	size_t baselen;  	bool deactivated, matches_local = true;  	u8 ie_len; @@ -449,14 +444,15 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m  		return;  	} -	baseaddr = mgmt->u.action.u.plink_action.variable; -	baselen = (u8 *) mgmt->u.action.u.plink_action.variable - (u8 *) mgmt; -	if (mgmt->u.action.u.plink_action.action_code == PLINK_CONFIRM) { +	baseaddr = mgmt->u.action.u.self_prot.variable; +	baselen = (u8 *) mgmt->u.action.u.self_prot.variable - (u8 *) mgmt; +	if (mgmt->u.action.u.self_prot.action_code == +						WLAN_SP_MESH_PEERING_CONFIRM) {  		baseaddr += 4;  		baselen += 4;  	}  	ieee802_11_parse_elems(baseaddr, len - baselen, &elems); -	if (!elems.peer_link) { +	if (!elems.peering) {  		mpl_dbg("Mesh plink: missing necessary peer link ie\n");  		return;  	} @@ -466,31 +462,34 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m  		return;  	} -	ftype = mgmt->u.action.u.plink_action.action_code; -	ie_len = elems.peer_link_len; -	if ((ftype == PLINK_OPEN && ie_len != 6) || -	    (ftype == PLINK_CONFIRM && ie_len != 8) || -	    (ftype == PLINK_CLOSE && ie_len != 8 && ie_len != 10)) { +	ftype = mgmt->u.action.u.self_prot.action_code; +	ie_len = elems.peering_len; +	if ((ftype == WLAN_SP_MESH_PEERING_OPEN && ie_len != 4) || +	    (ftype == WLAN_SP_MESH_PEERING_CONFIRM && ie_len != 6) || +	    (ftype == WLAN_SP_MESH_PEERING_CLOSE && ie_len != 6 +							&& ie_len != 8)) {  		mpl_dbg("Mesh plink: incorrect plink ie length %d %d\n",  		    ftype, ie_len);  		return;  	} -	if (ftype != PLINK_CLOSE && (!elems.mesh_id || !elems.mesh_config)) { +	if (ftype != WLAN_SP_MESH_PEERING_CLOSE && +				(!elems.mesh_id || !elems.mesh_config)) {  		mpl_dbg("Mesh plink: missing necessary ie\n");  		return;  	}  	/* Note the lines below are correct, the llid in the frame is the plid  	 * from the point of view of this host.  	 */ -	memcpy(&plid, PLINK_GET_LLID(elems.peer_link), 2); -	if (ftype == PLINK_CONFIRM || (ftype == PLINK_CLOSE && ie_len == 10)) -		memcpy(&llid, PLINK_GET_PLID(elems.peer_link), 2); +	memcpy(&plid, PLINK_GET_LLID(elems.peering), 2); +	if (ftype == WLAN_SP_MESH_PEERING_CONFIRM || +	    (ftype == WLAN_SP_MESH_PEERING_CLOSE && ie_len == 8)) +		memcpy(&llid, PLINK_GET_PLID(elems.peering), 2);  	rcu_read_lock();  	sta = sta_info_get(sdata, mgmt->sa); -	if (!sta && ftype != PLINK_OPEN) { +	if (!sta && ftype != WLAN_SP_MESH_PEERING_OPEN) {  		mpl_dbg("Mesh plink: cls or cnf from unknown peer\n");  		rcu_read_unlock();  		return; @@ -509,30 +508,30 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m  	/* Now we will figure out the appropriate event... */  	event = PLINK_UNDEFINED; -	if (ftype != PLINK_CLOSE && (!mesh_matches_local(&elems, sdata))) { +	if (ftype != WLAN_SP_MESH_PEERING_CLOSE && +	    (!mesh_matches_local(&elems, sdata))) {  		matches_local = false;  		switch (ftype) { -		case PLINK_OPEN: +		case WLAN_SP_MESH_PEERING_OPEN:  			event = OPN_RJCT;  			break; -		case PLINK_CONFIRM: +		case WLAN_SP_MESH_PEERING_CONFIRM:  			event = CNF_RJCT;  			break; -		case PLINK_CLOSE: -			/* avoid warning */ +		default:  			break;  		}  	}  	if (!sta && !matches_local) {  		rcu_read_unlock(); -		reason = cpu_to_le16(MESH_CAPABILITY_POLICY_VIOLATION); +		reason = cpu_to_le16(WLAN_REASON_MESH_CONFIG);  		llid = 0; -		mesh_plink_frame_tx(sdata, PLINK_CLOSE, mgmt->sa, llid, -				    plid, reason); +		mesh_plink_frame_tx(sdata, WLAN_SP_MESH_PEERING_CLOSE, +				    mgmt->sa, llid, plid, reason);  		return;  	} else if (!sta) { -		/* ftype == PLINK_OPEN */ +		/* ftype == WLAN_SP_MESH_PEERING_OPEN */  		u32 rates;  		rcu_read_unlock(); @@ -557,21 +556,21 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m  	} else if (matches_local) {  		spin_lock_bh(&sta->lock);  		switch (ftype) { -		case PLINK_OPEN: +		case WLAN_SP_MESH_PEERING_OPEN:  			if (!mesh_plink_free_count(sdata) ||  			    (sta->plid && sta->plid != plid))  				event = OPN_IGNR;  			else  				event = OPN_ACPT;  			break; -		case PLINK_CONFIRM: +		case WLAN_SP_MESH_PEERING_CONFIRM:  			if (!mesh_plink_free_count(sdata) ||  			    (sta->llid != llid || sta->plid != plid))  				event = CNF_IGNR;  			else  				event = CNF_ACPT;  			break; -		case PLINK_CLOSE: +		case WLAN_SP_MESH_PEERING_CLOSE:  			if (sta->plink_state == NL80211_PLINK_ESTAB)  				/* Do not check for llid or plid. This does not  				 * follow the standard but since multiple plinks @@ -620,10 +619,12 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m  			sta->llid = llid;  			mesh_plink_timer_set(sta, dot11MeshRetryTimeout(sdata));  			spin_unlock_bh(&sta->lock); -			mesh_plink_frame_tx(sdata, PLINK_OPEN, sta->sta.addr, llid, -					    0, 0); -			mesh_plink_frame_tx(sdata, PLINK_CONFIRM, sta->sta.addr, -					    llid, plid, 0); +			mesh_plink_frame_tx(sdata, +					    WLAN_SP_MESH_PEERING_OPEN, +					    sta->sta.addr, llid, 0, 0); +			mesh_plink_frame_tx(sdata, +					    WLAN_SP_MESH_PEERING_CONFIRM, +					    sta->sta.addr, llid, plid, 0);  			break;  		default:  			spin_unlock_bh(&sta->lock); @@ -635,10 +636,10 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m  		switch (event) {  		case OPN_RJCT:  		case CNF_RJCT: -			reason = cpu_to_le16(MESH_CAPABILITY_POLICY_VIOLATION); +			reason = cpu_to_le16(WLAN_REASON_MESH_CONFIG);  		case CLS_ACPT:  			if (!reason) -				reason = cpu_to_le16(MESH_CLOSE_RCVD); +				reason = cpu_to_le16(WLAN_REASON_MESH_CLOSE);  			sta->reason = reason;  			sta->plink_state = NL80211_PLINK_HOLDING;  			if (!mod_plink_timer(sta, @@ -647,8 +648,9 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m  			llid = sta->llid;  			spin_unlock_bh(&sta->lock); -			mesh_plink_frame_tx(sdata, PLINK_CLOSE, sta->sta.addr, llid, -					    plid, reason); +			mesh_plink_frame_tx(sdata, +					    WLAN_SP_MESH_PEERING_CLOSE, +					    sta->sta.addr, llid, plid, reason);  			break;  		case OPN_ACPT:  			/* retry timer is left untouched */ @@ -656,8 +658,9 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m  			sta->plid = plid;  			llid = sta->llid;  			spin_unlock_bh(&sta->lock); -			mesh_plink_frame_tx(sdata, PLINK_CONFIRM, sta->sta.addr, llid, -					    plid, 0); +			mesh_plink_frame_tx(sdata, +					    WLAN_SP_MESH_PEERING_CONFIRM, +					    sta->sta.addr, llid, plid, 0);  			break;  		case CNF_ACPT:  			sta->plink_state = NL80211_PLINK_CNF_RCVD; @@ -677,10 +680,10 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m  		switch (event) {  		case OPN_RJCT:  		case CNF_RJCT: -			reason = cpu_to_le16(MESH_CAPABILITY_POLICY_VIOLATION); +			reason = cpu_to_le16(WLAN_REASON_MESH_CONFIG);  		case CLS_ACPT:  			if (!reason) -				reason = cpu_to_le16(MESH_CLOSE_RCVD); +				reason = cpu_to_le16(WLAN_REASON_MESH_CLOSE);  			sta->reason = reason;  			sta->plink_state = NL80211_PLINK_HOLDING;  			if (!mod_plink_timer(sta, @@ -689,14 +692,15 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m  			llid = sta->llid;  			spin_unlock_bh(&sta->lock); -			mesh_plink_frame_tx(sdata, PLINK_CLOSE, sta->sta.addr, llid, -					    plid, reason); +			mesh_plink_frame_tx(sdata, WLAN_SP_MESH_PEERING_CLOSE, +					    sta->sta.addr, llid, plid, reason);  			break;  		case OPN_ACPT:  			llid = sta->llid;  			spin_unlock_bh(&sta->lock); -			mesh_plink_frame_tx(sdata, PLINK_CONFIRM, sta->sta.addr, llid, -					    plid, 0); +			mesh_plink_frame_tx(sdata, +					    WLAN_SP_MESH_PEERING_CONFIRM, +					    sta->sta.addr, llid, plid, 0);  			break;  		case CNF_ACPT:  			del_timer(&sta->plink_timer); @@ -717,10 +721,10 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m  		switch (event) {  		case OPN_RJCT:  		case CNF_RJCT: -			reason = cpu_to_le16(MESH_CAPABILITY_POLICY_VIOLATION); +			reason = cpu_to_le16(WLAN_REASON_MESH_CONFIG);  		case CLS_ACPT:  			if (!reason) -				reason = cpu_to_le16(MESH_CLOSE_RCVD); +				reason = cpu_to_le16(WLAN_REASON_MESH_CLOSE);  			sta->reason = reason;  			sta->plink_state = NL80211_PLINK_HOLDING;  			if (!mod_plink_timer(sta, @@ -729,8 +733,9 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m  			llid = sta->llid;  			spin_unlock_bh(&sta->lock); -			mesh_plink_frame_tx(sdata, PLINK_CLOSE, sta->sta.addr, llid, -					    plid, reason); +			mesh_plink_frame_tx(sdata, +					    WLAN_SP_MESH_PEERING_CLOSE, +					    sta->sta.addr, llid, plid, reason);  			break;  		case OPN_ACPT:  			del_timer(&sta->plink_timer); @@ -740,8 +745,9 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m  			ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON);  			mpl_dbg("Mesh plink with %pM ESTABLISHED\n",  				sta->sta.addr); -			mesh_plink_frame_tx(sdata, PLINK_CONFIRM, sta->sta.addr, llid, -					    plid, 0); +			mesh_plink_frame_tx(sdata, +					    WLAN_SP_MESH_PEERING_CONFIRM, +					    sta->sta.addr, llid, plid, 0);  			break;  		default:  			spin_unlock_bh(&sta->lock); @@ -752,7 +758,7 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m  	case NL80211_PLINK_ESTAB:  		switch (event) {  		case CLS_ACPT: -			reason = cpu_to_le16(MESH_CLOSE_RCVD); +			reason = cpu_to_le16(WLAN_REASON_MESH_CLOSE);  			sta->reason = reason;  			deactivated = __mesh_plink_deactivate(sta);  			sta->plink_state = NL80211_PLINK_HOLDING; @@ -761,14 +767,15 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m  			spin_unlock_bh(&sta->lock);  			if (deactivated)  				ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON); -			mesh_plink_frame_tx(sdata, PLINK_CLOSE, sta->sta.addr, llid, -					    plid, reason); +			mesh_plink_frame_tx(sdata, WLAN_SP_MESH_PEERING_CLOSE, +					    sta->sta.addr, llid, plid, reason);  			break;  		case OPN_ACPT:  			llid = sta->llid;  			spin_unlock_bh(&sta->lock); -			mesh_plink_frame_tx(sdata, PLINK_CONFIRM, sta->sta.addr, llid, -					    plid, 0); +			mesh_plink_frame_tx(sdata, +					    WLAN_SP_MESH_PEERING_CONFIRM, +					    sta->sta.addr, llid, plid, 0);  			break;  		default:  			spin_unlock_bh(&sta->lock); @@ -790,8 +797,8 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m  			llid = sta->llid;  			reason = sta->reason;  			spin_unlock_bh(&sta->lock); -			mesh_plink_frame_tx(sdata, PLINK_CLOSE, sta->sta.addr, -					    llid, plid, reason); +			mesh_plink_frame_tx(sdata, WLAN_SP_MESH_PEERING_CLOSE, +					    sta->sta.addr, llid, plid, reason);  			break;  		default:  			spin_unlock_bh(&sta->lock);  |