From owner-svn-src-projects@FreeBSD.ORG Thu Jun 4 17:12:50 2009 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 93F781065770; Thu, 4 Jun 2009 17:12:50 +0000 (UTC) (envelope-from sam@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 82A5A8FC1C; Thu, 4 Jun 2009 17:12:50 +0000 (UTC) (envelope-from sam@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n54HCoVN098329; Thu, 4 Jun 2009 17:12:50 GMT (envelope-from sam@svn.freebsd.org) Received: (from sam@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n54HConN098328; Thu, 4 Jun 2009 17:12:50 GMT (envelope-from sam@svn.freebsd.org) Message-Id: <200906041712.n54HConN098328@svn.freebsd.org> From: Sam Leffler Date: Thu, 4 Jun 2009 17:12:50 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r193443 - projects/mesh11s/sbin/ifconfig X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 04 Jun 2009 17:12:51 -0000 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", 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();