svn commit: r191721 - projects/mesh11s/sys/net80211
Rui Paulo
rpaulo at FreeBSD.org
Fri May 1 17:12:10 UTC 2009
Author: rpaulo
Date: Fri May 1 17:12:10 2009
New Revision: 191721
URL: http://svn.freebsd.org/changeset/base/191721
Log:
Implement ieee80211_add_meshpeer() and use it when necessary. While
there, correctly fill the capinfo for mesh action frames.
Sponsored by: The FreeBSD Foundation
Modified:
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_mesh.c
==============================================================================
--- projects/mesh11s/sys/net80211/ieee80211_mesh.c Fri May 1 17:05:49 2009 (r191720)
+++ projects/mesh11s/sys/net80211/ieee80211_mesh.c Fri May 1 17:12:10 2009 (r191721)
@@ -661,6 +661,41 @@ ieee80211_add_meshconf(uint8_t *frm, str
return frm + sizeof(ie);
}
+uint8_t *
+ieee80211_add_meshpeer(uint8_t *frm, uint8_t subtype, uint16_t localid,
+ uint16_t peerid, uint16_t reason)
+{
+#define ADDSHORT(frm, v) do { \
+ frm[0] = (v) & 0xff; \
+ frm[1] = (v) >> 8; \
+ frm += 2; \
+} while (0)
+ *frm++ = IEEE80211_ELEMID_MESHPEER;
+ switch (subtype) {
+ case IEEE80211_MESH_PEER_LINK_OPEN:
+ *frm++ = 3; /* length */
+ *frm++ = subtype;
+ ADDSHORT(frm, localid); /* local ID */
+ break;
+ case IEEE80211_MESH_PEER_LINK_CONFIRM:
+ *frm++ = 5; /* length */
+ ADDSHORT(frm, localid); /* local ID */
+ ADDSHORT(frm, peerid); /* peer ID */
+ break;
+ case IEEE80211_MESH_PEER_LINK_CLOSE:
+ if (peerid)
+ *frm++ = 7; /* length */
+ else
+ *frm++ = 5; /* length */
+ ADDSHORT(frm, localid); /* local ID */
+ if (peerid)
+ ADDSHORT(frm, peerid); /* peer ID */
+ ADDSHORT(frm, reason);
+ break;
+ }
+ return frm;
+#undef ADDSHORT
+}
void
ieee80211_create_mbss(struct ieee80211vap *vap, struct ieee80211_channel *chan)
{
Modified: projects/mesh11s/sys/net80211/ieee80211_mesh.h
==============================================================================
--- projects/mesh11s/sys/net80211/ieee80211_mesh.h Fri May 1 17:05:49 2009 (r191720)
+++ projects/mesh11s/sys/net80211/ieee80211_mesh.h Fri May 1 17:12:10 2009 (r191721)
@@ -269,6 +269,8 @@ void ieee80211_mesh_detach(struct ieee8
void ieee80211_parse_meshid(struct ieee80211_node *, const uint8_t *);
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,
+ uint16_t);
void ieee80211_create_mbss(struct ieee80211vap *, struct
ieee80211_channel *);
Modified: projects/mesh11s/sys/net80211/ieee80211_output.c
==============================================================================
--- projects/mesh11s/sys/net80211/ieee80211_output.c Fri May 1 17:05:49 2009 (r191720)
+++ projects/mesh11s/sys/net80211/ieee80211_output.c Fri May 1 17:12:10 2009 (r191721)
@@ -73,7 +73,8 @@ static uint8_t *
ieee80211_add_rates(uint8_t *, const struct ieee80211_rateset *);
static uint8_t *
ieee80211_add_xrates(uint8_t *, const struct ieee80211_rateset *);
-
+static uint16_t
+ getcapinfo(struct ieee80211vap *, struct ieee80211_channel *);
#ifdef IEEE80211_DEBUG
/*
* Decide if an outbound management frame should be
@@ -666,37 +667,29 @@ ieee80211_send_action(struct ieee80211_n
IEEE80211_NOTE(vap,
IEEE80211_MSG_ACTION | IEEE80211_MSG_MESH, ni,
"send PEER OPEN action: lid %x", args[0]);
- *frm++ = 0; /* capabilites */
- *frm++ = 0;
+ ADDSHORT(frm, getcapinfo(vap, ni->ni_chan));
frm = ieee80211_add_rates(frm, rs);
frm = ieee80211_add_xrates(frm, rs);
frm = ieee80211_add_meshid(frm, vap);
frm = ieee80211_add_meshconf(frm, vap);
- *frm++ = IEEE80211_ELEMID_MESHPEER;
- *frm++ = 3; /* len */
- *frm++ = IEEE80211_MESH_PEER_LINK_OPEN; /* subtype */
- ADDSHORT(frm, args[0]); /* local ID */
+ frm = ieee80211_add_meshpeer(frm,
+ IEEE80211_MESH_PEER_LINK_OPEN, args[0], 0, 0);
break;
case IEEE80211_ACTION_MESHPEERING_CONFIRM:
IEEE80211_NOTE(vap,
IEEE80211_MSG_ACTION | IEEE80211_MSG_MESH, ni,
"send PEER CONFIRM action: lid %x, pid %x",
args[0], args[1]);
- *frm++ = 0; /* capabilites */
- *frm++ = 0;
- *frm++ = 0; /* status code */
- *frm++ = 0;
- *frm++ = 0; /* AID */
- *frm++ = 0;
+ ADDSHORT(frm, getcapinfo(vap, ni->ni_chan));
+ ADDSHORT(frm, 0); /* status code */
+ ADDSHORT(frm, 0); /* AID */
frm = ieee80211_add_rates(frm, rs);
frm = ieee80211_add_xrates(frm, rs);
frm = ieee80211_add_meshid(frm, vap);
frm = ieee80211_add_meshconf(frm, vap);
- *frm++ = IEEE80211_ELEMID_MESHPEER;
- *frm++ = 5; /* len */
- *frm++ = IEEE80211_MESH_PEER_LINK_CONFIRM; /* subtype */
- ADDSHORT(frm, args[0]);
- ADDSHORT(frm, args[1]);
+ frm = ieee80211_add_meshpeer(frm,
+ IEEE80211_MESH_PEER_LINK_CONFIRM, args[0], args[1],
+ 0);
break;
}
break;
More information about the svn-src-projects
mailing list