summaryrefslogtreecommitdiffstats
path: root/usr.sbin/wlconfig/wlconfig.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr.sbin/wlconfig/wlconfig.c')
-rw-r--r--usr.sbin/wlconfig/wlconfig.c417
1 files changed, 0 insertions, 417 deletions
diff --git a/usr.sbin/wlconfig/wlconfig.c b/usr.sbin/wlconfig/wlconfig.c
deleted file mode 100644
index f361b2c..0000000
--- a/usr.sbin/wlconfig/wlconfig.c
+++ /dev/null
@@ -1,417 +0,0 @@
-/*
- * Copyright (C) 1996
- * Michael Smith. 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.
- *
- * THIS SOFTWARE IS PROVIDED BY Michael Smith 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 Michael Smith OR CONTRIBUTORS 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.
- */
-
-#ifndef lint
-static const char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-/*
- * wlconfig.c
- *
- * utility to read out and change various WAVELAN parameters.
- * Currently supports NWID and IRQ values.
- *
- * The NWID is used by 2 or more wavelan controllers to determine
- * if packets should be received or not. It is a filter that
- * is roughly analogous to the "channel" setting with a garage
- * door controller. Two companies side by side with wavelan devices
- * that could actually hear each other can use different NWIDs
- * and ignore packets. In truth however, the air space is shared,
- * and the NWID is a virtual filter.
- *
- * In the current set of wavelan drivers, ioctls changed only
- * the runtime radio modem registers which act in a manner analogous
- * to an ethernet transceiver. The ioctls do not change the
- * stored nvram PSA (or parameter storage area). At boot, the PSA
- * values are stored in the radio modem. Thus when the
- * system reboots it will restore the wavelan NWID to the value
- * stored in the PSA. The NCR/ATT dos utilities must be used to
- * change the initial NWID values in the PSA. The wlconfig utility
- * may be used to set a different NWID at runtime; this is only
- * permitted while the interface is up and running.
- *
- * By contrast, the IRQ value can only be changed while the
- * Wavelan card is down and unconfigured, and it will remain
- * disabled after an IRQ change until reboot.
- *
- */
-
-#include <sys/param.h>
-#include <sys/socket.h>
-#include <sys/ioctl.h>
-#include <sys/time.h>
-#include <machine/if_wl_wavelan.h>
-
-#include <net/if.h>
-#include <netinet/in.h>
-#include <netinet/if_ether.h>
-
-#include <err.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <limits.h>
-
-/* translate IRQ bit to number */
-/* array for maping irq numbers to values for the irq parameter register */
-static int irqvals[16] = {
- 0, 0, 0, 0x01, 0x02, 0x04, 0, 0x08, 0, 0, 0x10, 0x20, 0x40, 0, 0, 0x80
-};
-
-/* cache */
-static int w_sigitems; /* count of valid items */
-static struct w_sigcache wsc[MAXCACHEITEMS];
-
-int
-wlirq(int irqval)
-{
- int irq;
-
- for(irq = 0; irq < 16; irq++)
- if(irqvals[irq] == irqval)
- return(irq);
- return 0;
-}
-
-char *compat_type[] = {
- "PC-AT 915MHz",
- "PC-MC 915MHz",
- "PC-AT 2.4GHz",
- "PC-MC 2.4GHz",
- "PCCARD or 1/2 size AT, 915MHz or 2.4GHz"
-};
-
-char *subband[] = {
- "915MHz/see WaveModem",
- "2425MHz",
- "2460MHz",
- "2484MHz",
- "2430.5MHz"
-};
-
-
-/*
-** print_psa
-**
-** Given a pointer to a PSA structure, print it out
-*/
-void
-print_psa(u_char *psa, int currnwid)
-{
- int nwid;
-
- /*
- ** Work out what sort of board we have
- */
- if (psa[0] == 0x14) {
- printf("Board type : Microchannel\n");
- } else {
- if (psa[1] == 0) {
- printf("Board type : PCCARD\n");
- } else {
- printf("Board type : ISA");
- if ((psa[4] == 0) &&
- (psa[5] == 0) &&
- (psa[6] == 0))
- printf(" (DEC OEM)");
- printf("\n");
- printf("Base address options : 0x300, 0x%02x0, 0x%02x0, 0x%02x0\n",
- (int)psa[1], (int)psa[2], (int)psa[3]);
- printf("Waitstates : %d\n",psa[7] & 0xf);
- printf("Bus mode : %s\n",(psa[7] & 0x10) ? "EISA" : "ISA");
- printf("IRQ : %d\n",wlirq(psa[8]));
- }
- }
- printf("Default MAC address : %02x:%02x:%02x:%02x:%02x:%02x\n",
- psa[0x10],psa[0x11],psa[0x12],psa[0x13],psa[0x14],psa[0x15]);
- printf("Soft MAC address : %02x:%02x:%02x:%02x:%02x:%02x\n",
- psa[0x16],psa[0x17],psa[0x18],psa[0x19],psa[0x1a],psa[0x1b]);
- printf("Current MAC address : %s\n",(psa[0x1c] & 0x1) ? "Soft" : "Default");
- printf("Adapter compatibility : ");
- if (psa[0x1d] < 5) {
- printf("%s\n",compat_type[psa[0x1d]]);
- } else {
- printf("unknown\n");
- }
- printf("Threshold preset : %d\n",psa[0x1e]);
- printf("Call code required : %s\n",(psa[0x1f] & 0x1) ? "YES" : "NO");
- if (psa[0x1f] & 0x1)
- printf("Call code : 0x%02x%02x%02x%02x%02x%02x%02x%02x\n",
- psa[0x30],psa[0x31],psa[0x32],psa[0x33],psa[0x34],psa[0x35],psa[0x36],psa[0x37]);
- printf("Subband : %s\n",subband[psa[0x20] & 0xf]);
- printf("Quality threshold : %d\n",psa[0x21]);
- printf("Hardware version : %d (%s)\n",psa[0x22],psa[0x22] ? "Rel3" : "Rel1/Rel2");
- printf("Network ID enable : %s\n",(psa[0x25] & 0x1) ? "YES" : "NO");
- if (psa[0x25] & 0x1) {
- nwid = (psa[0x23] << 8) + psa[0x24];
- printf("NWID : 0x%04x\n",nwid);
- if (nwid != currnwid) {
- printf("Current NWID : 0x%04x\n",currnwid);
- }
- }
- printf("Datalink security : %s\n",(psa[0x26] & 0x1) ? "YES" : "NO");
- if (psa[0x26] & 0x1) {
- printf("Encryption key : ");
- if (psa[0x27] == 0) {
- printf("DENIED\n");
- } else {
- printf("0x%02x%02x%02x%02x%02x%02x%02x%02x\n",
- psa[0x27],psa[0x28],psa[0x29],psa[0x2a],psa[0x2b],psa[0x2c],psa[0x2d],psa[0x2e]);
- }
- }
- printf("Databus width : %d (%s)\n",
- (psa[0x2f] & 0x1) ? 16 : 8, (psa[0x2f] & 0x80) ? "fixed" : "variable");
- printf("Configuration state : %sconfigured\n",(psa[0x38] & 0x1) ? "" : "un");
- printf("CRC-16 : 0x%02x%02x\n",psa[0x3e],psa[0x3d]);
- printf("CRC status : ");
- switch(psa[0x3f]) {
- case 0xaa:
- printf("OK\n");
- break;
- case 0x55:
- printf("BAD\n");
- break;
- default:
- printf("Error\n");
- break;
- }
-}
-
-
-static void
-usage()
-{
- fprintf(stderr,"usage: wlconfig ifname [param value ...]\n");
- exit(1);
-}
-
-
-void
-get_cache(int sd, struct ifreq *ifr)
-{
- /* get the cache count */
- if (ioctl(sd, SIOCGWLCITEM, (caddr_t)ifr))
- err(1, "SIOCGWLCITEM - get cache count");
- w_sigitems = (int) ifr->ifr_data;
-
- ifr->ifr_data = (caddr_t) &wsc;
- /* get the cache */
- if (ioctl(sd, SIOCGWLCACHE, (caddr_t)ifr))
- err(1, "SIOCGWLCACHE - get cache count");
-}
-
-static int
-scale_value(int value, int max)
-{
- double dmax = (double) max;
- if (value > max)
- return(100);
- return((value/dmax) * 100);
-}
-
-static void
-dump_cache(int rawFlag)
-{
- int i;
- int signal, silence, quality;
-
- if (rawFlag)
- printf("signal range 0..63: silence 0..63: quality 0..15\n");
- else
- printf("signal range 0..100: silence 0..100: quality 0..100\n");
-
- /* after you read it, loop through structure,i.e. wsc
- * print each item:
- */
- for(i = 0; i < w_sigitems; i++) {
- printf("[%d:%d]>\n", i+1, w_sigitems);
- printf("\tip: %d.%d.%d.%d,",((wsc[i].ipsrc >> 0) & 0xff),
- ((wsc[i].ipsrc >> 8) & 0xff),
- ((wsc[i].ipsrc >> 16) & 0xff),
- ((wsc[i].ipsrc >> 24) & 0xff));
- printf(" mac: %02x:%02x:%02x:%02x:%02x:%02x\n",
- wsc[i].macsrc[0]&0xff,
- wsc[i].macsrc[1]&0xff,
- wsc[i].macsrc[2]&0xff,
- wsc[i].macsrc[3]&0xff,
- wsc[i].macsrc[4]&0xff,
- wsc[i].macsrc[5]&0xff);
- if (rawFlag) {
- signal = wsc[i].signal;
- silence = wsc[i].silence;
- quality = wsc[i].quality;
- }
- else {
- signal = scale_value(wsc[i].signal, 63);
- silence = scale_value(wsc[i].silence, 63);
- quality = scale_value(wsc[i].quality, 15);
- }
- printf("\tsignal: %d, silence: %d, quality: %d, ",
- signal,
- silence,
- quality);
- printf("snr: %d\n", signal - silence);
- }
-}
-
-#define raw_cache() dump_cache(1)
-#define scale_cache() dump_cache(0)
-
-int
-main(int argc, char *argv[])
-{
- int sd;
- struct ifreq ifr;
- u_char psabuf[0x40];
- int val, argind, i;
- char *cp, *param, *value;
- struct ether_addr *ea;
- int work = 0;
- int currnwid;
-
- if ((argc < 2) || (argc % 2))
- usage();
-
- /* get a socket */
- sd = socket(AF_INET, SOCK_DGRAM, 0);
- if (sd < 0)
- err(1,"socket");
- strncpy(ifr.ifr_name, argv[1], sizeof(ifr.ifr_name));
- ifr.ifr_addr.sa_family = AF_INET;
-
- /* get the PSA */
- ifr.ifr_data = (caddr_t)psabuf;
- if (ioctl(sd, SIOCGWLPSA, (caddr_t)&ifr))
- err(1,"get PSA");
-
- /* get the current NWID */
- if (ioctl(sd, SIOCGWLCNWID, (caddr_t)&ifr))
- err(1,"get NWID");
- currnwid = (int)ifr.ifr_data;
-
- /* just dump and exit? */
- if (argc == 2) {
- print_psa(psabuf, currnwid);
- exit(0);
- }
-
- /* loop reading arg pairs */
- for (argind = 2; argind < argc; argind += 2) {
-
- param = argv[argind];
- value = argv[argind+1];
-
- /* What to do? */
-
- if (!strcasecmp(param,"currnwid")) { /* set current NWID */
- val = strtol(value,&cp,0);
- if ((val < 0) || (val > 0xffff) || (cp == value))
- errx(1,"bad NWID '%s'",value);
-
- ifr.ifr_data = (caddr_t)val;
- if (ioctl(sd, SIOCSWLCNWID, (caddr_t)&ifr))
- err(1,"set NWID (interface not up?)");
- continue ;
- }
-
- if (!strcasecmp(param,"irq")) {
- val = strtol(value,&cp,0);
- val = irqvals[val];
- if ((val == 0) || (cp == value))
- errx(1,"bad IRQ '%s'",value);
- psabuf[WLPSA_IRQNO] = (u_char)val;
- work = 1;
- continue;
- }
-
- if (!strcasecmp(param,"mac")) {
- if ((ea = ether_aton(value)) == NULL)
- errx(1,"bad ethernet address '%s'",value);
- for (i = 0; i < 6; i++)
- psabuf[WLPSA_LOCALMAC + i] = ea->octet[i];
- work = 1;
- continue;
- }
-
- if (!strcasecmp(param,"macsel")) {
- if (!strcasecmp(value,"local")) {
- psabuf[WLPSA_MACSEL] |= 0x1;
- work = 1;
- continue;
- }
- if (!strcasecmp(value,"universal")) {
- psabuf[WLPSA_MACSEL] &= ~0x1;
- work = 1;
- continue;
- }
- errx(1,"bad macsel value '%s'",value);
- }
-
- if (!strcasecmp(param,"nwid")) {
- val = strtol(value,&cp,0);
- if ((val < 0) || (val > 0xffff) || (cp == value))
- errx(1,"bad NWID '%s'",value);
- psabuf[WLPSA_NWID] = (val >> 8) & 0xff;
- psabuf[WLPSA_NWID+1] = val & 0xff;
- work = 1;
- continue;
- }
- if (!strcasecmp(param,"cache")) {
-
- /* raw cache dump
- */
- if (!strcasecmp(value,"raw")) {
- get_cache(sd, &ifr);
- raw_cache();
- continue;
- }
- /* scaled cache dump
- */
- else if (!strcasecmp(value,"scale")) {
- get_cache(sd, &ifr);
- scale_cache();
- continue;
- }
- /* zero out cache
- */
- else if (!strcasecmp(value,"zero")) {
- if (ioctl(sd, SIOCDWLCACHE, (caddr_t)&ifr))
- err(1,"zero cache");
- continue;
- }
- errx(1,"unknown value '%s'", value);
- }
- errx(1,"unknown parameter '%s'",param);
- }
- if (work) {
- ifr.ifr_data = (caddr_t)psabuf;
- if (ioctl(sd, SIOCSWLPSA, (caddr_t)&ifr))
- err(1,"set PSA");
- }
- return(0);
-}
OpenPOWER on IntegriCloud