diff options
-rw-r--r-- | include/linux/ieee80211.h | 2 | ||||
-rw-r--r-- | net/mac80211/ieee80211_i.h | 10 | ||||
-rw-r--r-- | net/mac80211/mesh.c | 69 |
3 files changed, 35 insertions, 46 deletions
diff --git a/include/linux/ieee80211.h b/include/linux/ieee80211.h index 0aa831467493..50c684db33c7 100644 --- a/include/linux/ieee80211.h +++ b/include/linux/ieee80211.h | |||
@@ -115,7 +115,7 @@ | |||
115 | #define IEEE80211_MAX_SSID_LEN 32 | 115 | #define IEEE80211_MAX_SSID_LEN 32 |
116 | 116 | ||
117 | #define IEEE80211_MAX_MESH_ID_LEN 32 | 117 | #define IEEE80211_MAX_MESH_ID_LEN 32 |
118 | #define IEEE80211_MESH_CONFIG_LEN 24 | 118 | #define IEEE80211_MESH_CONFIG_LEN 7 |
119 | 119 | ||
120 | #define IEEE80211_QOS_CTL_LEN 2 | 120 | #define IEEE80211_QOS_CTL_LEN 2 |
121 | #define IEEE80211_QOS_CTL_TID_MASK 0x000F | 121 | #define IEEE80211_QOS_CTL_TID_MASK 0x000F |
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h index 1ef767366b77..1f4f88a8f80c 100644 --- a/net/mac80211/ieee80211_i.h +++ b/net/mac80211/ieee80211_i.h | |||
@@ -361,15 +361,15 @@ struct ieee80211_if_mesh { | |||
361 | u8 mesh_id[IEEE80211_MAX_MESH_ID_LEN]; | 361 | u8 mesh_id[IEEE80211_MAX_MESH_ID_LEN]; |
362 | size_t mesh_id_len; | 362 | size_t mesh_id_len; |
363 | /* Active Path Selection Protocol Identifier */ | 363 | /* Active Path Selection Protocol Identifier */ |
364 | u8 mesh_pp_id[4]; | 364 | u8 mesh_pp_id; |
365 | /* Active Path Selection Metric Identifier */ | 365 | /* Active Path Selection Metric Identifier */ |
366 | u8 mesh_pm_id[4]; | 366 | u8 mesh_pm_id; |
367 | /* Congestion Control Mode Identifier */ | 367 | /* Congestion Control Mode Identifier */ |
368 | u8 mesh_cc_id[4]; | 368 | u8 mesh_cc_id; |
369 | /* Synchronization Protocol Identifier */ | 369 | /* Synchronization Protocol Identifier */ |
370 | u8 mesh_sp_id[4]; | 370 | u8 mesh_sp_id; |
371 | /* Authentication Protocol Identifier */ | 371 | /* Authentication Protocol Identifier */ |
372 | u8 mesh_auth_id[4]; | 372 | u8 mesh_auth_id; |
373 | /* Local mesh Destination Sequence Number */ | 373 | /* Local mesh Destination Sequence Number */ |
374 | u32 dsn; | 374 | u32 dsn; |
375 | /* Last used PREQ ID */ | 375 | /* Last used PREQ ID */ |
diff --git a/net/mac80211/mesh.c b/net/mac80211/mesh.c index 9a733890eb47..a49a3374acb1 100644 --- a/net/mac80211/mesh.c +++ b/net/mac80211/mesh.c | |||
@@ -15,14 +15,14 @@ | |||
15 | #define IEEE80211_MESH_PEER_INACTIVITY_LIMIT (1800 * HZ) | 15 | #define IEEE80211_MESH_PEER_INACTIVITY_LIMIT (1800 * HZ) |
16 | #define IEEE80211_MESH_HOUSEKEEPING_INTERVAL (60 * HZ) | 16 | #define IEEE80211_MESH_HOUSEKEEPING_INTERVAL (60 * HZ) |
17 | 17 | ||
18 | #define PP_OFFSET 1 /* Path Selection Protocol */ | 18 | #define MESHCONF_PP_OFFSET 0 /* Path Selection Protocol */ |
19 | #define PM_OFFSET 5 /* Path Selection Metric */ | 19 | #define MESHCONF_PM_OFFSET 1 /* Path Selection Metric */ |
20 | #define CC_OFFSET 9 /* Congestion Control Mode */ | 20 | #define MESHCONF_CC_OFFSET 2 /* Congestion Control Mode */ |
21 | #define SP_OFFSET 13 /* Synchronization Protocol */ | 21 | #define MESHCONF_SP_OFFSET 3 /* Synchronization Protocol */ |
22 | #define AUTH_OFFSET 17 /* Authentication Protocol */ | 22 | #define MESHCONF_AUTH_OFFSET 4 /* Authentication Protocol */ |
23 | #define CAPAB_OFFSET 22 | 23 | #define MESHCONF_CAPAB_OFFSET 6 |
24 | #define CAPAB_ACCEPT_PLINKS 0x80 | 24 | #define MESHCONF_CAPAB_ACCEPT_PLINKS 0x01 |
25 | #define CAPAB_FORWARDING 0x10 | 25 | #define MESHCONF_CAPAB_FORWARDING 0x08 |
26 | 26 | ||
27 | #define TMR_RUNNING_HK 0 | 27 | #define TMR_RUNNING_HK 0 |
28 | #define TMR_RUNNING_MP 1 | 28 | #define TMR_RUNNING_MP 1 |
@@ -85,11 +85,12 @@ bool mesh_matches_local(struct ieee802_11_elems *ie, struct ieee80211_sub_if_dat | |||
85 | */ | 85 | */ |
86 | if (ifmsh->mesh_id_len == ie->mesh_id_len && | 86 | if (ifmsh->mesh_id_len == ie->mesh_id_len && |
87 | memcmp(ifmsh->mesh_id, ie->mesh_id, ie->mesh_id_len) == 0 && | 87 | memcmp(ifmsh->mesh_id, ie->mesh_id, ie->mesh_id_len) == 0 && |
88 | memcmp(ifmsh->mesh_pp_id, ie->mesh_config + PP_OFFSET, 4) == 0 && | 88 | (ifmsh->mesh_pp_id == *(ie->mesh_config + MESHCONF_PP_OFFSET))&& |
89 | memcmp(ifmsh->mesh_pm_id, ie->mesh_config + PM_OFFSET, 4) == 0 && | 89 | (ifmsh->mesh_pm_id == *(ie->mesh_config + MESHCONF_PM_OFFSET))&& |
90 | memcmp(ifmsh->mesh_cc_id, ie->mesh_config + CC_OFFSET, 4) == 0 && | 90 | (ifmsh->mesh_cc_id == *(ie->mesh_config + MESHCONF_CC_OFFSET))&& |
91 | memcmp(ifmsh->mesh_sp_id, ie->mesh_config + SP_OFFSET, 4) == 0 && | 91 | (ifmsh->mesh_sp_id == *(ie->mesh_config + MESHCONF_SP_OFFSET))&& |
92 | memcmp(ifmsh->mesh_auth_id, ie->mesh_config + AUTH_OFFSET, 4) == 0) | 92 | (ifmsh->mesh_auth_id == *(ie->mesh_config + |
93 | MESHCONF_AUTH_OFFSET))) | ||
93 | return true; | 94 | return true; |
94 | 95 | ||
95 | return false; | 96 | return false; |
@@ -102,7 +103,8 @@ bool mesh_matches_local(struct ieee802_11_elems *ie, struct ieee80211_sub_if_dat | |||
102 | */ | 103 | */ |
103 | bool mesh_peer_accepts_plinks(struct ieee802_11_elems *ie) | 104 | bool mesh_peer_accepts_plinks(struct ieee802_11_elems *ie) |
104 | { | 105 | { |
105 | return (*(ie->mesh_config + CAPAB_OFFSET) & CAPAB_ACCEPT_PLINKS) != 0; | 106 | return (*(ie->mesh_config + MESHCONF_CAPAB_OFFSET) & |
107 | MESHCONF_CAPAB_ACCEPT_PLINKS) != 0; | ||
106 | } | 108 | } |
107 | 109 | ||
108 | /** | 110 | /** |
@@ -128,18 +130,11 @@ void mesh_accept_plinks_update(struct ieee80211_sub_if_data *sdata) | |||
128 | 130 | ||
129 | void mesh_ids_set_default(struct ieee80211_if_mesh *sta) | 131 | void mesh_ids_set_default(struct ieee80211_if_mesh *sta) |
130 | { | 132 | { |
131 | u8 oui[3] = {0x00, 0x0F, 0xAC}; | 133 | sta->mesh_pp_id = 0; /* HWMP */ |
132 | 134 | sta->mesh_pm_id = 0; /* Airtime */ | |
133 | memcpy(sta->mesh_pp_id, oui, sizeof(oui)); | 135 | sta->mesh_cc_id = 0; /* Disabled */ |
134 | memcpy(sta->mesh_pm_id, oui, sizeof(oui)); | 136 | sta->mesh_sp_id = 0; /* Neighbor Offset */ |
135 | memcpy(sta->mesh_cc_id, oui, sizeof(oui)); | 137 | sta->mesh_auth_id = 0; /* Disabled */ |
136 | memcpy(sta->mesh_sp_id, oui, sizeof(oui)); | ||
137 | memcpy(sta->mesh_auth_id, oui, sizeof(oui)); | ||
138 | sta->mesh_pp_id[sizeof(oui)] = 0; | ||
139 | sta->mesh_pm_id[sizeof(oui)] = 0; | ||
140 | sta->mesh_cc_id[sizeof(oui)] = 0xff; | ||
141 | sta->mesh_sp_id[sizeof(oui)] = 0xff; | ||
142 | sta->mesh_auth_id[sizeof(oui)] = 0x0; | ||
143 | } | 138 | } |
144 | 139 | ||
145 | int mesh_rmc_init(struct ieee80211_sub_if_data *sdata) | 140 | int mesh_rmc_init(struct ieee80211_sub_if_data *sdata) |
@@ -260,28 +255,21 @@ void mesh_mgmt_ies_add(struct sk_buff *skb, struct ieee80211_sub_if_data *sdata) | |||
260 | pos = skb_put(skb, 2 + IEEE80211_MESH_CONFIG_LEN); | 255 | pos = skb_put(skb, 2 + IEEE80211_MESH_CONFIG_LEN); |
261 | *pos++ = WLAN_EID_MESH_CONFIG; | 256 | *pos++ = WLAN_EID_MESH_CONFIG; |
262 | *pos++ = IEEE80211_MESH_CONFIG_LEN; | 257 | *pos++ = IEEE80211_MESH_CONFIG_LEN; |
263 | /* Version */ | ||
264 | *pos++ = 1; | ||
265 | 258 | ||
266 | /* Active path selection protocol ID */ | 259 | /* Active path selection protocol ID */ |
267 | memcpy(pos, sdata->u.mesh.mesh_pp_id, 4); | 260 | *pos++ = sdata->u.mesh.mesh_pp_id; |
268 | pos += 4; | ||
269 | 261 | ||
270 | /* Active path selection metric ID */ | 262 | /* Active path selection metric ID */ |
271 | memcpy(pos, sdata->u.mesh.mesh_pm_id, 4); | 263 | *pos++ = sdata->u.mesh.mesh_pm_id; |
272 | pos += 4; | ||
273 | 264 | ||
274 | /* Congestion control mode identifier */ | 265 | /* Congestion control mode identifier */ |
275 | memcpy(pos, sdata->u.mesh.mesh_cc_id, 4); | 266 | *pos++ = sdata->u.mesh.mesh_cc_id; |
276 | pos += 4; | ||
277 | 267 | ||
278 | /* Synchronization protocol identifier */ | 268 | /* Synchronization protocol identifier */ |
279 | memcpy(pos, sdata->u.mesh.mesh_sp_id, 4); | 269 | *pos++ = sdata->u.mesh.mesh_sp_id; |
280 | pos += 4; | ||
281 | 270 | ||
282 | /* Authentication Protocol identifier */ | 271 | /* Authentication Protocol identifier */ |
283 | memcpy(pos, sdata->u.mesh.mesh_auth_id, 4); | 272 | *pos++ = sdata->u.mesh.mesh_auth_id; |
284 | pos += 4; | ||
285 | 273 | ||
286 | /* Mesh Formation Info */ | 274 | /* Mesh Formation Info */ |
287 | memset(pos, 0x00, 1); | 275 | memset(pos, 0x00, 1); |
@@ -289,8 +277,9 @@ void mesh_mgmt_ies_add(struct sk_buff *skb, struct ieee80211_sub_if_data *sdata) | |||
289 | 277 | ||
290 | /* Mesh capability */ | 278 | /* Mesh capability */ |
291 | sdata->u.mesh.accepting_plinks = mesh_plink_availables(sdata); | 279 | sdata->u.mesh.accepting_plinks = mesh_plink_availables(sdata); |
292 | *pos = CAPAB_FORWARDING; | 280 | *pos = MESHCONF_CAPAB_FORWARDING; |
293 | *pos++ |= sdata->u.mesh.accepting_plinks ? CAPAB_ACCEPT_PLINKS : 0x00; | 281 | *pos++ |= sdata->u.mesh.accepting_plinks ? |
282 | MESHCONF_CAPAB_ACCEPT_PLINKS : 0x00; | ||
294 | *pos++ = 0x00; | 283 | *pos++ = 0x00; |
295 | 284 | ||
296 | return; | 285 | return; |