diff --git a/sbin/ifconfig/ifconfig.8 b/sbin/ifconfig/ifconfig.8 index b93c1ee252aa..5b37cf3c6a23 100644 --- a/sbin/ifconfig/ifconfig.8 +++ b/sbin/ifconfig/ifconfig.8 @@ -28,7 +28,7 @@ .\" From: @(#)ifconfig.8 8.3 (Berkeley) 1/5/94 .\" $FreeBSD$ .\" -.Dd August 27, 2008 +.Dd September 5, 2008 .Dt IFCONFIG 8 .Os .Sh NAME @@ -1396,6 +1396,13 @@ See also .Cm outdoor , and .Cm anywhere . +.It Cm rifs +Enable use of Reduced InterFrame Spacing (RIFS) when operating in 802.11n +on an HT channel. +Note that RIFS must be supported by both the station and access point +for it to be used. +To disable RIFS use +.Fl rifs . .It Cm roam:rate Ar rate Set the threshold for controlling roaming when operating in a BSS. The @@ -1497,6 +1504,23 @@ on an HT channel. NB: this currently enables Short GI on both HT40 and HT20 channels. To disable Short GI use .Fl shortgi . +.It Cm smps +Enable use of Static Spatial Multiplexing Power Save (SMPS) +when operating in 802.11n. +A station operating with Static SMPS maintains only a single +receive chain active (this can significantly reduce power consumption). +To disable SMPS use +.Fl smps . +.It Cm smpsdyn +Enable use of Dynamic Spatial Multiplexing Power Save (SMPS) +when operating in 802.11n. +A station operating with Dynamic SMPS maintains only a single +receive chain active but switches to multiple receive chains when it +receives an RTS frame (this can significantly reduce power consumption). +Note that stations cannot distinguish between RTS/CTS intended to +enable multiple receive chains and those used for other purposes. +To disable SMPS use +.Fl smps . .It Cm ssid Ar ssid Set the desired Service Set Identifier (aka network name). The SSID is a string up to 32 characters diff --git a/sbin/ifconfig/ifieee80211.c b/sbin/ifconfig/ifieee80211.c index fbe1bc6e2367..8a43659b4d5e 100644 --- a/sbin/ifconfig/ifieee80211.c +++ b/sbin/ifconfig/ifieee80211.c @@ -112,6 +112,11 @@ #define IEEE80211_NODE_HTCOMPAT 0x0080 /* HT setup w/ vendor OUI's */ #define IEEE80211_NODE_WPS 0x0100 /* WPS association */ #define IEEE80211_NODE_TSN 0x0200 /* TSN association */ +#define IEEE80211_NODE_AMPDU_RX 0x0400 /* AMPDU rx enabled */ +#define IEEE80211_NODE_AMPDU_TX 0x0800 /* AMPDU tx enabled */ +#define IEEE80211_NODE_MIMO_PS 0x1000 /* MIMO power save enabled */ +#define IEEE80211_NODE_MIMO_RTS 0x2000 /* send RTS in MIMO PS */ +#define IEEE80211_NODE_RIFS 0x4000 /* RIFS enabled */ #endif #define MAXCOL 78 @@ -1695,6 +1700,18 @@ set80211dotd(const char *val, int d, int s, const struct afswtch *rafp) set80211(s, IEEE80211_IOC_DOTD, d, 0, NULL); } +static void +set80211smps(const char *val, int d, int s, const struct afswtch *rafp) +{ + set80211(s, IEEE80211_IOC_SMPS, d, 0, NULL); +} + +static void +set80211rifs(const char *val, int d, int s, const struct afswtch *rafp) +{ + set80211(s, IEEE80211_IOC_RIFS, d, 0, NULL); +} + static int regdomain_sort(const void *a, const void *b) { @@ -2093,7 +2110,18 @@ getflags(int flags) if (flags & IEEE80211_NODE_WPS) *cp++ = 'W'; if (flags & IEEE80211_NODE_TSN) + *cp++ = 'N'; + if (flags & IEEE80211_NODE_AMPDU_TX) *cp++ = 'T'; + if (flags & IEEE80211_NODE_AMPDU_RX) + *cp++ = 'R'; + if (flags & IEEE80211_NODE_MIMO_PS) { + *cp++ = 'M'; + if (flags & IEEE80211_NODE_MIMO_RTS) + *cp++ = '+'; + } + if (flags & IEEE80211_NODE_RIFS) + *cp++ = 'I'; *cp = '\0'; return flagstring; } @@ -4111,6 +4139,20 @@ ieee80211_status(int s) else if (verbose) LINE_CHECK("-puren"); } + if (get80211val(s, IEEE80211_IOC_SMPS, &val) != -1) { + if (val == IEEE80211_HTCAP_SMPS_DYNAMIC) + LINE_CHECK("smpsdyn"); + else if (val == IEEE80211_HTCAP_SMPS_ENA) + LINE_CHECK("smps"); + else if (verbose) + LINE_CHECK("-smps"); + } + if (get80211val(s, IEEE80211_IOC_RIFS, &val) != -1) { + if (val) + LINE_CHECK("rifs"); + else if (verbose) + LINE_CHECK("-rifs"); + } } if (get80211val(s, IEEE80211_IOC_WME, &wme) != -1) { @@ -4593,6 +4635,11 @@ static struct cmd ieee80211_cmds[] = { DEF_CMD("-ht40", 0, set80211htconf), DEF_CMD("ht", 3, set80211htconf), /* NB: 20+40 */ DEF_CMD("-ht", 0, set80211htconf), + DEF_CMD("rifs", 1, set80211rifs), + DEF_CMD("-rifs", 0, set80211rifs), + DEF_CMD("smps", IEEE80211_HTCAP_SMPS_ENA, set80211smps), + DEF_CMD("smpsdyn", IEEE80211_HTCAP_SMPS_DYNAMIC, set80211smps), + DEF_CMD("-smps", IEEE80211_HTCAP_SMPS_OFF, set80211smps), /* XXX for testing */ DEF_CMD_ARG("chanswitch", set80211chanswitch),