Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 29 May 2009 18:48:19 +0000 (UTC)
From:      Rui Paulo <rpaulo@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r193046 - projects/mesh11s/sys/net80211
Message-ID:  <200905291848.n4TImJjO083220@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: rpaulo
Date: Fri May 29 18:48:18 2009
New Revision: 193046
URL: http://svn.freebsd.org/changeset/base/193046

Log:
  * fill up the forwarding information table a little more
  * explain root modes
  * implement PREQ intermediate reply and PREQ propagation
  * fix PREP propagation
  * remove vap arg from ieee80211_airtime_calc()
  
  Sponsored by:	The FreeBSD Foundation

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

Modified: projects/mesh11s/sys/net80211/ieee80211_hwmp.c
==============================================================================
--- projects/mesh11s/sys/net80211/ieee80211_hwmp.c	Fri May 29 18:46:57 2009	(r193045)
+++ projects/mesh11s/sys/net80211/ieee80211_hwmp.c	Fri May 29 18:48:18 2009	(r193046)
@@ -65,15 +65,16 @@ __FBSDID("$FreeBSD$");
 
 /*
  * HWMP Forwarding Information table.
+ * XXX: this should be in vap
  */
 struct ieee80211_hwmp_fi {
-	TAILQ_ENTRY(ieee80211_hwmp_fi) fi_list;
-	uint8_t		fi_target[IEEE80211_ADDR_LEN];
+	TAILQ_ENTRY(ieee80211_hwmp_fi) fi_next;
+	uint8_t		fi_dest[IEEE80211_ADDR_LEN];
 	ieee80211_seq	fi_seq;			/* HWMP sequence number */
-        uint8_t		fi_mnxthop[IEEE80211_ADDR_LEN];
+        uint8_t		fi_nexthop[IEEE80211_ADDR_LEN];
 	uint32_t	fi_metric;		/* Path Metric */
 	uint32_t	fi_nhops;		/* Number of Hops */
-	/* XXX percursor list */
+	uint8_t		fi_prevhop[IEEE80211_ADDR_LEN];
 	uint32_t	fi_lifetime;
 };
 TAILQ_HEAD(, ieee80211_hwmp_fi)	ieee80211_hwmp_ft;
@@ -85,23 +86,23 @@ static void	hwmp_recv_preq(struct ieee80
     const struct ieee80211_meshpreq_ie *);
 static int	hwmp_send_preq(struct ieee80211_node *,
     const uint8_t [IEEE80211_ADDR_LEN], const uint8_t [IEEE80211_ADDR_LEN],
-    const struct ieee80211_meshpreq_ie *);
+    struct ieee80211_meshpreq_ie *);
 static void	hwmp_recv_prep(struct ieee80211vap *, struct ieee80211_node *,
     const struct ieee80211_meshprep_ie *);
 static int	hwmp_send_prep(struct ieee80211_node *,
     const uint8_t [IEEE80211_ADDR_LEN], const uint8_t [IEEE80211_ADDR_LEN],
-    const struct ieee80211_meshprep_ie *);
+    struct ieee80211_meshprep_ie *);
 static void	hwmp_recv_perr(struct ieee80211vap *, struct ieee80211_node *,
     const struct ieee80211_meshperr_ie *);
 static int	hwmp_send_perr(struct ieee80211_node *,
     const uint8_t [IEEE80211_ADDR_LEN], const uint8_t [IEEE80211_ADDR_LEN],
-    const struct ieee80211_meshperr_ie *);
+    struct ieee80211_meshperr_ie *);
 static void	hwmp_recv_rann(struct ieee80211vap *, struct ieee80211_node *,
-    const struct ieee80211_meshrann_ie *);
+   const  struct ieee80211_meshrann_ie *);
 #ifdef notyet
 static int	hwmp_send_rann(struct ieee80211_node *,
     const uint8_t [IEEE80211_ADDR_LEN], const uint8_t [IEEE80211_ADDR_LEN],
-    const struct ieee80211_meshrann_ie *);
+    struct ieee80211_meshrann_ie *);
 #endif
 
 static int	ieee80211_hwmp_maxhops = 31;	
@@ -126,9 +127,12 @@ static int	ieee80211_hwmp_confirmint = 2
 
 /*
  * Target Address set in a Proactive PREQ.
+ * XXX
  */
 static const uint8_t	proactiveaddr[IEEE80211_ADDR_LEN] =
 	{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
+static const uint8_t	broadcastaddr[IEEE80211_ADDR_LEN] =
+	{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
 
 SYSCTL_NODE(_net_wlan, OID_AUTO, hwmp, CTLFLAG_RD, 0,
     "IEEE 802.11s HWMP parameters");
@@ -140,7 +144,9 @@ SYSCTL_INT(_net_wlan_hwmp, OID_AUTO, rep
     &ieee80211_hwmp_replyforward, 0, "TBD");
 #ifdef notyet
 SYSCTL_INT(_net_wlan_hwmp, OID_AUTO, rootmode, CTLTYPE_INT | CTLFLAG_RW,
-    &ieee80211_hwmp_rootmode, 0, "Root Mesh Point Node");
+    &ieee80211_hwmp_rootmode, 0, "0 = Not a Root, "
+    "2 = Root with normal PREPs, 3 = Root with proactive PREPs, "
+    "3 = Root with RANNs");
 #endif
 
 extern int	ieee80211_mesh_ttl;
@@ -374,6 +380,8 @@ static void
 hwmp_recv_preq(struct ieee80211vap *vap, struct ieee80211_node *ni,
     const struct ieee80211_meshpreq_ie *preq)
 {
+	struct ieee80211_hwmp_fi *fi;
+
 	/*
 	 * Acceptance criteria: if the PREQ is not for us and
 	 * forwarding is disabled, discard this PREQ.
@@ -382,6 +390,14 @@ hwmp_recv_preq(struct ieee80211vap *vap,
 	    !ieee80211_mesh_forwarding)
 		return;
 
+	fi = NULL;
+	/*HWMP_LOCK();*/
+	TAILQ_FOREACH(fi, &ieee80211_hwmp_ft, fi_next) {
+		if (IEEE80211_ADDR_EQ(PREQ_TADDR(0), fi->fi_dest))
+			break;
+	}
+	/*HWMP_UNLOCK();*/
+
 	/*
 	 * Step 1. Record the PREQ ID and the originator MAC address.
 	 */
@@ -418,15 +434,70 @@ hwmp_recv_preq(struct ieee80211vap *vap,
 	/* XXX: Step 4. Check for AE bit and update proxy information */
 
 	/*
-	 * Step 5. Intermediate reply: check if we have this path on our
-	 * table and the TO bit is unset.
+	 * Step 5. Intermediate reply for PREQs with 1 target.
 	 */
-	if (!(PREQ_TFLAGS(0) & IEEE80211_MESHPREQ_TFLAGS_TO)) {
+	if (preq->preq_ttl > 1 && preq->preq_tcount == 1 &&
+	    !(PREQ_TFLAGS(0) & IEEE80211_MESHPREQ_TFLAGS_TO)) {
+		struct ieee80211_meshpreq_ie ppreq; /* propagated PREQ */
+
+		memcpy(&ppreq, preq, sizeof(ppreq));
+		/*
+		 * Can we do an intermediate path reply?
+		 */
+		if (fi != NULL) {
+			struct ieee80211_meshprep_ie prep;
 
+			/*
+			 * Propagate the original PREQ.
+			 */
+			ppreq.preq_hopcount += 1;
+			ppreq.preq_ttl -= 1;
+			ppreq.preq_metric += ieee80211_airtime_calc(ni);
+			/*
+			 * Set TO and unset RF bits because we are going
+			 * to send a PREP next.
+			 */
+			ppreq.preq_targets[0].target_flags |=
+			    IEEE80211_MESHPREQ_TFLAGS_TO;
+			ppreq.preq_targets[0].target_flags &=
+			    ~IEEE80211_MESHPREQ_TFLAGS_RF;
+			hwmp_send_preq(ni, vap->iv_myaddr, broadcastaddr,
+			    &ppreq);
+
+			/*
+			 * Build and send an intermediate PREP.
+			 */
+			prep.prep_flags = 0;
+			prep.prep_hopcount = 0;
+			prep.prep_ttl = ieee80211_mesh_ttl;
+			IEEE80211_ADDR_COPY(&prep.prep_targetaddr,
+			    preq->preq_origaddr);
+			prep.prep_targetseq = fi->fi_seq;
+			prep.prep_lifetime = preq->preq_lifetime;
+			prep.prep_metric = fi->fi_metric;
+			IEEE80211_ADDR_COPY(&prep.prep_origaddr,
+			    vap->iv_myaddr);
+			/* XXX */
+			prep.prep_origseq = 1;
+			hwmp_send_prep(ni, vap->iv_myaddr, broadcastaddr,
+			    &prep);
+		} else {
+			/*
+			 * We have no information about this path,
+			 * propagate the PREQ.
+			 */
+			ppreq.preq_hopcount += 1;
+			ppreq.preq_ttl -= 1;
+			ppreq.preq_metric += ieee80211_airtime_calc(ni);
+			hwmp_send_preq(ni, vap->iv_myaddr, broadcastaddr,
+			    &ppreq);
+		}
 		/*
 		 * XXX: Step 6. Update the percursor table
 		 */
+		return;
 	}
+		
 
 	/*
 	 * XXX: Step 8. Proactive PREQ: reply with a proactive PREP to the
@@ -452,7 +523,7 @@ static inline int
 hwmp_send_preq(struct ieee80211_node *ni,
     const uint8_t addr1[IEEE80211_ADDR_LEN],
     const uint8_t addr2[IEEE80211_ADDR_LEN],
-    const struct ieee80211_meshpreq_ie *preq)
+    struct ieee80211_meshpreq_ie *preq)
 {
 	/*
 	 * mesh preq action frame format
@@ -463,6 +534,10 @@ hwmp_send_preq(struct ieee80211_node *ni
 	 *     [1] category
 	 *     [tlv] mesh path request
 	 */
+	/* XXX target count > 1 */
+	preq->preq_ie = IEEE80211_ELEMID_MESHPREQ;
+	preq->preq_len = sizeof(struct ieee80211_meshpreq_ie) - 2;
+
 	return ieee80211_hwmp_send_action(ni, addr1, addr2, (uint8_t *)&preq,
 	    sizeof(*preq));
 }
@@ -471,7 +546,6 @@ static void
 hwmp_recv_prep(struct ieee80211vap *vap, struct ieee80211_node *ni,
     const struct ieee80211_meshprep_ie *prep)
 {
-	union ieee80211_send_action_args vargs;                 
 
 	/*
 	 * Acceptance criteria: if the PREP was not generated by us and
@@ -485,6 +559,7 @@ hwmp_recv_prep(struct ieee80211vap *vap,
 	 * Step 1: Update the Forwarding Information.
 	 */
 
+
 	/*
 	 * Step 2: If it's NOT for us, propagate the PREP if TTL is
 	 * greater than 1.
@@ -496,14 +571,11 @@ hwmp_recv_prep(struct ieee80211vap *vap,
 		memcpy(&pprep, prep, sizeof(pprep));
 		pprep.prep_hopcount += 1;
 		pprep.prep_ttl -= 1;
-		pprep.prep_metric += ieee80211_airtime_calc(vap, ni);
+		pprep.prep_metric += ieee80211_airtime_calc(ni);
 		IEEE80211_ADDR_COPY(pprep.prep_origaddr, vap->iv_myaddr);
 		pprep.prep_origseq = 1; /* XXX */
-
-		vargs.ptrarg = &pprep;
-		ieee80211_send_action(ni, IEEE80211_ACTION_CAT_MESHPATH,
-		    IEEE80211_ACTION_MESHPATH_REQ, vargs);
-
+		hwmp_send_prep(ni, vap->iv_myaddr, broadcastaddr,
+		    &pprep);
 		/*
 		 * XXX: Step 5: update the precursor list.
 		 */
@@ -527,7 +599,7 @@ static inline int
 hwmp_send_prep(struct ieee80211_node *ni,
     const uint8_t addr1[IEEE80211_ADDR_LEN],
     const uint8_t addr2[IEEE80211_ADDR_LEN],
-    const struct ieee80211_meshprep_ie *prep)
+    struct ieee80211_meshprep_ie *prep)
 {
 	/*
 	 * mesh prep action frame format
@@ -538,6 +610,9 @@ hwmp_send_prep(struct ieee80211_node *ni
 	 *     [1] category
 	 *     [tlv] mesh path reply
 	 */
+	prep->prep_ie = IEEE80211_ELEMID_MESHPREP;
+	prep->prep_len = sizeof(struct ieee80211_meshprep_ie) - 2;
+
 	return ieee80211_hwmp_send_action(ni, addr1, addr2, (uint8_t *)&prep,
 	    sizeof(*prep));
 }
@@ -554,7 +629,7 @@ static inline int
 hwmp_send_perr(struct ieee80211_node *ni,
     const uint8_t addr1[IEEE80211_ADDR_LEN],
     const uint8_t addr2[IEEE80211_ADDR_LEN],
-    const struct ieee80211_meshperr_ie *perr)
+    struct ieee80211_meshperr_ie *perr)
 {
 	/*
 	 * mesh perr action frame format
@@ -581,7 +656,7 @@ static int
 hwmp_send_rann(struct ieee80211_node *ni,
     const uint8_t addr1[IEEE80211_ADDR_LEN],
     const uint8_t addr2[IEEE80211_ADDR_LEN],
-    const struct ieee80211_meshrann_ie *rann)
+    struct ieee80211_meshrann_ie *rann)
 {
 	/*
 	 * mesh rann action frame format

Modified: projects/mesh11s/sys/net80211/ieee80211_mesh.c
==============================================================================
--- projects/mesh11s/sys/net80211/ieee80211_mesh.c	Fri May 29 18:46:57 2009	(r193045)
+++ projects/mesh11s/sys/net80211/ieee80211_mesh.c	Fri May 29 18:48:18 2009	(r193046)
@@ -878,7 +878,7 @@ mesh_recv_action(struct ieee80211_node *
 
 			/* XXX: check if we are using airtime or
 			   aother algorithm */
-			metric = ieee80211_airtime_calc(vap, ni);
+			metric = ieee80211_airtime_calc(ni);
 			vargs.ptrarg = &metric;
 			ieee80211_send_action(ni,
 			    IEEE80211_ACTION_CAT_MESHLMETRIC,
@@ -1151,7 +1151,7 @@ ieee80211_add_meshpeer(uint8_t *frm, uin
  * Based on D3.0.
  */
 uint32_t
-ieee80211_airtime_calc(struct ieee80211vap *vap, struct ieee80211_node *ni)
+ieee80211_airtime_calc(struct ieee80211_node *ni)
 {
 #define M_BITS 8
 #define S_FACTOR (2 * M_BITS)

Modified: projects/mesh11s/sys/net80211/ieee80211_mesh.h
==============================================================================
--- projects/mesh11s/sys/net80211/ieee80211_mesh.h	Fri May 29 18:46:57 2009	(r193045)
+++ projects/mesh11s/sys/net80211/ieee80211_mesh.h	Fri May 29 18:48:18 2009	(r193046)
@@ -353,8 +353,7 @@ uint8_t *	ieee80211_add_meshid(uint8_t *
 uint8_t *	ieee80211_add_meshconf(uint8_t *, struct ieee80211vap *);
 uint8_t *	ieee80211_add_meshpeer(uint8_t *, uint8_t, uint16_t, uint16_t,
 		    uint16_t);
-uint32_t	ieee80211_airtime_calc(struct ieee80211vap *,
-		    struct ieee80211_node *);
+uint32_t	ieee80211_airtime_calc(struct ieee80211_node *);
 uint8_t *	ieee80211_add_meshlmetric(uint8_t *, uint32_t);
 void		ieee80211_create_mbss(struct ieee80211vap *, struct
 		    ieee80211_channel *);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200905291848.n4TImJjO083220>