Implement "arlconfig arlX quality".
Man pages fixes. Submitted by: Stanislav A. Svirid <count@riss-telecom.ru>
This commit is contained in:
parent
df6511ed48
commit
456f076f01
@ -1,10 +1,16 @@
|
||||
/*
|
||||
* $RISS: if_arl/dev/arl/if_arl.c,v 1.5 2004/01/22 12:49:05 frol Exp $
|
||||
* $RISS: if_arl/dev/arl/if_arl.c,v 1.7 2004/03/16 04:43:27 count Exp $
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include "opt_inet.h"
|
||||
|
||||
#ifdef INET
|
||||
#define ARLCACHE
|
||||
#endif
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/systm.h>
|
||||
@ -26,10 +32,16 @@ __FBSDID("$FreeBSD$");
|
||||
#include <net/if_arp.h>
|
||||
#include <net/if_media.h>
|
||||
#include <net/ethernet.h>
|
||||
#include <net/bpf.h>
|
||||
|
||||
|
||||
#ifdef INET
|
||||
#include <netinet/in.h>
|
||||
#include <netinet/if_ether.h>
|
||||
#include <netinet/in_systm.h>
|
||||
#include <netinet/in_var.h>
|
||||
#include <netinet/ip.h>
|
||||
#endif
|
||||
|
||||
#include <net/bpf.h>
|
||||
|
||||
#include <machine/clock.h>
|
||||
|
||||
@ -48,7 +60,7 @@ __FBSDID("$FreeBSD$");
|
||||
#define ARL_CHANNEL(sc) \
|
||||
{ \
|
||||
D(("channel ctrl %x reg %x\n", sc->arl_control, ar->controlRegister)); \
|
||||
ar->controlRegister = (sc->arl_control ^= ARL_CHANNEL_ATTENTION); \
|
||||
ar->controlRegister = (sc->arl_control ^= ARL_CHANNEL_ATTENTION); \
|
||||
}
|
||||
|
||||
/*
|
||||
@ -60,7 +72,7 @@ __FBSDID("$FreeBSD$");
|
||||
#define BPF_MTAP(_ifp,_m) \
|
||||
do { \
|
||||
if ((_ifp)->if_bpf) \
|
||||
bpf_mtap((_ifp), (_m)); \
|
||||
bpf_mtap((_ifp), (_m)); \
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
@ -90,6 +102,11 @@ static void arl_read (struct arl_softc *, caddr_t, int);
|
||||
static void arl_recv (struct arl_softc *);
|
||||
static struct mbuf* arl_get (caddr_t, int, int, struct ifnet *);
|
||||
|
||||
#ifdef ARLCACHE
|
||||
static void arl_cache_store (struct arl_softc *, struct ether_header *,
|
||||
u_int8_t, u_int8_t, int);
|
||||
#endif
|
||||
|
||||
devclass_t arl_devclass;
|
||||
|
||||
/*
|
||||
@ -279,22 +296,7 @@ arl_config(sc)
|
||||
ar->commandByte = 1;
|
||||
ARL_CHANNEL(sc);
|
||||
DELAY(ARDELAY1);
|
||||
/*
|
||||
if (arl_command(sc) != 0) {
|
||||
int i;
|
||||
|
||||
for (i = 0x168; ar->diagnosticInfo == 0 && i; i--) {
|
||||
DELAY(ARDELAY1);
|
||||
}
|
||||
|
||||
if (i != 0 && ar->diagnosticInfo != 0xff)
|
||||
printf("arl%d: config error\n", sc->arl_unit);
|
||||
else if (i == 0)
|
||||
printf("arl%d: config timeout\n", sc->arl_unit);
|
||||
|
||||
} else
|
||||
printf("arl%d: config failed\n", sc->arl_unit);
|
||||
*/
|
||||
if (arl_command(sc)) {
|
||||
D(("config failed\n"));
|
||||
return;
|
||||
@ -320,7 +322,7 @@ arl_config(sc)
|
||||
ar->spreadingCode,
|
||||
ar->registrationMode));
|
||||
/* clear quality stat */
|
||||
bzero(&(aqual), ARLAN_MAX_QUALITY * sizeof(aqual[0]));
|
||||
bzero(sc->arl_sigcache, MAXARLCACHE * sizeof(struct arl_sigcache));
|
||||
}
|
||||
|
||||
/*
|
||||
@ -443,17 +445,17 @@ arl_ioctl(ifp, cmd, data)
|
||||
#undef GET_COPY_PARAM
|
||||
#undef GET_PARAM
|
||||
break;
|
||||
|
||||
#ifdef ARLCACHE
|
||||
case SIOCGARLQLT:
|
||||
user = (void *)ifr->ifr_data;
|
||||
for (count = 0; count < sizeof(struct arl_quality); count++) {
|
||||
for (count = 0; count < sizeof(sc->arl_sigcache); count++) {
|
||||
if (fubyte(user + count) < 0)
|
||||
return (EFAULT);
|
||||
}
|
||||
while (ar->interruptInProgress) ; /* wait */
|
||||
bcopy(&(aqual), (void *)ifr->ifr_data, sizeof(aqual));
|
||||
bcopy(&(sc->arl_sigcache), (void *)ifr->ifr_data, sizeof(sc->arl_sigcache));
|
||||
break;
|
||||
|
||||
#endif
|
||||
case SIOCGARLSTB:
|
||||
user = (void *)ifr->ifr_data;
|
||||
for (count = 0; count < sizeof(struct arl_stats); count++) {
|
||||
@ -802,6 +804,11 @@ arl_read(sc, buf, len)
|
||||
if (m == 0)
|
||||
return;
|
||||
|
||||
#ifdef ARLCACHE
|
||||
arl_cache_store(sc, eh, ar->rxQuality & 0x0f,
|
||||
(ar->rxQuality & 0xf0) >> 4, ARLCACHE_RX);
|
||||
#endif
|
||||
|
||||
#if __FreeBSD_version < 500100
|
||||
ether_input(ifp, eh, m);
|
||||
#else
|
||||
@ -858,13 +865,15 @@ arl_intr(arg)
|
||||
ifp->if_flags &= ~IFF_OACTIVE;
|
||||
arl_start(ifp);
|
||||
ar->txStatusVector = 0;
|
||||
/* (sc->quality.txLevel)[ar->txAckQuality & 0x0f]++;
|
||||
(sc->quality.txQuality)[(ar->txAckQuality & 0xf0) >> 4]++;*/
|
||||
#ifdef ARLCACHE
|
||||
arl_cache_store(sc,
|
||||
(struct ether_header *)(sc->arl_tx),
|
||||
ar->txAckQuality & 0x0f,
|
||||
(ar->txAckQuality & 0xf0) >> 4, ARLCACHE_TX);
|
||||
#endif
|
||||
}
|
||||
|
||||
if (ar->rxStatusVector) {
|
||||
/* (sc->quality.rxLevel)[ar->rxQuality & 0x0f]++;
|
||||
(sc->quality.rxQuality)[(ar->rxQuality & 0xf0) >> 4]++; */
|
||||
if (ar->rxStatusVector == 1) { /* it is data frame */
|
||||
arl_recv(sc);
|
||||
arl_read(sc, sc->arl_rx, sc->rx_len);
|
||||
@ -971,3 +980,45 @@ arl_release_resources(dev)
|
||||
sc->irq_res = 0;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef ARLCACHE
|
||||
static void
|
||||
arl_cache_store(sc, eh, level, quality, dir)
|
||||
struct arl_softc *sc;
|
||||
struct ether_header *eh;
|
||||
u_int8_t level;
|
||||
u_int8_t quality;
|
||||
int dir;
|
||||
{
|
||||
int i;
|
||||
static int cache_slot = 0;
|
||||
static int wrapindex = 0;
|
||||
|
||||
if ((ntohs(eh->ether_type) != ETHERTYPE_IP)) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 0; i < MAXARLCACHE; i++) {
|
||||
if (! bcmp(dir == ARLCACHE_RX ? eh->ether_shost : eh->ether_dhost,
|
||||
sc->arl_sigcache[i].macsrc, 6) ) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (i < MAXARLCACHE) {
|
||||
cache_slot = i;
|
||||
}
|
||||
else {
|
||||
if (wrapindex == MAXARLCACHE) {
|
||||
wrapindex = 0;
|
||||
}
|
||||
cache_slot = wrapindex++;
|
||||
}
|
||||
|
||||
bcopy(dir == ARLCACHE_RX ? eh->ether_shost : eh->ether_dhost,
|
||||
sc->arl_sigcache[cache_slot].macsrc, 6);
|
||||
|
||||
sc->arl_sigcache[cache_slot].level[dir] = level;
|
||||
sc->arl_sigcache[cache_slot].quality[dir] = quality;
|
||||
}
|
||||
#endif
|
||||
|
@ -1,10 +1,16 @@
|
||||
/*
|
||||
* $RISS: if_arl/dev/arl/if_arl_isa.c,v 1.4 2004/01/22 12:08:48 count Exp $
|
||||
* $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>
|
||||
@ -125,7 +131,7 @@ arl_isa_identify (driver_t *driver, device_t parent)
|
||||
u_int16_t free_mem = 0xFFFF;
|
||||
|
||||
if (bootverbose)
|
||||
printf("in identify\n");
|
||||
printf("arl: in identify\n");
|
||||
|
||||
/* Try avoid already added devices */
|
||||
for (i = 0; (child = device_find_child(parent, "arl", i)) != NULL; i++) {
|
||||
@ -263,10 +269,10 @@ arl_isa_probe (device_t dev)
|
||||
if (!arcfg.channelSet)
|
||||
arcfg.channelSet = ar->defaultChannelSet;
|
||||
GET_ARL_PARAM(channelNumber);
|
||||
GET_ARL_PARAM(registrationMode);
|
||||
GET_ARL_PARAM(spreadingCode);
|
||||
GET_ARL_PARAM(priority);
|
||||
GET_ARL_PARAM(receiveMode);
|
||||
arcfg.registrationMode = 1; /* set default TMA mode */
|
||||
arcfg.txRetry = 0; /* use default */
|
||||
|
||||
strncpy(arcfg.name, ar->name, ARLAN_NAME_SIZE);
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $RISS: if_arl/dev/arl/if_arlreg.h,v 1.2 2004/01/22 09:18:13 count Exp $
|
||||
* $RISS: if_arl/dev/arl/if_arlreg.h,v 1.4 2004/03/16 04:43:27 count Exp $
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
@ -230,13 +230,17 @@ struct arl_req {
|
||||
struct arl_cfg_param cfg;
|
||||
};
|
||||
|
||||
#define ARLAN_MAX_QUALITY 16
|
||||
#ifdef ARLCACHE
|
||||
#define MAXARLCACHE 16
|
||||
#define ARLCACHE_RX 0
|
||||
#define ARLCACHE_TX 1
|
||||
|
||||
struct arl_quality {
|
||||
u_int8_t macsrc[6];
|
||||
int rx_quality;
|
||||
int tx_quality;
|
||||
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
|
||||
@ -270,8 +274,10 @@ struct arl_softc {
|
||||
int tx_len;
|
||||
u_char arl_rx[2048];
|
||||
int rx_len;
|
||||
|
||||
struct arl_quality quality[ARLAN_MAX_QUALITY];
|
||||
|
||||
#ifdef ARLCACHE
|
||||
struct arl_sigcache arl_sigcache[MAXARLCACHE];
|
||||
#endif
|
||||
};
|
||||
#endif
|
||||
|
||||
@ -280,7 +286,6 @@ struct arl_softc {
|
||||
|
||||
#define ar sc->arl_mem
|
||||
#define arcfg sc->arl_cfg
|
||||
#define aqual sc->quality
|
||||
|
||||
#define ARDELAY 10000
|
||||
#define ARDELAY1 50000
|
||||
|
@ -5,7 +5,7 @@
|
||||
|
||||
PROG= arlconfig
|
||||
SRCS= arlconfig.c
|
||||
CFLAGS= -I${.CURDIR}/../../sys
|
||||
CFLAGS= -I${.CURDIR}/../../sys -DARLCACHE
|
||||
MAN= arlconfig.8
|
||||
|
||||
.include <bsd.prog.mk>
|
||||
|
@ -30,7 +30,7 @@
|
||||
.\"
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd August 25, 2003
|
||||
.Dd March 15, 2004
|
||||
.Dt ARLCONFIG 8 i386
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -38,6 +38,8 @@
|
||||
.Nd configure Aironet Arlan 655 device
|
||||
.Sh SYNOPSIS
|
||||
.Nm
|
||||
.Ar iface
|
||||
.Nm
|
||||
.Ar iface Cm name Ar name
|
||||
.Nm
|
||||
.Ar iface Cm sid Ar SID
|
||||
@ -60,7 +62,7 @@
|
||||
.Nm
|
||||
.Ar iface Cm stat
|
||||
.Nm
|
||||
.Ar iface Cm quality Ar seconds [ Cm count Ar <count> ]
|
||||
.Ar iface Cm quality
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
.Nm
|
||||
@ -91,7 +93,11 @@ etc.) and must be specified.
|
||||
.Sh OPTIONS
|
||||
The options are as follows:
|
||||
.Bl -tag -width indent
|
||||
.It Cm name Ar name
|
||||
.It Ar iface
|
||||
Display current settings of specified wireless interface.
|
||||
This retrieves current card settings from the driver and prints
|
||||
them out.
|
||||
.It Ar iface Cm name Ar name
|
||||
Set
|
||||
.Ar Device Name .
|
||||
This
|
||||
@ -104,7 +110,7 @@ If you choose to assign a name, while operating in
|
||||
.Ar TMA
|
||||
mode, the name will appear in the Arlan Access Point's Registration Table.
|
||||
Duplicate names are allowed.
|
||||
.It Cm sid Ar SID
|
||||
.It Ar iface Cm sid Ar SID
|
||||
Set
|
||||
.Ar System Identifier.
|
||||
The System Identifier
|
||||
@ -127,7 +133,7 @@ SID is
|
||||
Since nodes will only receive packets from other nodes with a matching SID,
|
||||
you must make sure that the Arlan 655 Client Card is set the same SID as
|
||||
other nodes on your network.
|
||||
.It Cm mode Ar mode ( Cm 640 | 655 )
|
||||
.It Ar iface Cm mode Ar mode ( Cm 640 | 655 )
|
||||
Use
|
||||
.Ar operating mode
|
||||
parameter to specify whether you are operating in
|
||||
@ -146,9 +152,9 @@ mode.
|
||||
.It PSP Ta Power save mode
|
||||
.El
|
||||
.!!!
|
||||
.It Cm country Ar country ( Cm 9-15 )
|
||||
.It Cm channel Ar channel
|
||||
.It Cm freq Ar freq ( Cm 2412, 2427, 2442, 2457, 2465 )
|
||||
.It Ar iface Cm country Ar country ( Cm 9-15 )
|
||||
.It Ar iface Cm channel Ar channel
|
||||
.It Ar iface Cm freq Ar freq ( Cm 2412, 2427, 2442, 2457, 2465 )
|
||||
Chose
|
||||
.Ar country , channel , freq
|
||||
parameters that depend on the
|
||||
@ -170,8 +176,8 @@ according to the following table:
|
||||
.It "U.K. " Ta 15 Ta "2460"
|
||||
.It "Spain " Ta 15 Ta "2460"
|
||||
.El
|
||||
.It Cm bitrate Ar bitrate ( Cm 0-4)
|
||||
.It Cm spread Ar spread Cm ( 354, 500, 1000, 2000 )
|
||||
.It Ar iface Cm bitrate Ar bitrate ( Cm 0-4)
|
||||
.It Ar iface Cm spread Ar spread Cm ( 354, 500, 1000, 2000 )
|
||||
Set device operating bitrate or spread.
|
||||
.Bl -column ".Em Rate" ".Em Spread" ".Em kb/s" -offset indent indent
|
||||
.Em "Rate Spread kb/s"
|
||||
@ -181,7 +187,7 @@ Set device operating bitrate or spread.
|
||||
.It 3 Ta 1000 Ta 1000
|
||||
.It 4 Ta 2000 Ta 2000
|
||||
.El
|
||||
.It Cm priority Ar priority ( Cm normal, high, highest )
|
||||
.It Ar iface Cm priority Ar priority ( Cm normal, high, highest )
|
||||
Use the
|
||||
.Ar priority
|
||||
parameter to set the priority of the Atlan 655 Radio Media Access Control
|
||||
@ -196,21 +202,19 @@ to transmit at the same time.
|
||||
The percentage of units on your network that you set to other than
|
||||
.Dq normal
|
||||
should be kept small - 10 percent or less.
|
||||
.It Cm stat
|
||||
.It Ar iface Cm stat
|
||||
Print internal Arlan 655 statistics block.
|
||||
.It Cm quality Ar seconds [ Cm count Ar <count> ]
|
||||
Perform link quality test during
|
||||
.Ar seconds
|
||||
transmitting
|
||||
.Ar count
|
||||
packets.
|
||||
Currently is broken.
|
||||
.It Ar iface Cm quality
|
||||
Display the cached signal level and quality mantained by the
|
||||
.Xr arl 4
|
||||
driver . The driver retains information about quality and level for packets received from different hosts. Also driver extract values from ACK packets.
|
||||
.El
|
||||
.Sh EXAMPLES
|
||||
.Bd -literal -offset indent
|
||||
alrlconfig arl0 name NODE1 sid 4 freq 2442
|
||||
arlconfig arl0 quality 10 seconds
|
||||
arlconfig arl0 status
|
||||
arlconfig arl0 name NODE1 sid 4 freq 2442
|
||||
arlconfig arl0 quality
|
||||
arlconfig arl0 stat
|
||||
arlconfig arl0
|
||||
.Pp
|
||||
You can configure Arlan 655 card from /etc/start_if.arl0. For example:
|
||||
.Pp
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $RISS: if_arl/arlconfig/arlconfig.c,v 1.3 2003/01/13 07:23:25 count Exp $
|
||||
* $RISS: if_arl/arlconfig/arlconfig.c,v 1.5 2004/03/16 05:00:21 count Exp $
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
@ -205,9 +205,10 @@ usage()
|
||||
#endif
|
||||
fprintf(stderr, "or: %s <ifname> stat\n", progname);
|
||||
fprintf(stderr, "\tprint internal arlan statistics block\n");
|
||||
fprintf(stderr, "or: %s <ifname> quality <seconds> [count <count>]\n",
|
||||
progname);
|
||||
fprintf(stderr, "\tprint receive packet level and quality with interval\n");
|
||||
#ifdef ARLCACHE
|
||||
fprintf(stderr,"or: %s <ifname> quality\n", progname);
|
||||
fprintf(stderr,"\tprint receive packet level and quality\n");
|
||||
#endif
|
||||
exit(0);
|
||||
}
|
||||
|
||||
@ -307,105 +308,31 @@ print_stb( struct arl_stats stb )
|
||||
stb.numNACKReceived);
|
||||
}
|
||||
|
||||
#ifdef ARL_QUALITY
|
||||
#ifdef ARLCACHE
|
||||
void
|
||||
print_qlt(struct arl_quality qlt, int count)
|
||||
print_qlt(struct arl_sigcache *qlt)
|
||||
{
|
||||
int i, s;
|
||||
int v, v1;
|
||||
time_t t;
|
||||
int minLevel, maxLevel, avgLevel;
|
||||
int minQuality, maxQuality, avgQuality;
|
||||
|
||||
t = time(NULL);
|
||||
localtime(&t);
|
||||
printf("#%d Current date-time: %s", count, ctime(&t));
|
||||
printf(" %-39s %s\n","Receive Level","Receive Quality");
|
||||
printf(
|
||||
" pkts 0.......10 11............100 > pkts 0.......10 11............100 >\n"\
|
||||
" -----+----------+-----------------+--- -----+----------+-----------------+---\n");
|
||||
|
||||
minLevel = 16;
|
||||
maxLevel = 0;
|
||||
avgLevel = 0;
|
||||
minQuality = 16;
|
||||
maxQuality = 0;
|
||||
avgQuality = 0;
|
||||
|
||||
for (i = 0, s = 0; i < ARLAN_MAX_QUALITY; i++) {
|
||||
v = qlt.rxLevel[i];
|
||||
if (v) {
|
||||
if (i < minLevel)
|
||||
minLevel = i;
|
||||
if (i > maxLevel)
|
||||
maxLevel = i;
|
||||
avgLevel += v*i;
|
||||
printf(" %-4d %x", v, i);
|
||||
} else
|
||||
printf(" o %x", i);
|
||||
s += v;
|
||||
if (v < 10)
|
||||
;
|
||||
else if (v < 100)
|
||||
v = 10 + ((v-10) * 20) / 90;
|
||||
else if (v < 1000)
|
||||
v = 31;
|
||||
else
|
||||
v = 32;
|
||||
v1 = v;
|
||||
while (v) {
|
||||
printf("*");
|
||||
v--;
|
||||
}
|
||||
|
||||
v = 33 - v1;
|
||||
while (v) {
|
||||
printf(" ");
|
||||
v--;
|
||||
}
|
||||
|
||||
v = qlt.rxQuality[i];
|
||||
if (v) {
|
||||
if (i < minQuality)
|
||||
minQuality = i;
|
||||
if (i > maxQuality)
|
||||
maxQuality = i;
|
||||
avgQuality += v*i;
|
||||
printf("%-4d %x", v, i);
|
||||
} else
|
||||
printf("o %x", i);
|
||||
|
||||
if (v < 10)
|
||||
;
|
||||
else if (v < 100)
|
||||
v = 10 + ((v-10) * 20) / 90;
|
||||
else if (v < 1000)
|
||||
v = 31;
|
||||
else
|
||||
v = 32;
|
||||
}
|
||||
v1 = v;
|
||||
while (v) {
|
||||
printf("*");
|
||||
v--;
|
||||
}
|
||||
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++;
|
||||
}
|
||||
printf(" -----+----------+-----------------+--- -----+----------+-----------------+---\n");
|
||||
if (minLevel > 15)
|
||||
minLevel = 0;
|
||||
if (minQuality > 15)
|
||||
minQuality = 0;
|
||||
printf("\tPackets count %-6d\n", s);
|
||||
if (!s)
|
||||
s++;
|
||||
printf("\tLevel min %d/avg %d/max %d\n",
|
||||
minLevel, avgLevel/s, maxLevel);
|
||||
printf("\tQuality min %d/avg %d/max %d\n",
|
||||
minQuality, avgQuality/s, maxQuality);
|
||||
}
|
||||
#endif /* ARL_QUALITY */
|
||||
#endif
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
@ -414,11 +341,10 @@ main(int argc, char *argv[])
|
||||
struct arl_req arl_io;
|
||||
struct ether_addr *ea;
|
||||
struct arl_stats stb;
|
||||
/*static arl_quality qlt;*/
|
||||
struct arl_sigcache qlt[MAXARLCACHE];
|
||||
int sd, argind, val = -1;
|
||||
long val2;
|
||||
char *param, *value, *value2;
|
||||
/*int end_count, i;*/
|
||||
|
||||
if (argc < 2)
|
||||
usage();
|
||||
@ -448,30 +374,18 @@ main(int argc, char *argv[])
|
||||
print_stb(stb);
|
||||
exit(0);
|
||||
}
|
||||
#ifdef ARL_QUALITY
|
||||
if (!strcasecmp(argv[2],"quality") && argc > 3) {
|
||||
val = atoi(argv[3]);
|
||||
if (val < 0 || val >= 3601)
|
||||
err(1,"Bad time range");
|
||||
end_count = 0;
|
||||
if (argc > 5 && !strcasecmp(argv[4], "count"))
|
||||
end_count = atoi(argv[5]);
|
||||
#ifdef ARLCACHE
|
||||
if (!strcasecmp( argv[2],"quality")) {
|
||||
printf("\n");
|
||||
i = 0;
|
||||
while (i < end_count || !end_count) { /* loop */
|
||||
if (i++)
|
||||
sleep(val);
|
||||
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, i);
|
||||
}
|
||||
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_QUALITY */
|
||||
#endif
|
||||
}
|
||||
|
||||
arl_io.what_set = 0;
|
||||
|
@ -30,7 +30,7 @@
|
||||
.\"
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd August 25, 2003
|
||||
.Dd March 15, 2004
|
||||
.Dt ARLCONFIG 8 i386
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -38,6 +38,8 @@
|
||||
.Nd configure Aironet Arlan 655 device
|
||||
.Sh SYNOPSIS
|
||||
.Nm
|
||||
.Ar iface
|
||||
.Nm
|
||||
.Ar iface Cm name Ar name
|
||||
.Nm
|
||||
.Ar iface Cm sid Ar SID
|
||||
@ -60,7 +62,7 @@
|
||||
.Nm
|
||||
.Ar iface Cm stat
|
||||
.Nm
|
||||
.Ar iface Cm quality Ar seconds [ Cm count Ar <count> ]
|
||||
.Ar iface Cm quality
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
.Nm
|
||||
@ -91,7 +93,11 @@ etc.) and must be specified.
|
||||
.Sh OPTIONS
|
||||
The options are as follows:
|
||||
.Bl -tag -width indent
|
||||
.It Cm name Ar name
|
||||
.It Ar iface
|
||||
Display current settings of specified wireless interface.
|
||||
This retrieves current card settings from the driver and prints
|
||||
them out.
|
||||
.It Ar iface Cm name Ar name
|
||||
Set
|
||||
.Ar Device Name .
|
||||
This
|
||||
@ -104,7 +110,7 @@ If you choose to assign a name, while operating in
|
||||
.Ar TMA
|
||||
mode, the name will appear in the Arlan Access Point's Registration Table.
|
||||
Duplicate names are allowed.
|
||||
.It Cm sid Ar SID
|
||||
.It Ar iface Cm sid Ar SID
|
||||
Set
|
||||
.Ar System Identifier.
|
||||
The System Identifier
|
||||
@ -127,7 +133,7 @@ SID is
|
||||
Since nodes will only receive packets from other nodes with a matching SID,
|
||||
you must make sure that the Arlan 655 Client Card is set the same SID as
|
||||
other nodes on your network.
|
||||
.It Cm mode Ar mode ( Cm 640 | 655 )
|
||||
.It Ar iface Cm mode Ar mode ( Cm 640 | 655 )
|
||||
Use
|
||||
.Ar operating mode
|
||||
parameter to specify whether you are operating in
|
||||
@ -146,9 +152,9 @@ mode.
|
||||
.It PSP Ta Power save mode
|
||||
.El
|
||||
.!!!
|
||||
.It Cm country Ar country ( Cm 9-15 )
|
||||
.It Cm channel Ar channel
|
||||
.It Cm freq Ar freq ( Cm 2412, 2427, 2442, 2457, 2465 )
|
||||
.It Ar iface Cm country Ar country ( Cm 9-15 )
|
||||
.It Ar iface Cm channel Ar channel
|
||||
.It Ar iface Cm freq Ar freq ( Cm 2412, 2427, 2442, 2457, 2465 )
|
||||
Chose
|
||||
.Ar country , channel , freq
|
||||
parameters that depend on the
|
||||
@ -170,8 +176,8 @@ according to the following table:
|
||||
.It "U.K. " Ta 15 Ta "2460"
|
||||
.It "Spain " Ta 15 Ta "2460"
|
||||
.El
|
||||
.It Cm bitrate Ar bitrate ( Cm 0-4)
|
||||
.It Cm spread Ar spread Cm ( 354, 500, 1000, 2000 )
|
||||
.It Ar iface Cm bitrate Ar bitrate ( Cm 0-4)
|
||||
.It Ar iface Cm spread Ar spread Cm ( 354, 500, 1000, 2000 )
|
||||
Set device operating bitrate or spread.
|
||||
.Bl -column ".Em Rate" ".Em Spread" ".Em kb/s" -offset indent indent
|
||||
.Em "Rate Spread kb/s"
|
||||
@ -181,7 +187,7 @@ Set device operating bitrate or spread.
|
||||
.It 3 Ta 1000 Ta 1000
|
||||
.It 4 Ta 2000 Ta 2000
|
||||
.El
|
||||
.It Cm priority Ar priority ( Cm normal, high, highest )
|
||||
.It Ar iface Cm priority Ar priority ( Cm normal, high, highest )
|
||||
Use the
|
||||
.Ar priority
|
||||
parameter to set the priority of the Atlan 655 Radio Media Access Control
|
||||
@ -196,21 +202,19 @@ to transmit at the same time.
|
||||
The percentage of units on your network that you set to other than
|
||||
.Dq normal
|
||||
should be kept small - 10 percent or less.
|
||||
.It Cm stat
|
||||
.It Ar iface Cm stat
|
||||
Print internal Arlan 655 statistics block.
|
||||
.It Cm quality Ar seconds [ Cm count Ar <count> ]
|
||||
Perform link quality test during
|
||||
.Ar seconds
|
||||
transmitting
|
||||
.Ar count
|
||||
packets.
|
||||
Currently is broken.
|
||||
.It Ar iface Cm quality
|
||||
Display the cached signal level and quality mantained by the
|
||||
.Xr arl 4
|
||||
driver . The driver retains information about quality and level for packets received from different hosts. Also driver extract values from ACK packets.
|
||||
.El
|
||||
.Sh EXAMPLES
|
||||
.Bd -literal -offset indent
|
||||
alrlconfig arl0 name NODE1 sid 4 freq 2442
|
||||
arlconfig arl0 quality 10 seconds
|
||||
arlconfig arl0 status
|
||||
arlconfig arl0 name NODE1 sid 4 freq 2442
|
||||
arlconfig arl0 quality
|
||||
arlconfig arl0 stat
|
||||
arlconfig arl0
|
||||
.Pp
|
||||
You can configure Arlan 655 card from /etc/start_if.arl0. For example:
|
||||
.Pp
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $RISS: if_arl/arlconfig/arlconfig.c,v 1.3 2003/01/13 07:23:25 count Exp $
|
||||
* $RISS: if_arl/arlconfig/arlconfig.c,v 1.5 2004/03/16 05:00:21 count Exp $
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
@ -205,9 +205,10 @@ usage()
|
||||
#endif
|
||||
fprintf(stderr, "or: %s <ifname> stat\n", progname);
|
||||
fprintf(stderr, "\tprint internal arlan statistics block\n");
|
||||
fprintf(stderr, "or: %s <ifname> quality <seconds> [count <count>]\n",
|
||||
progname);
|
||||
fprintf(stderr, "\tprint receive packet level and quality with interval\n");
|
||||
#ifdef ARLCACHE
|
||||
fprintf(stderr,"or: %s <ifname> quality\n", progname);
|
||||
fprintf(stderr,"\tprint receive packet level and quality\n");
|
||||
#endif
|
||||
exit(0);
|
||||
}
|
||||
|
||||
@ -307,105 +308,31 @@ print_stb( struct arl_stats stb )
|
||||
stb.numNACKReceived);
|
||||
}
|
||||
|
||||
#ifdef ARL_QUALITY
|
||||
#ifdef ARLCACHE
|
||||
void
|
||||
print_qlt(struct arl_quality qlt, int count)
|
||||
print_qlt(struct arl_sigcache *qlt)
|
||||
{
|
||||
int i, s;
|
||||
int v, v1;
|
||||
time_t t;
|
||||
int minLevel, maxLevel, avgLevel;
|
||||
int minQuality, maxQuality, avgQuality;
|
||||
|
||||
t = time(NULL);
|
||||
localtime(&t);
|
||||
printf("#%d Current date-time: %s", count, ctime(&t));
|
||||
printf(" %-39s %s\n","Receive Level","Receive Quality");
|
||||
printf(
|
||||
" pkts 0.......10 11............100 > pkts 0.......10 11............100 >\n"\
|
||||
" -----+----------+-----------------+--- -----+----------+-----------------+---\n");
|
||||
|
||||
minLevel = 16;
|
||||
maxLevel = 0;
|
||||
avgLevel = 0;
|
||||
minQuality = 16;
|
||||
maxQuality = 0;
|
||||
avgQuality = 0;
|
||||
|
||||
for (i = 0, s = 0; i < ARLAN_MAX_QUALITY; i++) {
|
||||
v = qlt.rxLevel[i];
|
||||
if (v) {
|
||||
if (i < minLevel)
|
||||
minLevel = i;
|
||||
if (i > maxLevel)
|
||||
maxLevel = i;
|
||||
avgLevel += v*i;
|
||||
printf(" %-4d %x", v, i);
|
||||
} else
|
||||
printf(" o %x", i);
|
||||
s += v;
|
||||
if (v < 10)
|
||||
;
|
||||
else if (v < 100)
|
||||
v = 10 + ((v-10) * 20) / 90;
|
||||
else if (v < 1000)
|
||||
v = 31;
|
||||
else
|
||||
v = 32;
|
||||
v1 = v;
|
||||
while (v) {
|
||||
printf("*");
|
||||
v--;
|
||||
}
|
||||
|
||||
v = 33 - v1;
|
||||
while (v) {
|
||||
printf(" ");
|
||||
v--;
|
||||
}
|
||||
|
||||
v = qlt.rxQuality[i];
|
||||
if (v) {
|
||||
if (i < minQuality)
|
||||
minQuality = i;
|
||||
if (i > maxQuality)
|
||||
maxQuality = i;
|
||||
avgQuality += v*i;
|
||||
printf("%-4d %x", v, i);
|
||||
} else
|
||||
printf("o %x", i);
|
||||
|
||||
if (v < 10)
|
||||
;
|
||||
else if (v < 100)
|
||||
v = 10 + ((v-10) * 20) / 90;
|
||||
else if (v < 1000)
|
||||
v = 31;
|
||||
else
|
||||
v = 32;
|
||||
}
|
||||
v1 = v;
|
||||
while (v) {
|
||||
printf("*");
|
||||
v--;
|
||||
}
|
||||
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++;
|
||||
}
|
||||
printf(" -----+----------+-----------------+--- -----+----------+-----------------+---\n");
|
||||
if (minLevel > 15)
|
||||
minLevel = 0;
|
||||
if (minQuality > 15)
|
||||
minQuality = 0;
|
||||
printf("\tPackets count %-6d\n", s);
|
||||
if (!s)
|
||||
s++;
|
||||
printf("\tLevel min %d/avg %d/max %d\n",
|
||||
minLevel, avgLevel/s, maxLevel);
|
||||
printf("\tQuality min %d/avg %d/max %d\n",
|
||||
minQuality, avgQuality/s, maxQuality);
|
||||
}
|
||||
#endif /* ARL_QUALITY */
|
||||
#endif
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
@ -414,11 +341,10 @@ main(int argc, char *argv[])
|
||||
struct arl_req arl_io;
|
||||
struct ether_addr *ea;
|
||||
struct arl_stats stb;
|
||||
/*static arl_quality qlt;*/
|
||||
struct arl_sigcache qlt[MAXARLCACHE];
|
||||
int sd, argind, val = -1;
|
||||
long val2;
|
||||
char *param, *value, *value2;
|
||||
/*int end_count, i;*/
|
||||
|
||||
if (argc < 2)
|
||||
usage();
|
||||
@ -448,30 +374,18 @@ main(int argc, char *argv[])
|
||||
print_stb(stb);
|
||||
exit(0);
|
||||
}
|
||||
#ifdef ARL_QUALITY
|
||||
if (!strcasecmp(argv[2],"quality") && argc > 3) {
|
||||
val = atoi(argv[3]);
|
||||
if (val < 0 || val >= 3601)
|
||||
err(1,"Bad time range");
|
||||
end_count = 0;
|
||||
if (argc > 5 && !strcasecmp(argv[4], "count"))
|
||||
end_count = atoi(argv[5]);
|
||||
#ifdef ARLCACHE
|
||||
if (!strcasecmp( argv[2],"quality")) {
|
||||
printf("\n");
|
||||
i = 0;
|
||||
while (i < end_count || !end_count) { /* loop */
|
||||
if (i++)
|
||||
sleep(val);
|
||||
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, i);
|
||||
}
|
||||
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_QUALITY */
|
||||
#endif
|
||||
}
|
||||
|
||||
arl_io.what_set = 0;
|
||||
|
Loading…
x
Reference in New Issue
Block a user