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

Rui Paulo rpaulo at FreeBSD.org
Sat May 30 16:26:08 UTC 2009


Author: rpaulo
Date: Sat May 30 16:26:08 2009
New Revision: 193099
URL: http://svn.freebsd.org/changeset/base/193099

Log:
  * move struct ieee80211_hwmp_fi to ieee80211_hwmp.h so we can add one
  per vap
  * add initial hanlding of root annoucement frames, the proactive side of
  HWMP
  * add initial handling of PERR frames
  
  Sponsored by:	The FreeBSD Foundation

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

Modified: projects/mesh11s/sys/net80211/ieee80211_hwmp.c
==============================================================================
--- projects/mesh11s/sys/net80211/ieee80211_hwmp.c	Sat May 30 15:20:25 2009	(r193098)
+++ projects/mesh11s/sys/net80211/ieee80211_hwmp.c	Sat May 30 16:26:08 2009	(r193099)
@@ -63,20 +63,6 @@ __FBSDID("$FreeBSD$");
 #include <net80211/ieee80211_hwmp.h>
 #include <net80211/ieee80211_input.h>
 
-/*
- * HWMP Forwarding Information table.
- * XXX: this should be in vap
- */
-struct ieee80211_hwmp_fi {
-	TAILQ_ENTRY(ieee80211_hwmp_fi) fi_next;
-	uint8_t		fi_dest[IEEE80211_ADDR_LEN];
-	ieee80211_seq	fi_seq;			/* HWMP sequence number */
-        uint8_t		fi_nexthop[IEEE80211_ADDR_LEN];
-	uint32_t	fi_metric;		/* Path Metric */
-	uint32_t	fi_nhops;		/* Number of Hops */
-	uint8_t		fi_prevhop[IEEE80211_ADDR_LEN];
-	uint32_t	fi_lifetime;
-};
 TAILQ_HEAD(, ieee80211_hwmp_fi)	ieee80211_hwmp_ft;
 
 static int	ieee80211_hwmp_send_action(struct ieee80211_node *,
@@ -99,11 +85,9 @@ static int	hwmp_send_perr(struct ieee802
     struct ieee80211_meshperr_ie *);
 static void	hwmp_recv_rann(struct ieee80211vap *, struct ieee80211_node *,
    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],
     struct ieee80211_meshrann_ie *);
-#endif
 
 static int	ieee80211_hwmp_maxhops = 31;	
 #ifdef notyet
@@ -111,9 +95,11 @@ static int	ieee80211_hwmp_maxhopstime = 
 static int	ieee80211_hwmp_maxprepretries = 3;
 static int	ieee80211_hwmp_prepminint = 100;
 static int	ieee80211_hwmp_perrminint = 100;
+#endif
 static int	ieee80211_hwmp_roottimeout = 5000;
+#ifdef notyet
 static int	ieee80211_hwmp_pathtimeout = 5000;
-static int	ieee80211_hwmp_rootmode = 0;
+static int	ieee80211_hwmp_rootmode = 0;	/* XXX move to vap */
 static int	ieee80211_hwmp_pathtoroottimeout = 5000;
 static int	ieee80211_hmwp_rootint = 2000;
 static int	ieee80211_hwmp_rannint = 1000;
@@ -515,9 +501,9 @@ hwmp_recv_preq(struct ieee80211vap *vap,
 		}
 	}
 }
-#undef PREQ_TFLAGS
-#undef PREQ_TADDR
-#undef PREQ_TSEQ
+#undef	PREQ_TFLAGS
+#undef	PREQ_TADDR
+#undef	PREQ_TSEQ
 
 static inline int
 hwmp_send_preq(struct ieee80211_node *ni,
@@ -617,13 +603,39 @@ hwmp_send_prep(struct ieee80211_node *ni
 	    sizeof(*prep));
 }
 
+#define	PERR_DADDR(n)	perr->perr_dests[n].dest_addr
+#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)
 {
+	struct ieee80211_hwmp_fi *fi;
+/* 	struct ieee80211_meshperr_ie pperr;*/
 
-}
+	/*
+	 * Acceptance criteria: check if we received a PERR from a
+	 * neighbor and forwarding is 1.
+	 */
+	if (ni == vap->iv_bss ||
+	    ni->ni_mlstate != IEEE80211_NODE_MESH_ESTABLISHED ||
+	    !ieee80211_mesh_forwarding)
+		return;
+
+	fi = NULL;
+	/*HWMP_LOCK();*/
+	TAILQ_FOREACH(fi, &ieee80211_hwmp_ft, fi_next) {
+		if (IEEE80211_ADDR_EQ(PERR_DADDR(0), fi->fi_dest))
+			break;
+	}
+
+	if (fi == NULL)
+		return;
+
+	/*
+	 * Propagate the PERR.
+	 */
 
+}
 
 static inline int
 hwmp_send_perr(struct ieee80211_node *ni,
@@ -640,6 +652,9 @@ hwmp_send_perr(struct ieee80211_node *ni
 	 *     [1] category
 	 *     [tlv] mesh path error
 	 */
+	perr->perr_ie = IEEE80211_ELEMID_MESHPERR;
+	perr->perr_len = sizeof(struct ieee80211_meshperr_ie) - 2;
+
 	return ieee80211_hwmp_send_action(ni, addr1, addr2, (uint8_t *)&perr,
 	    sizeof(*perr));
 }
@@ -648,10 +663,56 @@ static void
 hwmp_recv_rann(struct ieee80211vap *vap, struct ieee80211_node *ni,
     const struct ieee80211_meshrann_ie *rann)
 {
+	struct ieee80211_hwmp_fi *fi;
 
+	/*
+	 * Acceptance criteria: check the HWMP sequence number
+	 * and the path metric is better than what we have.
+	 */
+	fi = NULL;
+	/*HWMP_LOCK();*/
+	TAILQ_FOREACH(fi, &ieee80211_hwmp_ft, fi_next) {
+		if (IEEE80211_ADDR_EQ(rann->rann_addr, fi->fi_dest))
+			break;
+	}
+	/*HWMP_UNLOCK();*/
+
+	if (fi == NULL) {
+		struct ieee80211_meshpreq_ie preq;
+
+		/*
+		 * Try to establish a path to this root mesh station.
+		 */
+		preq.preq_flags = 0;
+		preq.preq_hopcount = 0;
+		preq.preq_ttl = ieee80211_mesh_ttl;
+		IEEE80211_ADDR_COPY(&preq.preq_origaddr,
+		    vap->iv_myaddr);
+		preq.preq_origseq = 0; /* XXX */
+		preq.preq_targets[0].target_flags |=
+		    IEEE80211_MESHPREQ_TFLAGS_TO;
+		IEEE80211_ADDR_COPY(preq.preq_targets[0].target_addr,
+		    rann->rann_addr);
+		preq.preq_targets[0].target_seq = rann->rann_seq;
+		preq.preq_lifetime = ieee80211_hwmp_roottimeout;
+		preq.preq_metric = IEEE80211_MESHLMETRIC_INITIALVAL; 
+		hwmp_send_preq(ni, vap->iv_myaddr, broadcastaddr,
+		    &preq);
+	/*
+	 * We have a path for this Root Mesh station, so
+	 * propagate the RANN if forwarding is enabled.
+	 */
+	} else if (rann->rann_ttl > 1 && ieee80211_mesh_forwarding) {
+		struct ieee80211_meshrann_ie prann;
+
+		memcpy(&prann, rann, sizeof(prann));
+		prann.rann_hopcount += 1;
+		prann.rann_ttl -= 1;
+		prann.rann_metric += ieee80211_airtime_calc(ni);
+		hwmp_send_rann(ni, broadcastaddr, vap->iv_myaddr, &prann);
+	}
 }
 
-#ifdef notyet
 static int
 hwmp_send_rann(struct ieee80211_node *ni,
     const uint8_t addr1[IEEE80211_ADDR_LEN],
@@ -667,10 +728,12 @@ hwmp_send_rann(struct ieee80211_node *ni
 	 *     [1] category
 	 *     [tlv] root annoucement
 	 */
+	rann->rann_ie = IEEE80211_ELEMID_MESHRANN;
+	rann->rann_len = sizeof(struct ieee80211_meshrann_ie) - 2;
+
 	return ieee80211_hwmp_send_action(ni, addr1, addr2, (uint8_t *)&rann,
 	    sizeof(*rann));
 }
-#endif
 
 static int
 hwmp_ioctl_get80211(struct ieee80211vap *vap, struct ieee80211req *ireq)

Modified: projects/mesh11s/sys/net80211/ieee80211_hwmp.h
==============================================================================
--- projects/mesh11s/sys/net80211/ieee80211_hwmp.h	Sat May 30 15:20:25 2009	(r193098)
+++ projects/mesh11s/sys/net80211/ieee80211_hwmp.h	Sat May 30 16:26:08 2009	(r193099)
@@ -31,6 +31,20 @@
 #ifndef _NET80211_IEEE80211_HWMP_H_
 #define _NET80211_IEEE80211_HWMP_H_
 
+/*
+ * HWMP Forwarding Information table, part of each VAP.
+ */
+struct ieee80211_hwmp_fi {
+	TAILQ_ENTRY(ieee80211_hwmp_fi) fi_next;
+	uint8_t		fi_dest[IEEE80211_ADDR_LEN];
+	ieee80211_seq	fi_seq;			/* HWMP sequence number */
+        uint8_t		fi_nexthop[IEEE80211_ADDR_LEN];
+	uint32_t	fi_metric;		/* Path Metric */
+	uint32_t	fi_nhops;		/* Number of Hops */
+	uint8_t		fi_prevhop[IEEE80211_ADDR_LEN];
+	uint32_t	fi_lifetime;
+};
+
 void		ieee80211_hwmp_recv_action(struct ieee80211vap *,
     struct ieee80211_node *, struct mbuf *);
 uint8_t *	ieee80211_add_meshprep(uint8_t *,

Modified: projects/mesh11s/sys/net80211/ieee80211_var.h
==============================================================================
--- projects/mesh11s/sys/net80211/ieee80211_var.h	Sat May 30 15:20:25 2009	(r193098)
+++ projects/mesh11s/sys/net80211/ieee80211_var.h	Sat May 30 16:26:08 2009	(r193099)
@@ -53,6 +53,7 @@
 #include <net80211/ieee80211_proto.h>
 #include <net80211/ieee80211_radiotap.h>
 #include <net80211/ieee80211_scan.h>
+#include <net80211/ieee80211_hwmp.h>		/* for ieee80211_hwmp_fi */
 
 #define	IEEE80211_TXPOWER_MAX	100	/* .5 dbM (XXX units?) */
 #define	IEEE80211_TXPOWER_MIN	0	/* kill radio */


More information about the svn-src-projects mailing list