svn commit: r191150 - in projects/mesh11s: sbin/ifconfig
sys/net80211
Rui Paulo
rpaulo at FreeBSD.org
Thu Apr 16 14:50:18 PDT 2009
Author: rpaulo
Date: Thu Apr 16 21:50:17 2009
New Revision: 191150
URL: http://svn.freebsd.org/changeset/base/191150
Log:
Implement MBSS (Mesh) scanning in net80211 and ifconfig.
Sponsored by: The FreeBSD Foundation
Modified:
projects/mesh11s/sbin/ifconfig/ifieee80211.c
projects/mesh11s/sys/net80211/ieee80211_input.c
projects/mesh11s/sys/net80211/ieee80211_ioctl.c
projects/mesh11s/sys/net80211/ieee80211_ioctl.h
projects/mesh11s/sys/net80211/ieee80211_scan.h
projects/mesh11s/sys/net80211/ieee80211_scan_sta.c
Modified: projects/mesh11s/sbin/ifconfig/ifieee80211.c
==============================================================================
--- projects/mesh11s/sbin/ifconfig/ifieee80211.c Thu Apr 16 21:20:24 2009 (r191149)
+++ projects/mesh11s/sbin/ifconfig/ifieee80211.c Thu Apr 16 21:50:17 2009 (r191150)
@@ -77,6 +77,8 @@
#include <net/if_media.h>
#include <net/route.h>
+#include <arpa/inet.h>
+
#include <net80211/ieee80211_ioctl.h>
#include <net80211/ieee80211_freebsd.h>
#include <net80211/ieee80211_superg.h>
@@ -2482,6 +2484,40 @@ printathie(const char *tag, const u_int8
}
}
+
+static void
+printmeshconf(const char *tag, const uint8_t *ie, size_t ielen, int maxlen)
+{
+#define MATCHOUI(bitfield, oui, value, string) \
+do { \
+ if (((htonl(bitfield)) >> 8) == oui && \
+ ((htonl(bitfield)) & 0xff) == value) \
+ printf("%s", string); \
+} while (0)
+
+ printf("%s", tag);
+ if (verbose) {
+ const struct ieee80211_meshconf_ie *mconf =
+ (const struct ieee80211_meshconf_ie *)ie;
+ printf("<v%d APSPI:", mconf->conf_ver);
+ MATCHOUI(mconf->conf_apspi, IEEE80211_MESHCONF_APSPI_HWMP_OUI,
+ IEEE80211_MESHCONF_APSPI_HWMP_VALUE, "HWMP");
+ printf(" APSMI:");
+ MATCHOUI(mconf->conf_apsmi,
+ IEEE80211_MESHCONF_APSMI_AIRTIME_OUI,
+ IEEE80211_MESHCONF_APSMI_AIRTIME_VALUE, "AIRTIME");
+ printf(" CCMI:");
+ MATCHOUI(mconf->conf_ccmi, IEEE80211_MESHCONF_CCMI_DEFAULT_OUI,
+ IEEE80211_MESHCONF_CCMI_DEFAULT_VALUE, "DEFAULT");
+ MATCHOUI(mconf->conf_ccmi, IEEE80211_MESHCONF_CCMI_NULL_OUI,
+ IEEE80211_MESHCONF_CCMI_NULL_VALUE, "NULL");
+ printf(" FORM:0x%x CAPS:0x%x", mconf->conf_finfo,
+ mconf->conf_cap);
+ printf(">");
+ }
+#undef MATCHOUI
+}
+
static const char *
wpa_cipher(const u_int8_t *sel)
{
@@ -2952,6 +2988,15 @@ printies(const u_int8_t *vp, int ielen,
if (verbose)
printhtinfo(" HTINFO", vp, 2+vp[1], maxcols);
break;
+ case IEEE80211_ELEMID_MESHID:
+ if (verbose)
+ printssid(" MESHID", vp, 2+vp[1], maxcols);
+ break;
+ case IEEE80211_ELEMID_MESHCONF:
+ if (verbose)
+ printmeshconf(" MESHCONF", vp, 2+vp[1],
+ maxcols);
+ break;
default:
if (verbose)
printie(iename(vp[0]), vp, 2+vp[1], maxcols);
@@ -2980,7 +3025,7 @@ list_scan(int s)
uint8_t buf[24*1024];
char ssid[IEEE80211_NWID_LEN+1];
const uint8_t *cp;
- int len, ssidmax;
+ int len, ssidmax, idlen;
if (get80211len(s, IEEE80211_IOC_SCAN_RESULTS, buf, sizeof(buf), &len) < 0)
errx(1, "unable to get scan results");
@@ -2989,9 +3034,9 @@ list_scan(int s)
getchaninfo(s);
- ssidmax = verbose ? IEEE80211_NWID_LEN : 14;
+ ssidmax = verbose ? IEEE80211_NWID_LEN - 1 : 14;
printf("%-*.*s %-17.17s %4s %4s %-7s %3s %4s\n"
- , ssidmax, ssidmax, "SSID"
+ , ssidmax, ssidmax, "SSID/MESH ID"
, "BSSID"
, "CHAN"
, "RATE"
@@ -3002,13 +3047,20 @@ list_scan(int s)
cp = buf;
do {
const struct ieee80211req_scan_result *sr;
- const uint8_t *vp;
+ const uint8_t *vp, *idp;
sr = (const struct ieee80211req_scan_result *) cp;
vp = cp + sr->isr_ie_off;
+ if (sr->isr_meshid_len) {
+ idp = vp + sr->isr_ssid_len;
+ idlen = sr->isr_meshid_len;
+ } else {
+ idp = vp;
+ idlen = sr->isr_ssid_len;
+ }
printf("%-*.*s %s %3d %3dM %3d:%-3d %3d %-4.4s"
, ssidmax
- , copy_essid(ssid, ssidmax, vp, sr->isr_ssid_len)
+ , copy_essid(ssid, ssidmax, idp, idlen)
, ssid
, ether_ntoa((const struct ether_addr *) sr->isr_bssid)
, ieee80211_mhz2ieee(sr->isr_freq, sr->isr_flags)
@@ -3017,7 +3069,8 @@ list_scan(int s)
, sr->isr_intval
, getcaps(sr->isr_capinfo)
);
- printies(vp + sr->isr_ssid_len, sr->isr_ie_len, 24);
+ printies(vp + sr->isr_ssid_len + sr->isr_meshid_len,
+ sr->isr_ie_len, 24);
printf("\n");
cp += sr->isr_len, len -= sr->isr_len;
} while (len >= sizeof(struct ieee80211req_scan_result));
Modified: projects/mesh11s/sys/net80211/ieee80211_input.c
==============================================================================
--- projects/mesh11s/sys/net80211/ieee80211_input.c Thu Apr 16 21:20:24 2009 (r191149)
+++ projects/mesh11s/sys/net80211/ieee80211_input.c Thu Apr 16 21:50:17 2009 (r191150)
@@ -479,6 +479,9 @@ ieee80211_parse_beacon(struct ieee80211_
* [tlv] HT capabilities
* [tlv] HT information
* [tlv] Atheros capabilities
+ * [tlv] Mesh ID
+ * [tlv] Mesh Configuration
+ * [tlv] Mesh TIM
*/
IEEE80211_VERIFY_LENGTH(efrm - frm, 12,
return (scan->status = IEEE80211_BPARSE_BADIELEN));
@@ -551,6 +554,15 @@ ieee80211_parse_beacon(struct ieee80211_
case IEEE80211_ELEMID_HTINFO:
scan->htinfo = frm;
break;
+ case IEEE80211_ELEMID_MESHID:
+ scan->meshid = frm;
+ break;
+ case IEEE80211_ELEMID_MESHCONF:
+ scan->meshconf = frm;
+ break;
+ case IEEE80211_ELEMID_MESHTIM:
+ /* XXXRP TBD */
+ break;
case IEEE80211_ELEMID_VENDOR:
if (iswpaoui(frm))
scan->wpa = frm;
Modified: projects/mesh11s/sys/net80211/ieee80211_ioctl.c
==============================================================================
--- projects/mesh11s/sys/net80211/ieee80211_ioctl.c Thu Apr 16 21:20:24 2009 (r191149)
+++ projects/mesh11s/sys/net80211/ieee80211_ioctl.c Thu Apr 16 21:50:17 2009 (r191150)
@@ -242,7 +242,8 @@ scan_space(const struct ieee80211_scan_e
* packet is <3Kbytes so we are sure this doesn't overflow
* 16-bits; if this is a concern we can drop the ie's.
*/
- len = sizeof(struct ieee80211req_scan_result) + se->se_ssid[1] + *ielen;
+ len = sizeof(struct ieee80211req_scan_result) + se->se_ssid[1] +
+ se->se_meshid[1] + *ielen;
return roundup(len, sizeof(uint32_t));
}
@@ -287,14 +288,19 @@ get_scan_result(void *arg, const struct
memcpy(sr->isr_rates+nr, se->se_xrates+2, nxr);
sr->isr_nrates = nr + nxr;
+ /* copy SSID */
sr->isr_ssid_len = se->se_ssid[1];
cp = ((uint8_t *)sr) + sr->isr_ie_off;
memcpy(cp, se->se_ssid+2, sr->isr_ssid_len);
- if (ielen) {
- cp += sr->isr_ssid_len;
+ /* copy mesh id */
+ cp += sr->isr_ssid_len;
+ sr->isr_meshid_len = se->se_meshid[1];
+ memcpy(cp, se->se_meshid+2, sr->isr_meshid_len);
+ cp += sr->isr_meshid_len;
+
+ if (ielen)
memcpy(cp, se->se_ies.data, ielen);
- }
req->space -= len;
req->sr = (struct ieee80211req_scan_result *)(((uint8_t *)sr) + len);
Modified: projects/mesh11s/sys/net80211/ieee80211_ioctl.h
==============================================================================
--- projects/mesh11s/sys/net80211/ieee80211_ioctl.h Thu Apr 16 21:20:24 2009 (r191149)
+++ projects/mesh11s/sys/net80211/ieee80211_ioctl.h Thu Apr 16 21:50:17 2009 (r191150)
@@ -716,7 +716,9 @@ struct ieee80211req_scan_result {
uint8_t isr_nrates;
uint8_t isr_rates[IEEE80211_RATE_MAXSIZE];
uint8_t isr_ssid_len; /* SSID length */
- /* variable length SSID followed by IE data */
+ uint8_t isr_meshid_len; /* MESH ID length */
+ /* variable length SSID, followed by variable length MESH ID,
+ followed by IE data */
};
/*
Modified: projects/mesh11s/sys/net80211/ieee80211_scan.h
==============================================================================
--- projects/mesh11s/sys/net80211/ieee80211_scan.h Thu Apr 16 21:20:24 2009 (r191149)
+++ projects/mesh11s/sys/net80211/ieee80211_scan.h Thu Apr 16 21:50:17 2009 (r191150)
@@ -210,6 +210,9 @@ struct ieee80211_scanparams {
uint8_t *htinfo;
uint8_t *ath;
uint8_t *tdma;
+ uint8_t *meshid;
+ uint8_t *meshconf;
+ uint8_t *meshtim;
};
/*
@@ -239,6 +242,7 @@ struct ieee80211_scan_entry {
int8_t se_rssi; /* avg'd recv ssi */
int8_t se_noise; /* noise floor */
uint8_t se_cc[2]; /* captured country code */
+ uint8_t se_meshid[2+IEEE80211_NWID_LEN];
struct ieee80211_ies se_ies; /* captured ie's */
u_int se_age; /* age of entry (0 on create) */
};
Modified: projects/mesh11s/sys/net80211/ieee80211_scan_sta.c
==============================================================================
--- projects/mesh11s/sys/net80211/ieee80211_scan_sta.c Thu Apr 16 21:20:24 2009 (r191149)
+++ projects/mesh11s/sys/net80211/ieee80211_scan_sta.c Thu Apr 16 21:50:17 2009 (r191150)
@@ -282,6 +282,8 @@ found:
memcpy(ise->se_tstamp.data, sp->tstamp, sizeof(ise->se_tstamp));
ise->se_intval = sp->bintval;
ise->se_capinfo = sp->capinfo;
+ if (sp->meshid != NULL && sp->meshid[1] != 0)
+ memcpy(ise->se_meshid, sp->meshid, 2+sp->meshid[1]);
/*
* Beware of overriding se_chan for frames seen
* off-channel; this can cause us to attempt an
More information about the svn-src-projects
mailing list