Merge branch 'master' of git://git.infradead.org/users/linville/wireless-next into...
[pandora-kernel.git] / net / mac80211 / mesh_plink.c
index f4adc09..7e57f5d 100644 (file)
 #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,
@@ -60,6 +43,10 @@ enum plink_event {
        CLS_IGNR
 };
 
+static int mesh_plink_frame_tx(struct ieee80211_sub_if_data *sdata,
+               enum ieee80211_self_protected_actioncode action,
+               u8 *da, __le16 llid, __le16 plid, __le16 reason);
+
 static inline
 void mesh_plink_inc_estab_count(struct ieee80211_sub_if_data *sdata)
 {
@@ -105,7 +92,9 @@ static struct sta_info *mesh_plink_alloc(struct ieee80211_sub_if_data *sdata,
        if (!sta)
                return NULL;
 
-       sta->flags = WLAN_STA_AUTHORIZED | WLAN_STA_AUTH;
+       set_sta_flag(sta, WLAN_STA_AUTH);
+       set_sta_flag(sta, WLAN_STA_AUTHORIZED);
+       set_sta_flag(sta, WLAN_STA_WME);
        sta->sta.supp_rates[local->hw.conf.channel->band] = rates;
        rate_control_rate_init(sta);
 
@@ -150,6 +139,10 @@ void mesh_plink_deactivate(struct sta_info *sta)
 
        spin_lock_bh(&sta->lock);
        deactivated = __mesh_plink_deactivate(sta);
+       sta->reason = cpu_to_le16(WLAN_REASON_MESH_PEER_CANCELED);
+       mesh_plink_frame_tx(sdata, WLAN_SP_MESH_PEERING_CLOSE,
+                           sta->sta.addr, sta->llid, sta->plid,
+                           sta->reason);
        spin_unlock_bh(&sta->lock);
 
        if (deactivated)
@@ -157,16 +150,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 +168,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;
-
-       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);
+       mgmt->u.action.category = WLAN_CATEGORY_SELF_PROTECTED;
+       mgmt->u.action.u.self_prot.action_code = action;
+
+       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 (ieee80211_add_srates_ie(&sdata->vif, skb) ||
+                   ieee80211_add_ext_srates_ie(&sdata->vif, skb) ||
+                   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 +327,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 */
@@ -380,7 +385,7 @@ int mesh_plink_open(struct sta_info *sta)
        __le16 llid;
        struct ieee80211_sub_if_data *sdata = sta->sdata;
 
-       if (!test_sta_flags(sta, WLAN_STA_AUTH))
+       if (!test_sta_flag(sta, WLAN_STA_AUTH))
                return -EPERM;
 
        spin_lock_bh(&sta->lock);
@@ -396,7 +401,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 +427,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 +454,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,37 +472,40 @@ 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;
        }
 
-       if (sta && !test_sta_flags(sta, WLAN_STA_AUTH)) {
+       if (sta && !test_sta_flag(sta, WLAN_STA_AUTH)) {
                mpl_dbg("Mesh plink: Action frame from non-authed peer\n");
                rcu_read_unlock();
                return;
@@ -509,30 +518,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 +566,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 +629,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 +646,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 +658,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 +668,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 +690,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 +702,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 +731,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 +743,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 +755,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 +768,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 +777,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 +807,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);