From 7c00275166dba6929264a86635aefb76f19f76fd Mon Sep 17 00:00:00 2001 From: sommerfeld Date: Wed, 14 Jul 1999 22:33:33 +0000 Subject: [PATCH] Utility to configure wi* 802.11 driver --- usr.sbin/wiconfig/Makefile | 11 + usr.sbin/wiconfig/wiconfig.8 | 254 +++++++++++++++++ usr.sbin/wiconfig/wiconfig.c | 518 +++++++++++++++++++++++++++++++++++ 3 files changed, 783 insertions(+) create mode 100644 usr.sbin/wiconfig/Makefile create mode 100644 usr.sbin/wiconfig/wiconfig.8 create mode 100644 usr.sbin/wiconfig/wiconfig.c diff --git a/usr.sbin/wiconfig/Makefile b/usr.sbin/wiconfig/Makefile new file mode 100644 index 000000000000..d97ed22ea0f9 --- /dev/null +++ b/usr.sbin/wiconfig/Makefile @@ -0,0 +1,11 @@ +# $NetBSD: Makefile,v 1.1 1999/07/14 22:33:33 sommerfeld Exp $ +# From FreeBSD: +# $Id: Makefile,v 1.1 1999/07/14 22:33:33 sommerfeld Exp $ +PROG= wiconfig +SRCS= wiconfig.c + +CFLAGS+= -Wall + +MAN= wiconfig.8 + +.include diff --git a/usr.sbin/wiconfig/wiconfig.8 b/usr.sbin/wiconfig/wiconfig.8 new file mode 100644 index 000000000000..a90051399922 --- /dev/null +++ b/usr.sbin/wiconfig/wiconfig.8 @@ -0,0 +1,254 @@ +.\" Copyright (c) 1997, 1998, 1999 +.\" Bill Paul All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by Bill Paul. +.\" 4. Neither the name of the author nor the names of any co-contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL Bill Paul OR THE VOICES IN HIS HEAD +.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +.\" THE POSSIBILITY OF SUCH DAMAGE. +.\" +.\" $Id: wiconfig.8,v 1.1 1999/07/14 22:33:34 sommerfeld Exp $ +.\" +.Dd April 21, 1999 +.Dt WICONTROL 8 +.Os FreeBSD 3.0 +.Sh NAME +.Nm wicontrol +.Nd configure WaveLAN/IEEE devices +.Sh SYNOPSIS +.Nm wicontrol +.Fl i Ar iface Op Fl o +.Nm wicontrol +.Fl i Ar iface Fl t Ar tx rate +.Nm wicontrol +.Fl i Ar iface Fl n Ar network name +.Nm wicontrol +.Fl i Ar iface Fl s Ar station name +.Nm wicontrol +.Fl i Ar iface Fl c Ar 0|1 +.Nm wicontrol +.Fl i Ar iface Fl q Ar SSID +.Nm wicontrol +.Fl i Ar iface Fl p Ar port type +.Nm wicontrol +.Fl i Ar iface Fl a Ar access point density +.Nm wicontrol +.Fl i Ar iface Fl m Ar mac address +.Nm wicontrol +.Fl i Ar iface Fl d Ar max data length +.Nm wicontrol +.Fl i Ar iface Fl r Ar RTS threshold +.Nm wicontrol +.Fl i Ar iface Fl f Ar frequency +.Nm wicontrol +.Fl i Ar iface Fl P Ar 0|1 +.Nm wicontrol +.Fl i Ar iface Fl S Ar max_sleep_duration +.Sh DESCRIPTION +The +.Nm +command controls the operation of WaveLAN/IEEE wireless networking +devices via the +.Xr wi 4 +driver. Most of the parameters that can be changed relate to the +IEEE 802.11 protocol which the WaveLAN implements. This includes +the station name, whether the station is operating in ad-hoc (point +to point) or BSS (service set) mode, and the network name of a service +set to join (IBSS) if BSS mode is enabled. The +.Nm +command can also be used to view the current settings of these paremeters +and to dump out the values of the card's statistics counters. +.Pp +The +.Ar iface +argument given to +.Nm +should be the logical interface name associated with the WaveLAN/IEEE +device (wi0, wi1, etc...). +.Sh OPTIONS +The options are as follows: +.Bl -tag -width Fl +.It Fl i Ar iface Op Fl o +Display the current settings of the specified WaveLAN/IEEE interface. +This retrives the current card settings from the driver and prints them +out. Using the additional +.Fl o +flag will cause +.Nm +to print out the statistics counters instead of the card settings. +.It Fl i Ar iface Fl t Ar tx rate +Set the transmit rate of the specified interface. The legal values +for the transmit rate vary depending on whether the interface is a +standard WaveLAN/IEEE or a WaveLAN/IEEE Turbo adapter. The standard +NICs support a maximum transmit rate of 2Mbps while the turbo NICs +support a maximum speed of 6Mbps. The following table shows the +legal transmit rate settings and the corresponding transmit speeds: +.Bd -filled -offset indent +.Bl -column "TX rate " "NIC speed " +.Em "TX rate NIC speed" +1 Fixed Low (1Mbps) +2 Fixed Standard (2Mbps) +3 Auto Rate Select (High) +4 Fixed Medium (4Mbps) +5 Fixed High (6Mbps) +6 Auto Rate Select (Standard) +7 Auto Rate Select (Medium) +.El +.Ed +.Pp +The standard NICs support only settings 1 through 3. Turbo NICs support +all the above listed speed settings. +The default driver setting is 3 (auto rate select). +.It Fl i Ar iface Fl n Ar network name +Set the name of the service set (IBSS) that this station wishes to +join. The +.Ar network name +can be any text string up to 30 characters in length. The default name +is the string "ANY" which should allow the station to connect to the first +available access point. The interface should be set for BSS mode using +the +.Fl p +flag in order for this to work. +.Pp +Note: the WaveLAN manual indicates that an empty string will allow the +host to connect to any access point, however I have also seen a reference +in another driver which indicates that the "ANY" string works as well. +.It Fl i Ar iface Fl s Ar station name +Sets the +.Ar station name +for the specified interface. The +.Ar station name +is used for diagnostic purposes. The Lucent WaveMANAGER sofware can +poll the names of remote hosts. +.It Fl i Ar iface Fl c Ar 0|1 +Allow the station to create a service set (IBSS). Permitted values +are 0 (don't create IBSS) and 1 (enable creation of IBSS). The default +is 0. +.Pp +Note: this option is provided for experimental purposes only: enabling +the creation of an IBSS on a host system doesn't appear to actually work. +.It Fl i Ar iface Fl q Ar SSID +Specify the name of an IBSS (SSID) to create on a given interface. +The +.Ar SSID +can be any text string up to 30 characters long. +.Pp +Note: this option is provided for experimental purposes only: enabling +the creation of an IBSS on a host system doesn't appear to actually work. +.It Fl i Ar iface Fl p Ar port type +Set the +.Ar port type +for a specified interface. The legal values for +.Ar port type +are 1 (BSS mode) and 3 (ad-hoc) mode. In ad-hoc mode, the station can +comminicate directly with any other stations within direct radio range +(provided that they are also operating in ad-hoc mode). In BSS mode, +hosts must associate with a service set controlled by an access point, +which relays traffic between end stations. The default setting is 3 +(ad-hoc mode). +.It Fl i Ar iface Fl a Ar access_point_density +Specify the +.Ar access point density +for a given interface. Legal values are 1 (low), 2 (medium) and 3 (high). +This setting influences some of the radio modem threshold settings. +.It Fl i Ar iface Fl m Ar mac address +Set the station address for the specified interface. The +.Ar mac address +is specified as a series of six hexadecimal values separated by colons, +e.g.: 00:60:1d:12:34:56. This programs the new address into the card +and updates the interface as well. +.It Fl i Ar iface Fl d Ar max_data_length +Set the maximum receive and transmit frame size for a specified interface. +The +.Ar max data length +can be any number from 350 to 2304. The default is 2304. +.It Fl i Ar iface Fl r Ar RTS threshold +Set the RTS/CTS threshold for a given interface. This controls the +number of bytes used for the RTS/CTS handhake boundary. The +.Ar RTS threshold +can be any value between 0 and 2047. The default is 2347. +.It Fl i Ar iface Fl f Ar frequency +Set the radio frequency of a given interface. The +.Ar frequency +should be specfied as a channel ID as shown in the table below. The +list of available frequencies is dependent on radio regulations specified +by regional authorities. Recognized regulatory authorities include +the FCC (United States), ETSI (Europe), France and Japan. Frequencies +in the table are specified in Mhz. +.Bd -filled -offset indent +.Bl -column "Channel ID " "FCC " "ETSI " "France " "Japan " +.Em "Channel ID FCC ETSI France Japan" +1 2412 2412 - - +2 2417 2417 - - +3 2422 2422 - - +4 2427 2427 - - +5 2432 2432 - - +6 2437 2437 - - +7 2442 2442 - - +8 2447 2447 - - +9 2452 2452 - - +10 2457 2457 2457 - +11 2462 2462 2462 - +12 - 2467 2467 - +13 - 2472 2472 - +14 - - - 2484 +.El +.Ed +.Pp +If an illegal channel is specified, the +NIC will revert to its default channel. For NICs sold in the United States +and Europe, the default channel is 3. For NICs sold in France, the default +channel is 11. For NICs sold in Japan, the only available channel is 14. +Note that two stations must be set to the same channel in order to +communicate. +.It Fl i Ar iface Fl P Ar 0|1 +Enable or disable power management on a given interface. Enabling +power management uses an alternating sleep/wake protocol to help +conserve power on mobile stations, at the cost of some increased +receive latency. Power management is off by default. Note that power +management requires the cooperation of an access point in order to +function; it is not functional in ad-hoc mode. Also, power management +is only implemented in Lucent WavePOINT firmware version 2.03 or +later, and in WaveLAN PCMCIA adapter firmware 2.00 or later. Older +revisions will silently ignore the power management setting. Legal +values for this parameter are 0 (off) and 1 (on). +.It Fl i Ar iface Fl S Ar max_sleep_interval +Specify the sleep interval to use when power management is enabled. +The +.Are max sleep interval +is specified in milliseconds. The default is 100. +.El +.Sh SEE ALSO +.Xr wi 4 , +.Xr ifconfig 8 +.Sh HISTORY +The +.Nm +command first appeared in +.Fx 3.0 . +.Sh AUTHOR +The +.Nm +command was written by +.An Bill Paul Aq wpaul@ctr.columbia.edu . diff --git a/usr.sbin/wiconfig/wiconfig.c b/usr.sbin/wiconfig/wiconfig.c new file mode 100644 index 000000000000..44fbbe585162 --- /dev/null +++ b/usr.sbin/wiconfig/wiconfig.c @@ -0,0 +1,518 @@ +/* + * Copyright (c) 1997, 1998, 1999 + * Bill Paul . All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Bill Paul. + * 4. Neither the name of the author nor the names of any co-contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL Bill Paul OR THE VOICES IN HIS HEAD + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + * + * $Id: wiconfig.c,v 1.1 1999/07/14 22:33:34 sommerfeld Exp $ + */ + +#include +#include +#include +#include +#include +#include + +#include +#include + +#include + +#include +#include +#include +#include +#include +#include + +#if !defined(lint) +static const char copyright[] = "@(#) Copyright (c) 1997, 1998, 1999\ + Bill Paul. All rights reserved."; +static const char rcsid[] = + "@(#) $Id: wiconfig.c,v 1.1 1999/07/14 22:33:34 sommerfeld Exp $"; +#endif + +static void wi_getval __P((char *, struct wi_req *)); +static void wi_setval __P((char *, struct wi_req *)); +static void wi_printstr __P((struct wi_req *)); +static void wi_setstr __P((char *, int, char *)); +static void wi_setbytes __P((char *, int, char *, int)); +static void wi_setword __P((char *, int, int)); +static void wi_sethex __P((char *, int, char *)); +static void wi_printwords __P((struct wi_req *)); +static void wi_printbool __P((struct wi_req *)); +static void wi_printhex __P((struct wi_req *)); +static void wi_dumpinfo __P((char *)); +static void wi_dumpstats __P((char *)); +static void usage __P((char *)); +int main __P((int argc, char **argv)); + +static void wi_getval(iface, wreq) + char *iface; + struct wi_req *wreq; +{ + struct ifreq ifr; + int s; + + bzero((char *)&ifr, sizeof(ifr)); + + strcpy(ifr.ifr_name, iface); + ifr.ifr_data = (caddr_t)wreq; + + s = socket(AF_INET, SOCK_DGRAM, 0); + + if (s == -1) + err(1, "socket"); + + if (ioctl(s, SIOCGWAVELAN, &ifr) == -1) + err(1, "SIOCGWAVELAN"); + + close(s); + + return; +} + +static void wi_setval(iface, wreq) + char *iface; + struct wi_req *wreq; +{ + struct ifreq ifr; + int s; + + bzero((char *)&ifr, sizeof(ifr)); + + strcpy(ifr.ifr_name, iface); + ifr.ifr_data = (caddr_t)wreq; + + s = socket(AF_INET, SOCK_DGRAM, 0); + + if (s == -1) + err(1, "socket"); + + if (ioctl(s, SIOCSWAVELAN, &ifr) == -1) + err(1, "SIOCSWAVELAN"); + + close(s); + + return; +} + +void wi_printstr(wreq) + struct wi_req *wreq; +{ + char *ptr; + int i; + + if (wreq->wi_type == WI_RID_SERIALNO) { + ptr = (char *)&wreq->wi_val; + for (i = 0; i < (wreq->wi_len - 1) * 2; i++) { + if (ptr[i] == '\0') + ptr[i] = ' '; + } + } else { + ptr = (char *)&wreq->wi_val[1]; + for (i = 0; i < wreq->wi_val[0]; i++) { + if (ptr[i] == '\0') + ptr[i] = ' '; + } + } + + ptr[i] = '\0'; + printf("[ %s ]", ptr); + + return; +} + +void wi_setstr(iface, code, str) + char *iface; + int code; + char *str; +{ + struct wi_req wreq; + + if (iface == NULL) + errx(1, "must specify interface name"); + + if (str == NULL) + errx(1, "must specify string"); + + bzero((char *)&wreq, sizeof(wreq)); + + if (strlen(str) > 30) + errx(1, "string too long"); + + wreq.wi_type = code; + wreq.wi_len = 18; + wreq.wi_val[0] = strlen(str); + bcopy(str, (char *)&wreq.wi_val[1], strlen(str)); + + wi_setval(iface, &wreq); + + return; +} + +void wi_setbytes(iface, code, bytes, len) + char *iface; + int code; + char *bytes; + int len; +{ + struct wi_req wreq; + + if (iface == NULL) + errx(1, "must specify interface name"); + + bzero((char *)&wreq, sizeof(wreq)); + + wreq.wi_type = code; + wreq.wi_len = (len / 2) + 1; + bcopy(bytes, (char *)&wreq.wi_val[0], len); + + wi_setval(iface, &wreq); + + return; +} + +void wi_setword(iface, code, word) + char *iface; + int code; + int word; +{ + struct wi_req wreq; + + bzero((char *)&wreq, sizeof(wreq)); + + wreq.wi_type = code; + wreq.wi_len = 2; + wreq.wi_val[0] = word; + + wi_setval(iface, &wreq); + + return; +} + +void wi_sethex(iface, code, str) + char *iface; + int code; + char *str; +{ + struct ether_addr *addr; + + if (str == NULL) + errx(1, "must specify address"); + + addr = ether_aton(str); + + if (addr == NULL) + errx(1, "badly formatted address"); + + wi_setbytes(iface, code, (char *)addr, ETHER_ADDR_LEN); + + return; +} + +void wi_printwords(wreq) + struct wi_req *wreq; +{ + int i; + + printf("[ "); + for (i = 0; i < wreq->wi_len - 1; i++) + printf("%d ", wreq->wi_val[i]); + printf("]"); + + return; +} + +void wi_printbool(wreq) + struct wi_req *wreq; +{ + if (wreq->wi_val[0]) + printf("[ On ]"); + else + printf("[ Off ]"); + + return; +} + +void wi_printhex(wreq) + struct wi_req *wreq; +{ + int i; + unsigned char *c; + + c = (unsigned char *)&wreq->wi_val; + + printf("[ "); + for (i = 0; i < (wreq->wi_len - 1) * 2; i++) { + printf("%02x", c[i]); + if (i < ((wreq->wi_len - 1) * 2) - 1) + printf(":"); + } + + printf(" ]"); + return; +} + +#define WI_STRING 0x01 +#define WI_BOOL 0x02 +#define WI_WORDS 0x03 +#define WI_HEXBYTES 0x04 + +struct wi_table { + int wi_code; + int wi_type; + char *wi_str; +}; + +static struct wi_table wi_table[] = { + { WI_RID_SERIALNO, WI_STRING, "NIC serial number:\t\t\t" }, + { WI_RID_NODENAME, WI_STRING, "Station name:\t\t\t\t" }, + { WI_RID_OWN_SSID, WI_STRING, "SSID for IBSS creation:\t\t\t" }, + { WI_RID_CURRENT_SSID, WI_STRING, "Current netname (SSID):\t\t\t" }, + { WI_RID_DESIRED_SSID, WI_STRING, "Desired netname (SSID):\t\t\t" }, + { WI_RID_CURRENT_BSSID, WI_HEXBYTES, "Current BSSID:\t\t\t\t" }, + { WI_RID_CHANNEL_LIST, WI_WORDS, "Channel list:\t\t\t\t" }, + { WI_RID_OWN_CHNL, WI_WORDS, "IBSS channel:\t\t\t\t" }, + { WI_RID_CURRENT_CHAN, WI_WORDS, "Current channel:\t\t\t" }, + { WI_RID_COMMS_QUALITY, WI_WORDS, "Comms quality/signal/noise:\t\t" }, + { WI_RID_PROMISC, WI_BOOL, "Promiscuous mode:\t\t\t" }, + { WI_RID_PORTTYPE, WI_WORDS, "Port type (1=BSS, 3=ad-hoc):\t\t"}, + { WI_RID_MAC_NODE, WI_HEXBYTES, "MAC address:\t\t\t\t"}, + { WI_RID_TX_RATE, WI_WORDS, "TX rate:\t\t\t\t"}, + { WI_RID_RTS_THRESH, WI_WORDS, "RTS/CTS handshake threshold:\t\t"}, + { WI_RID_CREATE_IBSS, WI_BOOL, "Create IBSS:\t\t\t\t" }, + { WI_RID_SYSTEM_SCALE, WI_WORDS, "Access point density:\t\t\t" }, + { WI_RID_PM_ENABLED, WI_WORDS, "Power Mgmt (1=on, 0=off):\t\t" }, + { WI_RID_MAX_SLEEP, WI_WORDS, "Max sleep time:\t\t\t\t" }, + { 0, NULL } +}; + +static void wi_dumpinfo(iface) + char *iface; +{ + struct wi_req wreq; + int i; + struct wi_table *w; + + w = wi_table; + + for (i = 0; w[i].wi_type; i++) { + bzero((char *)&wreq, sizeof(wreq)); + + wreq.wi_len = WI_MAX_DATALEN; + wreq.wi_type = w[i].wi_code; + + wi_getval(iface, &wreq); + printf("%s", w[i].wi_str); + switch(w[i].wi_type) { + case WI_STRING: + wi_printstr(&wreq); + break; + case WI_WORDS: + wi_printwords(&wreq); + break; + case WI_BOOL: + wi_printbool(&wreq); + break; + case WI_HEXBYTES: + wi_printhex(&wreq); + break; + default: + break; + } + printf("\n"); + } + + return; +} + +static void wi_dumpstats(iface) + char *iface; +{ + struct wi_req wreq; + struct wi_counters *c; + + if (iface == NULL) + errx(1, "must specify interface name"); + + bzero((char *)&wreq, sizeof(wreq)); + wreq.wi_len = WI_MAX_DATALEN; + wreq.wi_type = WI_RID_IFACE_STATS; + + wi_getval(iface, &wreq); + + c = (struct wi_counters *)&wreq.wi_val; + + printf("Transmitted unicast frames:\t\t%d\n", + c->wi_tx_unicast_frames); + printf("Transmitted multicast frames:\t\t%d\n", + c->wi_tx_multicast_frames); + printf("Transmitted fragments:\t\t\t%d\n", + c->wi_tx_fragments); + printf("Transmitted unicast octets:\t\t%d\n", + c->wi_tx_unicast_octets); + printf("Transmitted multicast octets:\t\t%d\n", + c->wi_tx_multicast_octets); + printf("Single transmit retries:\t\t%d\n", + c->wi_tx_single_retries); + printf("Multiple transmit retries:\t\t%d\n", + c->wi_tx_multi_retries); + printf("Transmit retry limit exceeded:\t\t%d\n", + c->wi_tx_retry_limit); + printf("Transmit discards:\t\t\t%d\n", + c->wi_tx_discards); + printf("Transmit discards due to wrong SA:\t%d\n", + c->wi_tx_discards_wrong_sa); + printf("Received unicast frames:\t\t%d\n", + c->wi_rx_unicast_frames); + printf("Received multicast frames:\t\t%d\n", + c->wi_rx_multicast_frames); + printf("Received fragments:\t\t\t%d\n", + c->wi_rx_fragments); + printf("Received unicast octets:\t\t%d\n", + c->wi_rx_unicast_octets); + printf("Received multicast octets:\t\t%d\n", + c->wi_rx_multicast_octets); + printf("Receive FCS errors:\t\t\t%d\n", + c->wi_rx_fcs_errors); + printf("Receive discards due to no buffer:\t%d\n", + c->wi_rx_discards_nobuf); + printf("Can't decrypt WEP frame:\t\t%d\n", + c->wi_rx_WEP_cant_decrypt); + printf("Received message fragments:\t\t%d\n", + c->wi_rx_msg_in_msg_frags); + printf("Received message bad fragments:\t\t%d\n", + c->wi_rx_msg_in_bad_msg_frags); + + return; +} + +static void usage(p) + char *p; +{ + fprintf(stderr, "usage: %s -i iface\n", p); + fprintf(stderr, "\t%s -i iface -o\n", p); + fprintf(stderr, "\t%s -i iface -t tx rate\n", p); + fprintf(stderr, "\t%s -i iface -n network name\n", p); + fprintf(stderr, "\t%s -i iface -s station name\n", p); + fprintf(stderr, "\t%s -i iface -c 0|1\n", p); + fprintf(stderr, "\t%s -i iface -q SSID\n", p); + fprintf(stderr, "\t%s -i iface -p port type\n", p); + fprintf(stderr, "\t%s -i iface -a access point density\n", p); + fprintf(stderr, "\t%s -i iface -m mac address\n", p); + fprintf(stderr, "\t%s -i iface -d max data length\n", p); + fprintf(stderr, "\t%s -i iface -r RTS threshold\n", p); + fprintf(stderr, "\t%s -i iface -f frequency\n", p); + fprintf(stderr, "\t%s -i iface -P 0|1t\n", p); + fprintf(stderr, "\t%s -i iface -S max sleep duration\n", p); + + exit(1); +} + +int main(argc, argv) + int argc; + char *argv[]; +{ + int ch; + char *iface = NULL; + char *p = argv[0]; + + while((ch = getopt(argc, argv, + "hoc:d:f:i:p:r:q:t:n:s:m:P:S:")) != -1) { + switch(ch) { + case 'o': + wi_dumpstats(iface); + exit(0); + break; + case 'i': + iface = optarg; + break; + case 'c': + wi_setword(iface, WI_RID_CREATE_IBSS, atoi(optarg)); + exit(0); + break; + case 'd': + wi_setword(iface, WI_RID_MAX_DATALEN, atoi(optarg)); + exit(0); + break; + case 'f': + wi_setword(iface, WI_RID_OWN_CHNL, atoi(optarg)); + exit(0); + break; + case 'p': + wi_setword(iface, WI_RID_PORTTYPE, atoi(optarg)); + exit(0); + break; + case 'r': + wi_setword(iface, WI_RID_RTS_THRESH, atoi(optarg)); + exit(0); + break; + case 't': + wi_setword(iface, WI_RID_TX_RATE, atoi(optarg)); + exit(0); + break; + case 'n': + wi_setstr(iface, WI_RID_DESIRED_SSID, optarg); + exit(0); + break; + case 's': + wi_setstr(iface, WI_RID_NODENAME, optarg); + exit(0); + break; + case 'm': + wi_sethex(iface, WI_RID_MAC_NODE, optarg); + exit(0); + break; + case 'q': + wi_setstr(iface, WI_RID_OWN_SSID, optarg); + exit(0); + break; + case 'S': + wi_setword(iface, WI_RID_MAX_SLEEP, atoi(optarg)); + exit(0); + break; + case 'P': + wi_setword(iface, WI_RID_PM_ENABLED, atoi(optarg)); + exit(0); + break; + case 'h': + default: + usage(p); + break; + } + } + + if (iface == NULL) + usage(p); + + wi_dumpinfo(iface); + + exit(0); +}