summaryrefslogtreecommitdiff
path: root/sbin
diff options
context:
space:
mode:
authorReyk Floeter <reyk@cvs.openbsd.org>2005-02-15 19:45:23 +0000
committerReyk Floeter <reyk@cvs.openbsd.org>2005-02-15 19:45:23 +0000
commit0e56d20dc864c1695a2ae919a744e52604fb25e6 (patch)
tree0ae55cb5c58369a738f7459680603188a9bfda48 /sbin
parent665c26fbfa839aefa17124ac2f607c306e0de4fd (diff)
add txpower support to ifconfig
ok bob@ robert@ danh@ and others
Diffstat (limited to 'sbin')
-rw-r--r--sbin/ifconfig/ifconfig.811
-rw-r--r--sbin/ifconfig/ifconfig.c50
2 files changed, 54 insertions, 7 deletions
diff --git a/sbin/ifconfig/ifconfig.8 b/sbin/ifconfig/ifconfig.8
index 5890c98f8d0..966cc4d5253 100644
--- a/sbin/ifconfig/ifconfig.8
+++ b/sbin/ifconfig/ifconfig.8
@@ -1,4 +1,4 @@
-.\" $OpenBSD: ifconfig.8,v 1.98 2005/01/20 17:52:53 mcbride Exp $
+.\" $OpenBSD: ifconfig.8,v 1.99 2005/02/15 19:45:22 reyk Exp $
.\" $NetBSD: ifconfig.8,v 1.11 1996/01/04 21:27:29 pk Exp $
.\" $FreeBSD: ifconfig.8,v 1.16 1998/02/01 07:03:29 steve Exp $
.\"
@@ -656,6 +656,15 @@ Clear the IPv6 tentative address bit.
.It Cm timeslot Ar timeslot_range
Set the timeslot range map, which is used to control which channels
an interface device uses.
+.It Cm txpower Ar dBm
+(IEEE 802.11 devices only)
+Set the transmit power for IEEE 802.11-based wireless network interfaces.
+The driver will disable any auto level and transmit power controls in this
+mode.
+.It Fl txpower
+(IEEE 802.11 devices only)
+Disable manual transmit power mode and enable any auto level and transmit
+power controls.
.It Cm tunnel Ar src_address dest_address
Set the source and destination tunnel addresses on a tunnel interface,
including
diff --git a/sbin/ifconfig/ifconfig.c b/sbin/ifconfig/ifconfig.c
index d28f28f9f45..ed151906b5b 100644
--- a/sbin/ifconfig/ifconfig.c
+++ b/sbin/ifconfig/ifconfig.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ifconfig.c,v 1.130 2005/01/20 17:47:38 mcbride Exp $ */
+/* $OpenBSD: ifconfig.c,v 1.131 2005/02/15 19:45:22 reyk Exp $ */
/* $NetBSD: ifconfig.c,v 1.40 1997/10/01 02:19:43 enami Exp $ */
/*
@@ -77,7 +77,7 @@ static const char copyright[] =
#if 0
static const char sccsid[] = "@(#)ifconfig.c 8.2 (Berkeley) 2/16/94";
#else
-static const char rcsid[] = "$OpenBSD: ifconfig.c,v 1.130 2005/01/20 17:47:38 mcbride Exp $";
+static const char rcsid[] = "$OpenBSD: ifconfig.c,v 1.131 2005/02/15 19:45:22 reyk Exp $";
#endif
#endif /* not lint */
@@ -170,6 +170,7 @@ void setifnwid(const char *, int);
void setifbssid(const char *, int);
void setifnwkey(const char *, int);
void setifchan(const char *, int);
+void setiftxpower(const char *, int);
void setifpowersave(const char *, int);
void setifpowersavesleep(const char *, int);
void setifnetmask(const char *, int);
@@ -330,6 +331,8 @@ const struct cmd {
{ "pppoeac", NEXTARG, 0, setpppoe_ac },
{ "-pppoeac", 1, 0, setpppoe_ac },
{ "timeslot", NEXTARG, 0, settimeslot },
+ { "txpower", NEXTARG, 0, setiftxpower },
+ { "-txpower", 1, 0, setiftxpower },
#endif /* SMALL */
#if 0
/* XXX `create' special-cased below */
@@ -1290,6 +1293,31 @@ setifchan(const char *val, int d)
warn("SIOCS80211CHANNEL");
}
+#ifndef SMALL
+void
+setiftxpower(const char *val, int d)
+{
+ const char *errmsg = NULL;
+ struct ieee80211_txpower txpower;
+ int dbm;
+
+ strlcpy(txpower.i_name, name, sizeof(txpower.i_name));
+
+ if (d == 1) {
+ txpower.i_mode = IEEE80211_TXPOWER_MODE_AUTO;
+ } else {
+ dbm = strtonum(val, SHRT_MIN, SHRT_MAX, &errmsg);
+ if (errmsg)
+ errx(1, "txpower %sdBm: %s", val, errmsg);
+ txpower.i_val = (int16_t)dbm;
+ txpower.i_mode = IEEE80211_TXPOWER_MODE_FIXED;
+ }
+
+ if (ioctl(s, SIOCS80211TXPOWER, (caddr_t)&txpower) == -1)
+ warn("SIOCS80211TXPOWER");
+}
+#endif
+
/* ARGSUSED */
void
setifpowersave(const char *val, int d)
@@ -1331,12 +1359,13 @@ setifpowersavesleep(const char *val, int d)
void
ieee80211_status(void)
{
- int len, i, nwkey_verbose, inwid, inwkey, ichan, ipwr, ibssid;
+ int len, i, nwkey_verbose, inwid, inwkey, ichan, ipwr, ibssid, itxpower;
struct ieee80211_nwid nwid;
struct ieee80211_nwkey nwkey;
struct ieee80211_power power;
struct ieee80211chanreq channel;
struct ieee80211_bssid bssid;
+ struct ieee80211_txpower txpower;
u_int8_t zero_bssid[IEEE80211_ADDR_LEN];
u_int8_t keybuf[IEEE80211_WEP_NKID][16];
struct ether_addr ea;
@@ -1363,9 +1392,13 @@ ieee80211_status(void)
strlcpy(bssid.i_name, name, sizeof(bssid.i_name));
ibssid = ioctl(s, SIOCG80211BSSID, &bssid);
+ memset(&txpower, 0, sizeof(txpower));
+ strlcpy(txpower.i_name, name, sizeof(txpower.i_name));
+ itxpower = ioctl(s, SIOCG80211TXPOWER, &txpower);
+
/* check if any ieee80211 option is active */
if (inwid == 0 || inwkey == 0 || ipwr == 0 ||
- ichan == 0 || ibssid == 0)
+ ichan == 0 || ibssid == 0 || itxpower == 0)
fputs("\tieee80211: ", stdout);
else
return;
@@ -1453,6 +1486,11 @@ ieee80211_status(void)
if (ipwr == 0 && power.i_enabled)
printf("powersave on (%dms sleep) ", power.i_maxsleep);
+ if (itxpower == 0)
+ printf("%ddBm %s", txpower.i_val,
+ txpower.i_mode == IEEE80211_TXPOWER_MODE_AUTO ?
+ "(auto) " : "");
+
putchar('\n');
}
@@ -3303,8 +3341,8 @@ usage(int value)
"\t[media type] [[-]mediaopt opts] [mode mode] [instance minst]\n"
"\t[mtu value] [metric nhops] [netmask mask] [prefixlen n]\n"
"\t[nwid id] [nwkey key] [nwkey persist[:key]] [-nwkey]\n"
- "\t[bssid bssid] [-bssid] [chan n] [-chan]\n"
- "\t[[-]powersave] [powersavesleep duration]\n"
+ "\t[bssid bssid] [-bssid] [chan n] [-chan] [txpower dBm]\n"
+ "\t[-txpower] [[-]powersave] [powersavesleep duration]\n"
#ifdef INET6
"\t[[-]anycast] [eui64] [pltime n] [vltime n] [[-]tentative]\n"
#endif