Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 9 Jun 2009 22:12:13 +0000 (UTC)
From:      Rui Paulo <rpaulo@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r193866 - projects/mesh11s/sys/net80211
Message-ID:  <200906092212.n59MCD3E085530@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: rpaulo
Date: Tue Jun  9 22:12:13 2009
New Revision: 193866
URL: http://svn.freebsd.org/changeset/base/193866

Log:
  * fix a typo in previous commit
  * add remaining bits of mesh peering
  
  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	Tue Jun  9 22:09:29 2009	(r193865)
+++ projects/mesh11s/sys/net80211/ieee80211_mesh.c	Tue Jun  9 22:12:13 2009	(r193866)
@@ -164,8 +164,8 @@ mesh_newstate(struct ieee80211vap *vap, 
 		switch (ostate) {
 		case IEEE80211_S_INIT:
 			if (vap->iv_des_chan != IEEE80211_CHAN_ANYC &&
-			    !IEEE80211_IS_CHAN_RADAR(vap->iv_des_chan &&
-			    vap->iv_meshidlen != 0)) {
+			    !IEEE80211_IS_CHAN_RADAR(vap->iv_des_chan) &&
+			    vap->iv_meshidlen != 0) {
 			    /*
 			     * Already have a channel and a mesh ID; bypass the
 			     * scan and startup immediately.
@@ -439,7 +439,6 @@ static void
 mesh_recv_mgmt(struct ieee80211_node *ni, struct mbuf *m0, int subtype,
     int rssi, int noise)
 {
-	static const uint8_t zerobssid[IEEE80211_ADDR_LEN];
 	struct ieee80211vap *vap = ni->ni_vap;
 	struct ieee80211com *ic = ni->ni_ic;
 	struct ieee80211_frame *wh;
@@ -504,10 +503,9 @@ mesh_recv_mgmt(struct ieee80211_node *ni
 		/*
 		 * More validation: make sure we are talking to a Mesh node.
 		 */
-		if ((scan.capinfo & (IEEE80211_CAPINFO_ESS|IEEE80211_CAPINFO_IBSS)) == 0 &&
-		    !IEEE80211_ADDR_EQ(wh->i_addr2, ni->ni_macaddr) &&
-		    IEEE80211_ADDR_EQ(wh->i_addr3, zerobssid)) {
-			union ieee80211_send_action_args vargs;
+		if ((scan.capinfo &
+		    (IEEE80211_CAPINFO_ESS|IEEE80211_CAPINFO_IBSS)) == 0 &&
+		    !IEEE80211_ADDR_EQ(wh->i_addr2, ni->ni_macaddr)) {
 			/*
 			 * Create a new entry in the neighbor table.
 			 */
@@ -516,9 +514,14 @@ mesh_recv_mgmt(struct ieee80211_node *ni
 			 * Mesh nodes must be QoS capable.
 			 */
 			ni->ni_flags |= IEEE80211_NODE_QOS;
-			/*
-			 * Try to peer with this node.
-			 */
+		}
+		/*
+		 * Try to peer with this node if possible.
+		 */
+		if (ni != vap->iv_bss &&
+		    vap->iv_meshflags & IEEE80211_MFLAGS_AP &&
+		    ni->ni_mlstate == IEEE80211_NODE_MESH_IDLE) {
+			union ieee80211_send_action_args vargs;
 			get_random_bytes(&ni->ni_mlpid, 2);
 			ni->ni_mlstate = IEEE80211_NODE_MESH_OPENSNT;
 			IEEE80211_NOTE(vap,
@@ -532,11 +535,8 @@ mesh_recv_mgmt(struct ieee80211_node *ni
 			ni->ni_mlrcnt = 0;
 			mesh_peer_timeout_setup(ni);
 		}
-		if (ni != NULL) {
-			IEEE80211_RSSI_LPF(ni->ni_avgrssi, rssi);
-			ni->ni_noise = noise;
-		}
-
+		IEEE80211_RSSI_LPF(ni->ni_avgrssi, rssi);
+		ni->ni_noise = noise;
 		break;
 	}
 	case IEEE80211_FC0_SUBTYPE_PROBE_REQ:
@@ -716,6 +716,28 @@ mesh_recv_action(struct ieee80211_node *
 			    IEEE80211_MSG_ACTION | IEEE80211_MSG_MESH,
 			    wh, NULL, "%s", "action frame not for our mesh");
 			vap->iv_stats.is_rx_mgtdiscard++;
+			switch (ni->ni_mlstate) {
+			case IEEE80211_NODE_MESH_IDLE:
+				break;
+			case IEEE80211_NODE_MESH_OPENSNT:
+			case IEEE80211_NODE_MESH_OPENRCV:
+			case IEEE80211_NODE_MESH_CONFIRMRCV:
+				vargs.fixedarg[0] = ni->ni_mlid;
+				vargs.fixedarg[1] = ni->ni_plid;
+				vargs.fixedarg[2] =
+				    IEEE80211_REASON_PEER_LINK_CANCELED;
+				ieee80211_send_action(ni,
+				    IEEE80211_ACTION_CAT_MESHPEERING,
+				    IEEE80211_ACTION_MESHPEERING_CLOSE,
+				    vargs);
+				ni->ni_mlstate = IEEE80211_NODE_MESH_HOLDING;
+				IEEE80211_NOTE(vap,
+				    IEEE80211_MSG_MESH,
+				    ni, "peer link: switching to state %s",
+				    nodemeshstates[ni->ni_mlstate]);
+				mesh_peer_timeout_setup(ni);
+				break;
+			}
 			return;
 		}
 		switch (ia->ia_action) {
@@ -833,7 +855,8 @@ mesh_recv_action(struct ieee80211_node *
 			case IEEE80211_NODE_MESH_HOLDING:
 				vargs.fixedarg[0] = ni->ni_mllid;
 				vargs.fixedarg[1] = ni->ni_mlpid;
-				vargs.fixedarg[2] = IEEE80211_REASON_MESH_MAX_RETRIES;
+				vargs.fixedarg[2] =
+				    IEEE80211_REASON_MESH_MAX_RETRIES;
 				ieee80211_send_action(ni,
 				    IEEE80211_ACTION_CAT_MESHPEERING,
 				    IEEE80211_ACTION_MESHPEERING_CLOSE,
@@ -853,16 +876,34 @@ mesh_recv_action(struct ieee80211_node *
 			    "%s", "recv PEER CLOSE");
 			switch (ni->ni_mlstate) {
 			case IEEE80211_NODE_MESH_IDLE:
-			case IEEE80211_NODE_MESH_CONFIRMRECV:
-			case IEEE80211_NODE_MESH_ESTABLISHED:
+				/* ignore */
 				break;
 			case IEEE80211_NODE_MESH_OPENRCV:
+			case IEEE80211_NODE_MESH_OPENSNT:
+			case IEEE80211_NODE_MESH_CONFIRMRECV:
+			case IEEE80211_NODE_MESH_ESTABLISHED:
+				vargs.fixedarg[0] = ni->ni_mlid;
+				vargs.fixedarg[1] = 0;
+				vargs.fixedarg[2] =
+				    IEEE80211_REASON_MESH_CLOSE_RCVD;
+				ieee80211_send_action(ni,
+				    IEEE80211_ACTION_CAT_MESHPEERING,
+				    IEEE80211_ACTION_MESHPEERING_CLOSE,
+				    vargs);
 				ni->ni_mlstate = IEEE80211_NODE_MESH_HOLDING;
+				IEEE80211_NOTE(vap,
+				    IEEE80211_MSG_MESH,
+				    ni, "peer link: switching to state %s",
+				    nodemeshstates[ni->ni_mlstate]);
 				mesh_peer_timeout_setup(ni);
 				break;
-			case IEEE80211_NODE_MESH_OPENSNT:
-				break;
 			case IEEE80211_NODE_MESH_HOLDING:
+				ni->ni_mlstate = IEEE80211_NODE_MESH_IDLE;
+				IEEE80211_NOTE(vap,
+				    IEEE80211_MSG_MESH,
+				    ni, "peer link: switching to state %s",
+				    nodemeshstates[ni->ni_mlstate]);
+				mesh_peer_timeout_setup(ni);
 				break;
 			}
 			break;
@@ -921,11 +962,15 @@ mesh_peer_timeout_setup(struct ieee80211
 	case IEEE80211_NODE_MESH_CONFIRMRECV:
 		ni->ni_mltval = CONFIRM_TIMEOUT;
 		break;
+	case IEEE80211_NODE_MESH_IDLE:
+		ni->ni_mltval = 0;
+		break;
 	default:
 		ni->ni_mltval = RETRY_TIMEOUT;
 	}
-	callout_reset(&ni->ni_mltimer, ni->ni_mltval, mesh_peer_timeout_cb,
-	    ni);
+	if (ni->ni_mltval)
+		callout_reset(&ni->ni_mltimer, ni->ni_mltval,
+		    mesh_peer_timeout_cb, ni);
 }
 
 /*



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200906092212.n59MCD3E085530>