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