From owner-svn-src-projects@FreeBSD.ORG Wed Jun 10 11:33:01 2009 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 9285F106568B; Wed, 10 Jun 2009 11:33:01 +0000 (UTC) (envelope-from rpaulo@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 77CE78FC1B; Wed, 10 Jun 2009 11:33:01 +0000 (UTC) (envelope-from rpaulo@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n5ABX1dl011681; Wed, 10 Jun 2009 11:33:01 GMT (envelope-from rpaulo@svn.freebsd.org) Received: (from rpaulo@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n5ABX17C011680; Wed, 10 Jun 2009 11:33:01 GMT (envelope-from rpaulo@svn.freebsd.org) Message-Id: <200906101133.n5ABX17C011680@svn.freebsd.org> From: Rui Paulo Date: Wed, 10 Jun 2009 11:33:01 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r193901 - projects/mesh11s/sys/net80211 X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 10 Jun 2009 11:33:02 -0000 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,