mac80211: send notification on new peer candidate for our secure mesh
authorJavier Cardona <javier@cozybit.com>
Thu, 7 Apr 2011 22:08:35 +0000 (15:08 -0700)
committerJohn W. Linville <linville@tuxdriver.com>
Tue, 12 Apr 2011 20:58:24 +0000 (16:58 -0400)
Also, advertise support for mesh authentication.

Signed-off-by: Javier Cardona <javier@cozybit.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
net/mac80211/main.c
net/mac80211/mesh.c
net/mac80211/mesh.h
net/mac80211/mesh_plink.c

index e2db3dc2395351dbd0cbdd9c458e62a7f2dd3872..0ab2a8df312df03988a4293402743a7fe3ce2cb7 100644 (file)
@@ -762,6 +762,11 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
        local->hw.wiphy->interface_modes &= ~BIT(NL80211_IFTYPE_MESH_POINT);
 #endif
 
+       /* if the underlying driver supports mesh, mac80211 will (at least)
+        * provide routing of mesh authentication frames to userspace */
+       if (local->hw.wiphy->interface_modes & BIT(NL80211_IFTYPE_MESH_POINT))
+               local->hw.wiphy->flags |= WIPHY_FLAG_MESH_AUTH;
+
        /* mac80211 supports control port protocol changing */
        local->hw.wiphy->flags |= WIPHY_FLAG_CONTROL_PORT_PROTOCOL;
 
index 47a26c0f6993f573d1c368669404674a93c841ec..11207979e2e29b7a07a6aedf927e527a9f7b01dd 100644 (file)
@@ -590,9 +590,7 @@ static void ieee80211_mesh_rx_bcn_presp(struct ieee80211_sub_if_data *sdata,
        if (elems.mesh_id && elems.mesh_config &&
            mesh_matches_local(&elems, sdata)) {
                supp_rates = ieee80211_sta_get_rates(local, &elems, band);
-
-               mesh_neighbour_update(mgmt->sa, supp_rates, sdata,
-                                     mesh_peer_accepts_plinks(&elems));
+               mesh_neighbour_update(mgmt->sa, supp_rates, sdata, &elems);
        }
 }
 
index b99e230fe31c3eff6960c09c6d4b4e37b228518b..10acf1cc80824b0aa1165c20cab1bdbc7b1a0d38 100644 (file)
@@ -226,7 +226,8 @@ void mesh_rx_path_sel_frame(struct ieee80211_sub_if_data *sdata,
 int mesh_path_add(u8 *dst, struct ieee80211_sub_if_data *sdata);
 /* Mesh plinks */
 void mesh_neighbour_update(u8 *hw_addr, u32 rates,
-               struct ieee80211_sub_if_data *sdata, bool add);
+               struct ieee80211_sub_if_data *sdata,
+               struct ieee802_11_elems *ie);
 bool mesh_peer_accepts_plinks(struct ieee802_11_elems *ie);
 void mesh_accept_plinks_update(struct ieee80211_sub_if_data *sdata);
 void mesh_plink_broken(struct sta_info *sta);
index b327e0e6c730ed223ce33af1c5b240540bd29481..84e5b056af022a33d3016ebc3b813c61a370ee22 100644 (file)
@@ -237,8 +237,9 @@ static int mesh_plink_frame_tx(struct ieee80211_sub_if_data *sdata,
        return 0;
 }
 
-void mesh_neighbour_update(u8 *hw_addr, u32 rates, struct ieee80211_sub_if_data *sdata,
-                          bool peer_accepting_plinks)
+void mesh_neighbour_update(u8 *hw_addr, u32 rates,
+               struct ieee80211_sub_if_data *sdata,
+               struct ieee802_11_elems *elems)
 {
        struct ieee80211_local *local = sdata->local;
        struct sta_info *sta;
@@ -248,8 +249,14 @@ void mesh_neighbour_update(u8 *hw_addr, u32 rates, struct ieee80211_sub_if_data
        sta = sta_info_get(sdata, hw_addr);
        if (!sta) {
                rcu_read_unlock();
-
-               sta = mesh_plink_alloc(sdata, hw_addr, rates);
+               /* Userspace handles peer allocation when security is enabled
+                * */
+               if (sdata->u.mesh.is_secure)
+                       cfg80211_notify_new_peer_candidate(sdata->dev, hw_addr,
+                                       elems->ie_start, elems->total_len,
+                                       GFP_KERNEL);
+               else
+                       sta = mesh_plink_alloc(sdata, hw_addr, rates);
                if (!sta)
                        return;
                if (sta_info_insert_rcu(sta)) {
@@ -260,7 +267,8 @@ void mesh_neighbour_update(u8 *hw_addr, u32 rates, struct ieee80211_sub_if_data
 
        sta->last_rx = jiffies;
        sta->sta.supp_rates[local->hw.conf.channel->band] = rates;
-       if (peer_accepting_plinks && sta->plink_state == PLINK_LISTEN &&
+       if (mesh_peer_accepts_plinks(elems) &&
+                       sta->plink_state == PLINK_LISTEN &&
                        sdata->u.mesh.accepting_plinks &&
                        sdata->u.mesh.mshcfg.auto_open_plinks)
                mesh_plink_open(sta);