Date: Fri, 1 May 2009 17:12:10 +0000 (UTC) From: Rui Paulo <rpaulo@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r191721 - projects/mesh11s/sys/net80211 Message-ID: <200905011712.n41HCAtU048400@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200905011712.n41HCAtU048400>