Date: Wed, 8 Jul 2009 17:01:07 +0000 (UTC) From: Rui Paulo <rpaulo@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r195472 - projects/mesh11s/sys/net80211 Message-ID: <200907081701.n68H17bi057530@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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; }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200907081701.n68H17bi057530>