Date: Thu, 4 Jun 2009 17:12:50 +0000 (UTC) From: Sam Leffler <sam@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r193443 - projects/mesh11s/sbin/ifconfig Message-ID: <200906041712.n54HConN098328@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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();
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200906041712.n54HConN098328>