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

Rui Paulo rpaulo at FreeBSD.org
Wed Jul 8 17:01:08 UTC 2009


Author: rpaulo
Date: Wed Jul  8 17:01:07 2009
New Revision: 195472
URL: http://svn.freebsd.org/changeset/base/195472

Log:
  * use mesh ttl, not hwmp ttl
  * verify hopcount before fwding
  
  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 Jul  8 16:53:31 2009	(r195471)
+++ projects/mesh11s/sys/net80211/ieee80211_hwmp.c	Wed Jul  8 17:01:07 2009	(r195472)
@@ -175,7 +175,6 @@ struct ieee80211_hwmp_state {
 	int			hs_rootmode;	/* proactive HWMP */
 	struct callout		hs_roottimer;
 	uint8_t			hs_maxhops;	/* max hop count */
-	uint8_t			hs_ttl;		/* HWMP ttl */
 };
 
 SYSCTL_NODE(_net_wlan, OID_AUTO, hwmp, CTLFLAG_RD, 0,
@@ -186,7 +185,6 @@ SYSCTL_INT(_net_wlan_hwmp, OID_AUTO, rep
     &ieee80211_hwmp_replyforward, 0, "Set RF bit on generated PREQs");
 
 #define	IEEE80211_HWMP_DEFAULT_MAXHOPS	31
-#define	IEEE80211_HWMP_DEFAULT_TTL	31
 
 static	ieee80211_recv_action_func hwmp_recv_action_meshpath_preq;
 static	ieee80211_recv_action_func hwmp_recv_action_meshpath_prep;
@@ -242,7 +240,6 @@ hwmp_vattach(struct ieee80211vap *vap)
 		return;
 	}
 	hs->hs_maxhops = IEEE80211_HWMP_DEFAULT_MAXHOPS;
-	hs->hs_ttl = IEEE80211_HWMP_DEFAULT_TTL;
 	callout_init(&hs->hs_roottimer, CALLOUT_MPSAFE);
 	vap->iv_hwmp = hs;
 }
@@ -610,6 +607,7 @@ hwmp_rootmode_cb(void *arg)
 {
 	struct ieee80211vap *vap = (struct ieee80211vap *)arg;
 	struct ieee80211_hwmp_state *hs = vap->iv_hwmp;
+	struct ieee80211_mesh_state *ms = vap->iv_mesh;
 	struct ieee80211_meshpreq_ie preq;
 
 	IEEE80211_NOTE(vap, IEEE80211_MSG_HWMP, vap->iv_bss,
@@ -620,7 +618,7 @@ hwmp_rootmode_cb(void *arg)
 	if (hs->hs_rootmode == IEEE80211_HWMP_ROOTMODE_PROACTIVE)
 		preq.preq_flags |= IEEE80211_MESHPREQ_FLAGS_PP;
 	preq.preq_hopcount = 0;
-	preq.preq_ttl = hs->hs_ttl;
+	preq.preq_ttl = ms->ms_ttl;
 	preq.preq_id = ++hs->hs_preqid;
 	IEEE80211_ADDR_COPY(preq.preq_origaddr, vap->iv_myaddr);
 	preq.preq_origseq = ++hs->hs_seq;
@@ -648,6 +646,7 @@ hwmp_rootmode_rann_cb(void *arg)
 {
 	struct ieee80211vap *vap = (struct ieee80211vap *)arg;
 	struct ieee80211_hwmp_state *hs = vap->iv_hwmp;
+	struct ieee80211_mesh_state *ms = vap->iv_mesh;
 	struct ieee80211_meshrann_ie rann;
 
 	IEEE80211_NOTE(vap, IEEE80211_MSG_HWMP, vap->iv_bss,
@@ -656,7 +655,7 @@ hwmp_rootmode_rann_cb(void *arg)
 	/* XXX check portal role */
 	rann.rann_flags = 0;
 	rann.rann_hopcount = 0;
-	rann.rann_ttl = hs->hs_ttl;
+	rann.rann_ttl = ms->ms_ttl;
 	IEEE80211_ADDR_COPY(rann.rann_addr, vap->iv_myaddr);
 	rann.rann_seq = ++hs->hs_seq;
 	rann.rann_metric = IEEE80211_MESHLMETRIC_INITIALVAL;
@@ -715,7 +714,7 @@ hwmp_recv_preq(struct ieee80211vap *vap,
 		 */
 		prep.prep_flags = 0;
 		prep.prep_hopcount = 0;
-		prep.prep_ttl = hs->hs_ttl;
+		prep.prep_ttl = ms->ms_ttl;
 		IEEE80211_ADDR_COPY(prep.prep_targetaddr, preq->preq_origaddr);
 		prep.prep_targetseq = preq->preq_origseq;
 		prep.prep_lifetime = preq->preq_lifetime;
@@ -758,7 +757,7 @@ hwmp_recv_preq(struct ieee80211vap *vap,
 		    (preq->preq_flags & IEEE80211_MESHPREQ_FLAGS_PP)) {
 			prep.prep_flags = 0;
 			prep.prep_hopcount = 0;
-			prep.prep_ttl = hs->hs_ttl;
+			prep.prep_ttl = ms->ms_ttl;
 			IEEE80211_ADDR_COPY(prep.prep_origaddr,
 			    vap->iv_myaddr);
 			prep.prep_origseq = preq->preq_origseq;
@@ -795,7 +794,8 @@ hwmp_recv_preq(struct ieee80211vap *vap,
 			    struct ieee80211_hwmp_route);
 			hr->hr_preqid = preq->preq_id;
 			hr->hr_seq = preq->preq_origseq;
-			if (preq->preq_ttl > 1) {
+			if (preq->preq_ttl > 1 &&
+			    preq->preq_hopcount < hs->hs_maxhops) {
 				IEEE80211_NOTE(vap, IEEE80211_MSG_HWMP, ni,
 				    "forwarding PREQ from %s",
 				    ether_sprintf(preq->preq_origaddr));
@@ -829,7 +829,7 @@ hwmp_recv_preq(struct ieee80211vap *vap,
 				    ether_sprintf(preq->preq_origaddr));
 				prep.prep_flags = 0;
 				prep.prep_hopcount = rt->rt_nhops + 1;
-				prep.prep_ttl = hs->hs_ttl;
+				prep.prep_ttl = ms->ms_ttl;
 				IEEE80211_ADDR_COPY(&prep.prep_targetaddr,
 				    preq->preq_origaddr);
 				prep.prep_targetseq = hr->hr_seq;
@@ -844,9 +844,10 @@ hwmp_recv_preq(struct ieee80211vap *vap,
 			}
 		/*
 		 * We have no information about this path,
-		 * propagate the PREQ based on TTL.
+		 * propagate the PREQ.
 		 */
-		} else if (preq->preq_ttl > 1) {
+		} else if (preq->preq_ttl > 1 &&
+		    preq->preq_hopcount < hs->hs_maxhops) {
 			if (rt == NULL)
 				rt = ieee80211_mesh_rt_add(vap, PREQ_TADDR(0));
 			hr = IEEE80211_MESH_ROUTE_PRIV(rt,
@@ -928,11 +929,10 @@ hwmp_recv_prep(struct ieee80211vap *vap,
 	    "received PREP from %s", ether_sprintf(prep->prep_origaddr));
 
 	/*
-	 * If it's NOT for us, propagate the PREP if TTL is
-	 * greater than 1.
+	 * If it's NOT for us, propagate the PREP.
 	 */
 	if (!IEEE80211_ADDR_EQ(vap->iv_myaddr, prep->prep_targetaddr) &&
-	    prep->prep_ttl > 1) {
+	    prep->prep_ttl > 1 && prep->prep_hopcount < hs->hs_maxhops) {
 		struct ieee80211_meshprep_ie pprep; /* propagated PREP */
 
 		IEEE80211_NOTE(vap, IEEE80211_MSG_HWMP, ni,
@@ -1154,6 +1154,7 @@ hwmp_recv_rann(struct ieee80211vap *vap,
     const struct ieee80211_frame *wh, const struct ieee80211_meshrann_ie *rann)
 {
 	struct ieee80211_mesh_state *ms = vap->iv_mesh;
+	struct ieee80211_hwmp_state *hs = vap->iv_hwmp;
 	struct ieee80211_mesh_route *rt = NULL;
 	struct ieee80211_hwmp_route *hr;
 	struct ieee80211_meshrann_ie prann;
@@ -1173,6 +1174,7 @@ hwmp_recv_rann(struct ieee80211vap *vap,
 	}
 	hr = IEEE80211_MESH_ROUTE_PRIV(rt, struct ieee80211_hwmp_route);
 	if (rann->rann_seq > hr->hr_seq && rann->rann_ttl > 1 &&
+	    rann->rann_hopcount < hs->hs_maxhops &&
 	    (ms->ms_flags & IEEE80211_MESHFLAGS_FWD)) {
 		memcpy(&prann, rann, sizeof(prann));
 		prann.rann_hopcount += 1;
@@ -1211,6 +1213,7 @@ hwmp_discover(struct ieee80211vap *vap,
     const uint8_t dest[IEEE80211_ADDR_LEN], struct mbuf *m)
 {
 	struct ieee80211_hwmp_state *hs = vap->iv_hwmp;
+	struct ieee80211_mesh_state *ms = vap->iv_mesh;
 	struct ieee80211_mesh_route *rt = NULL;
 	struct ieee80211_hwmp_route *hr;
 	struct ieee80211_meshpreq_ie preq;
@@ -1250,7 +1253,7 @@ hwmp_discover(struct ieee80211vap *vap,
 			 */
 			preq.preq_flags = 0;
 			preq.preq_hopcount = 0;
-			preq.preq_ttl = hs->hs_ttl;
+			preq.preq_ttl = ms->ms_ttl;
 			preq.preq_id = hr->hr_preqid;
 			IEEE80211_ADDR_COPY(preq.preq_origaddr, vap->iv_myaddr);
 			preq.preq_origseq = hr->hr_seq;
@@ -1316,9 +1319,6 @@ hwmp_ioctl_get80211(struct ieee80211vap 
 	case IEEE80211_IOC_HWMP_MAXHOPS:
 		ireq->i_val = hs->hs_maxhops;
 		break;
-	case IEEE80211_IOC_HWMP_TTL:
-		ireq->i_val = hs->hs_ttl;
-		break;
 	default:
 		return ENOSYS;
 	}
@@ -1347,11 +1347,6 @@ hwmp_ioctl_set80211(struct ieee80211vap 
 			return EINVAL;
 		hs->hs_maxhops = ireq->i_val;
 		break;
-	case IEEE80211_IOC_HWMP_TTL:
-		if (ireq->i_val <= 0 || ireq->i_val > 255)
-			return EINVAL;
-		hs->hs_ttl = ireq->i_val;
-		break;
 	default:
 		return ENOSYS;
 	}


More information about the svn-src-projects mailing list