svn commit: r195054 - projects/mesh11s/sys/net80211
Rui Paulo
rpaulo at FreeBSD.org
Fri Jun 26 15:11:07 UTC 2009
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,
More information about the svn-src-projects
mailing list