svn commit: r195059 - projects/mesh11s/sys/net80211
Rui Paulo
rpaulo at FreeBSD.org
Fri Jun 26 16:22:08 UTC 2009
Author: rpaulo
Date: Fri Jun 26 16:22:07 2009
New Revision: 195059
URL: http://svn.freebsd.org/changeset/base/195059
Log:
* fix the action frame validation
* send peer link close packets on ifconfig wlan0 down
* revert the timers to the draft values
Sponsored by: The FreeBSD Foundation
Modified:
projects/mesh11s/sys/net80211/ieee80211_mesh.c
Modified: projects/mesh11s/sys/net80211/ieee80211_mesh.c
==============================================================================
--- projects/mesh11s/sys/net80211/ieee80211_mesh.c Fri Jun 26 16:03:32 2009 (r195058)
+++ projects/mesh11s/sys/net80211/ieee80211_mesh.c Fri Jun 26 16:22:07 2009 (r195059)
@@ -84,12 +84,11 @@ static int mesh_verify_meshconf(struct i
struct ieee80211_meshconf_ie *);
/* timeout values in miliseconds */
-/* XXX: spec says 40 msec */
-static const int ieee80211_mesh_retrytimeout = 4000;
+static const int ieee80211_mesh_retrytimeout = 40;
#define RETRY_TIMEOUT msecs_to_ticks(ieee80211_mesh_retrytimeout)
-static const int ieee80211_mesh_holdingtimeout = 4000;
+static const int ieee80211_mesh_holdingtimeout = 40;
#define HOLDING_TIMEOUT msecs_to_ticks(ieee80211_mesh_holdingtimeout)
-static const int ieee80211_mesh_confirmtimeout = 4000;
+static const int ieee80211_mesh_confirmtimeout = 40;
#define CONFIRM_TIMEOUT msecs_to_ticks(ieee80211_mesh_confirmtimeout)
static const int ieee80211_mesh_maxretries = 2;
@@ -108,8 +107,20 @@ ieee80211_mesh_detach(struct ieee80211co
}
static void
-mesh_vdetach_stoptimers(void *arg, struct ieee80211_node *ni)
+mesh_vdetach_peers(void *arg, struct ieee80211_node *ni)
{
+ union ieee80211_send_action_args vargs;
+
+ if (ni->ni_mlstate == IEEE80211_NODE_MESH_ESTABLISHED) {
+ vargs.fixedarg[0] = ni->ni_mlpid;
+ vargs.fixedarg[1] = ni->ni_mllid;
+ vargs.fixedarg[2] =
+ IEEE80211_REASON_PEER_LINK_CANCELED;
+ ieee80211_send_action(ni,
+ IEEE80211_ACTION_CAT_MESHPEERING,
+ IEEE80211_ACTION_MESHPEERING_CLOSE,
+ vargs);
+ }
callout_stop(&ni->ni_mltimer);
}
@@ -117,7 +128,7 @@ mesh_vdetach_stoptimers(void *arg, struc
static void
mesh_vdetach(struct ieee80211vap *vap)
{
- ieee80211_iterate_nodes(&vap->iv_ic->ic_sta, mesh_vdetach_stoptimers,
+ ieee80211_iterate_nodes(&vap->iv_ic->ic_sta, mesh_vdetach_peers,
NULL);
ieee80211_hwmp_vdetach(vap);
}
@@ -161,6 +172,10 @@ mesh_newstate(struct ieee80211vap *vap,
case IEEE80211_S_SCAN:
ieee80211_cancel_scan(vap);
break;
+ case IEEE80211_S_RUN:
+ ieee80211_iterate_nodes(&vap->iv_ic->ic_sta,
+ mesh_vdetach_peers, NULL);
+ break;
default:
break;
}
@@ -902,11 +917,16 @@ mesh_recv_action(struct ieee80211_node *
}
frm += frm[1] + 2;
}
-
+ /*
+ * Verify the contents of the frame. Action frames with
+ * close subtype don't have a Mesh Configuration IE.
+ * If if fails validation, close the peer link.
+ */
if (mesh_verify_meshpeerver(vap, meshpeerver) ||
mesh_verify_meshid(vap, meshid) ||
- mesh_verify_meshconf(vap, meshconf) ||
- !meshpeer) {
+ !meshpeer || (meshpeer->peer_subtype !=
+ IEEE80211_ACTION_MESHPEERING_CLOSE &&
+ mesh_verify_meshconf(vap, meshconf))) {
IEEE80211_DISCARD(vap,
IEEE80211_MSG_ACTION | IEEE80211_MSG_MESH,
wh, NULL, "%s", "action frame not for our mesh");
More information about the svn-src-projects
mailing list