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