Skip to contentSkip to conversation

mac80211: use 4-byte mesh sequence number

PATCH In review Luis Carlos Cobo 2 participants 3 messages Apr 23, 2008 – May 3, 2008

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 mac80211: use 4-byte mesh sequence number

This follows the new 802.11s/D2.0 draft.

---
 include/linux/ieee80211.h  |    2 +-
 net/mac80211/ieee80211_i.h |    2 +-
 net/mac80211/mesh.c        |   17 +++++------------
 net/mac80211/mesh.h        |    2 +-
 4 files changed, 8 insertions(+), 15 deletions(-)
include/linux/ieee80211.h +1 -1
index f27d11a..c840bd1 100644
@@ -113,7 +113,7 @@ struct ieee80211_hdr {
 struct ieee80211s_hdr {
 	u8 flags;
 	u8 ttl;
-	u8 seqnum[3];
+	__le32 seqnum;
 	u8 eaddr1[6];
 	u8 eaddr2[6];
 	u8 eaddr3[6];
net/mac80211/ieee80211_i.h +1 -1
index 8e53ce7..c7314bf 100644
@@ -354,7 +354,7 @@ struct ieee80211_if_sta {
 	int preq_queue_len;
 	struct mesh_stats mshstats;
 	struct mesh_config mshcfg;
-	u8 mesh_seqnum[3];
+	u32 mesh_seqnum;
 	bool accepting_plinks;
 #endif
 	u16 aid;
net/mac80211/mesh.c +5 -12
index 594a335..f76bc26 100644
@@ -8,6 +8,7 @@
  * published by the Free Software Foundation.
  */
 
+#include <asm/unaligned.h>
 #include "ieee80211_i.h"
 #include "mesh.h"
 
@@ -167,8 +168,8 @@ int mesh_rmc_check(u8 *sa, struct ieee80211s_hdr *mesh_hdr,
 	struct rmc_entry *p, *n;
 
 	/* Don't care about endianness since only match matters */
-	memcpy(&seqnum, mesh_hdr->seqnum, sizeof(mesh_hdr->seqnum));
-	idx = mesh_hdr->seqnum[0] & rmc->idx_mask;
+	memcpy(&seqnum, &mesh_hdr->seqnum, sizeof(mesh_hdr->seqnum));
+	idx = le32_to_cpu(mesh_hdr->seqnum) & rmc->idx_mask;
 	list_for_each_entry_safe(p, n, &rmc->bucket[idx].list, list) {
 		++entries;
 		if (time_after(jiffies, p->exp_time) ||
@@ -393,16 +394,8 @@ int ieee80211_new_mesh_header(struct ieee80211s_hdr *meshhdr,
 {
 	meshhdr->flags = 0;
 	meshhdr->ttl = sdata->u.sta.mshcfg.dot11MeshTTL;
-
-	meshhdr->seqnum[0] = sdata->u.sta.mesh_seqnum[0]++;
-	meshhdr->seqnum[1] = sdata->u.sta.mesh_seqnum[1];
-	meshhdr->seqnum[2] = sdata->u.sta.mesh_seqnum[2];
-
-	if (sdata->u.sta.mesh_seqnum[0] == 0) {
-		sdata->u.sta.mesh_seqnum[1]++;
-		if (sdata->u.sta.mesh_seqnum[1] == 0)
-			sdata->u.sta.mesh_seqnum[2]++;
-	}
+	put_unaligned(cpu_to_le32(sdata->u.sta.mesh_seqnum), &meshhdr->seqnum);
+	sdata->u.sta.mesh_seqnum++;
 
 	return 5;
 }
net/mac80211/mesh.h +1 -1
index 742003d..9f8cb76 100644
@@ -139,7 +139,7 @@ struct rmc_entry {
 
 struct mesh_rmc {
 	struct rmc_entry bucket[RMC_BUCKETS];
-	u8 idx_mask;
+	u32 idx_mask;
 };
 
 
Signature · 1 line
1.5.4.3
maintainer
#1 lore raw
Quoted 1 line · Luis Carlos Cobo

This follows the new 802.11s/D2.0 draft.

Umm, I just realised that

Quoted 5 lines
 include/linux/ieee80211.h  |    2 +-
 net/mac80211/ieee80211_i.h |    2 +-
 net/mac80211/mesh.c        |   17 +++++------------
 net/mac80211/mesh.h        |    2 +-
 4 files changed, 8 insertions(+), 15 deletions(-)

This doesn't change ieee80211_get_mesh_hdrlen. Isn't that missing? Can you send an add-on patch (since this one has been merged)?

johannes

maintainer
#2 lore raw
Quoted 5 lines · Johannes Berg
Quoted 1 line · Luis Carlos Cobo

This follows the new 802.11s/D2.0 draft.

Umm, I just realised that

Quoted 8 lines
Quoted 5 lines
 include/linux/ieee80211.h  |    2 +-
 net/mac80211/ieee80211_i.h |    2 +-
 net/mac80211/mesh.c        |   17 +++++------------
 net/mac80211/mesh.h        |    2 +-
 4 files changed, 8 insertions(+), 15 deletions(-)

This doesn't change ieee80211_get_mesh_hdrlen. Isn't that missing? Can you send an add-on patch (since this one has been merged)?

And the return value of ieee80211_new_mesh_header as well.

johannes