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