PERFORCE change 65734 for review
Sam Leffler
sam at FreeBSD.org
Tue Nov 23 22:44:13 GMT 2004
http://perforce.freebsd.org/chv.cgi?CH=65734
Change 65734 by sam at sam_ebb on 2004/11/23 22:43:12
o redo callback decls+definitions using macros
o add basic wme parameters
Affected files ...
.. //depot/projects/wifi/sbin/ifconfig/ifieee80211.c#16 edit
Differences ...
==== //depot/projects/wifi/sbin/ifconfig/ifieee80211.c#16 (text+ko) ====
@@ -481,40 +481,82 @@
}
}
-static void
-set80211cwmin(const char *val, int d, int s, const struct afswtch *rafp)
+static int
+getac(const char *ac)
+{
+ if (strcasecmp(ac, "ac_be") == 0 || strcasecmp(ac, "be") == 0)
+ return WME_AC_BE;
+ if (strcasecmp(ac, "ac_bk") == 0 || strcasecmp(ac, "bk") == 0)
+ return WME_AC_BK;
+ if (strcasecmp(ac, "ac_vi") == 0 || strcasecmp(ac, "vi") == 0)
+ return WME_AC_VI;
+ if (strcasecmp(ac, "ac_vo") == 0 || strcasecmp(ac, "vo") == 0)
+ return WME_AC_VO;
+ errx(1, "unknown wme access class %s", ac);
+}
+
+static
+DECL_CMD_FUNC2(set80211cwmin, ac, val)
+{
+ set80211(s, IEEE80211_IOC_WME_CWMIN, atoi(val), getac(ac), NULL);
+}
+
+static
+DECL_CMD_FUNC2(set80211cwmax, ac, val)
+{
+ set80211(s, IEEE80211_IOC_WME_CWMAX, atoi(val), getac(ac), NULL);
+}
+
+static
+DECL_CMD_FUNC2(set80211aifs, ac, val)
+{
+ set80211(s, IEEE80211_IOC_WME_AIFS, atoi(val), getac(ac), NULL);
+}
+
+static
+DECL_CMD_FUNC2(set80211txoplimit, ac, val)
+{
+ set80211(s, IEEE80211_IOC_WME_TXOPLIMIT, atoi(val), getac(ac), NULL);
+}
+
+static
+DECL_CMD_FUNC(set80211acm, val, d)
{
- set80211(s, IEEE80211_IOC_WME_CWMIN, atoi(val), 0, NULL);
+ set80211(s, IEEE80211_IOC_WME_ACM, d, WME_AC_BE, NULL);
}
-static void
-set80211cwmax(const char *val, int d, int s, const struct afswtch *rafp)
+static
+DECL_CMD_FUNC(set80211ackpolicy, val, d)
{
- set80211(s, IEEE80211_IOC_WME_CWMAX, atoi(val), 0, NULL);
+ set80211(s, IEEE80211_IOC_WME_ACKPOLICY, d, WME_AC_BE, NULL);
}
-static void
-set80211aifs(const char *val, int d, int s, const struct afswtch *rafp)
+static
+DECL_CMD_FUNC2(set80211bsscwmin, ac, val)
{
- set80211(s, IEEE80211_IOC_WME_AIFS, atoi(val), 0, NULL);
+ set80211(s, IEEE80211_IOC_WME_CWMIN, atoi(val),
+ getac(ac)|IEEE80211_WMEPARAM_BSS, NULL);
}
-static void
-set80211txoplimit(const char *val, int d, int s, const struct afswtch *rafp)
+static
+DECL_CMD_FUNC2(set80211bsscwmax, ac, val)
{
- set80211(s, IEEE80211_IOC_WME_TXOPLIMIT, atoi(val), 0, NULL);
+ set80211(s, IEEE80211_IOC_WME_CWMAX, atoi(val),
+ getac(ac)|IEEE80211_WMEPARAM_BSS, NULL);
}
-static void
-set80211acm(const char *val, int d, int s, const struct afswtch *rafp)
+static
+DECL_CMD_FUNC2(set80211bssaifs, ac, val)
{
- set80211(s, IEEE80211_IOC_WME_ACM, atoi(val), 0, NULL);
+ set80211(s, IEEE80211_IOC_WME_AIFS, atoi(val),
+ getac(ac)|IEEE80211_WMEPARAM_BSS, NULL);
}
-static void
-set80211ackpolicy(const char *val, int d, int s, const struct afswtch *rafp)
+static
+DECL_CMD_FUNC2(set80211bsstxoplimit, ac, val)
{
- set80211(s, IEEE80211_IOC_WME_ACKPOLICY, d, 0, NULL);
+ set80211(s, IEEE80211_IOC_WME_TXOPLIMIT, atoi(val),
+ getac(ac)|IEEE80211_WMEPARAM_BSS, NULL);
}
static int
@@ -726,8 +768,8 @@
close(sroute);
}
-static void
-set80211scan(const char *val, int d, int s, const struct afswtch *rafp)
+static
+DECL_CMD_FUNC(set80211scan, val, d)
{
scan_and_wait(s);
list_scan(s);
@@ -914,7 +956,65 @@
}
static void
-set80211list(const char *arg, int d, int s, const struct afswtch *rafp)
+list_wme(int s)
+{
+ static const char *acnames[] = { "AC_BE", "AC_BK", "AC_VI", "AC_VO" };
+ struct ieee80211req ireq;
+ int ac;
+
+ (void) memset(&ireq, 0, sizeof(ireq));
+ (void) strncpy(ireq.i_name, name, sizeof(ireq.i_name));
+ ireq.i_len = 0;
+ for (ac = WME_AC_BE; ac <= WME_AC_VO; ac++) {
+again:
+ if (ireq.i_len & IEEE80211_WMEPARAM_BSS)
+ printf("\t%s", " ");
+ else
+ printf("\t%s", acnames[ac]);
+
+ ireq.i_len = (ireq.i_len & IEEE80211_WMEPARAM_BSS) | ac;
+
+ /* show WME BSS parameters */
+ ireq.i_type = IEEE80211_IOC_WME_CWMIN;
+ if (ioctl(s, SIOCG80211, &ireq) != -1)
+ printf(" cwmin %2u", ireq.i_val);
+ ireq.i_type = IEEE80211_IOC_WME_CWMAX;
+ if (ioctl(s, SIOCG80211, &ireq) != -1)
+ printf(" cwmax %2u", ireq.i_val);
+ ireq.i_type = IEEE80211_IOC_WME_AIFS;
+ if (ioctl(s, SIOCG80211, &ireq) != -1)
+ printf(" aifs %2u", ireq.i_val);
+ ireq.i_type = IEEE80211_IOC_WME_TXOPLIMIT;
+ if (ioctl(s, SIOCG80211, &ireq) != -1)
+ printf(" txopLimit %3u", ireq.i_val);
+ ireq.i_type = IEEE80211_IOC_WME_ACM;
+ if (ioctl(s, SIOCG80211, &ireq) != -1) {
+ if (ireq.i_val)
+ printf(" acm");
+ else if (verbose)
+ printf(" -acm");
+ }
+ /* !BSS only */
+ if ((ireq.i_len & IEEE80211_WMEPARAM_BSS) == 0) {
+ ireq.i_type = IEEE80211_IOC_WME_ACKPOLICY;
+ if (ioctl(s, SIOCG80211, &ireq) != -1) {
+ if (!ireq.i_val)
+ printf(" -ack");
+ else if (verbose)
+ printf(" ack");
+ }
+ }
+ printf("\n");
+ if ((ireq.i_len & IEEE80211_WMEPARAM_BSS) == 0) {
+ ireq.i_len |= IEEE80211_WMEPARAM_BSS;
+ goto again;
+ } else
+ ireq.i_len &= ~IEEE80211_WMEPARAM_BSS;
+ }
+}
+
+static
+DECL_CMD_FUNC(set80211list, arg, d)
{
#define iseq(a,b) (strncasecmp(a,b,sizeof(b)-1) == 0)
@@ -928,6 +1028,8 @@
list_keys(s);
else if (iseq(arg, "caps"))
list_capabilities(s);
+ else if (iseq(arg, "wme"))
+ list_wme(s);
else
errx(1, "Don't know how to list %s for %s", arg, name);
#undef iseq
@@ -1054,7 +1156,7 @@
{
static const uint8_t zerobssid[IEEE80211_ADDR_LEN];
enum ieee80211_opmode opmode = get80211opmode(s);
- int i, num, wpa;
+ int i, num, wpa, wme;
struct ieee80211req ireq;
u_int8_t data[32];
char spacer;
@@ -1302,14 +1404,16 @@
ireq.i_type = IEEE80211_IOC_WME;
if (ioctl(s, SIOCG80211, &ireq) != -1) {
- if (ireq.i_val) {
+ wme = ireq.i_val;
+ if (wme) {
printf("%cwme", spacer);
spacer = ' ';
} else if (verbose) {
printf("%c-wme", spacer);
spacer = ' ';
}
- }
+ } else
+ wme = 0;
if (opmode == IEEE80211_M_HOSTAP) {
ireq.i_type = IEEE80211_IOC_HIDESSID;
@@ -1359,6 +1463,9 @@
printf("\n");
spacer = '\t';
+ if (wme && verbose)
+ list_wme(s);
+
if (wpa) {
spacer = '\t';
ireq.i_type = IEEE80211_IOC_COUNTERMEASURES;
@@ -1507,45 +1614,50 @@
}
static struct cmd ieee80211_cmds[] = {
- { "ssid", NEXTARG, set80211ssid },
- { "nwid", NEXTARG, set80211ssid },
- { "stationname", NEXTARG, set80211stationname },
- { "station", NEXTARG, set80211stationname }, /* BSD/OS */
- { "channel", NEXTARG, set80211channel },
- { "authmode", NEXTARG, set80211authmode },
- { "powersavemode", NEXTARG, set80211powersavemode },
- { "powersave", 1, set80211powersave },
- { "-powersave", 0, set80211powersave },
- { "powersavesleep", NEXTARG, set80211powersavesleep },
- { "wepmode", NEXTARG, set80211wepmode },
- { "wep", 1, set80211wep },
- { "-wep", 0, set80211wep },
- { "weptxkey", NEXTARG, set80211weptxkey },
- { "wepkey", NEXTARG, set80211wepkey },
- { "nwkey", NEXTARG, set80211nwkey }, /* NetBSD */
- { "-nwkey", 0, set80211wep }, /* NetBSD */
- { "rtsthreshold",NEXTARG, set80211rtsthreshold },
- { "protmode", NEXTARG, set80211protmode },
- { "txpower", NEXTARG, set80211txpower },
- { "roaming", NEXTARG, set80211roaming },
- { "wme", 1, set80211wme },
- { "-wme", 0, set80211wme },
- { "hidessid", 1, set80211hidessid },
- { "-hidessid", 0, set80211hidessid },
- { "apbridge", 1, set80211apbridge },
- { "-apbridge", 0, set80211apbridge },
- { "chanlist", NEXTARG, set80211chanlist },
- { "bssid", NEXTARG, set80211bssid },
- { "ap", NEXTARG, set80211bssid },
- { "scan", 0, set80211scan },
- { "list", NEXTARG, set80211list },
- { "cwmin", NEXTARG, set80211cwmin },
- { "cwmax", NEXTARG, set80211cwmax },
- { "aifs", NEXTARG, set80211aifs },
- { "txoplimit", NEXTARG, set80211txoplimit },
- { "acm", NEXTARG, set80211acm },
- { "ack", 1, set80211ackpolicy },
- { "-ack", 0, set80211ackpolicy },
+ DEF_CMD_ARG("ssid", set80211ssid),
+ DEF_CMD_ARG("nwid", set80211ssid),
+ DEF_CMD_ARG("stationname", set80211stationname),
+ DEF_CMD_ARG("station", set80211stationname), /* BSD/OS */
+ DEF_CMD_ARG("channel", set80211channel),
+ DEF_CMD_ARG("authmode", set80211authmode),
+ DEF_CMD_ARG("powersavemode", set80211powersavemode),
+ DEF_CMD("powersave", 1, set80211powersave),
+ DEF_CMD("-powersave", 0, set80211powersave),
+ DEF_CMD_ARG("powersavesleep", set80211powersavesleep),
+ DEF_CMD_ARG("wepmode", set80211wepmode),
+ DEF_CMD("wep", 1, set80211wep),
+ DEF_CMD("-wep", 0, set80211wep),
+ DEF_CMD_ARG("weptxkey", set80211weptxkey),
+ DEF_CMD_ARG("wepkey", set80211wepkey),
+ DEF_CMD_ARG("nwkey", set80211nwkey), /* NetBSD */
+ DEF_CMD("-nwkey", 0, set80211wep), /* NetBSD */
+ DEF_CMD_ARG("rtsthreshold", set80211rtsthreshold),
+ DEF_CMD_ARG("protmode", set80211protmode),
+ DEF_CMD_ARG("txpower", set80211txpower),
+ DEF_CMD_ARG("roaming", set80211roaming),
+ DEF_CMD("wme", 1, set80211wme),
+ DEF_CMD("-wme", 0, set80211wme),
+ DEF_CMD("hidessid", 1, set80211hidessid),
+ DEF_CMD("-hidessid", 0, set80211hidessid),
+ DEF_CMD("apbridge", 1, set80211apbridge),
+ DEF_CMD("-apbridge", 0, set80211apbridge),
+ DEF_CMD_ARG("chanlist", set80211chanlist),
+ DEF_CMD_ARG("bssid", set80211bssid),
+ DEF_CMD_ARG("ap", set80211bssid),
+ DEF_CMD("scan", 0, set80211scan),
+ DEF_CMD_ARG("list", set80211list),
+ DEF_CMD_ARG2("cwmin", set80211cwmin),
+ DEF_CMD_ARG2("cwmax", set80211cwmax),
+ DEF_CMD_ARG2("aifs", set80211aifs),
+ DEF_CMD_ARG2("txoplimit", set80211txoplimit),
+ DEF_CMD("acm", 1, set80211acm),
+ DEF_CMD("-acm", 0, set80211acm),
+ DEF_CMD("ack", 1, set80211ackpolicy),
+ DEF_CMD("-ack", 0, set80211ackpolicy),
+ DEF_CMD_ARG2("bss:cwmin", set80211bsscwmin),
+ DEF_CMD_ARG2("bss:cwmax", set80211bsscwmax),
+ DEF_CMD_ARG2("bss:aifs", set80211bssaifs),
+ DEF_CMD_ARG2("bss:txoplimit", set80211bsstxoplimit),
};
static struct afswtch af_ieee80211 = {
.af_name = "ieee80211",
More information about the p4-projects
mailing list