summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorsam <sam@FreeBSD.org>2009-07-21 19:38:22 +0000
committersam <sam@FreeBSD.org>2009-07-21 19:38:22 +0000
commit68cbb6a7463b70cec8d8a0cd9948339a98406099 (patch)
tree0f9e36b532861f65854a4eb56c1f537c203e5b91 /sys
parente5dfb90bc39200659ab00a42b65e93605c31f968 (diff)
downloadFreeBSD-src-68cbb6a7463b70cec8d8a0cd9948339a98406099.zip
FreeBSD-src-68cbb6a7463b70cec8d8a0cd9948339a98406099.tar.gz
store mesh timers as ticks and sysctls for changing the defaults
Reviewed by: rpaulo Approved by: re (kib)
Diffstat (limited to 'sys')
-rw-r--r--sys/net80211/ieee80211_hwmp.c61
-rw-r--r--sys/net80211/ieee80211_mesh.c16
-rw-r--r--sys/net80211/ieee80211_mesh.h5
3 files changed, 43 insertions, 39 deletions
diff --git a/sys/net80211/ieee80211_hwmp.c b/sys/net80211/ieee80211_hwmp.c
index 41b119f..5ad0d41 100644
--- a/sys/net80211/ieee80211_hwmp.c
+++ b/sys/net80211/ieee80211_hwmp.c
@@ -116,24 +116,8 @@ static struct ieee80211_node *
const uint8_t [IEEE80211_ADDR_LEN], struct mbuf *);
static void hwmp_peerdown(struct ieee80211_node *);
-static int ieee80211_hwmp_targetonly = 0;
-static int ieee80211_hwmp_replyforward = 1;
-static const int ieee80211_hwmp_maxprepretries = 3;
-static const struct timeval ieee80211_hwmp_maxhopstime = { 0, 500000 };
-static const struct timeval ieee80211_hwmp_preqminint = { 0, 100000 };
-static const struct timeval ieee80211_hwmp_perrminint = { 0, 100000 };
-static const struct timeval ieee80211_hwmp_roottimeout = { 5, 0 };
-static const struct timeval ieee80211_hwmp_pathtimeout = { 5, 0 };
-static const struct timeval ieee80211_hwmp_pathtoroottimeout = { 5, 0 };
-static const struct timeval ieee80211_hwmp_rootint = { 2, 0 };
-static const struct timeval ieee80211_hwmp_rannint = { 1, 0 };
-static const struct timeval ieee80211_hwmp_pathmaintenanceint = { 2, 0 };
-static const struct timeval ieee80211_hwmp_confirmint = { 2, 0 };
-
-#define timeval2msecs(tv) (tv.tv_sec * 1000 + tv.tv_usec / 1000)
-
-#define HWMP_ROOTMODEINT msecs_to_ticks(timeval2msecs(ieee80211_hwmp_rootint))
-#define HWMP_RANNMODEINT msecs_to_ticks(timeval2msecs(ieee80211_hwmp_rannint))
+static struct timeval ieee80211_hwmp_preqminint = { 0, 100000 };
+static struct timeval ieee80211_hwmp_perrminint = { 0, 100000 };
/* unalligned little endian access */
#define LE_WRITE_2(p, v) do { \
@@ -176,10 +160,28 @@ struct ieee80211_hwmp_state {
SYSCTL_NODE(_net_wlan, OID_AUTO, hwmp, CTLFLAG_RD, 0,
"IEEE 802.11s HWMP parameters");
+static int ieee80211_hwmp_targetonly = 0;
SYSCTL_INT(_net_wlan_hwmp, OID_AUTO, targetonly, CTLTYPE_INT | CTLFLAG_RW,
&ieee80211_hwmp_targetonly, 0, "Set TO bit on generated PREQs");
+static int ieee80211_hwmp_replyforward = 1;
SYSCTL_INT(_net_wlan_hwmp, OID_AUTO, replyforward, CTLTYPE_INT | CTLFLAG_RW,
&ieee80211_hwmp_replyforward, 0, "Set RF bit on generated PREQs");
+static int ieee80211_hwmp_pathtimeout = -1;
+SYSCTL_PROC(_net_wlan_hwmp, OID_AUTO, pathlifetime, CTLTYPE_INT | CTLFLAG_RW,
+ &ieee80211_hwmp_pathtimeout, 0, ieee80211_sysctl_msecs_ticks, "I",
+ "path entry lifetime (ms)");
+static int ieee80211_hwmp_roottimeout = -1;
+SYSCTL_PROC(_net_wlan_hwmp, OID_AUTO, roottimeout, CTLTYPE_INT | CTLFLAG_RW,
+ &ieee80211_hwmp_roottimeout, 0, ieee80211_sysctl_msecs_ticks, "I",
+ "root PREQ timeout (ms)");
+static int ieee80211_hwmp_rootint = -1;
+SYSCTL_PROC(_net_wlan_hwmp, OID_AUTO, rootint, CTLTYPE_INT | CTLFLAG_RW,
+ &ieee80211_hwmp_rootint, 0, ieee80211_sysctl_msecs_ticks, "I",
+ "root interval (ms)");
+static int ieee80211_hwmp_rannint = -1;
+SYSCTL_PROC(_net_wlan_hwmp, OID_AUTO, rannint, CTLTYPE_INT | CTLFLAG_RW,
+ &ieee80211_hwmp_rannint, 0, ieee80211_sysctl_msecs_ticks, "I",
+ "root announcement interval (ms)");
#define IEEE80211_HWMP_DEFAULT_MAXHOPS 31
@@ -188,7 +190,7 @@ static ieee80211_recv_action_func hwmp_recv_action_meshpath_prep;
static ieee80211_recv_action_func hwmp_recv_action_meshpath_perr;
static ieee80211_recv_action_func hwmp_recv_action_meshpath_rann;
-static const struct ieee80211_mesh_proto_path mesh_proto_hwmp = {
+static struct ieee80211_mesh_proto_path mesh_proto_hwmp = {
.mpp_descr = "HWMP",
.mpp_ie = IEEE80211_MESHCONF_HWMP,
.mpp_discover = hwmp_discover,
@@ -197,14 +199,20 @@ static const struct ieee80211_mesh_proto_path mesh_proto_hwmp = {
.mpp_vdetach = hwmp_vdetach,
.mpp_newstate = hwmp_newstate,
.mpp_privlen = sizeof(struct ieee80211_hwmp_route),
- /* ieee80211_hwmp_pathtimeout */
- .mpp_inact = { 5, 0 },
};
+SYSCTL_PROC(_net_wlan_hwmp, OID_AUTO, inact, CTLTYPE_INT | CTLFLAG_RW,
+ &mesh_proto_hwmp.mpp_inact, 0, ieee80211_sysctl_msecs_ticks, "I",
+ "mesh route inactivity timeout (ms)");
static void
ieee80211_hwmp_init(void)
{
+ ieee80211_hwmp_pathtimeout = msecs_to_ticks(5*1000);
+ ieee80211_hwmp_roottimeout = msecs_to_ticks(5*1000);
+ ieee80211_hwmp_rootint = msecs_to_ticks(2*1000);
+ ieee80211_hwmp_rannint = msecs_to_ticks(1*1000);
+
/*
* Register action frame handlers.
*/
@@ -217,6 +225,9 @@ ieee80211_hwmp_init(void)
ieee80211_recv_action_register(IEEE80211_ACTION_CAT_MESHPATH,
IEEE80211_ACTION_MESHPATH_RANN, hwmp_recv_action_meshpath_rann);
+ /* NB: default is 5 secs per spec */
+ mesh_proto_hwmp.mpp_inact = msecs_to_ticks(5*1000);
+
/*
* Register HWMP.
*/
@@ -617,11 +628,11 @@ hwmp_rootmode_setup(struct ieee80211vap *vap)
break;
case IEEE80211_HWMP_ROOTMODE_NORMAL:
case IEEE80211_HWMP_ROOTMODE_PROACTIVE:
- callout_reset(&hs->hs_roottimer, HWMP_ROOTMODEINT,
+ callout_reset(&hs->hs_roottimer, ieee80211_hwmp_rootint,
hwmp_rootmode_cb, vap);
break;
case IEEE80211_HWMP_ROOTMODE_RANN:
- callout_reset(&hs->hs_roottimer, HWMP_RANNMODEINT,
+ callout_reset(&hs->hs_roottimer, ieee80211_hwmp_rannint,
hwmp_rootmode_rann_cb, vap);
break;
}
@@ -654,7 +665,7 @@ hwmp_rootmode_cb(void *arg)
preq.preq_id = ++hs->hs_preqid;
IEEE80211_ADDR_COPY(preq.preq_origaddr, vap->iv_myaddr);
preq.preq_origseq = ++hs->hs_seq;
- preq.preq_lifetime = timeval2msecs(ieee80211_hwmp_roottimeout);
+ preq.preq_lifetime = ticks_to_msecs(ieee80211_hwmp_roottimeout);
preq.preq_metric = IEEE80211_MESHLMETRIC_INITIALVAL;
preq.preq_tcount = 1;
IEEE80211_ADDR_COPY(PREQ_TADDR(0), broadcastaddr);
@@ -1297,7 +1308,7 @@ hwmp_discover(struct ieee80211vap *vap,
}
rt->rt_metric = IEEE80211_MESHLMETRIC_INITIALVAL;
rt->rt_lifetime =
- timeval2msecs(ieee80211_hwmp_pathtimeout);
+ ticks_to_msecs(ieee80211_hwmp_pathtimeout);
/* XXX check preq retries */
sendpreq = 1;
IEEE80211_NOTE_MAC(vap, IEEE80211_MSG_HWMP, dest,
diff --git a/sys/net80211/ieee80211_mesh.c b/sys/net80211/ieee80211_mesh.c
index 912cad4..4cbc9bd 100644
--- a/sys/net80211/ieee80211_mesh.c
+++ b/sys/net80211/ieee80211_mesh.c
@@ -180,7 +180,7 @@ mesh_rt_add_locked(struct ieee80211_mesh_state *ms,
if (rt != NULL) {
IEEE80211_ADDR_COPY(rt->rt_dest, dest);
rt->rt_priv = (void *)ALIGN(&rt[1]);
- getmicrouptime(&rt->rt_crtime);
+ rt->rt_crtime = ticks;
TAILQ_INSERT_TAIL(&ms->ms_routes, rt, rt_next);
}
return rt;
@@ -310,17 +310,13 @@ mesh_rt_flush_invalid(struct ieee80211vap *vap)
{
struct ieee80211_mesh_state *ms = vap->iv_mesh;
struct ieee80211_mesh_route *rt, *next;
- struct timeval tv, delta;
if (ms == NULL)
return;
- getmicrouptime(&tv);
MESH_RT_LOCK(ms);
TAILQ_FOREACH_SAFE(rt, &ms->ms_routes, rt_next, next) {
- delta = tv;
- timevalsub(&delta, &rt->rt_crtime);
if ((rt->rt_flags & IEEE80211_MESHRT_FLAGS_VALID) == 0 &&
- timevalcmp(&delta, &ms->ms_ppath->mpp_inact, >=))
+ ticks - rt->rt_crtime >= ms->ms_ppath->mpp_inact)
mesh_rt_del(ms, rt);
}
MESH_RT_UNLOCK(ms);
@@ -676,9 +672,7 @@ mesh_newstate(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg)
break;
}
ieee80211_node_authorize(vap->iv_bss);
- callout_reset(&ms->ms_cleantimer,
- msecs_to_ticks(ms->ms_ppath->mpp_inact.tv_sec * 1000 +
- ms->ms_ppath->mpp_inact.tv_usec / 1000),
+ callout_reset(&ms->ms_cleantimer, ms->ms_ppath->mpp_inact,
mesh_rt_cleanup_cb, vap);
break;
default:
@@ -696,9 +690,7 @@ mesh_rt_cleanup_cb(void *arg)
struct ieee80211_mesh_state *ms = vap->iv_mesh;
mesh_rt_flush_invalid(vap);
- callout_reset(&ms->ms_cleantimer,
- msecs_to_ticks(ms->ms_ppath->mpp_inact.tv_sec * 1000 +
- ms->ms_ppath->mpp_inact.tv_usec / 1000),
+ callout_reset(&ms->ms_cleantimer, ms->ms_ppath->mpp_inact,
mesh_rt_cleanup_cb, vap);
}
diff --git a/sys/net80211/ieee80211_mesh.h b/sys/net80211/ieee80211_mesh.h
index 37004e5..6c91852 100644
--- a/sys/net80211/ieee80211_mesh.h
+++ b/sys/net80211/ieee80211_mesh.h
@@ -376,7 +376,7 @@ struct ieee80211_meshcntl_ae11 {
MALLOC_DECLARE(M_80211_MESH_RT);
struct ieee80211_mesh_route {
TAILQ_ENTRY(ieee80211_mesh_route) rt_next;
- struct timeval rt_crtime; /* creation time */
+ int rt_crtime; /* creation time */
uint8_t rt_dest[IEEE80211_ADDR_LEN];
uint8_t rt_nexthop[IEEE80211_ADDR_LEN];
uint32_t rt_metric; /* path metric */
@@ -409,7 +409,8 @@ struct ieee80211_mesh_proto_path {
enum ieee80211_state, int);
const size_t mpp_privlen; /* size required in the routing table
for private data */
- const struct timeval mpp_inact; /* inact. timeout for invalid routes */
+ int mpp_inact; /* inact. timeout for invalid routes
+ (ticks) */
};
/*
OpenPOWER on IntegriCloud