svn commit: r193443 - projects/mesh11s/sbin/ifconfig

Sam Leffler sam at FreeBSD.org
Thu Jun 4 17:12:51 UTC 2009


Author: sam
Date: Thu Jun  4 17:12:50 2009
New Revision: 193443
URL: http://svn.freebsd.org/changeset/base/193443

Log:
  o add list mesh
  o reduce list sta knowledge of  mesh

Modified:
  projects/mesh11s/sbin/ifconfig/ifieee80211.c

Modified: projects/mesh11s/sbin/ifconfig/ifieee80211.c
==============================================================================
--- projects/mesh11s/sbin/ifconfig/ifieee80211.c	Thu Jun  4 16:50:03 2009	(r193442)
+++ projects/mesh11s/sbin/ifconfig/ifieee80211.c	Thu Jun  4 17:12:50 2009	(r193443)
@@ -3013,9 +3013,7 @@ printies(const u_int8_t *vp, int ielen, 
 				printssid(" MESHID", vp, 2+vp[1], maxcols);
 			break;
 		case IEEE80211_ELEMID_MESHCONF:
-			if (verbose)
-				printmeshconf(" MESHCONF", vp, 2+vp[1],
-				    maxcols);
+			printmeshconf(" MESHCONF", vp, 2+vp[1], maxcols);
 			break;
 		default:
 			if (verbose)
@@ -3187,20 +3185,6 @@ getrxseq(const struct ieee80211req_sta_i
 #undef IEEE80211_NODE_QOS
 }
 
-static const char *
-mesh_linkstate_string(uint8_t state)
-{
-	switch (state) {
-	case 0: return "IDLE";
-	case 1: return "OPEN SENT";
-	case 2: return "OPEN RECEIVED";
-	case 3: return "CONFIRM RECEIVED";
-	case 4: return "ESTABLISHED";
-	case 5: return "HOLDING";
-	default: return "UNKNOWN";
-	}
-}
-
 static void
 list_stations(int s)
 {
@@ -3260,10 +3244,94 @@ list_stations(int s)
 			, getflags(si->isi_state)
 		);
 		printies(cp + si->isi_ie_off, si->isi_ie_len, 24);
-		if (verbose && opmode == IEEE80211_M_MBSS)
-			printf(" MESHLINK<PEERID: 0x%x LOCALID: 0x%x "
-			    "STATE %s>", si->isi_peerid, si->isi_localid,
-			    mesh_linkstate_string(si->isi_peerstate));
+		printmimo(&si->isi_mimo);
+		printf("\n");
+		cp += si->isi_len, len -= si->isi_len;
+	} while (len >= sizeof(struct ieee80211req_sta_info));
+}
+
+static const char *
+mesh_linkstate_string(uint8_t state)
+{
+#define	N(a)	(sizeof(a) / sizeof(a[0]))
+	static const char *state_names[] = {
+	    [0] = "IDLE",
+	    [1] = "OPEN-TX",
+	    [2] = "OPEN-RX",
+	    [3] = "CONF-RX",
+	    [4] = "ESTAB",
+	    [5] = "HOLDING",
+	};
+
+	if (state >= N(state_names)) {
+		static char buf[10];
+		snprintf(buf, sizeof(buf), "#%u", state);
+		return buf;
+	} else
+		return state_names[state];
+#undef N
+}
+
+static void
+list_mesh(int s)
+{
+	union {
+		struct ieee80211req_sta_req req;
+		uint8_t buf[24*1024];
+	} u;
+	enum ieee80211_opmode opmode = get80211opmode(s);
+	const uint8_t *cp;
+	int len;
+
+	/* broadcast address =>'s get all stations */
+	(void) memset(u.req.is_u.macaddr, 0xff, IEEE80211_ADDR_LEN);
+	if (opmode == IEEE80211_M_STA) {
+		/*
+		 * Get information about the associated AP.
+		 */
+		(void) get80211(s, IEEE80211_IOC_BSSID,
+		    u.req.is_u.macaddr, IEEE80211_ADDR_LEN);
+	}
+	if (get80211len(s, IEEE80211_IOC_STA_INFO, &u, sizeof(u), &len) < 0)
+		errx(1, "unable to get station information");
+	if (len < sizeof(struct ieee80211req_sta_info))
+		return;
+
+	getchaninfo(s);
+
+	printf("%-17.17s %4s %5s %5s %7s %4s %4s %4s %6s %6s\n"
+		, "ADDR"
+		, "CHAN"
+		, "LOCAL"
+		, "PEER"
+		, "STATE"
+		, "RATE"
+		, "RSSI"
+		, "IDLE"
+		, "TXSEQ"
+		, "RXSEQ"
+	);
+	cp = (const uint8_t *) u.req.info;
+	do {
+		const struct ieee80211req_sta_info *si;
+
+		si = (const struct ieee80211req_sta_info *) cp;
+		if (si->isi_len < sizeof(*si))
+			break;
+		printf("%s %4d %5x %5x %7.7s %3dM %3.1f %4d %6d %6d"
+			, ether_ntoa((const struct ether_addr*) si->isi_macaddr)
+			, ieee80211_mhz2ieee(si->isi_freq, si->isi_flags)
+			, si->isi_localid
+			, si->isi_peerid
+			, mesh_linkstate_string(si->isi_peerstate)
+			, si->isi_txmbps/2
+			, si->isi_rssi/2.
+			, si->isi_inact
+			, gettxseq(si)
+			, getrxseq(si)
+		);
+		if (verbose)
+			printies(cp + si->isi_ie_off, si->isi_ie_len, 24);
 		printmimo(&si->isi_mimo);
 		printf("\n");
 		cp += si->isi_len, len -= si->isi_len;
@@ -3843,6 +3911,8 @@ DECL_CMD_FUNC(set80211list, arg, d)
 		list_regdomain(s, 1);
 	else if (iseq(arg, "countries"))
 		list_countries();
+	else if (iseq(arg, "mesh"))
+		list_mesh(s);
 	else
 		errx(1, "Don't know how to list %s for %s", arg, name);
 	LINE_BREAK();


More information about the svn-src-projects mailing list