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>