svn commit: r193901 - projects/mesh11s/sys/net80211
Rui Paulo
rpaulo at FreeBSD.org
Wed Jun 10 11:33:02 UTC 2009
Author: rpaulo
Date: Wed Jun 10 11:33:01 2009
New Revision: 193901
URL: http://svn.freebsd.org/changeset/base/193901
Log:
Add mesh local/peer ID validation.
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 Wed Jun 10 11:19:34 2009 (r193900)
+++ projects/mesh11s/sys/net80211/ieee80211_mesh.c Wed Jun 10 11:33:01 2009 (r193901)
@@ -779,8 +779,22 @@ mesh_recv_action(struct ieee80211_node *
mesh_peer_timeout_setup(ni);
break;
case IEEE80211_NODE_MESH_OPENRCV:
+ /* Wrong Link ID */
+ if (ni->ni_mllid != meshpeer->peer_llinkid) {
+ vargs.fixedarg[0] = ni->ni_mllid;
+ vargs.fixedarg[1] = ni->ni_mlpid;
+ vargs.fixedarg[2] =
+ IEEE80211_REASON_PEER_LINK_CANCELED;
+ ieee80211_send_action(ni,
+ IEEE80211_ACTION_CAT_MESHPEERING,
+ IEEE80211_ACTION_MESHPEERING_CLOSE,
+ vargs);
+ mesh_linkchange(ni,
+ IEEE80211_NODE_MESH_HOLDING);
+ mesh_peer_timeout_setup(ni);
+ break;
+ }
/* Duplicate open, confirm again. */
- ni->ni_mllid = meshpeer->peer_llinkid;
vargs.fixedarg[0] = ni->ni_mlpid;
vargs.fixedarg[1] = ni->ni_mllid;
ieee80211_send_action(ni,
@@ -789,9 +803,9 @@ mesh_recv_action(struct ieee80211_node *
vargs);
break;
case IEEE80211_NODE_MESH_OPENSNT:
+ ni->ni_mllid = meshpeer->peer_llinkid;
mesh_linkchange(ni,
IEEE80211_NODE_MESH_OPENRCV);
- ni->ni_mllid = meshpeer->peer_llinkid;
vargs.fixedarg[0] = ni->ni_mlpid;
vargs.fixedarg[1] = ni->ni_mllid;
ieee80211_send_action(ni,
@@ -801,6 +815,20 @@ mesh_recv_action(struct ieee80211_node *
/* NB: don't setup/clear any timeout */
break;
case IEEE80211_NODE_MESH_CONFIRMRECV:
+ if (ni->ni_mllid != meshpeer->peer_llinkid) {
+ vargs.fixedarg[0] = ni->ni_mllid;
+ vargs.fixedarg[1] = ni->ni_mlpid;
+ vargs.fixedarg[2] =
+ IEEE80211_REASON_PEER_LINK_CANCELED;
+ ieee80211_send_action(ni,
+ IEEE80211_ACTION_CAT_MESHPEERING,
+ IEEE80211_ACTION_MESHPEERING_CLOSE,
+ vargs);
+ mesh_linkchange(ni,
+ IEEE80211_NODE_MESH_HOLDING);
+ mesh_peer_timeout_setup(ni);
+ break;
+ }
mesh_linkchange(ni,
IEEE80211_NODE_MESH_ESTABLISHED);
ni->ni_mllid = meshpeer->peer_llinkid;
@@ -813,6 +841,20 @@ mesh_recv_action(struct ieee80211_node *
mesh_peer_timeout_stop(ni);
break;
case IEEE80211_NODE_MESH_ESTABLISHED:
+ if (ni->ni_mllid != meshpeer->peer_llinkid) {
+ vargs.fixedarg[0] = ni->ni_mllid;
+ vargs.fixedarg[1] = ni->ni_mlpid;
+ vargs.fixedarg[2] =
+ IEEE80211_REASON_PEER_LINK_CANCELED;
+ ieee80211_send_action(ni,
+ IEEE80211_ACTION_CAT_MESHPEERING,
+ IEEE80211_ACTION_MESHPEERING_CLOSE,
+ vargs);
+ mesh_linkchange(ni,
+ IEEE80211_NODE_MESH_HOLDING);
+ mesh_peer_timeout_setup(ni);
+ break;
+ }
vargs.fixedarg[0] = ni->ni_mlpid;
vargs.fixedarg[1] = ni->ni_mllid;
ieee80211_send_action(ni,
@@ -857,6 +899,21 @@ mesh_recv_action(struct ieee80211_node *
IEEE80211_ACTION_MESHPEERING_CLOSE,
vargs);
break;
+ case IEEE80211_NODE_MESH_CONFIRMRECV:
+ if (ni->ni_mllid != meshpeer->peer_llinkid) {
+ vargs.fixedarg[0] = ni->ni_mllid;
+ vargs.fixedarg[1] = ni->ni_mlpid;
+ vargs.fixedarg[2] =
+ IEEE80211_REASON_PEER_LINK_CANCELED;
+ ieee80211_send_action(ni,
+ IEEE80211_ACTION_CAT_MESHPEERING,
+ IEEE80211_ACTION_MESHPEERING_CLOSE,
+ vargs);
+ mesh_linkchange(ni,
+ IEEE80211_NODE_MESH_HOLDING);
+ mesh_peer_timeout_setup(ni);
+ }
+ break;
default:
IEEE80211_DISCARD(vap,
IEEE80211_MSG_ACTION | IEEE80211_MSG_MESH,
More information about the svn-src-projects
mailing list