Remove the arl(4) driver. It is reported to not work on 6.x or later

even though the driver hasn't changed since 4.x (last known working
release).
This commit is contained in:
John Baldwin 2008-07-04 18:15:36 +00:00
parent 0c036c44dd
commit 94f923b69d
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=180257
14 changed files with 6 additions and 2744 deletions

View File

@ -14,6 +14,12 @@
# The file is partitioned: OLD_FILES first, then OLD_LIBS and OLD_DIRS last.
#
# 20080704: arl(4) removed
.if ${TARGET_ARCH} == "i386"
OLD_FILES+=usr/sbin/arlcontrol
OLD_FILES+=usr/share/man/man4/arl.4.gz
OLD_FILES+=usr/share/man/man8/arlcontrol.8.gz
.endif
# 20080703: sunlabel only for sparc64
.if ${TARGET_ARCH} != "sparc64"
OLD_FILES+=sbin/sunlabel

View File

@ -12,7 +12,6 @@ MAN= acpi_aiboost.4 \
amdpm.4 \
apm.4 \
ar.4 \
arl.4 \
ce.4 \
cp.4 \
CPU_ELAN.4 \

View File

@ -1,115 +0,0 @@
.\" Copyright (c) 2004
.\" Ivan Sharov <ivan.sharov@iname.com>. 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 Ivan Sharov.
.\" 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 Ivan Sharov 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 Ivan Sharov 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.
.\"
.\" $FreeBSD$
.\"
.Dd July 16, 2005
.Dt ARL 4 i386
.Os
.Sh NAME
.Nm arl
.Nd "Aironet Arlan 655 wireless network adapter driver"
.Sh SYNOPSIS
To compile this driver into the kernel,
place the following line in your
kernel configuration file:
.Bd -ragged -offset indent
.Cd "device arl"
.Ed
.Pp
Alternatively, to load the driver as a
module at boot time, place the following line in
.Xr loader.conf 5 :
.Bd -literal -offset indent
if_arl_load="YES"
.Ed
.Sh DESCRIPTION
The
.Nm
driver provides support for Aironet Arlan 655
wireless network adapters.
The Arlan 655 series adapters operate at 354kbps, 512kbps, 1Mbps and 2Mbps.
.Pp
The Aironet Arlan 655 devices support Aironet TMA, Aironet Non-TMA
and PSP operating modes.
.Pp
By default, the
.Nm
driver configures the Aironet Arlan 655 card for TMA operation.
.Pp
To set up Radio Network parameters, use
.Xr arlcontrol 8 .
.Sh SEE ALSO
.Xr arp 4 ,
.Xr netintro 4 ,
.Xr arlcontrol 8 ,
.Xr ifconfig 8
.Sh LIMITATIONS
When using
.Xr ifconfig 8
for setting
.Va SSID
you must use a 4-byte even hexadecimal digit value and it must start with
00 or 02.
.Pp
You can change
.Va channel
for current
.Va country
only through
.Xr ifconfig 8 .
You must use
.Xr arlcontrol 8
for changing
.Va country .
.Pp
Cannot change link-level address.
.Sh HISTORY
The
.Nm
device driver first appeared in
.Fx 5.3 .
.Sh AUTHORS
.An -nosplit
The
.Nm
driver was initially written by
.An Ivan Sharov Aq ivan.sharov@iname.com .
.Aq ran@styx.aic.net
wrote the
.Xr arlcontrol 8
utility and added
.Xr ioctl 2
support to the driver.
.An Stanislav Svirid Aq count@riss-telecom.ru
ported this driver to the new ISA architecture, merged some al driver changes,
fixed some bugs and made it a module.
.An Yuri Kurenkov Aq y.kurenkov@init.ru
wrote this manpage.

View File

@ -153,8 +153,6 @@ dev/arcmsr/arcmsr.c optional arcmsr pci
dev/ar/if_ar.c optional ar
dev/ar/if_ar_isa.c optional ar isa
dev/ar/if_ar_pci.c optional ar pci
dev/arl/if_arl.c optional arl
dev/arl/if_arl_isa.c optional arl isa
dev/asmc/asmc.c optional asmc isa
dev/atkbdc/atkbd.c optional atkbd atkbdc
dev/atkbdc/atkbd_atkbdc.c optional atkbd atkbdc

File diff suppressed because it is too large Load Diff

View File

@ -1,344 +0,0 @@
/*-
* Copyright (c) 1999-2001, Ivan Sharov, Vitaly Belekhov.
* Copyright (c) 2004 Stanislav Svirid.
* 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 AUTHOR 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 AUTHOR 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.
*
* $RISS: if_arl/dev/arl/if_arl_isa.c,v 1.7 2004/03/16 05:30:38 count Exp $
*/
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
#include "opt_inet.h"
#ifdef INET
#define ARLCACHE
#endif
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/socket.h>
#include <sys/kernel.h>
#include <sys/malloc.h>
#include <sys/module.h>
#include <sys/bus.h>
#include <machine/bus.h>
#include <machine/resource.h>
#include <sys/rman.h>
#include <net/ethernet.h>
#include <net/if.h>
#include <net/if_arp.h>
#include <net/if_mib.h>
#include <net/if_media.h>
#include <isa/isavar.h>
#include <isa/pnpvar.h>
#include <isa/isa_common.h>
#include <machine/md_var.h>
#include <vm/vm.h>
#include <vm/pmap.h>
#include <vm/vm_param.h>
#include <dev/arl/if_arlreg.h>
static void arl_isa_identify(driver_t *, device_t);
static int arl_isa_probe (device_t);
static int arl_isa_attach (device_t);
static int arl_isa_detach (device_t);
static char* arl_make_desc (u_int8_t, u_int8_t);
#define ARL_MAX_ATYPE_LEN 10
static struct arl_type {
u_int8_t type;
char* desc;
}
arl_type_list[] = {
{ 0, "450" },
{ 1, "650" },
{ 0xb, "670" },
{ 0xc, "670E" },
{ 0xd, "650E" },
{ 0xe, "440LT" },
{ 0x2e, "655" },
{ 0x6b, "IC2200" },
{ 0, 0 }
};
#define ARL_MAX_RTYPE_LEN 10
struct radio_type {
u_int8_t type;
char* desc;
} radio_type_list [] = {
{ 1, "092/094" },
{ 2, "020" },
{ 3, "092A" },
{ 4, "020B" },
{ 5, "095" },
{ 6, "024" },
{ 7, "025B" },
{ 8, "024B" },
{ 9, "024C" },
{10, "025C" },
{11, "024-1A" },
{12, "025-1A" },
};
static char*
arl_make_desc(hw_type, radio_mod)
u_int8_t hw_type;
u_int8_t radio_mod;
{
static char desc[80];
char atype[ARL_MAX_ATYPE_LEN], rtype[ARL_MAX_RTYPE_LEN];
int i;
*atype = *rtype = 0;
/* arl type */
for(i = 0; arl_type_list[i].desc; i++) {
if (arl_type_list[i].type == hw_type)
break;
}
if (arl_type_list[i].desc)
strncpy(atype, arl_type_list[i].desc, ARL_MAX_ATYPE_LEN);
else
snprintf(atype, ARL_MAX_ATYPE_LEN, "(0x%x)", hw_type);
/* radio type */
for(i = 0; radio_type_list[i].desc; i++)
if (radio_type_list[i].type == radio_mod)
break;
if (radio_type_list[i].desc)
strncpy(rtype, radio_type_list[i].desc, ARL_MAX_RTYPE_LEN);
else
snprintf(rtype, ARL_MAX_RTYPE_LEN, "(0x%x)", radio_mod);
snprintf(desc, 80, "ArLan type %s, radio module %s", atype, rtype);
return desc;
}
#define ARL_ADDR2VEC(addr) (1 << ((addr - ARL_BASE_START) / ARL_BASE_STEP))
static void
arl_isa_identify (driver_t *driver, device_t parent)
{
device_t child;
struct arl_softc *sc;
int chunk, found, i;
u_int16_t free_mem = 0xFFFF;
if (bootverbose)
printf("arl: in identify\n");
/* Try avoid already added devices */
for (i = 0; (child = device_find_child(parent, "arl", i)) != NULL; i++) {
chunk = bus_get_resource_start(child, SYS_RES_MEMORY, 0);
if (bootverbose)
device_printf(child, "found at iomem = 0x%0x\n", chunk);
if (chunk >= ARL_BASE_START && chunk <= ARL_BASE_END)
free_mem ^= ARL_ADDR2VEC(chunk);
}
if (bootverbose)
printf("arl: free mem vector = 0x%x\n", free_mem);
for (chunk = ARL_BASE_START; chunk <= ARL_BASE_END; chunk += ARL_BASE_STEP) {
/* If device 'arl' with this chunk was found early - skip it */
if ( !(free_mem & ARL_ADDR2VEC(chunk)) )
continue;
found = 0;
child = BUS_ADD_CHILD(parent, ISA_ORDER_SPECULATIVE, "arl", -1);
device_set_driver(child, driver);
sc = device_get_softc(child);
bzero(sc, sizeof(*sc));
bus_set_resource(child, SYS_RES_MEMORY, sc->mem_rid, chunk,
ARL_BASE_STEP);
if (arl_alloc_memory(child, sc->mem_rid, ARL_BASE_STEP) == 0) {
ar = (struct arl_private *) rman_get_virtual(sc->mem_res);
if (!bcmp(ar->textRegion, ARLAN_SIGN, sizeof(ARLAN_SIGN) - 1))
found++;
}
if (bootverbose)
device_printf(child, "%sfound at 0x%x\n",
!found ? "not " : "", chunk);
arl_release_resources(child);
if (!found) {
bus_delete_resource(child, SYS_RES_MEMORY, sc->mem_rid);
device_delete_child(parent, child);
}
}
}
static int
arl_isa_probe (device_t dev)
{
struct arl_softc *sc = device_get_softc(dev);
int error;
u_char *ptr;
u_int8_t irq;
if (isa_get_vendorid(dev))
return (ENXIO);
sc->arl_dev = dev;
if (bootverbose)
device_printf(dev, "in probe\n");
error = arl_alloc_memory(dev, 0, ARL_BASE_STEP);
if (error) {
if (bootverbose)
device_printf(dev, "Error allocating memory (%d)\n", error);
return (error);
}
ar = (struct arl_private *) rman_get_virtual(sc->mem_res);
if (bcmp(ar->textRegion, ARLAN_SIGN, sizeof(ARLAN_SIGN) - 1)) {
if (bootverbose)
device_printf(dev, "not found\n");
error = ENOENT;
goto bad;
}
irq = ar->irqLevel;
if (irq == 2)
irq = 9;
error = bus_set_resource(dev, SYS_RES_IRQ, 0, irq, 1);
if (error)
goto bad;
error = arl_alloc_irq(dev, 0, 0);
if (error) {
if (bootverbose)
device_printf(dev, "Can't allocate IRQ %d\n", irq);
goto bad;
}
ar->controlRegister = 1; /* freeze board */
/* Memory test */
for (ptr = (u_char *) ar;
ptr < ((u_char *) ar + ARL_BASE_STEP - 1); ptr++) {
u_char c;
c = *ptr; *ptr = ~(*ptr);
if (*ptr != (u_char)~c) {
device_printf(dev, "board memory failed at [%lx]\n",
rman_get_start(sc->mem_res) + (ptr - (u_char *)ar));
break; /* skip memory test */
}
}
bzero((void *) ar, ARL_BASE_STEP - 1); /* clear board ram */
if (arl_wait_reset(sc, 100, ARDELAY)) {
error = ENXIO;
goto bad;
}
if (ar->diagnosticInfo == 0xFF) {
device_set_desc_copy(dev, arl_make_desc(ar->hardwareType,
ar->radioModule));
error = 0;
} else {
if (bootverbose)
device_printf(dev, "board self-test failed (0x%x)!\n",
ar->diagnosticInfo);
error = ENXIO;
}
bad:
arl_release_resources(dev);
return (error);
}
static int
arl_isa_attach (device_t dev)
{
struct arl_softc *sc = device_get_softc(dev);
sc->arl_dev = dev;
if (bootverbose)
device_printf(dev, "in attach\n");
arl_alloc_memory(dev, sc->mem_rid, ARL_BASE_STEP);
arl_alloc_irq(dev, sc->irq_rid, 0);
return arl_attach(dev);
}
static int
arl_isa_detach(device_t dev)
{
struct arl_softc *sc = device_get_softc(dev);
ARL_LOCK(sc);
arl_stop(sc);
ARL_UNLOCK(sc);
callout_drain(&sc->arl_timer);
ether_ifdetach(sc->arl_ifp);
ifmedia_removeall(&sc->arl_ifmedia);
bus_teardown_intr(dev, sc->irq_res, sc->irq_handle);
if_free(sc->arl_ifp);
arl_release_resources(dev);
mtx_destroy(&sc->arl_lock);
return (0);
}
static device_method_t arl_isa_methods[] = {
/* Device interface */
DEVMETHOD(device_identify, arl_isa_identify),
DEVMETHOD(device_probe, arl_isa_probe),
DEVMETHOD(device_attach, arl_isa_attach),
DEVMETHOD(device_detach, arl_isa_detach),
{ 0, 0 }
};
static driver_t arl_isa_driver = {
"arl",
arl_isa_methods,
sizeof(struct arl_softc)
};
extern devclass_t arl_devclass;
DRIVER_MODULE(arl, isa, arl_isa_driver, arl_devclass, 0, 0);
MODULE_DEPEND(arl, isa, 1, 1, 1);
MODULE_DEPEND(arl, ether, 1, 1, 1);

View File

@ -1,344 +0,0 @@
/*-
* Copyright (c) 1999-2001, Ivan Sharov, Vitaly Belekhov.
* Copyright (c) 2004 Stanislav Svirid.
* 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 AUTHOR 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 AUTHOR 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.
*
* $RISS: if_arl/dev/arl/if_arlreg.h,v 1.4 2004/03/16 04:43:27 count Exp $
* $FreeBSD$
*/
#ifndef _IF_ARLREG_H
#define _IF_ARLREG_H
#define ARL_BASE_START 0xC0000
#define ARL_BASE_END 0xDE000
#define ARL_BASE_STEP 0x2000
#define ARLAN_NAME_SIZE 16
#define ARLAN_NAME "ArLan655-SCT"
/*
* Statistics
*/
struct arl_stats {
u_int32_t numDatagramsTransmitted;
u_int32_t numReTransmissions;
u_int32_t numFramesDiscarded;
u_int32_t numDatagramsReceived;
u_int32_t numDuplicateReceivedFrames;
u_int32_t numDatagramsDiscarded;
u_int16_t maxNumReTransmitDatagram;
u_int16_t maxNumReTransmitFrames;
u_int16_t maxNumConsecutiveDuplicateFrames;
u_int32_t numBytesTransmitted;
u_int32_t numBytesReceived;
u_int32_t numCRCErrors;
u_int32_t numLengthErrors;
u_int32_t numAbortErrors;
u_int32_t numTXUnderruns;
u_int32_t numRXOverruns;
u_int32_t numHoldOffs;
u_int32_t numFramesTransmitted;
u_int32_t numFramesReceived;
u_int32_t numReceiveFramesLost;
u_int32_t numRXBufferOverflows;
u_int32_t numFramesDiscardedAddrMismatch;
u_int32_t numFramesDiscardedSIDMismatch;
u_int32_t numPollsTransmistted;
u_int32_t numPollAcknowledges;
u_int32_t numStatusVectorTimeouts;
u_int32_t numNACKReceived;
} __attribute__((packed));
/*
* Arlan private structure in memomory
*/
struct arl_private {
/* Header Signature */
char textRegion[48];
u_int8_t resetFlag;
u_int8_t diagnosticInfo;
u_int16_t diagnosticOffset;
u_int8_t _1[12];
u_int8_t lanCardNodeId[6];
u_int8_t broadcastAddress[6];
u_int8_t hardwareType;
u_int8_t majorHardwareVersion;
u_int8_t minorHardwareVersion;
u_int8_t radioModule;
u_int8_t defaultChannelSet;
u_int8_t _2[47];
/* Control/Status Block - 0x0080 */
u_int8_t interruptInProgress;
u_int8_t cntrlRegImage;
u_int8_t _3[14];
u_int8_t commandByte;
u_int8_t commandParameter[15];
/* Receive Status - 0x00a0 */
u_int8_t rxStatusVector;
u_int8_t rxFrmType;
u_int16_t rxOffset;
u_int16_t rxLength;
u_int8_t rxSrc[6];
u_int8_t rxBroadcastFlag;
u_int8_t rxQuality;
u_int8_t scrambled;
u_int8_t _4[1];
/* Transmit Status - 0x00b0 */
u_int8_t txStatusVector;
u_int8_t txAckQuality;
u_int8_t numRetries;
u_int8_t _5[14];
u_int8_t registeredRouter[6];
u_int8_t backboneRouter[6];
u_int8_t registrationStatus;
u_int8_t configuredStatusFlag;
u_int8_t _6[1];
u_int8_t ultimateDestAddress[6];
u_int8_t immedDestAddress[6];
u_int8_t immedSrcAddress[6];
u_int16_t rxSequenceNumber;
u_int8_t assignedLocaltalkAddress;
u_int8_t _7[27];
/* System Parameter Block */
/* - Driver Parameters (Novell Specific) */
u_int16_t txTimeout;
u_int16_t transportTime;
u_int8_t _8[4];
/* - Configuration Parameters */
u_int8_t irqLevel;
u_int8_t spreadingCode;
u_int8_t channelSet;
u_int8_t channelNumber;
u_int16_t radioNodeId;
u_int8_t _9[2];
u_int8_t scramblingDisable;
u_int8_t radioType;
u_int16_t routerId;
u_int8_t _10[9];
u_int8_t txAttenuation;
u_int8_t systemId[4]; /* on an odd address for a long !!! */
u_int16_t globalChecksum;
u_int8_t _11[4];
u_int16_t maxDatagramSize;
u_int16_t maxFrameSize;
u_int8_t maxRetries;
u_int8_t receiveMode;
u_int8_t priority;
u_int8_t rootOrRepeater;
u_int8_t specifiedRouter[6];
u_int16_t fastPollPeriod;
u_int8_t pollDecay;
u_int8_t fastPollDelay[2];
u_int8_t arlThreshold;
u_int8_t arlDecay;
u_int8_t _12[1];
u_int16_t specRouterTimeout;
u_int8_t _13[5];
/* Scrambled Area */
u_int8_t SID[4];
u_int8_t encryptionKey[12];
u_int8_t _14[2];
u_int8_t waitTime[2];
u_int8_t lParameter[2];
u_int8_t _15[3];
u_int16_t headerSize;
u_int16_t sectionChecksum;
u_int8_t registrationMode;
u_int8_t registrationFill;
u_int16_t pollPeriod;
u_int16_t refreshPeriod;
u_int8_t name[ARLAN_NAME_SIZE];
u_int8_t NID[6];
u_int8_t localTalkAddress;
u_int8_t codeFormat;
u_int8_t SSCode[64];
u_int8_t _16[0x140];
/* Statistics Block - 0x0300 */
u_int8_t hostcpuLock;
u_int8_t lancpuLock;
u_int8_t resetTime[18];
struct arl_stats stat;
u_int8_t _17[0x86];
u_int8_t txBuffer[0x800];
u_int8_t rxBuffer[0x800];
u_int8_t _18[0x0bfd];
u_int8_t resetFlag1;
u_int8_t _19;
u_int8_t controlRegister;
};
/*
* Transmit parametrs
*/
struct arl_tx_param {
u_int16_t offset;
u_int16_t length;
u_int8_t dest[6];
u_int8_t clear;
u_int8_t retries;
u_int8_t routing;
u_int8_t scrambled;
};
#define ARL_HARDWARE_RESET 0x01
#define ARL_CHANNEL_ATTENTION 0x02
#define ARL_INTERRUPT_ENABLE 0x04
#define ARL_CLEAR_INTERRUPT 0x08
/* additions for sys/sockio.h ( socket ioctl parameters for arlan card ) */
#define SIOCGARLQLT _IOWR('i', 70, struct ifreq) /* get QUALITY */
#define SIOCGARLALL _IOWR('i', 71, struct ifreq) /* get ALL */
#define SIOCSARLALL _IOWR('i', 72, struct ifreq) /* set paramter (who_set) */
#define SIOCGARLSTB _IOWR('i', 73, struct ifreq) /* get statistic block */
/*
* Arlan request struct via ioctl
*/
struct arl_cfg_param {
u_char name[ARLAN_NAME_SIZE];
u_int8_t sid[4];
u_int8_t channelSet;
u_int8_t channelNumber;
u_int8_t spreadingCode;
u_int8_t registrationMode;
u_int8_t lanCardNodeId[6];
u_int8_t specifiedRouter[6];
u_int8_t hardwareType;
u_int8_t majorHardwareVersion;
u_int8_t minorHardwareVersion;
u_int8_t radioModule;
u_int8_t priority;
u_int8_t receiveMode;
u_int8_t txRetry;
};
struct arl_req {
u_int32_t what_set;
struct arl_cfg_param cfg;
};
#ifdef ARLCACHE
#define MAXARLCACHE 16
#define ARLCACHE_RX 0
#define ARLCACHE_TX 1
struct arl_sigcache {
u_int8_t macsrc[6]; /* unique MAC address for entry */
u_int8_t level[2];
u_int8_t quality[2];
};
#endif
#define ARLAN_SET_name 0x0001
#define ARLAN_SET_sid 0x0002
#define ARLAN_SET_channelSet 0x0004
#define ARLAN_SET_channelNumber 0x0008
#define ARLAN_SET_spreadingCode 0x0010
#define ARLAN_SET_registrationMode 0x0020
#define ARLAN_SET_lanCardNodeId 0x0040
#define ARLAN_SET_specifiedRouter 0x0080
#define ARLAN_SET_priority 0x0100
#define ARLAN_SET_receiveMode 0x0200
#define ARLAN_SET_txRetry 0x0400
#ifdef _KERNEL
struct arl_softc {
struct ifnet *arl_ifp;
device_t arl_dev;
struct arl_private * arl_mem; /* arlan data */
struct arl_cfg_param arl_cfg; /* arlan vars in our mem */
u_char arl_control;
int mem_rid; /* resource id for mem */
struct resource* mem_res; /* resource for mem */
int irq_rid; /* resource id for irq */
struct resource* irq_res; /* resource for irq */
void* irq_handle; /* handle for irq handler */
u_char arl_tx[2048];
int tx_len;
u_char arl_rx[2048];
int rx_len;
#ifdef ARLCACHE
struct arl_sigcache arl_sigcache[MAXARLCACHE];
#endif
struct ifmedia arl_ifmedia;
struct callout arl_timer;
struct mtx arl_lock;
};
#define ARL_LOCK(sc) mtx_lock(&(sc)->arl_lock)
#define ARL_UNLOCK(sc) mtx_unlock(&(sc)->arl_lock)
#define ARL_LOCK_ASSERT(sc) mtx_assert(&(sc)->arl_lock, MA_OWNED)
#endif
#define ARLAN_SIGN "TELESYSTEM"
#define ARLAN_HEADER_SIZE 0x0C
#define ar sc->arl_mem
#define arcfg sc->arl_cfg
#define ARDELAY 10000
#define ARDELAY1 50000
#define WAIT_RESET(cnt, delay) \
do { \
int i; \
for (i = cnt; i && ar->resetFlag; i--) { \
DELAY(delay); \
} \
} while (0)
#ifdef _KERNEL
void arl_release_resources (device_t);
int arl_alloc_memory (device_t, int, int);
int arl_alloc_irq (device_t, int, int);
int arl_attach (device_t);
int arl_wait_reset (struct arl_softc *, int, int);
void arl_stop (struct arl_softc *);
driver_intr_t arl_intr;
#endif
#endif /* _IF_ARLREG_H */

View File

@ -563,7 +563,6 @@ hint.mse.0.irq="5"
# ar: Arnet SYNC/570i hdlc sync 2/4 port V.35/X.21 serial driver
# (requires sppp)
# arl: Aironet Arlan 655 wireless adapters.
# ath: Atheros a/b/g WiFi adapters (requires ath_hal and wlan)
# ce: Cronyx Tau-PCI/32 sync single/dual port G.703/E1 serial adaptor
# with 32 HDLC subchannels (requires sppp (default), or NETGRAPH if
@ -605,10 +604,6 @@ hint.ar.0.at="isa"
hint.ar.0.port="0x300"
hint.ar.0.irq="10"
hint.ar.0.maddr="0xd0000"
device arl
hint.arl.0.at="isa"
hint.arl.0.irq="9"
hint.arl.0.maddr="0xd0000"
device ce
device cp
device cs

View File

@ -23,7 +23,6 @@ SUBDIR= ${_3dfx} \
${_ar} \
${_arcmsr} \
${_arcnet} \
${_arl} \
${_asmc} \
${_asr} \
ata \
@ -452,7 +451,6 @@ _aac= aac
_acpi= acpi
_ahb= ahb
_arcmsr= arcmsr
_arl= arl
_asmc= asmc
_asr= asr
_bios= bios

View File

@ -1,16 +0,0 @@
# $RISS: if_arl/modules/if_arl/Makefile,v 1.3 2003/01/13 08:05:29 frol Exp $
# $FreeBSD$
.PATH: ${.CURDIR}/../../dev/arl
KMOD= if_arl
SRCS= if_arl.c if_arl_isa.c
SRCS+= opt_inet.h device_if.h bus_if.h isa_if.h
CFLAGS+= -I${.CURDIR}/../..
.if !defined(KERNBUILDDIR)
opt_inet.h:
echo "#define INET 1" > opt_inet.h
.endif
.include <bsd.kmod.mk>

View File

@ -12,7 +12,6 @@ SUBDIR= ac \
ancontrol \
${_apm} \
${_apmd} \
${_arlcontrol} \
arp \
${_asf} \
${_atm} \
@ -317,7 +316,6 @@ _zzz= zzz
.if ${MK_ACPI} != "no"
_acpi= acpi
.endif
_arlcontrol= arlcontrol
_boot0cfg= boot0cfg
_wlconfig= wlconfig
.elif ${MACHINE} == "pc98"

View File

@ -1,10 +0,0 @@
#
# $RISS: if_arl/arlconfig/Makefile,v 1.5 2003/01/13 08:05:29 frol Exp $
# $FreeBSD$
#
PROG= arlcontrol
CFLAGS+= -I${.CURDIR}/../../sys -DARLCACHE
MAN= arlcontrol.8
.include <bsd.prog.mk>

View File

@ -1,166 +0,0 @@
.\" Copyright (c) 2004
.\" <ran@styx.aic.net>. All right 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 <ran@styx.aic.net>
.\" 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 ran@styx.aic.net 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 <ran@styx.aic.net> 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.
.\"
.\" $FreeBSD$
.\"
.Dd March 15, 2004
.Dt ARLCONTROL 8 i386
.Os
.Sh NAME
.Nm arlcontrol
.Nd configure Aironet Arlan 655 device
.Sh SYNOPSIS
.Nm
.Ar iface
.Nm
.Ar iface Cm country Ar country Pq Cm 9 Ns - Ns Cm 15
.Nm
.Ar iface Cm priority Ar priority Pq Cm normal , high , highest
.Nm
.Ar iface Cm txretry Ar txretry
.Nm
.Ar iface Cm stat
.Nm
.Ar iface Cm quality
.Sh DESCRIPTION
The
.Nm
utility controls the operation of Aironet Arlan 655 wireless networking
devices via the
.Xr arl 4
driver.
Most of the parameters that can be changed are related to the
Aironet protocol which the Aironet Arlan 655 card implements.
The
.Nm
utility can also be used to view the current NIC status, configuration,
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 Aironet Arlan 655
device
.Li ( arl0 , arl1 ,
etc.) and must be specified.
.Sh OPTIONS
The options are as follows:
.Bl -tag -width indent
.It Ar iface
Display current settings of the specified wireless interface.
This retrieves current card settings from the driver and prints
them out.
.It Ar iface Cm country Ar country Pq Cm 9 Ns - Ns Cm 15
Chose
.Ar country , channel
parameters that depend on the
.Ar country
according to the following table:
.Bl -column ".No North America" ".Em Channel" ".Em MHz"
.Em "Country Ch_Set MHz"
.It "North America" Ta 9 Ta "2412, 2427, 2442, 2457, 2465"
.It "U.S.A" Ta 9 Ta "2412, 2427, 2442, 2457, 2465"
.It "Canada" Ta 9 Ta "2412, 2427, 2442, 2457, 2465"
.It "Mexico" Ta 9 Ta "2412, 2427, 2442, 2457, 2465"
.It "New Zealand" Ta 9 Ta "2412, 2427, 2442, 2457, 2465"
.It "E.T.S.I" Ta 10 Ta "2412, 2427, 2442, 2457, 2472"
.It "Japan" Ta 11 Ta "2484"
.It "France" Ta 12 Ta "2457, 2465, 2475"
.It "Australia" Ta 13 Ta "2411, 2425, 2439"
.It "Germany" Ta 14 Ta "2427, 2442, 2457"
.It "U.K.(MPT1349)" Ta 15 Ta "2460"
.It "U.K." Ta 15 Ta "2460"
.It "Spain" Ta 15 Ta "2460"
.El
.It Ar iface Cm priority Ar priority Pq Cm normal , high , highest
Use the
.Ar priority
parameter to set the priority of the Arlan 655 Radio Media Access Control
the values are
.Cm normal , high
or
.Cm highest .
The higher the priority is set, the more likely this unit will be the first
to successfully transmit a packet when multiple units are trying
to transmit at the same time.
.Pp
The percentage of units on your network that you set to values other than
.Cm normal
should be kept small - 10 percent or less.
.It Ar iface Cm txretry Ar txretry
Set transmit retries.
Default is 0.
.It Ar iface Cm stat
Print internal Arlan 655 statistics block.
.It Ar iface Cm quality
Display the cached signal level and quality maintained by the
.Xr arl 4
driver.
The driver retains information about quality and level for packets
received from different hosts.
Also the driver extracts values from ACK packets.
.El
.Sh EXAMPLES
.Bd -literal -offset indent
arlcontrol arl0 country 11 priority high
arlcontrol arl0 quality
arlcontrol arl0 stat
arlcontrol arl0
.Ed
.Pp
You can configure the Arlan 655 card from
.Pa /etc/start_if.arl0 .
For example:
.Bd -literal -offset indent
#!/bin/sh
/usr/sbin/arlcontrol country 9 priority highest
.Ed
.Sh SEE ALSO
.Xr arl 4
.Rs
.%T "Arlan 655 ISA Wireless LAN Client Card User Guide"
.Re
.Sh HISTORY
The
.Nm
utility first appeared in
.Fx 5.3 .
.Sh AUTHORS
.An -nosplit
The
.Nm
utility was written by
.Aq ran@styx.aic.net .
This manpage was written by
.An Yuri Kurenkov Aq y.kurenkov@init.ru .
.Sh BUGS
Aironet Arlan 640 bridges and Arlan 630 access points do not understand
country codes other than 9.

View File

@ -1,430 +0,0 @@
/*
* $RISS: if_arl/arlconfig/arlconfig.c,v 1.5 2004/03/16 05:00:21 count Exp $
*/
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <net/ethernet.h>
#include <netinet/in.h>
#include <netinet/if_ether.h>
#include <err.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include <limits.h>
#include <dev/arl/if_arlreg.h>
struct freq_list {
short fr_no;
char* name;
};
struct freq_list freq_list_1[] = {
{ 0, "908.50" },
{ 1, "910.06" },
{ 2, "915.52" },
{ 3, "915.00" },
{ 4, "917.83" },
{ 5, "919.22" },
{ 6, "922.26" },
{ 7, "911.45" },
{ 8, "915.00" },
{ 9, "918.55" },
{ 10,"915.00" },
{ 11,"915.00" }
};
struct freq_list freq_list_6[] = {
{ 0, "920.31" },
{ 1, "920.33" },
{ 2, "921.55" },
{ 3, "922.17" },
{ 4, "922.79" },
{ 5, "921.46" },
{ 6, "921.55" }
};
struct freq_list freq_list_9[] = {
{ 0, "Bad" },
{ 1, "2412" },
{ 2, "2427" },
{ 3, "2442" },
{ 4, "2457" },
{ 5, "2465" }
};
struct freq_list freq_list_10[] = {
{ 0, "Bad" },
{ 1, "2412" },
{ 2, "2427" },
{ 3, "2442" },
{ 4, "2457" },
{ 5, "2472" }
};
struct freq_list freq_list_11[] = {
{ 0, "Bad" },
{ 1, "2484" }
};
struct freq_list freq_list_12[] = {
{ 0, "Bad" },
{ 1, "2457" },
{ 2, "2465" },
{ 3, "2472" },
};
struct freq_list freq_list_13[] = {
{ 0, "Bad" },
{ 1, "2411" },
{ 2, "2425" },
{ 3, "2439" }
};
struct freq_list freq_list_14[] = {
{ 0, "Bad" },
{ 1, "2427" },
{ 2, "2442" },
{ 3, "2457" }
};
struct freq_list freq_list_15[] = {
{ 0, "Bad" },
{ 1, "2460" }
};
#define MAXFREQ(a) sizeof(a)/sizeof(struct freq_list)
struct rate_list {
short rate_no;
char* name;
};
struct rate_list rate_list_2400[] = {
{ 0, "Bad" },
{ 1, "354" },
{ 2, "512" },
{ 3, "1000" },
{ 4, "2000" }
};
struct radio_type {
int id;
char* name;
} radio_type_list [] = {
{ 0, "No EPROM" },
{ 1, "092/094" },
{ 2, "020" },
{ 3, "092A" },
{ 4, "020B" },
{ 5, "095" },
{ 6, "024" },
{ 7, "025B" },
{ 8, "024B" },
{ 9, "024C" },
{10, "025C" },
{11, "024-1A" },
{12, "025-1A" },
{13, "Other" }
};
static struct ch_list {
short chan;
char* fr;
char* country;
struct rate_list* rate;
struct freq_list* freq;
int max_freq;
} CHSET[] = {
{ 0, 0, 0, 0, 0, 0 },
{ 1, "900 Mhz", "Canada, U.S.A., Mexico", 0, freq_list_1, MAXFREQ(freq_list_1) },
{ 2, 0, 0, 0, 0, 0 },
{ 3, 0, 0, 0, 0, 0 },
{ 4, 0, 0, 0, 0, 0 },
{ 5, 0, 0, 0, 0, 0 },
{ 6, "900 Mhz", "Australia", 0, freq_list_6, MAXFREQ(freq_list_6) },
{ 7, 0, 0, 0, 0, 0 },
{ 8, 0, 0, 0, 0, 0 },
{ 9, "2400 Mhz", "North America", rate_list_2400, freq_list_9, MAXFREQ(freq_list_9) },
{ 10, "2400 Mhz", "E.T.S.I", rate_list_2400, freq_list_10, MAXFREQ(freq_list_10) },
{ 11, "2400 Mhz", "Japan", rate_list_2400, freq_list_11, MAXFREQ(freq_list_11) },
{ 12, "2400 Mhz", "France", rate_list_2400, freq_list_12, MAXFREQ(freq_list_12) },
{ 13, "2400 Mhz", "Australia", rate_list_2400, freq_list_13, MAXFREQ(freq_list_13) },
{ 14, "2400 Mhz", "Germany", rate_list_2400, freq_list_14, MAXFREQ(freq_list_14) },
{ 15, "2400 Mhz", "U.K.(MPT1349),Spain", rate_list_2400, freq_list_15, MAXFREQ(freq_list_15) }
};
char* registrationMode[] = {
"NON-TMA",
"TMA",
"PSP"
};
char* priorityList[] = {
"normal",
"high",
"highest"
};
void
usage()
{
const char *progname = getprogname();
#if 0
fprintf(stderr, "\nArlan configuration utility.\n\n");
#endif
fprintf(stderr, "Usage: %s <ifname> [<param> <value> ...]\n", progname);
fprintf(stderr, "\t<ifname>\tArlan interface name.\n");
fprintf(stderr, "\t<param>\t\tParameter name (see below).\n");
fprintf(stderr, "\t<value>\t\tNew value for parameter.\n");
fprintf(stderr, "Parameter name:\t\tValue:\n");
fprintf(stderr, "\tcountry\t\tset Country (9-15)\n");
fprintf(stderr, "\tpriority\tset Priority (normal, high, highest)\n");
fprintf(stderr, "\ttxretry\t\tset Arlan Tx retry.\n");
fprintf(stderr, "or: %s <ifname> stat\n", progname);
fprintf(stderr, "\tprint internal arlan statistics block\n");
#ifdef ARLCACHE
fprintf(stderr,"or: %s <ifname> quality\n", progname);
fprintf(stderr,"\tprint receive packet level and quality\n");
#endif
exit(0);
}
void
print_al(struct arl_cfg_param *arl_io)
{
printf("Arlan-655(IC2000) type 0x%x v%d.%d, radio module type %s\n",
arl_io->hardwareType,
arl_io->majorHardwareVersion,
arl_io->minorHardwareVersion,
(arl_io->radioModule < 13) ?
radio_type_list[arl_io->radioModule].name : "Unknown" );
printf("\tname %s, sid 0x%06x, mode %s, num tx retry %d\n",
arl_io->name,
*(int *)arl_io->sid,
(arl_io->registrationMode < 3) ?
registrationMode[arl_io->registrationMode]:"Unknown",
arl_io->txRetry );
printf("\tchannel set %d, %s, %s\n",
arl_io->channelSet,
CHSET[arl_io->channelSet].fr,
CHSET[arl_io->channelSet].country);
printf("\tfrequency %s Mhz, bitrate %s kb/s, priority %s, receive mode %d\n",
(CHSET[arl_io->channelSet].freq &&
CHSET[arl_io->channelSet].max_freq > arl_io->channelNumber) ?
CHSET[arl_io->channelSet].freq[arl_io->channelNumber].name :
"unknown",
(CHSET[arl_io->channelSet].rate) ?
CHSET[arl_io->channelSet].rate[arl_io->spreadingCode].name :
"unknown",
arl_io->priority <= 2 ?
priorityList[arl_io->priority] : "unknown",
arl_io->receiveMode);
printf("\tether %s",
(char *)ether_ntoa((struct ether_addr *)arl_io->lanCardNodeId));
printf(" registered to %s\n",
(char *)ether_ntoa((struct ether_addr *)arl_io->specifiedRouter));
}
void
print_stb( struct arl_stats stb )
{
printf("Arlan internal statistics block\n\n");
printf("%8u\tdatagrams transmitted\n",
stb.numDatagramsTransmitted);
printf("%8u\tre-transmitted\n",
stb.numReTransmissions);
printf("%8u\tframes discarded internally in a router\n",
stb.numFramesDiscarded);
printf("%8u\tdatagrams received\n",
stb.numDatagramsReceived);
printf("%8u\tduplicate received frame\n",
stb.numDuplicateReceivedFrames);
printf("%8u\tdatagrams discarded due to unavailable mail box buffer\n",
stb.numDatagramsDiscarded);
printf("%8d\tmaximum of re-transmissions datagram\n",
stb.maxNumReTransmitDatagram);
printf("%8d\tmaximum of re-transmissions frame\n",
stb.maxNumReTransmitFrames);
printf("%8d\tmaximum of consecutive duplicate received frames\n",
stb.maxNumConsecutiveDuplicateFrames);
printf("%8u\tbytes transmitted\n",
stb.numBytesTransmitted);
printf("%8u\tbytes received\n",
stb.numBytesReceived);
printf("%8u\tCRC errors\n",
stb.numCRCErrors);
printf("%8u\tlength errors\n",
stb.numLengthErrors);
printf("%8u\tabort errors\n",
stb.numAbortErrors);
printf("%8u\tTX underuns\n",
stb.numTXUnderruns);
printf("%8u\tRX overruns\n",
stb.numRXOverruns);
printf("%8u\tHold Offs (channel tested busy, tx delayed)\n",
stb.numHoldOffs);
printf("%8u\tframes transmitted\n",
stb.numFramesTransmitted);
printf("%8u\tframes received\n",
stb.numFramesReceived);
printf("%8u\treceive frames lost due unavailable buffer\n",
stb.numReceiveFramesLost);
printf("%8u\tRX buffer overflows \n",
stb.numRXBufferOverflows);
printf("%8u\tframes discarded due to Address mismatch\n",
stb.numFramesDiscardedAddrMismatch);
printf("%8u\tframes discarded due to SID mismatch\n",
stb.numFramesDiscardedSIDMismatch);
printf("%8u\tpolls transmitted\n",
stb.numPollsTransmistted);
printf("%8u\tpoll acknowledges received\n",
stb.numPollAcknowledges);
printf("%8u\tstatus vector timeout\n",
stb.numStatusVectorTimeouts);
printf("%8u\tNACK packets received\n",
stb.numNACKReceived);
}
#ifdef ARLCACHE
void
print_qlt(struct arl_sigcache *qlt)
{
int i;
u_int8_t zero[6] = {0, 0, 0, 0, 0, 0};
for (i = 0; i < MAXARLCACHE && bcmp(qlt->macsrc, zero, 6); i++) {
printf("[%d]:", i+1);
printf(" %02x:%02x:%02x:%02x:%02x:%02x,",
qlt->macsrc[0]&0xff,
qlt->macsrc[1]&0xff,
qlt->macsrc[2]&0xff,
qlt->macsrc[3]&0xff,
qlt->macsrc[4]&0xff,
qlt->macsrc[5]&0xff);
printf(" rx lvl/qlty: %d/%d,", qlt->level[ARLCACHE_RX],
qlt->quality[ARLCACHE_RX]);
printf(" tx lvl/qlty: %d/%d", qlt->level[ARLCACHE_TX],
qlt->quality[ARLCACHE_TX]);
printf("\n");
qlt++;
}
}
#endif
int
main(int argc, char *argv[])
{
struct ifreq ifr;
struct arl_req arl_io;
struct ether_addr *ea;
struct arl_stats stb;
struct arl_sigcache qlt[MAXARLCACHE];
int sd, argind, val = -1;
char *param, *value;
if (argc < 2)
usage();
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;
bzero(&arl_io, sizeof(arl_io));
ifr.ifr_data = (caddr_t)&arl_io;
if (argc == 2) {
if (ioctl(sd, SIOCGARLALL, (caddr_t)&ifr))
err(1,"Get ALL");
print_al(&arl_io.cfg);
exit(0);
}
if (argc == 3) {
if (!strcasecmp(argv[2], "stat")) {
strncpy(ifr.ifr_name, argv[1], sizeof(ifr.ifr_name));
ifr.ifr_addr.sa_family = AF_INET;
ifr.ifr_data = (caddr_t)&stb;
if (ioctl(sd, SIOCGARLSTB, (caddr_t)&ifr))
err(1,"Get STB");
print_stb(stb);
exit(0);
}
#ifdef ARLCACHE
if (!strcasecmp( argv[2],"quality")) {
printf("\n");
strncpy(ifr.ifr_name, argv[1], sizeof(ifr.ifr_name));
ifr.ifr_addr.sa_family = AF_INET;
ifr.ifr_data = (caddr_t)qlt;
if (ioctl(sd, SIOCGARLQLT, (caddr_t)&ifr))
err(1,"Get QLT");
print_qlt(qlt);
exit(0);
}
#endif
}
arl_io.what_set = 0;
for (argind = 2; argind < argc; argind += 2) {
param = argv[argind];
value = argv[argind+1];
val = -1;
if (!strcasecmp(param, "priority")) {
if (!strcasecmp(value, "normal"))
val = 0;
else if (!strcasecmp(value, "high"))
val = 1;
else if (!strcasecmp(value, "highest"))
val = 2;
if (val == -1)
err( 1, "Bad priority - %s", value);
arl_io.cfg.priority = val;
arl_io.what_set |= ARLAN_SET_priority;
}
if (!strcasecmp(param, "parent")) {
if ((ea = (struct ether_addr*) ether_aton(value)) == NULL)
err (1, "Bad parent's MAC - %s", value);
for (val = 0; val < 6; val++) {
arl_io.cfg.specifiedRouter[val] =
(int) ea->octet[val];
}
arl_io.what_set |= ARLAN_SET_specifiedRouter;
}
if (!strcasecmp(param, "country")) {
arl_io.cfg.channelSet = atoi(value);
arl_io.what_set |= ARLAN_SET_channelSet;
}
if (!strcasecmp(param, "txretry")) {
arl_io.cfg.txRetry = atoi(value);
arl_io.what_set |= ARLAN_SET_txRetry;
}
}
if (arl_io.what_set) {
if (ioctl(sd, SIOCSARLALL, (caddr_t)&ifr))
err (1, "Set ALL" );
if (ioctl(sd, SIOCGARLALL, (caddr_t)&ifr))
err (1, "Get ALL");
print_al(&arl_io.cfg);
}
return 0;
}