diff options
-rw-r--r-- | include/linux/ieee80211.h | 2 | ||||
-rw-r--r-- | net/mac80211/ieee80211_i.h | 2 | ||||
-rw-r--r-- | net/mac80211/mesh.c | 17 | ||||
-rw-r--r-- | net/mac80211/mesh.h | 2 |
4 files changed, 8 insertions, 15 deletions
diff --git a/include/linux/ieee80211.h b/include/linux/ieee80211.h index 529f301d937..0b5e03eae6d 100644 --- a/include/linux/ieee80211.h +++ b/include/linux/ieee80211.h | |||
@@ -113,7 +113,7 @@ struct ieee80211_hdr { | |||
113 | struct ieee80211s_hdr { | 113 | struct ieee80211s_hdr { |
114 | u8 flags; | 114 | u8 flags; |
115 | u8 ttl; | 115 | u8 ttl; |
116 | u8 seqnum[3]; | 116 | __le32 seqnum; |
117 | u8 eaddr1[6]; | 117 | u8 eaddr1[6]; |
118 | u8 eaddr2[6]; | 118 | u8 eaddr2[6]; |
119 | u8 eaddr3[6]; | 119 | u8 eaddr3[6]; |
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h index 8e53ce7ed44..c7314bf4bec 100644 --- a/net/mac80211/ieee80211_i.h +++ b/net/mac80211/ieee80211_i.h | |||
@@ -354,7 +354,7 @@ struct ieee80211_if_sta { | |||
354 | int preq_queue_len; | 354 | int preq_queue_len; |
355 | struct mesh_stats mshstats; | 355 | struct mesh_stats mshstats; |
356 | struct mesh_config mshcfg; | 356 | struct mesh_config mshcfg; |
357 | u8 mesh_seqnum[3]; | 357 | u32 mesh_seqnum; |
358 | bool accepting_plinks; | 358 | bool accepting_plinks; |
359 | #endif | 359 | #endif |
360 | u16 aid; | 360 | u16 aid; |
diff --git a/net/mac80211/mesh.c b/net/mac80211/mesh.c index 594a3356a50..f76bc26ae4d 100644 --- a/net/mac80211/mesh.c +++ b/net/mac80211/mesh.c | |||
@@ -8,6 +8,7 @@ | |||
8 | * published by the Free Software Foundation. | 8 | * published by the Free Software Foundation. |
9 | */ | 9 | */ |
10 | 10 | ||
11 | #include <asm/unaligned.h> | ||
11 | #include "ieee80211_i.h" | 12 | #include "ieee80211_i.h" |
12 | #include "mesh.h" | 13 | #include "mesh.h" |
13 | 14 | ||
@@ -167,8 +168,8 @@ int mesh_rmc_check(u8 *sa, struct ieee80211s_hdr *mesh_hdr, | |||
167 | struct rmc_entry *p, *n; | 168 | struct rmc_entry *p, *n; |
168 | 169 | ||
169 | /* Don't care about endianness since only match matters */ | 170 | /* Don't care about endianness since only match matters */ |
170 | memcpy(&seqnum, mesh_hdr->seqnum, sizeof(mesh_hdr->seqnum)); | 171 | memcpy(&seqnum, &mesh_hdr->seqnum, sizeof(mesh_hdr->seqnum)); |
171 | idx = mesh_hdr->seqnum[0] & rmc->idx_mask; | 172 | idx = le32_to_cpu(mesh_hdr->seqnum) & rmc->idx_mask; |
172 | list_for_each_entry_safe(p, n, &rmc->bucket[idx].list, list) { | 173 | list_for_each_entry_safe(p, n, &rmc->bucket[idx].list, list) { |
173 | ++entries; | 174 | ++entries; |
174 | if (time_after(jiffies, p->exp_time) || | 175 | if (time_after(jiffies, p->exp_time) || |
@@ -393,16 +394,8 @@ int ieee80211_new_mesh_header(struct ieee80211s_hdr *meshhdr, | |||
393 | { | 394 | { |
394 | meshhdr->flags = 0; | 395 | meshhdr->flags = 0; |
395 | meshhdr->ttl = sdata->u.sta.mshcfg.dot11MeshTTL; | 396 | meshhdr->ttl = sdata->u.sta.mshcfg.dot11MeshTTL; |
396 | 397 | put_unaligned(cpu_to_le32(sdata->u.sta.mesh_seqnum), &meshhdr->seqnum); | |
397 | meshhdr->seqnum[0] = sdata->u.sta.mesh_seqnum[0]++; | 398 | sdata->u.sta.mesh_seqnum++; |
398 | meshhdr->seqnum[1] = sdata->u.sta.mesh_seqnum[1]; | ||
399 | meshhdr->seqnum[2] = sdata->u.sta.mesh_seqnum[2]; | ||
400 | |||
401 | if (sdata->u.sta.mesh_seqnum[0] == 0) { | ||
402 | sdata->u.sta.mesh_seqnum[1]++; | ||
403 | if (sdata->u.sta.mesh_seqnum[1] == 0) | ||
404 | sdata->u.sta.mesh_seqnum[2]++; | ||
405 | } | ||
406 | 399 | ||
407 | return 5; | 400 | return 5; |
408 | } | 401 | } |
diff --git a/net/mac80211/mesh.h b/net/mac80211/mesh.h index 742003d3a84..9f8cb769049 100644 --- a/net/mac80211/mesh.h +++ b/net/mac80211/mesh.h | |||
@@ -139,7 +139,7 @@ struct rmc_entry { | |||
139 | 139 | ||
140 | struct mesh_rmc { | 140 | struct mesh_rmc { |
141 | struct rmc_entry bucket[RMC_BUCKETS]; | 141 | struct rmc_entry bucket[RMC_BUCKETS]; |
142 | u8 idx_mask; | 142 | u32 idx_mask; |
143 | }; | 143 | }; |
144 | 144 | ||
145 | 145 | ||