svn commit: r234883 - head/sys/net80211
Monthadar Al Jaberi
monthadar at FreeBSD.org
Tue May 1 16:05:10 UTC 2012
Author: monthadar
Date: Tue May 1 16:05:09 2012
New Revision: 234883
URL: http://svn.freebsd.org/changeset/base/234883
Log:
* Added a mesh max PREQ retires sysctl that governous how many times
we try to discover an address;
* Added a mesh net travelse time across an MBSS, which is used to enforce
discovery rate check;
Approved by: adrian
Modified:
head/sys/net80211/ieee80211_hwmp.c
Modified: head/sys/net80211/ieee80211_hwmp.c
==============================================================================
--- head/sys/net80211/ieee80211_hwmp.c Tue May 1 16:03:27 2012 (r234882)
+++ head/sys/net80211/ieee80211_hwmp.c Tue May 1 16:05:09 2012 (r234883)
@@ -154,7 +154,8 @@ struct ieee80211_hwmp_route {
ieee80211_hwmp_seq hr_preqid; /* last PREQ ID seen from dst */
ieee80211_hwmp_seq hr_origseq; /* seq. no. on our latest PREQ*/
struct timeval hr_lastpreq; /* last time we sent a PREQ */
- int hr_preqretries;
+ int hr_preqretries; /* number of discoveries */
+ int hr_lastdiscovery; /* last discovery in ticks */
};
struct ieee80211_hwmp_state {
ieee80211_hwmp_seq hs_seq; /* next seq to be used */
@@ -177,6 +178,15 @@ static int ieee80211_hwmp_pathtimeout =
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_maxpreq_retries = -1;
+SYSCTL_PROC(_net_wlan_hwmp, OID_AUTO, maxpreq_retries, CTLTYPE_INT | CTLFLAG_RW,
+ &ieee80211_hwmp_maxpreq_retries, 0, ieee80211_sysctl_msecs_ticks, "I",
+ "maximum number of preq retries");
+static int ieee80211_hwmp_net_diameter_traversaltime = -1;
+SYSCTL_PROC(_net_wlan_hwmp, OID_AUTO, net_diameter_traversal_time,
+ CTLTYPE_INT | CTLFLAG_RW, &ieee80211_hwmp_net_diameter_traversaltime, 0,
+ ieee80211_sysctl_msecs_ticks, "I",
+ "estimate travelse time across the MBSS (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",
@@ -212,10 +222,17 @@ SYSCTL_PROC(_net_wlan_hwmp, OID_AUTO, in
static void
ieee80211_hwmp_init(void)
{
+ /* Default values as per amendment */
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);
+ ieee80211_hwmp_maxpreq_retries = 3;
+ /*
+ * (TU): A measurement of time equal to 1024 μs,
+ * 500 TU is 512 ms.
+ */
+ ieee80211_hwmp_net_diameter_traversaltime = msecs_to_ticks(512);
/*
* Register action frame handler.
@@ -1288,6 +1305,7 @@ hwmp_recv_prep(struct ieee80211vap *vap,
rt->rt_metric, metric);
hr->hr_seq = prep->prep_targetseq;
+ hr->hr_preqretries = 0;
IEEE80211_ADDR_COPY(rt->rt_nexthop, ni->ni_macaddr);
rt->rt_metric = metric;
rt->rt_nhops = prep->prep_hopcount + 1;
@@ -1648,13 +1666,31 @@ hwmp_discover(struct ieee80211vap *vap,
hr = IEEE80211_MESH_ROUTE_PRIV(rt,
struct ieee80211_hwmp_route);
if ((rt->rt_flags & IEEE80211_MESHRT_FLAGS_VALID) == 0) {
+ if (hr->hr_lastdiscovery != 0 &&
+ (ticks - hr->hr_lastdiscovery <
+ (ieee80211_hwmp_net_diameter_traversaltime * 2))) {
+ IEEE80211_DISCARD_MAC(vap, IEEE80211_MSG_ANY,
+ dest, NULL, "%s",
+ "too frequent discovery requeust");
+ /* XXX: stats? */
+ goto done;
+ }
+ hr->hr_lastdiscovery = ticks;
+ if (hr->hr_preqretries >=
+ ieee80211_hwmp_maxpreq_retries) {
+ IEEE80211_DISCARD_MAC(vap, IEEE80211_MSG_ANY,
+ dest, NULL, "%s",
+ "no valid path , max number of discovery");
+ vap->iv_stats.is_mesh_fwd_nopath++;
+ goto done;
+ }
+ hr->hr_preqretries++;
if (hr->hr_origseq == 0)
hr->hr_origseq = ++hs->hs_seq;
rt->rt_metric = IEEE80211_MESHLMETRIC_INITIALVAL;
/* XXX: special discovery timeout, larger lifetime? */
ieee80211_mesh_rt_update(rt,
ticks_to_msecs(ieee80211_hwmp_pathtimeout));
- /* XXX check preq retries */
sendpreq = 1;
IEEE80211_NOTE_MAC(vap, IEEE80211_MSG_HWMP, dest,
"start path discovery (src %s), target seq %u",
More information about the svn-src-head
mailing list