Commit 136cfa28 authored by Rui Paulo's avatar Rui Paulo Committed by John W. Linville

mac80211: use a structure to hold the mesh config information element

Signed-off-by: default avatarRui Paulo <rpaulo@gmail.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent fe7a5d5c
...@@ -115,7 +115,6 @@ ...@@ -115,7 +115,6 @@
#define IEEE80211_MAX_SSID_LEN 32 #define IEEE80211_MAX_SSID_LEN 32
#define IEEE80211_MAX_MESH_ID_LEN 32 #define IEEE80211_MAX_MESH_ID_LEN 32
#define IEEE80211_MESH_CONFIG_LEN 7
#define IEEE80211_QOS_CTL_LEN 2 #define IEEE80211_QOS_CTL_LEN 2
#define IEEE80211_QOS_CTL_TID_MASK 0x000F #define IEEE80211_QOS_CTL_TID_MASK 0x000F
...@@ -554,6 +553,21 @@ struct ieee80211_tim_ie { ...@@ -554,6 +553,21 @@ struct ieee80211_tim_ie {
u8 virtual_map[1]; u8 virtual_map[1];
} __attribute__ ((packed)); } __attribute__ ((packed));
/**
* struct ieee80211_meshconf_ie
*
* This structure refers to "Mesh Configuration information element"
*/
struct ieee80211_meshconf_ie {
u8 meshconf_psel;
u8 meshconf_pmetric;
u8 meshconf_congest;
u8 meshconf_synch;
u8 meshconf_auth;
u8 meshconf_form;
u8 meshconf_cap;
} __attribute__ ((packed));
/** /**
* struct ieee80211_rann_ie * struct ieee80211_rann_ie
* *
......
...@@ -798,7 +798,7 @@ struct ieee802_11_elems { ...@@ -798,7 +798,7 @@ struct ieee802_11_elems {
u8 *wmm_param; u8 *wmm_param;
struct ieee80211_ht_cap *ht_cap_elem; struct ieee80211_ht_cap *ht_cap_elem;
struct ieee80211_ht_info *ht_info_elem; struct ieee80211_ht_info *ht_info_elem;
u8 *mesh_config; struct ieee80211_meshconf_ie *mesh_config;
u8 *mesh_id; u8 *mesh_id;
u8 *peer_link; u8 *peer_link;
u8 *preq; u8 *preq;
...@@ -826,7 +826,6 @@ struct ieee802_11_elems { ...@@ -826,7 +826,6 @@ struct ieee802_11_elems {
u8 ext_supp_rates_len; u8 ext_supp_rates_len;
u8 wmm_info_len; u8 wmm_info_len;
u8 wmm_param_len; u8 wmm_param_len;
u8 mesh_config_len;
u8 mesh_id_len; u8 mesh_id_len;
u8 peer_link_len; u8 peer_link_len;
u8 preq_len; u8 preq_len;
......
...@@ -16,12 +16,6 @@ ...@@ -16,12 +16,6 @@
#define IEEE80211_MESH_HOUSEKEEPING_INTERVAL (60 * HZ) #define IEEE80211_MESH_HOUSEKEEPING_INTERVAL (60 * HZ)
#define IEEE80211_MESH_RANN_INTERVAL (1 * HZ) #define IEEE80211_MESH_RANN_INTERVAL (1 * HZ)
#define MESHCONF_PP_OFFSET 0 /* Path Selection Protocol */
#define MESHCONF_PM_OFFSET 1 /* Path Selection Metric */
#define MESHCONF_CC_OFFSET 2 /* Congestion Control Mode */
#define MESHCONF_SP_OFFSET 3 /* Synchronization Protocol */
#define MESHCONF_AUTH_OFFSET 4 /* Authentication Protocol */
#define MESHCONF_CAPAB_OFFSET 6
#define MESHCONF_CAPAB_ACCEPT_PLINKS 0x01 #define MESHCONF_CAPAB_ACCEPT_PLINKS 0x01
#define MESHCONF_CAPAB_FORWARDING 0x08 #define MESHCONF_CAPAB_FORWARDING 0x08
...@@ -87,12 +81,11 @@ bool mesh_matches_local(struct ieee802_11_elems *ie, struct ieee80211_sub_if_dat ...@@ -87,12 +81,11 @@ bool mesh_matches_local(struct ieee802_11_elems *ie, struct ieee80211_sub_if_dat
*/ */
if (ifmsh->mesh_id_len == ie->mesh_id_len && if (ifmsh->mesh_id_len == ie->mesh_id_len &&
memcmp(ifmsh->mesh_id, ie->mesh_id, ie->mesh_id_len) == 0 && memcmp(ifmsh->mesh_id, ie->mesh_id, ie->mesh_id_len) == 0 &&
(ifmsh->mesh_pp_id == *(ie->mesh_config + MESHCONF_PP_OFFSET))&& (ifmsh->mesh_pp_id == ie->mesh_config->meshconf_psel) &&
(ifmsh->mesh_pm_id == *(ie->mesh_config + MESHCONF_PM_OFFSET))&& (ifmsh->mesh_pm_id == ie->mesh_config->meshconf_pmetric) &&
(ifmsh->mesh_cc_id == *(ie->mesh_config + MESHCONF_CC_OFFSET))&& (ifmsh->mesh_cc_id == ie->mesh_config->meshconf_congest) &&
(ifmsh->mesh_sp_id == *(ie->mesh_config + MESHCONF_SP_OFFSET))&& (ifmsh->mesh_sp_id == ie->mesh_config->meshconf_synch) &&
(ifmsh->mesh_auth_id == *(ie->mesh_config + (ifmsh->mesh_auth_id == ie->mesh_config->meshconf_auth))
MESHCONF_AUTH_OFFSET)))
return true; return true;
return false; return false;
...@@ -105,7 +98,7 @@ bool mesh_matches_local(struct ieee802_11_elems *ie, struct ieee80211_sub_if_dat ...@@ -105,7 +98,7 @@ bool mesh_matches_local(struct ieee802_11_elems *ie, struct ieee80211_sub_if_dat
*/ */
bool mesh_peer_accepts_plinks(struct ieee802_11_elems *ie) bool mesh_peer_accepts_plinks(struct ieee802_11_elems *ie)
{ {
return (*(ie->mesh_config + MESHCONF_CAPAB_OFFSET) & return (ie->mesh_config->meshconf_cap &
MESHCONF_CAPAB_ACCEPT_PLINKS) != 0; MESHCONF_CAPAB_ACCEPT_PLINKS) != 0;
} }
...@@ -262,9 +255,9 @@ void mesh_mgmt_ies_add(struct sk_buff *skb, struct ieee80211_sub_if_data *sdata) ...@@ -262,9 +255,9 @@ void mesh_mgmt_ies_add(struct sk_buff *skb, struct ieee80211_sub_if_data *sdata)
if (sdata->u.mesh.mesh_id_len) if (sdata->u.mesh.mesh_id_len)
memcpy(pos, sdata->u.mesh.mesh_id, sdata->u.mesh.mesh_id_len); memcpy(pos, sdata->u.mesh.mesh_id, sdata->u.mesh.mesh_id_len);
pos = skb_put(skb, 2 + IEEE80211_MESH_CONFIG_LEN); pos = skb_put(skb, 2 + sizeof(struct ieee80211_meshconf_ie));
*pos++ = WLAN_EID_MESH_CONFIG; *pos++ = WLAN_EID_MESH_CONFIG;
*pos++ = IEEE80211_MESH_CONFIG_LEN; *pos++ = sizeof(struct ieee80211_meshconf_ie);
/* Active path selection protocol ID */ /* Active path selection protocol ID */
*pos++ = sdata->u.mesh.mesh_pp_id; *pos++ = sdata->u.mesh.mesh_pp_id;
......
...@@ -666,8 +666,8 @@ u32 ieee802_11_parse_elems_crc(u8 *start, size_t len, ...@@ -666,8 +666,8 @@ u32 ieee802_11_parse_elems_crc(u8 *start, size_t len,
elems->mesh_id_len = elen; elems->mesh_id_len = elen;
break; break;
case WLAN_EID_MESH_CONFIG: case WLAN_EID_MESH_CONFIG:
elems->mesh_config = pos; if (elen >= sizeof(struct ieee80211_meshconf_ie))
elems->mesh_config_len = elen; elems->mesh_config = (void *)pos;
break; break;
case WLAN_EID_PEER_LINK: case WLAN_EID_PEER_LINK:
elems->peer_link = pos; elems->peer_link = pos;
......
...@@ -217,7 +217,7 @@ static bool is_mesh(struct cfg80211_bss *a, ...@@ -217,7 +217,7 @@ static bool is_mesh(struct cfg80211_bss *a,
a->len_information_elements); a->len_information_elements);
if (!ie) if (!ie)
return false; return false;
if (ie[1] != IEEE80211_MESH_CONFIG_LEN) if (ie[1] != sizeof(struct ieee80211_meshconf_ie))
return false; return false;
/* /*
...@@ -225,7 +225,8 @@ static bool is_mesh(struct cfg80211_bss *a, ...@@ -225,7 +225,8 @@ static bool is_mesh(struct cfg80211_bss *a,
* comparing since that may differ between stations taking * comparing since that may differ between stations taking
* part in the same mesh. * part in the same mesh.
*/ */
return memcmp(ie + 2, meshcfg, IEEE80211_MESH_CONFIG_LEN - 2) == 0; return memcmp(ie + 2, meshcfg,
sizeof(struct ieee80211_meshconf_ie) - 2) == 0;
} }
static int cmp_bss(struct cfg80211_bss *a, static int cmp_bss(struct cfg80211_bss *a,
...@@ -399,7 +400,7 @@ cfg80211_bss_update(struct cfg80211_registered_device *dev, ...@@ -399,7 +400,7 @@ cfg80211_bss_update(struct cfg80211_registered_device *dev,
res->pub.information_elements, res->pub.information_elements,
res->pub.len_information_elements); res->pub.len_information_elements);
if (!meshid || !meshcfg || if (!meshid || !meshcfg ||
meshcfg[1] != IEEE80211_MESH_CONFIG_LEN) { meshcfg[1] != sizeof(struct ieee80211_meshconf_ie)) {
/* bogus mesh */ /* bogus mesh */
kref_put(&res->ref, bss_release); kref_put(&res->ref, bss_release);
return NULL; return NULL;
...@@ -865,7 +866,7 @@ ieee80211_bss(struct wiphy *wiphy, struct iw_request_info *info, ...@@ -865,7 +866,7 @@ ieee80211_bss(struct wiphy *wiphy, struct iw_request_info *info,
break; break;
case WLAN_EID_MESH_CONFIG: case WLAN_EID_MESH_CONFIG:
ismesh = true; ismesh = true;
if (ie[1] != IEEE80211_MESH_CONFIG_LEN) if (ie[1] != sizeof(struct ieee80211_meshconf_ie))
break; break;
buf = kmalloc(50, GFP_ATOMIC); buf = kmalloc(50, GFP_ATOMIC);
if (!buf) if (!buf)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment