svn commit: r194862 - projects/mesh11s/sys/net80211

Rui Paulo rpaulo at FreeBSD.org
Wed Jun 24 17:16:14 UTC 2009


Author: rpaulo
Date: Wed Jun 24 17:16:13 2009
New Revision: 194862
URL: http://svn.freebsd.org/changeset/base/194862

Log:
  Add functions to manipulate the HWMP routing table and use them.
  
  Sponsored by:	The FreeBSD Foundation

Modified:
  projects/mesh11s/sys/net80211/ieee80211_hwmp.c

Modified: projects/mesh11s/sys/net80211/ieee80211_hwmp.c
==============================================================================
--- projects/mesh11s/sys/net80211/ieee80211_hwmp.c	Wed Jun 24 17:03:06 2009	(r194861)
+++ projects/mesh11s/sys/net80211/ieee80211_hwmp.c	Wed Jun 24 17:16:13 2009	(r194862)
@@ -63,9 +63,16 @@ __FBSDID("$FreeBSD$");
 #include <net80211/ieee80211_hwmp.h>
 #include <net80211/ieee80211_input.h>
 
+static struct ieee80211_hwmp_fi *
+		hwmp_rt_find(struct ieee80211vap *,
+    const uint8_t [IEEE80211_ADDR_LEN]);
+static struct ieee80211_hwmp_fi *
+		hwmp_rt_add(struct ieee80211vap *,
+    const uint8_t [IEEE80211_ADDR_LEN]);
+static void	hwmp_rt_flush(struct ieee80211vap *);
 static int	ieee80211_hwmp_send_action(struct ieee80211_node *,
-	const uint8_t [IEEE80211_ADDR_LEN], const uint8_t [IEEE80211_ADDR_LEN],
-	uint8_t *, size_t);
+    const uint8_t [IEEE80211_ADDR_LEN], const uint8_t [IEEE80211_ADDR_LEN],
+    uint8_t *, size_t);
 static uint8_t *hwmp_add_meshpreq(uint8_t *,
     const struct ieee80211_meshpreq_ie *);
 static uint8_t *hwmp_add_meshprep(uint8_t *,
@@ -145,6 +152,62 @@ MALLOC_DEFINE(M_80211_HWMP, "80211hwmp",
 
 extern int	ieee80211_mesh_ttl;
 
+/*
+ * Helper functions to manipulate the HWMP routing table.
+ */
+static struct ieee80211_hwmp_fi *
+hwmp_rt_find(struct ieee80211vap *vap, const uint8_t dest[IEEE80211_ADDR_LEN])
+{
+	struct ieee80211_hwmp_state *hs = vap->iv_hwmp;
+	struct ieee80211_hwmp_fi *fi;
+
+	HWMP_LOCK(hs);
+	TAILQ_FOREACH(fi, &hs->hs_head, fi_next) {
+		if (IEEE80211_ADDR_EQ(dest, fi->fi_dest)) {
+			HWMP_UNLOCK(hs);
+			return fi;
+		}
+	}
+	HWMP_UNLOCK(hs);
+	return NULL;
+}
+
+static struct ieee80211_hwmp_fi *
+hwmp_rt_add(struct ieee80211vap *vap, const uint8_t dest[IEEE80211_ADDR_LEN])
+{
+	struct ieee80211_hwmp_state *hs = vap->iv_hwmp;
+	struct ieee80211_hwmp_fi *fi;
+
+	KASSERT(hwmp_rt_find(vap, dest) == NULL,
+	    ("%s: duplicate entry in the routing table", __func__));
+
+	fi = malloc(sizeof(struct ieee80211_hwmp_fi), M_80211_HWMP,
+	    M_NOWAIT | M_ZERO);
+	memset(fi, 0, sizeof(*fi));
+	IEEE80211_ADDR_COPY(fi->fi_dest, dest);
+	HWMP_LOCK(hs);
+	TAILQ_INSERT_TAIL(&hs->hs_head, fi, fi_next);
+	HWMP_UNLOCK(hs);
+
+	return fi;
+}
+
+static void
+hwmp_rt_flush(struct ieee80211vap *vap)
+{
+	struct ieee80211_hwmp_state *hs = vap->iv_hwmp;
+	struct ieee80211_hwmp_fi *fi, *next;
+
+	if (hs == NULL)
+		return;
+	HWMP_LOCK(hs);
+	TAILQ_FOREACH_SAFE(fi, &hs->hs_head, fi_next, next) {
+		TAILQ_REMOVE(&hs->hs_head, fi, fi_next);
+		free(fi, M_80211_HWMP);
+	}
+	HWMP_UNLOCK(hs);
+}
+
 void
 ieee80211_hwmp_vattach(struct ieee80211vap *vap)
 {
@@ -168,12 +231,8 @@ void
 ieee80211_hwmp_vdetach(struct ieee80211vap *vap)
 {
 	struct ieee80211_hwmp_state *hs = vap->iv_hwmp;
-	struct ieee80211_hwmp_fi *fi, *next;
 
-	TAILQ_FOREACH_SAFE(fi, &hs->hs_head, fi_next, next) {
-		TAILQ_REMOVE(&hs->hs_head, fi, fi_next);
-		free(fi, M_80211_HWMP);
-	}
+	hwmp_rt_flush(vap);
 	mtx_destroy(&hs->hs_lock);
 	free(vap->iv_hwmp, M_80211_HWMP);
 } 
@@ -182,22 +241,12 @@ int
 ieee80211_hwmp_newstate(struct ieee80211vap *vap, enum ieee80211_state ostate, int arg)
 {
 	enum ieee80211_state nstate = vap->iv_state;
-	struct ieee80211_hwmp_state *hs = vap->iv_hwmp;
-	struct ieee80211_hwmp_fi *fi, *next;
 
 	switch (nstate) {
 	case IEEE80211_S_SCAN:
 		switch (ostate) {
 		case IEEE80211_S_INIT:
-			/*
-			 * Flush the HWMP routing table
-			 */
-			if (hs == NULL)
-				return 0;
-			TAILQ_FOREACH_SAFE(fi, &hs->hs_head, fi_next, next) {
-				TAILQ_REMOVE(&hs->hs_head, fi, fi_next);
-				free(fi, M_80211_HWMP);
-			}
+			hwmp_rt_flush(vap);
 			break;
 		default:
 			break;
@@ -537,27 +586,16 @@ hwmp_recv_preq(struct ieee80211vap *vap,
 		return;
 	}
 
-	HWMP_LOCK(hs);
-	TAILQ_FOREACH(fi, &hs->hs_head, fi_next) {
-		if (IEEE80211_ADDR_EQ(PREQ_TADDR(0), fi->fi_dest))
-			break;
-	}
-	HWMP_UNLOCK(hs);
+	fi = hwmp_rt_find(vap, PREQ_TADDR(0));
 #if 0
 	/*
 	 * Record the PREQ ID and the originator MAC address.
 	 */
 	if (fi == NULL) {
-		fi = malloc(sizeof(struct ieee80211_hwmp_fi), M_80211_HWMP,
-		    M_NOWAIT | M_ZERO);
-		memset(fi, 0, sizeof(*fi));
-		IEEE80211_ADDR_COPY(fi->fi_dest, PREQ_TADDR(0));
+		fi = hwmp_rt_add(vap, PREQ_TADDR(0));
 		fi->fi_seq = preq->preq_origseq;
 		fi->fi_metric = preq->preq_metric;
 		fi->fi_lifetime = preq->preq_lifetime;
-		HWMP_LOCK(hs);
-		TAILQ_INSERT_TAIL(&hs->hs_head, fi, fi_next);
-		HWMP_UNLOCK(hs);
 	}
 	fi->fi_preqid = preq->preq_id;
 #endif
@@ -729,7 +767,6 @@ static void
 hwmp_recv_prep(struct ieee80211vap *vap, struct ieee80211_node *ni,
     const struct ieee80211_frame *wh, const struct ieee80211_meshprep_ie *prep)
 {
-	struct ieee80211_hwmp_state *hs = vap->iv_hwmp;
 	struct ieee80211_hwmp_fi *fi = NULL;
 
 	/*
@@ -743,12 +780,7 @@ hwmp_recv_prep(struct ieee80211vap *vap,
 	IEEE80211_NOTE(vap, IEEE80211_MSG_HWMP, ni,
 	    "received PREP from %s", ether_sprintf(prep->prep_origaddr));
 
-	HWMP_LOCK(hs);
-	TAILQ_FOREACH(fi, &hs->hs_head, fi_next) {
-		if (IEEE80211_ADDR_EQ(prep->prep_origaddr, fi->fi_dest))
-			break;
-	}
-	HWMP_UNLOCK(hs);
+	fi = hwmp_rt_find(vap, prep->prep_origaddr);
 
 	/*
 	 * If it's NOT for us, propagate the PREP if TTL is
@@ -834,7 +866,6 @@ static void
 hwmp_recv_perr(struct ieee80211vap *vap, struct ieee80211_node *ni,
     const struct ieee80211_frame *wh, const struct ieee80211_meshperr_ie *perr)
 {
-	struct ieee80211_hwmp_state *hs = vap->iv_hwmp;
 	struct ieee80211_hwmp_fi *fi = NULL;
 /* 	struct ieee80211_meshperr_ie pperr;*/
 
@@ -847,12 +878,7 @@ hwmp_recv_perr(struct ieee80211vap *vap,
 	    !(vap->iv_meshflags & IEEE80211_MFLAGS_FWRD))
 		return;
 
-	HWMP_LOCK(hs);
-	TAILQ_FOREACH(fi, &hs->hs_head, fi_next) {
-		if (IEEE80211_ADDR_EQ(PERR_DADDR(0), fi->fi_dest))
-			break;
-	}
-	HWMP_UNLOCK(hs);
+	fi = hwmp_rt_find(vap, PERR_DADDR(0));
 
 	if (fi == NULL)
 		return;
@@ -901,13 +927,10 @@ hwmp_recv_rann(struct ieee80211vap *vap,
 	/*
 	 * Acceptance criteria: check the HWMP sequence number
 	 * and the path metric is better than what we have.
+	 * XXX: TBD
 	 */
-	HWMP_LOCK(hs);
-	TAILQ_FOREACH(fi, &hs->hs_head, fi_next) {
-		if (IEEE80211_ADDR_EQ(rann->rann_addr, fi->fi_dest))
-			break;
-	}
-	HWMP_UNLOCK(hs);
+
+	fi = hwmp_rt_find(vap, rann->rann_addr);
 
 	if (fi == NULL) {
 		struct ieee80211_meshpreq_ie preq;
@@ -985,30 +1008,17 @@ ieee80211_hwmp_discover(struct ieee80211
 	if (IEEE80211_IS_MULTICAST(dest))
 		return ieee80211_find_txnode(vap, dest);
 
-	HWMP_LOCK(hs);
-	TAILQ_FOREACH(fi, &hs->hs_head, fi_next) {
-		if (IEEE80211_ADDR_EQ(fi->fi_dest, dest)) {
-			if (IEEE80211_ADDR_EQ(fi->fi_nexthop, invalidaddr)) {
-				/* XXX check preq retries */
-				sendpreq = 1;
-				unknowndst = 1;
-			}
-			break;
-		}
-	}
-	HWMP_UNLOCK(hs);
-
+	fi = hwmp_rt_find(vap, dest);
 	if (fi == NULL) {
-		fi = malloc(sizeof(struct ieee80211_hwmp_fi), M_80211_HWMP,
-		    M_NOWAIT | M_ZERO);
-		IEEE80211_ADDR_COPY(fi->fi_dest, dest);
+		fi = hwmp_rt_add(vap, dest);
 		fi->fi_seq = ++hs->hs_seq;
 		fi->fi_preqid = ++hs->hs_preqid;
 		fi->fi_metric = IEEE80211_MESHLMETRIC_INITIALVAL;
 		fi->fi_lifetime = timeval2msecs(ieee80211_hwmp_pathtimeout);
-		HWMP_LOCK(hs);
-		TAILQ_INSERT_TAIL(&hs->hs_head, fi, fi_next);
-		HWMP_UNLOCK(hs);
+		sendpreq = 1;
+		unknowndst = 1;
+	} else if (IEEE80211_ADDR_EQ(fi->fi_nexthop, invalidaddr)) {
+		/* XXX check preq retries */
 		sendpreq = 1;
 		unknowndst = 1;
 	}
@@ -1062,15 +1072,9 @@ struct ieee80211_node *
 ieee80211_hwmp_find_txnode(struct ieee80211vap *vap,
     uint8_t dest[IEEE80211_ADDR_LEN])
 {
-	struct ieee80211_hwmp_state *hs = vap->iv_hwmp;
 	struct ieee80211_hwmp_fi *fi;
 
-	HWMP_LOCK(hs);
-	TAILQ_FOREACH(fi, &hs->hs_head, fi_next) {
-		if (IEEE80211_ADDR_EQ(fi->fi_dest, dest))
-			break;
-	}
-	HWMP_UNLOCK(hs);
+	fi = hwmp_rt_find(vap, dest);
 	if (fi == NULL)
 		return NULL;
 	return ieee80211_find_txnode(vap, fi->fi_nexthop);
@@ -1142,12 +1146,7 @@ hwmp_ioctl_set80211(struct ieee80211vap 
 	case IEEE80211_HWMP_CMD_LIST:
 		return EINVAL;
 	case IEEE80211_HWMP_CMD_FLUSH:
-		HWMP_LOCK(hs);
-		TAILQ_FOREACH_SAFE(fi, &hs->hs_head, fi_next, next) {
-			TAILQ_REMOVE(&hs->hs_head, fi, fi_next);
-			free(fi, M_80211_HWMP);
-		}
-		HWMP_UNLOCK(hs);
+		hwmp_rt_flush(vap);
 		break;
 	case IEEE80211_HWMP_CMD_ADD:
 		HWMP_LOCK(hs);


More information about the svn-src-projects mailing list