Utility to configure wi* 802.11 driver

This commit is contained in:
sommerfeld 1999-07-14 22:33:33 +00:00
parent 5d33b8fc14
commit 7c00275166
3 changed files with 783 additions and 0 deletions

View File

@ -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 <bsd.prog.mk>

View File

@ -0,0 +1,254 @@
.\" Copyright (c) 1997, 1998, 1999
.\" Bill Paul <wpaul@ctr.columbia.edu> 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 .

View File

@ -0,0 +1,518 @@
/*
* Copyright (c) 1997, 1998, 1999
* Bill Paul <wpaul@ctr.columbia.edu>. 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 <sys/types.h>
#include <sys/cdefs.h>
#include <sys/param.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <net/if.h>
#include <net/if_ether.h>
#include <dev/pcmcia/if_wi_ieee.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <err.h>
#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);
}