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

Rui Paulo rpaulo at FreeBSD.org
Wed Jul 1 14:43:07 UTC 2009


Author: rpaulo
Date: Wed Jul  1 14:43:06 2009
New Revision: 195240
URL: http://svn.freebsd.org/changeset/base/195240

Log:
  Complete prep processing by checking path metric, seq no and hopcount.
  
  Sponsored by:	The FreeBSD Foundation

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

Modified: projects/mesh11s/sys/net80211/ieee80211_hwmp.c
==============================================================================
--- projects/mesh11s/sys/net80211/ieee80211_hwmp.c	Wed Jul  1 13:30:01 2009	(r195239)
+++ projects/mesh11s/sys/net80211/ieee80211_hwmp.c	Wed Jul  1 14:43:06 2009	(r195240)
@@ -800,16 +800,32 @@ hwmp_recv_prep(struct ieee80211vap *vap,
 	}
 
 	rt = hwmp_rt_find(vap, prep->prep_origaddr);
-	if (rt != NULL) {
+	if (rt == NULL)
+		return;
+	if (prep->prep_targetseq == rt->rt_seq) {
+		int useprep = 0;
 		/*
-		 * Build the rest of the entry.
-		 * XXX check for SEQ and PREQ ID.
+		 * Check if we already have a path to this node.
+		 * If we do, check if this path reply contains a
+		 * better route.
 		 */
-		IEEE80211_ADDR_COPY(rt->rt_nexthop, wh->i_addr2);
-		rt->rt_nhops = prep->prep_hopcount;
-		rt->rt_lifetime = prep->prep_lifetime;
-		rt->rt_metric = prep->prep_metric;
-	}
+		if (IEEE80211_ADDR_EQ(rt->rt_nexthop, invalidaddr))
+			useprep = 1;
+		else if (prep->prep_hopcount < rt->rt_nhops ||
+		    prep->prep_metric < rt->rt_metric)
+			useprep = 1;
+		if (useprep) {
+			IEEE80211_ADDR_COPY(rt->rt_nexthop, wh->i_addr2);
+			rt->rt_nhops = prep->prep_hopcount;
+			rt->rt_lifetime = prep->prep_lifetime;
+			rt->rt_metric = prep->prep_metric;
+		}
+	} else {
+		IEEE80211_NOTE(vap, IEEE80211_MSG_HWMP, ni,
+		    "discard PREP from %s, wrong seqno %u",
+		    ether_sprintf(prep->prep_origaddr), prep->prep_targetseq);
+		vap->iv_stats.is_hwmp_wrongseq++;
+	} 
 
 	/*
 	 * XXX: If it's for us and the AE bit is set, update the

Modified: projects/mesh11s/sys/net80211/ieee80211_ioctl.h
==============================================================================
--- projects/mesh11s/sys/net80211/ieee80211_ioctl.h	Wed Jul  1 13:30:01 2009	(r195239)
+++ projects/mesh11s/sys/net80211/ieee80211_ioctl.h	Wed Jul  1 14:43:06 2009	(r195240)
@@ -229,7 +229,10 @@ struct ieee80211_stats {
 	uint32_t	is_mesh_fwd_tooshort;	/* mesh not fwd'd 'cuz no hdr */
 	uint32_t	is_mesh_fwd_disabled;	/* mesh not fwd'd 'cuz disabled */
 	uint32_t	is_mesh_fwd_nopath;	/* mesh not fwd'd 'cuz path unknown */
-	uint32_t	is_spare[11];
+
+	uint32_t	is_hwmp_wrongseq;	/* wrong hwmp seq no. */
+
+	uint32_t	is_spare[10];
 };
 
 /*


More information about the svn-src-projects mailing list