Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 4 May 2009 23:36:20 +0000 (UTC)
From:      Rui Paulo <rpaulo@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r191802 - projects/mesh11s/sys/net80211
Message-ID:  <200905042336.n44NaK44060938@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: rpaulo
Date: Mon May  4 23:36:20 2009
New Revision: 191802
URL: http://svn.freebsd.org/changeset/base/191802

Log:
  One more piece of the mesh link peering puzzle. The state machine is not
  yet completely implemented and some timers need to be set.
  While there, expert the peer id, local id and the link peering FSM to
  user land.
  
  Sponsored by:	The FreeBSD Foundation

Modified:
  projects/mesh11s/sys/net80211/ieee80211.h
  projects/mesh11s/sys/net80211/ieee80211_ioctl.c
  projects/mesh11s/sys/net80211/ieee80211_ioctl.h
  projects/mesh11s/sys/net80211/ieee80211_mesh.c
  projects/mesh11s/sys/net80211/ieee80211_node.h
  projects/mesh11s/sys/net80211/ieee80211_output.c

Modified: projects/mesh11s/sys/net80211/ieee80211.h
==============================================================================
--- projects/mesh11s/sys/net80211/ieee80211.h	Mon May  4 21:58:32 2009	(r191801)
+++ projects/mesh11s/sys/net80211/ieee80211.h	Mon May  4 23:36:20 2009	(r191802)
@@ -902,16 +902,13 @@ enum {
 	/* values not yet allocated by ANA */
 	IEEE80211_REASON_PEER_LINK_CANCELED	= 2,	/* 11s */
 	IEEE80211_REASON_MESH_MAX_PEERS		= 3,	/* 11s */
-	IEEE80211_REASON_MESH_CAP_POLICY_VIOLATION = 4,	/* 11s */
+	IEEE80211_REASON_MESH_CPVIOLATION	= 4,	/* 11s */
 	IEEE80211_REASON_MESH_CLOSE_RCVD	= 5,	/* 11s */
 	IEEE80211_REASON_MESH_MAX_RETRIES	= 6,	/* 11s */
 	IEEE80211_REASON_MESH_CONFIRM_TIMEOUT	= 7,	/* 11s */
-	IEEE80211_REASON_MESH_SEC_ROLE_NEG_DIFFERS = 8,	/* 11s */
-	IEEE80211_REASON_MESH_SEC_AUTH_IMPOSSIBLE = 9,	/* 11s */
-	IEEE80211_REASON_MESH_SEC_FAILED_VERIF	= 10,	/* 11s */
-	IEEE80211_REASON_MESH_INVALID_GTK	= 11,	/* 11s */
-	IEEE80211_REASON_MESH_MISMATCH_GTK	= 12,	/* 11s */
-	IEEE80211_REASON_MESH_INCONSISTENT_PARAMS = 13,	/* 11s */
+	IEEE80211_REASON_MESH_INVALID_GTK	= 8,	/* 11s */
+	IEEE80211_REASON_MESH_INCONS_PARAMS	= 9,	/* 11s */
+	IEEE80211_REASON_MESH_INVALID_SECURITY	= 10,	/* 11s */
 
 	IEEE80211_STATUS_SUCCESS		= 0,
 	IEEE80211_STATUS_UNSPECIFIED		= 1,
@@ -939,18 +936,6 @@ enum {
 	IEEE80211_STATUS_UNSUPP_RSN_IE_VERSION	= 44,	/* 11i */
 	IEEE80211_STATUS_INVALID_RSN_IE_CAP	= 45,	/* 11i */
 	IEEE80211_STATUS_CIPHER_SUITE_REJECTED	= 46,	/* 11i */
-	/* values not yet allocated by ANA */
-	IEEE80211_STATUS_PEER_LINK_ESTABLISHED	= 14,	/* 11s */
-	IEEE80211_STATUS_PEER_LINK_CLOSED	= 15,	/* 11s */
-	/* XXXRP: no identifiers for 16-17 */
-	IEEE80211_STATUS_PEER_LINK_MAX_RETRIES	= 18,	/* 11s */
-	IEEE80211_STATUS_PEER_LINK_NO_PMK	= 19,	/* 11s */
-	IEEE80211_STATUS_PEER_LINK_ALT_PMK	= 20,	/* 11s */
-	IEEE80211_STATUS_PEER_LINK_NO_AKM	= 21,	/* 11s */
-	IEEE80211_STATUS_PEER_LINK_ALT_AKM	= 22,	/* 11s */
-	IEEE80211_STATUS_PEER_LINK_NO_KDF	= 23,	/* 11s */
-	IEEE80211_STATUS_PEER_LINK_SA_ESTABLISHED = 24,	/* 11s */
-	/* XXRP: no identifier for 25 */
 };
 
 #define	IEEE80211_WEP_KEYLEN		5	/* 40bit */

Modified: projects/mesh11s/sys/net80211/ieee80211_ioctl.c
==============================================================================
--- projects/mesh11s/sys/net80211/ieee80211_ioctl.c	Mon May  4 21:58:32 2009	(r191801)
+++ projects/mesh11s/sys/net80211/ieee80211_ioctl.c	Mon May  4 23:36:20 2009	(r191802)
@@ -441,6 +441,9 @@ get_sta_info(void *arg, struct ieee80211
 	else
 		si->isi_inact = vap->iv_inact_init;
 	si->isi_inact = (si->isi_inact - ni->ni_inact) * IEEE80211_INACT_WAIT;
+	si->isi_peerstate = ni->ni_peerstate;
+	si->isi_localid = ni->ni_llid;
+	si->isi_peerid = ni->ni_plid;
 
 	if (ielen) {
 		cp = ((uint8_t *)si) + si->isi_ie_off;

Modified: projects/mesh11s/sys/net80211/ieee80211_ioctl.h
==============================================================================
--- projects/mesh11s/sys/net80211/ieee80211_ioctl.h	Mon May  4 21:58:32 2009	(r191801)
+++ projects/mesh11s/sys/net80211/ieee80211_ioctl.h	Mon May  4 23:36:20 2009	(r191802)
@@ -378,6 +378,10 @@ struct ieee80211req_sta_info {
 	uint16_t	isi_txmbps;		/* current tx rate in .5 Mb/s */
 	uint32_t	isi_jointime;		/* time of assoc/join */
 	struct ieee80211_mimo_info isi_mimo;	/* MIMO info for 11n sta's */
+	/* 11s info */
+	uint8_t		isi_peerstate;
+	uint16_t	isi_peerid;
+	uint16_t	isi_localid;
 	/* XXX frag state? */
 	/* variable length IE data */
 };

Modified: projects/mesh11s/sys/net80211/ieee80211_mesh.c
==============================================================================
--- projects/mesh11s/sys/net80211/ieee80211_mesh.c	Mon May  4 21:58:32 2009	(r191801)
+++ projects/mesh11s/sys/net80211/ieee80211_mesh.c	Mon May  4 23:36:20 2009	(r191802)
@@ -405,7 +405,21 @@ mesh_recv_mgmt(struct ieee80211_node *ni
 		 * peered with this node, send him a mgmt frame with
 		 * peer link IE.
 		 */
-		/* XXX */
+		if (ni->ni_peerstate == IEEE80211_NODE_MESH_IDLE) {
+			uint16_t args[4];
+			
+			get_random_bytes(&ni->ni_plid, 2);
+			ni->ni_peerstate = IEEE80211_NODE_MESH_OPENSNT;
+			IEEE80211_NOTE(vap,
+			    IEEE80211_MSG_MESH,
+			    ni, "peer link: switching to state %d",
+			    ni->ni_peerstate);
+			args[0] = ni->ni_plid;
+			ieee80211_send_action(ni,
+			    IEEE80211_ACTION_CAT_MESHPEERING,
+			    IEEE80211_ACTION_MESHPEERING_OPEN, args);
+			/* XXX setup timeout1 */
+		}
 		break;
 	}
 	case IEEE80211_FC0_SUBTYPE_PROBE_REQ:
@@ -562,34 +576,95 @@ mesh_recv_action(struct ieee80211_node *
 		case IEEE80211_ACTION_MESHPEERING_OPEN:
 			IEEE80211_NOTE(vap,
 			    IEEE80211_MSG_ACTION | IEEE80211_MSG_MESH, ni,
-			    "%s", "recv peering open");
-			ni->ni_peerstate = IEEE80211_NODE_MESH_OPENRCV;
-			ni->ni_llid = meshpeer->peer_llinkid;
-			ni->ni_plid = 0xf4ef;
-			args[0] = ni->ni_plid;
-			ieee80211_send_action(ni,
-			    IEEE80211_ACTION_CAT_MESHPEERING,
-			    IEEE80211_ACTION_MESHPEERING_OPEN, args);
+			    "%s", "recv PEER OPEN");
+			switch (ni->ni_peerstate) {
+			case IEEE80211_NODE_MESH_IDLE:			
+				ni->ni_peerstate = IEEE80211_NODE_MESH_OPENRCV;
+				IEEE80211_NOTE(vap,
+				    IEEE80211_MSG_MESH,
+				    ni, "peer link: switching to state %d",
+				    ni->ni_peerstate);
+				ni->ni_llid = meshpeer->peer_llinkid;
+				get_random_bytes(&ni->ni_plid, 2);
+				args[0] = ni->ni_plid;
+				/* Announce we're open too... */
+				ieee80211_send_action(ni,
+				    IEEE80211_ACTION_CAT_MESHPEERING,
+				    IEEE80211_ACTION_MESHPEERING_OPEN, args);
+				/* ... and confirm the link. */
+				args[0] = ni->ni_plid;
+				args[1] = ni->ni_llid;
+				ieee80211_send_action(ni,
+				    IEEE80211_ACTION_CAT_MESHPEERING,
+				    IEEE80211_ACTION_MESHPEERING_CONFIRM, args);
+				/* XXX setup timeout1 */
+				break;
+			case IEEE80211_NODE_MESH_OPENRCV:
+				/* We received a duplicate open, confirm again. */
+				ni->ni_llid = meshpeer->peer_llinkid;
+				args[0] = ni->ni_plid;
+				args[1] = ni->ni_llid;
+				ieee80211_send_action(ni,
+				    IEEE80211_ACTION_CAT_MESHPEERING,
+				    IEEE80211_ACTION_MESHPEERING_CONFIRM, args);
+				break;
+			case IEEE80211_NODE_MESH_OPENSNT:
+				ni->ni_peerstate = IEEE80211_NODE_MESH_OPENRCV;
+				IEEE80211_NOTE(vap,
+				    IEEE80211_MSG_MESH,
+				    ni, "peer link: switching to state %d",
+				    ni->ni_peerstate);
+				args[0] = ni->ni_plid;
+				args[1] = ni->ni_llid;
+				ieee80211_send_action(ni,
+				    IEEE80211_ACTION_CAT_MESHPEERING,
+				    IEEE80211_ACTION_MESHPEERING_CONFIRM, args);
+				/* XXX setup timeout1 */
+				break;
+			case IEEE80211_NODE_MESH_CONFIRMRECV:
+				ni->ni_peerstate = IEEE80211_NODE_MESH_ESTABLISHED;
+				IEEE80211_NOTE(vap,
+				    IEEE80211_MSG_MESH,
+				    ni, "peer link: switching to state %d",
+				    ni->ni_peerstate);
+				ni->ni_llid = meshpeer->peer_llinkid;
+				args[0] = ni->ni_plid;
+				args[1] = ni->ni_llid;
+				ieee80211_send_action(ni,
+				    IEEE80211_ACTION_CAT_MESHPEERING,
+				    IEEE80211_ACTION_MESHPEERING_CONFIRM, args);
+				/* clear timeoutC */
+				break;
+			}
 			break;
 		case IEEE80211_ACTION_MESHPEERING_CONFIRM:
 			IEEE80211_NOTE(vap,
 			    IEEE80211_MSG_ACTION | IEEE80211_MSG_MESH, ni,
-			    "%s", "recv peering confirm");
-			if (ni->ni_peerstate != IEEE80211_NODE_MESH_OPNSENT &&
-			    ni->ni_peerstate != IEEE80211_NODE_MESH_OPENRCV) {
+			    "%s", "recv PEER CONFIRM");
+			switch (ni->ni_peerstate) {
+			case IEEE80211_NODE_MESH_OPENRCV:
+				ni->ni_peerstate = IEEE80211_NODE_MESH_ESTABLISHED;
+				IEEE80211_NOTE(vap,
+				    IEEE80211_MSG_MESH,
+				    ni, "peer link: switching to state %d",
+				    ni->ni_peerstate);
+				/* clear timeoutR */
+				break;
+			case IEEE80211_NODE_MESH_OPENSNT:
+				ni->ni_peerstate = IEEE80211_NODE_MESH_CONFIRMRECV;
+				IEEE80211_NOTE(vap,
+				    IEEE80211_MSG_MESH,
+				    ni, "peer link: switching to state %d",
+				    ni->ni_peerstate);
+				break;
+			default:
+
 				IEEE80211_DISCARD(vap,
 				    IEEE80211_MSG_ACTION | IEEE80211_MSG_MESH,
 				    wh, NULL, "received confirm in invalid "
 				    "state %d", ni->ni_peerstate);
 				vap->iv_stats.is_rx_mgtdiscard++;
-				return;
 			}
-			ni->ni_peerstate = IEEE80211_NODE_MESH_CONFIRMRECV;
-			args[0] = 0xf4ef;
-			args[1] = ni->ni_llid;
-			ieee80211_send_action(ni,
-			    IEEE80211_ACTION_CAT_MESHPEERING,
-			    IEEE80211_ACTION_MESHPEERING_CONFIRM, args);
 		}
 		break;
 	default:
@@ -688,6 +763,7 @@ ieee80211_add_meshpeer(uint8_t *frm, uin
 			*frm++ = 7;	/* length */
 		else
 			*frm++ = 5;	/* length */
+		*frm++ = subtype;
 		ADDSHORT(frm, localid);	/* local ID */
 		if (peerid)
 			ADDSHORT(frm, peerid);	/* peer ID */

Modified: projects/mesh11s/sys/net80211/ieee80211_node.h
==============================================================================
--- projects/mesh11s/sys/net80211/ieee80211_node.h	Mon May  4 21:58:32 2009	(r191801)
+++ projects/mesh11s/sys/net80211/ieee80211_node.h	Mon May  4 23:36:20 2009	(r191802)
@@ -175,9 +175,9 @@ struct ieee80211_node {
 	uint8_t			ni_dtim_period;	/* DTIM period */
 	uint8_t			ni_dtim_count;	/* DTIM count for last bcn */
 
-	/* mesh */
+	/* 11s state */
 #define IEEE80211_NODE_MESH_IDLE	0
-#define IEEE80211_NODE_MESH_OPNSENT	1	/* Peer Open Frame Received */
+#define IEEE80211_NODE_MESH_OPENSNT	1	/* Peer Open Frame Received */
 #define IEEE80211_NODE_MESH_OPENRCV	2	/* Peer Open Frame Sent */
 #define IEEE80211_NODE_MESH_CONFIRMRECV	3	/* Peer Confirm Frame Recvived */
 #define IEEE80211_NODE_MESH_ESTABLISHED	4	/* Peer Link Established */

Modified: projects/mesh11s/sys/net80211/ieee80211_output.c
==============================================================================
--- projects/mesh11s/sys/net80211/ieee80211_output.c	Mon May  4 21:58:32 2009	(r191801)
+++ projects/mesh11s/sys/net80211/ieee80211_output.c	Mon May  4 23:36:20 2009	(r191802)
@@ -691,6 +691,17 @@ ieee80211_send_action(struct ieee80211_n
 			    IEEE80211_MESH_PEER_LINK_CONFIRM, args[0], args[1],
 			    0);
 			break;
+		case IEEE80211_ACTION_MESHPEERING_CLOSE:
+			IEEE80211_NOTE(vap,
+			    IEEE80211_MSG_ACTION | IEEE80211_MSG_MESH, ni,
+			    "sending PEER CLOSE action: localid %x peerid %x "
+			    "reason %d", args[0], args[1], args[2]);
+			ADDSHORT(frm, args[2]);		/* reason code */
+			frm = ieee80211_add_meshid(frm, vap);
+			frm = ieee80211_add_meshpeer(frm,
+			    IEEE80211_MESH_PEER_LINK_CLOSE, args[0], args[1],
+			    args[2]);
+			break;
 		}
 		break;
 	default:



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