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

Rui Paulo rpaulo at FreeBSD.org
Thu Jun 11 11:59:53 UTC 2009


Author: rpaulo
Date: Thu Jun 11 11:59:53 2009
New Revision: 193989
URL: http://svn.freebsd.org/changeset/base/193989

Log:
  Fix some code that was introduced in previous revisions.
  Add a bit more of PREP processing, still unfinished.
  This makes HWMP usable for local neighbors.
  
  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	Thu Jun 11 11:17:16 2009	(r193988)
+++ projects/mesh11s/sys/net80211/ieee80211_hwmp.c	Thu Jun 11 11:59:53 2009	(r193989)
@@ -75,22 +75,22 @@ static uint8_t *hwmp_add_meshperr(uint8_
 static uint8_t *hwmp_add_meshrann(uint8_t *,
     const struct ieee80211_meshrann_ie *);
 static void	hwmp_recv_preq(struct ieee80211vap *, struct ieee80211_node *,
-    const struct ieee80211_meshpreq_ie *);
+    const struct ieee80211_frame *, const struct ieee80211_meshpreq_ie *);
 static inline int hwmp_send_preq(struct ieee80211_node *,
     const uint8_t [IEEE80211_ADDR_LEN], const uint8_t [IEEE80211_ADDR_LEN],
     struct ieee80211_meshpreq_ie *);
 static void	hwmp_recv_prep(struct ieee80211vap *, struct ieee80211_node *,
-    const struct ieee80211_meshprep_ie *);
+    const struct ieee80211_frame *, const struct ieee80211_meshprep_ie *);
 static inline int hwmp_send_prep(struct ieee80211_node *,
     const uint8_t [IEEE80211_ADDR_LEN], const uint8_t [IEEE80211_ADDR_LEN],
     struct ieee80211_meshprep_ie *);
 static void	hwmp_recv_perr(struct ieee80211vap *, struct ieee80211_node *,
-    const struct ieee80211_meshperr_ie *);
+    const struct ieee80211_frame *, const struct ieee80211_meshperr_ie *);
 static inline int hwmp_send_perr(struct ieee80211_node *,
     const uint8_t [IEEE80211_ADDR_LEN], const uint8_t [IEEE80211_ADDR_LEN],
     struct ieee80211_meshperr_ie *);
 static void	hwmp_recv_rann(struct ieee80211vap *, struct ieee80211_node *,
-   const  struct ieee80211_meshrann_ie *);
+   const struct ieee80211_frame *, const  struct ieee80211_meshrann_ie *);
 static inline int hwmp_send_rann(struct ieee80211_node *,
     const uint8_t [IEEE80211_ADDR_LEN], const uint8_t [IEEE80211_ADDR_LEN],
     struct ieee80211_meshrann_ie *);
@@ -240,7 +240,7 @@ ieee80211_hwmp_recv_action(struct ieee80
 			vap->iv_stats.is_rx_mgtdiscard++;
 			return;
 		}
-		hwmp_recv_preq(vap, ni, meshpreq);
+		hwmp_recv_preq(vap, ni, wh, meshpreq);
 		break;
 	case IEEE80211_ACTION_MESHPATH_REP:
 		if (meshprep == NULL) {
@@ -250,7 +250,7 @@ ieee80211_hwmp_recv_action(struct ieee80
 			vap->iv_stats.is_rx_mgtdiscard++;
 			return;
 		}
-		hwmp_recv_prep(vap, ni, meshprep);
+		hwmp_recv_prep(vap, ni, wh, meshprep);
 		break;
 	case IEEE80211_ACTION_MESHPATH_ERR:
 		if (meshperr == NULL) {
@@ -260,7 +260,7 @@ ieee80211_hwmp_recv_action(struct ieee80
 			vap->iv_stats.is_rx_mgtdiscard++;
 			return;
 		}
-		hwmp_recv_perr(vap, ni, meshperr);
+		hwmp_recv_perr(vap, ni, wh, meshperr);
 		break;
 	case IEEE80211_ACTION_MESHPATH_RANN:
 		if (meshrann == NULL) {
@@ -270,7 +270,7 @@ ieee80211_hwmp_recv_action(struct ieee80
 			vap->iv_stats.is_rx_mgtdiscard++;
 			return;
 		}
-		hwmp_recv_rann(vap, ni, meshrann);
+		hwmp_recv_rann(vap, ni, wh, meshrann);
 		break;
 	default:
 		IEEE80211_DISCARD_MAC(vap, IEEE80211_MSG_MESH,
@@ -472,7 +472,7 @@ hwmp_add_meshrann(uint8_t *frm, const st
 #define	PREQ_TSEQ(n)	preq->preq_targets[n].target_seq
 static void
 hwmp_recv_preq(struct ieee80211vap *vap, struct ieee80211_node *ni,
-    const struct ieee80211_meshpreq_ie *preq)
+    const struct ieee80211_frame *wh, const struct ieee80211_meshpreq_ie *preq)
 {
 	struct ieee80211_hwmp_state *hs = vap->iv_hwmp;
 	struct ieee80211_hwmp_fi *fi = NULL;
@@ -493,7 +493,7 @@ hwmp_recv_preq(struct ieee80211vap *vap,
 
 	mtx_lock(&hs->hs_lock);
 	TAILQ_FOREACH(fi, &hs->hs_head, fi_next) {
-		if (IEEE80211_ADDR_EQ(PREQ_TADDR(0), fi->fi_dest))
+		if (IEEE80211_ADDR_EQ(preq->preq_origaddr, fi->fi_dest))
 			break;
 	}
 	mtx_unlock(&hs->hs_lock);
@@ -539,13 +539,15 @@ hwmp_recv_preq(struct ieee80211vap *vap,
 		prep.prep_origseq = hs->hs_seq++;
 		/* XXX addr1 = next hop */
 		hwmp_send_prep(ni, vap->iv_myaddr, preq->preq_origaddr, &prep);
+#if 0
 		/*
 		 * Build the reverse path, if we don't have it already.
 		 */
 		if (fi == NULL ||
-		    memcmp(fi->fi_nexthop, invalidaddr, IEEE80211_ADDR_LEN)) {
+		    IEEE80211_ADDR_EQ(fi->fi_nexthop, invalidaddr)) {
 			ieee80211_hwmp_discover(vap, fi->fi_dest);
 		}
+#endif
 
 		return;
 	}
@@ -666,8 +668,10 @@ hwmp_send_preq(struct ieee80211_node *ni
 
 static void
 hwmp_recv_prep(struct ieee80211vap *vap, struct ieee80211_node *ni,
-    const struct ieee80211_meshprep_ie *prep)
+    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;
 
 	/*
 	 * Acceptance criteria: if the PREP was not generated by us and
@@ -677,10 +681,28 @@ hwmp_recv_prep(struct ieee80211vap *vap,
 	    !(vap->iv_meshflags & IEEE80211_MFLAGS_FWRD))
 		return;
 
+	IEEE80211_NOTE(vap, IEEE80211_MSG_MESH, ni,
+	    "received PREP from %s", ether_sprintf(prep->prep_origaddr));
+
 	/*
-	 * Update the Forwarding Information.
+	 * Find out if this path reply is useful to us.
 	 */
+	mtx_lock(&hs->hs_lock);
+	TAILQ_FOREACH(fi, &hs->hs_head, fi_next) {
+		if (IEEE80211_ADDR_EQ(prep->prep_targetaddr, fi->fi_dest))
+			break;
+	}
+	mtx_unlock(&hs->hs_lock);
 
+	/* XXX */
+	if (fi == NULL)
+		return;
+
+	/*
+	 * Record the next hop.
+	 * XXX check for SEQ and PREQ ID.
+	 */
+	IEEE80211_ADDR_COPY(fi->fi_nexthop, wh->i_addr2);
 
 	/*
 	 * If it's NOT for us, propagate the PREP if TTL is
@@ -740,7 +762,7 @@ hwmp_send_prep(struct ieee80211_node *ni
 #define	PREQ_DSEQ(n)	perr->perr_dests[n].dest_seq
 static void
 hwmp_recv_perr(struct ieee80211vap *vap, struct ieee80211_node *ni,
-    const struct ieee80211_meshperr_ie *perr)
+    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;
@@ -792,7 +814,7 @@ hwmp_send_perr(struct ieee80211_node *ni
 
 static void
 hwmp_recv_rann(struct ieee80211vap *vap, struct ieee80211_node *ni,
-    const struct ieee80211_meshrann_ie *rann)
+    const struct ieee80211_frame *wh, const struct ieee80211_meshrann_ie *rann)
 {
 	struct ieee80211_hwmp_state *hs = vap->iv_hwmp;
 	struct ieee80211_hwmp_fi *fi = NULL;
@@ -881,16 +903,14 @@ ieee80211_hwmp_discover(struct ieee80211
 	if (IEEE80211_IS_MULTICAST(dest))
 		return ieee80211_find_txnode(vap, dest);
 
-	IEEE80211_NOTE_MAC(vap, IEEE80211_MSG_MESH, dest,
-	    "%s", "initiating path discovery");
-
 	mtx_lock(&hs->hs_lock);
 	TAILQ_FOREACH(fi, &hs->hs_head, fi_next) {
-		if (IEEE80211_ADDR_EQ(fi->fi_dest, dest) &&
-		    IEEE80211_ADDR_EQ(fi->fi_nexthop, invalidaddr)) {
-			/* XXX check preq retries */
-			sendpreq = 1;
-			unknowndst = 1;
+		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;
 		}
 	}
@@ -901,6 +921,7 @@ ieee80211_hwmp_discover(struct ieee80211
 		    M_NOWAIT | M_ZERO);
 		IEEE80211_ADDR_COPY(fi->fi_dest, dest);
 		fi->fi_seq = ++hs->hs_seq;
+		fi->fi_preqid = ++hs->hs_preqid;
 		fi->fi_metric = IEEE80211_MESHLMETRIC_INITIALVAL;
 		fi->fi_lifetime = ieee80211_hwmp_pathtimeout;
 		mtx_lock(&hs->hs_lock);
@@ -911,13 +932,15 @@ ieee80211_hwmp_discover(struct ieee80211
 	}
 
 	if (sendpreq) {
+		IEEE80211_NOTE_MAC(vap, IEEE80211_MSG_MESH, dest,
+		    "%s", "initiating path discovery");
 		/*
 		 * Try to discover the path for this node.
 		 */
 		preq.preq_flags = 0;
 		preq.preq_hopcount = 0;
 		preq.preq_ttl = ieee80211_mesh_ttl;
-		preq.preq_id = ++hs->hs_preqid;
+		preq.preq_id = fi->fi_preqid;
 		IEEE80211_ADDR_COPY(preq.preq_origaddr, vap->iv_myaddr);
 		preq.preq_origseq = fi->fi_seq;
 		preq.preq_lifetime = fi->fi_lifetime;


More information about the svn-src-projects mailing list