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