mirror of https://gitee.com/openkylin/linux.git
mac80211: send notification on new peer candidate for our secure mesh
Also, advertise support for mesh authentication. Signed-off-by: Javier Cardona <javier@cozybit.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
c93b5e717e
commit
1570ca5927
|
@ -762,6 +762,11 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
|
||||||
local->hw.wiphy->interface_modes &= ~BIT(NL80211_IFTYPE_MESH_POINT);
|
local->hw.wiphy->interface_modes &= ~BIT(NL80211_IFTYPE_MESH_POINT);
|
||||||
#endif
|
#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 */
|
/* mac80211 supports control port protocol changing */
|
||||||
local->hw.wiphy->flags |= WIPHY_FLAG_CONTROL_PORT_PROTOCOL;
|
local->hw.wiphy->flags |= WIPHY_FLAG_CONTROL_PORT_PROTOCOL;
|
||||||
|
|
||||||
|
|
|
@ -590,9 +590,7 @@ static void ieee80211_mesh_rx_bcn_presp(struct ieee80211_sub_if_data *sdata,
|
||||||
if (elems.mesh_id && elems.mesh_config &&
|
if (elems.mesh_id && elems.mesh_config &&
|
||||||
mesh_matches_local(&elems, sdata)) {
|
mesh_matches_local(&elems, sdata)) {
|
||||||
supp_rates = ieee80211_sta_get_rates(local, &elems, band);
|
supp_rates = ieee80211_sta_get_rates(local, &elems, band);
|
||||||
|
mesh_neighbour_update(mgmt->sa, supp_rates, sdata, &elems);
|
||||||
mesh_neighbour_update(mgmt->sa, supp_rates, sdata,
|
|
||||||
mesh_peer_accepts_plinks(&elems));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
int mesh_path_add(u8 *dst, struct ieee80211_sub_if_data *sdata);
|
||||||
/* Mesh plinks */
|
/* Mesh plinks */
|
||||||
void mesh_neighbour_update(u8 *hw_addr, u32 rates,
|
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);
|
bool mesh_peer_accepts_plinks(struct ieee802_11_elems *ie);
|
||||||
void mesh_accept_plinks_update(struct ieee80211_sub_if_data *sdata);
|
void mesh_accept_plinks_update(struct ieee80211_sub_if_data *sdata);
|
||||||
void mesh_plink_broken(struct sta_info *sta);
|
void mesh_plink_broken(struct sta_info *sta);
|
||||||
|
|
|
@ -237,8 +237,9 @@ static int mesh_plink_frame_tx(struct ieee80211_sub_if_data *sdata,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void mesh_neighbour_update(u8 *hw_addr, u32 rates, struct ieee80211_sub_if_data *sdata,
|
void mesh_neighbour_update(u8 *hw_addr, u32 rates,
|
||||||
bool peer_accepting_plinks)
|
struct ieee80211_sub_if_data *sdata,
|
||||||
|
struct ieee802_11_elems *elems)
|
||||||
{
|
{
|
||||||
struct ieee80211_local *local = sdata->local;
|
struct ieee80211_local *local = sdata->local;
|
||||||
struct sta_info *sta;
|
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);
|
sta = sta_info_get(sdata, hw_addr);
|
||||||
if (!sta) {
|
if (!sta) {
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
|
/* Userspace handles peer allocation when security is enabled
|
||||||
sta = mesh_plink_alloc(sdata, hw_addr, rates);
|
* */
|
||||||
|
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)
|
if (!sta)
|
||||||
return;
|
return;
|
||||||
if (sta_info_insert_rcu(sta)) {
|
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->last_rx = jiffies;
|
||||||
sta->sta.supp_rates[local->hw.conf.channel->band] = rates;
|
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.accepting_plinks &&
|
||||||
sdata->u.mesh.mshcfg.auto_open_plinks)
|
sdata->u.mesh.mshcfg.auto_open_plinks)
|
||||||
mesh_plink_open(sta);
|
mesh_plink_open(sta);
|
||||||
|
|
Loading…
Reference in New Issue