Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 26 Jun 2009 15:11:06 +0000 (UTC)
From:      Rui Paulo <rpaulo@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r195054 - projects/mesh11s/sys/net80211
Message-ID:  <200906261511.n5QFB6ac089974@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: rpaulo
Date: Fri Jun 26 15:11:06 2009
New Revision: 195054
URL: http://svn.freebsd.org/changeset/base/195054

Log:
  Include the D3.0s Mesh Peer Version IE on peer link frames.

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

Modified: projects/mesh11s/sys/net80211/ieee80211.h
==============================================================================
--- projects/mesh11s/sys/net80211/ieee80211.h	Fri Jun 26 13:37:53 2009	(r195053)
+++ projects/mesh11s/sys/net80211/ieee80211.h	Fri Jun 26 15:11:06 2009	(r195054)
@@ -727,7 +727,7 @@ enum {
 	IEEE80211_ELEMID_MESHPU		= 53,
 	IEEE80211_ELEMID_MESHPUC	= 54,
 	IEEE80211_ELEMID_MESHAH		= 60, /* Abbreviated Handshake */
-	IEEE80211_ELEMID_MESHPEERV	= 61, /* Peering Protocol Version */
+	IEEE80211_ELEMID_MESHPEERVER	= 69, /* Peering Protocol Version */
 };
 
 struct ieee80211_tim_ie {

Modified: projects/mesh11s/sys/net80211/ieee80211_mesh.c
==============================================================================
--- projects/mesh11s/sys/net80211/ieee80211_mesh.c	Fri Jun 26 13:37:53 2009	(r195053)
+++ projects/mesh11s/sys/net80211/ieee80211_mesh.c	Fri Jun 26 15:11:06 2009	(r195054)
@@ -76,6 +76,8 @@ static inline void	mesh_peer_timeout_set
 static void		mesh_peer_timeout_backoff(struct ieee80211_node *);
 static void		mesh_peer_timeout_cb(void *);
 static inline void	mesh_peer_timeout_stop(struct ieee80211_node *);
+static int	mesh_verify_meshpeerver(struct ieee80211vap *,
+		    struct ieee80211_meshpeerver_ie *);
 static int	mesh_verify_meshid(struct ieee80211vap *,
 		    struct ieee80211_meshid_ie *);
 static int	mesh_verify_meshconf(struct ieee80211vap *,
@@ -816,6 +818,7 @@ mesh_recv_action(struct ieee80211_node *
 	struct ieee80211_meshid_ie *meshid = NULL;
 	struct ieee80211_meshconf_ie *meshconf = NULL;
 	struct ieee80211_meshpeer_ie *meshpeer = NULL;
+	struct ieee80211_meshpeerver_ie *meshpeerver = NULL;
 	struct ieee80211_meshpeer_ie meshpeercopy;
 	uint8_t *frm, *efrm;
 	union ieee80211_send_action_args vargs;
@@ -864,6 +867,10 @@ mesh_recv_action(struct ieee80211_node *
 		while (efrm - frm > 1) {
 			IEEE80211_VERIFY_LENGTH(efrm - frm, frm[1] + 2, return);
 			switch (*frm) {
+			case IEEE80211_ELEMID_MESHPEERVER:
+				meshpeerver =
+				    (struct ieee80211_meshpeerver_ie *)frm;
+				break;
 			case IEEE80211_ELEMID_MESHID:
 				meshid = (struct ieee80211_meshid_ie *) frm;
 				break;
@@ -896,7 +903,8 @@ mesh_recv_action(struct ieee80211_node *
 			frm += frm[1] + 2;
 		}
 
-		if (mesh_verify_meshid(vap, meshid) ||
+		if (mesh_verify_meshpeerver(vap, meshpeerver) ||
+		    mesh_verify_meshid(vap, meshid) ||
 		    mesh_verify_meshconf(vap, meshconf) ||
 		    !meshpeer) {
 			IEEE80211_DISCARD(vap,
@@ -1275,6 +1283,15 @@ mesh_peer_timeout_cb(void *arg)
 }
 
 static inline int
+mesh_verify_meshpeerver(struct ieee80211vap *vap,
+    struct ieee80211_meshpeerver_ie *meshpeerver)
+{
+	static const uint8_t peer[4] = IEEE80211_MESHPEERVER_PEER;
+
+	return memcmp(meshpeerver->peerver_proto, peer, 4);
+}
+
+static inline int
 mesh_verify_meshid(struct ieee80211vap *vap,
     struct ieee80211_meshid_ie *meshid)
 {
@@ -1423,13 +1440,29 @@ ieee80211_add_meshconf(uint8_t *frm, str
 		ie.conf_cap |= IEEE80211_MESHCONF_CAP_AP;
 	if (vap->iv_meshflags & IEEE80211_MFLAGS_FWRD)
 		ie.conf_cap |= IEEE80211_MESHCONF_CAP_FWRD;
-
 	memcpy(frm, &ie, sizeof(ie));
-
 	return frm + sizeof(ie);
 }
 
 /*
+ * Add a Mesh Peer Protocol IE to a frame.
+ * XXX: needs to grow support for Abbreviated Handshake
+ */
+uint8_t *
+ieee80211_add_meshpeerver(uint8_t *frm, struct ieee80211vap *vap)
+{
+	struct ieee80211_meshpeerver_ie ie = {
+		.peerver_ie 	= IEEE80211_ELEMID_MESHPEERVER,
+		.peerver_len 	= 4,
+		.peerver_proto	= IEEE80211_MESHPEERVER_PEER,
+	};
+
+	KASSERT(vap->iv_opmode == IEEE80211_M_MBSS, ("not a MBSS vap"));
+
+	memcpy(frm, &ie, sizeof(ie));
+	return frm + sizeof(ie);
+}
+/*
  * Add a Mesh Peer Management IE to a frame.
  */
 uint8_t *
@@ -1464,7 +1497,6 @@ ieee80211_add_meshpeer(uint8_t *frm, uin
 		ADDSHORT(frm, reason);
 		break;
 	}
-
 	return frm;
 }
 

Modified: projects/mesh11s/sys/net80211/ieee80211_mesh.h
==============================================================================
--- projects/mesh11s/sys/net80211/ieee80211_mesh.h	Fri Jun 26 13:37:53 2009	(r195053)
+++ projects/mesh11s/sys/net80211/ieee80211_mesh.h	Fri Jun 26 15:11:06 2009	(r195054)
@@ -113,6 +113,23 @@ struct ieee80211_meshcngst_ie {
 					   AC_BE, AC_VI, AC_VO */
 } __packed;
 
+/* Peer Version */
+struct ieee80211_meshpeerver_ie {
+	uint8_t		peerver_ie;	/* IEEE80211_ELEMID_MESHPEERVER */
+	uint8_t		peerver_len;
+	uint8_t		peerver_proto[4];
+} __packed;
+/* Mesh Peering Management Protocol */
+#define	IEEE80211_MESHPEERVER_PEER_OUI		0x00, 0x0f, 0xac
+#define	IEEE80211_MESHPEERVER_PEER_VALUE	0x2a
+#define	IEEE80211_MESHPEERVER_PEER	{ IEEE80211_MESHPEERVER_PEER_OUI, \
+					  IEEE80211_MESHPEERVER_PEER_VALUE }
+/* Abbreviated Handshake Protocol */
+#define	IEEE80211_MESHPEERVER_AH_OUI		0x00, 0x0f, 0xac
+#define	IEEE80211_MESHPEERVER_AH_VALUE		0x2b
+#define	IEEE80211_MESHPEERVER_AH	{ IEEE80211_MESHPEERVER_AH_OUI, \
+					  IEEE80211_MESHPEERVER_AH_VALUE }
+
 /* Peer Link Management */
 struct ieee80211_meshpeer_ie {
 	uint8_t		peer_ie;	/* IEEE80211_ELEMID_MESHPEER */
@@ -357,6 +374,7 @@ struct ieee80211_meshcntl_ae11 {
 void		ieee80211_mesh_attach(struct ieee80211com *);
 void		ieee80211_mesh_detach(struct ieee80211com *);
 void		ieee80211_parse_meshid(struct ieee80211_node *, const uint8_t *);
+uint8_t *	ieee80211_add_meshpeerver(uint8_t *, struct ieee80211vap *);
 uint8_t *	ieee80211_add_meshid(uint8_t *, struct ieee80211vap *);
 uint8_t *	ieee80211_add_meshconf(uint8_t *, struct ieee80211vap *);
 uint8_t *	ieee80211_add_meshpeer(uint8_t *, uint8_t, uint16_t, uint16_t,

Modified: projects/mesh11s/sys/net80211/ieee80211_output.c
==============================================================================
--- projects/mesh11s/sys/net80211/ieee80211_output.c	Fri Jun 26 13:37:53 2009	(r195053)
+++ projects/mesh11s/sys/net80211/ieee80211_output.c	Fri Jun 26 15:11:06 2009	(r195054)
@@ -597,6 +597,7 @@ ieee80211_send_action(struct ieee80211_n
 		addsize = sizeof(uint16_t)		/* capabilities */
 			+ 2 + IEEE80211_RATE_SIZE
 			+ 2 + (IEEE80211_RATE_MAXSIZE - IEEE80211_RATE_SIZE)
+			+ sizeof(struct ieee80211_meshpeerver_ie)
 			+ 2 + vap->iv_meshidlen		/* Mesh ID */
 			+ sizeof(struct ieee80211_meshconf_ie)
 			+ sizeof(struct ieee80211_meshpeer_ie);
@@ -688,6 +689,7 @@ ieee80211_send_action(struct ieee80211_n
 		 *   [1] action
 		 *   [1] category
 		 *   [2] capabilities
+		 *   [tlv] mesh peer protocol version
 		 *   [tlv] rates
 		 *   [tlv] xrates
 		 *   [tlv] mesh id
@@ -700,6 +702,7 @@ ieee80211_send_action(struct ieee80211_n
 			    "send PEER OPEN action: localid 0x%x",
 			    vargs.fixedarg[0]);
 			ADDSHORT(frm, getcapinfo(vap, ni->ni_chan));
+			frm = ieee80211_add_meshpeerver(frm, vap);
 			frm = ieee80211_add_rates(frm, rs);
 			frm = ieee80211_add_xrates(frm, rs);
 			frm = ieee80211_add_meshid(frm, vap);
@@ -715,6 +718,7 @@ ieee80211_send_action(struct ieee80211_n
 		 *   [2] capabilities
 		 *   [2] status code
 		 *   [2] association id (peer ID)
+		 *   [tlv] mesh peer protocol version
 		 *   [tlv] rates
 		 *   [tlv] xrates
 		 *   [tlv] mesh id
@@ -730,6 +734,7 @@ ieee80211_send_action(struct ieee80211_n
 			ADDSHORT(frm, getcapinfo(vap, ni->ni_chan));
 			ADDSHORT(frm, 0);		  /* status code */
 			ADDSHORT(frm, vargs.fixedarg[1]); /* AID */
+			frm = ieee80211_add_meshpeerver(frm, vap);
 			frm = ieee80211_add_rates(frm, rs);
 			frm = ieee80211_add_xrates(frm, rs);
 			frm = ieee80211_add_meshid(frm, vap);
@@ -744,6 +749,7 @@ ieee80211_send_action(struct ieee80211_n
 		 *   [1] action
 		 *   [1] category
 		 *   [2] reason code
+		 *   [tlv] mesh peer protocol version
 		 *   [tlv] mesh id
 		 *   [tlv] mesh peer link mgmt
 		 */
@@ -754,6 +760,7 @@ ieee80211_send_action(struct ieee80211_n
 			    "peerid 0x%x reason %d", vargs.fixedarg[0],
 			    vargs.fixedarg[1], vargs.fixedarg[2]);
 			ADDSHORT(frm, vargs.fixedarg[2]);   /* reason code */
+			frm = ieee80211_add_meshpeerver(frm, vap);
 			frm = ieee80211_add_meshid(frm, vap);
 			frm = ieee80211_add_meshpeer(frm,
 			    IEEE80211_MESH_PEER_LINK_CLOSE,



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