~kris/9p

9hist

da583659dc4adf301e28826339f43c28471b790c — David du Colombier 25 years ago 40c366c
Plan 9 from Bell Labs 2001-01-22
1 files changed, 143 insertions(+), 140 deletions(-)

M pc/etherwavelan.c
M pc/etherwavelan.c => pc/etherwavelan.c +143 -140
@@ 33,25 33,25 @@ typedef struct Wltv 	Wltv;
typedef struct WFrame	WFrame;
typedef struct Stats	Stats;
typedef struct WStats	WStats;
typedef struct WKey		WKey;
typedef struct WKey	WKey;

struct WStats 
{
	ulong	ntxuframes;			// unicast frames
	ulong	ntxmframes;			// multicast frames
	ulong	ntxfrags;			// fragments
	ulong	ntxubytes;			// unicast bytes
	ulong	ntxmbytes;			// multicast bytes
	ulong	ntxuframes;		// unicast frames
	ulong	ntxmframes;		// multicast frames
	ulong	ntxfrags;		// fragments
	ulong	ntxubytes;		// unicast bytes
	ulong	ntxmbytes;		// multicast bytes
	ulong	ntxdeferred;		// deferred transmits
	ulong	ntxsretries;		// single retries
	ulong	ntxmultiretries;	// multiple retries
	ulong	ntxretrylimit;
	ulong	ntxdiscards;
	ulong	nrxuframes;			// unicast frames
	ulong	nrxmframes;			// multicast frames
	ulong	nrxfrags;			// fragments
	ulong	nrxubytes;			// unicast bytes
	ulong	nrxmbytes;			// multicast bytes
	ulong	nrxuframes;		// unicast frames
	ulong	nrxmframes;		// multicast frames
	ulong	nrxfrags;		// fragments
	ulong	nrxubytes;		// unicast bytes
	ulong	nrxmbytes;		// multicast bytes
	ulong	nrxfcserr;
	ulong	nrxdropnobuf;
	ulong	nrxdropnosa;


@@ 63,55 63,55 @@ struct WStats

struct WFrame
{
	ushort		sts;
	ushort		rsvd0;
	ushort		rsvd1;
	ushort		qinfo;
	ushort		rsvd2;
	ushort		rsvd3;
	ushort		txctl;
	ushort		framectl;
	ushort		id;
	uchar		addr1[Eaddrlen];
	uchar		addr2[Eaddrlen];
	uchar		addr3[Eaddrlen];
	ushort		seqctl;
	uchar		addr4[Eaddrlen];
	ushort		dlen;
	uchar		dstaddr[Eaddrlen];
	uchar		srcaddr[Eaddrlen];
	ushort		len;
	ushort		dat[3];
	ushort		type;
	ushort	sts;
	ushort	rsvd0;
	ushort	rsvd1;
	ushort	qinfo;
	ushort	rsvd2;
	ushort	rsvd3;
	ushort	txctl;
	ushort	framectl;
	ushort	id;
	uchar	addr1[Eaddrlen];
	uchar	addr2[Eaddrlen];
	uchar	addr3[Eaddrlen];
	ushort	seqctl;
	uchar	addr4[Eaddrlen];
	ushort	dlen;
	uchar	dstaddr[Eaddrlen];
	uchar	srcaddr[Eaddrlen];
	ushort	len;
	ushort	dat[3];
	ushort	type;
};

// Lucent's Length-Type-Value records  to talk to the wavelan.
// most operational parameters are read/set using this. 
enum 
{
	WTyp_Stats	=	0xf100,
	WTyp_Ptype	= 	0xfc00,
	WTyp_Mac	= 	0xfc01,
	WTyp_WantName= 	0xfc02,
	WTyp_Chan	= 	0xfc03,
	WTyp_NetName = 	0xfc04,
	WTyp_ApDens	= 	0xfc06,
	WTyp_MaxLen	= 	0xfc07,
	WTyp_PM		=	0xfc09,
	WTyp_PMWait	=	0xfc0c,
	WTyp_NodeName= 	0xfc0e,
	WTyp_Crypt	=	0xfc20,
	WTyp_XClear=	0xfc22,
	WTyp_Tick 	= 	0xfce0,
	WTyp_RtsThres= 	0xfc83,
	WTyp_TxRate	= 	0xfc84,
		WTx1Mbps	= 	0x0,
		WTx2Mbps	= 	0x1,
		WTxAuto		= 	0x3,
	WTyp_Prom	=	0xfc85,
	WTyp_Keys	=	0xfcb0,
	WTyp_TxKey	=	0xfcb1,
	WTyp_HasCrypt=	0xfd4f,
	WTyp_Stats	= 0xf100,
	WTyp_Ptype	= 0xfc00,
	WTyp_Mac	= 0xfc01,
	WTyp_WantName	= 0xfc02,
	WTyp_Chan	= 0xfc03,
	WTyp_NetName	= 0xfc04,
	WTyp_ApDens	= 0xfc06,
	WTyp_MaxLen	= 0xfc07,
	WTyp_PM		= 0xfc09,
	WTyp_PMWait	= 0xfc0c,
	WTyp_NodeName	= 0xfc0e,
	WTyp_Crypt	= 0xfc20,
	WTyp_XClear	= 0xfc22,
	WTyp_Tick 	= 0xfce0,
	WTyp_RtsThres	= 0xfc83,
	WTyp_TxRate	= 0xfc84,
		WTx1Mbps	= 0x0,
		WTx2Mbps	= 0x1,
		WTxAuto		= 0x3,
	WTyp_Prom	= 0xfc85,
	WTyp_Keys	= 0xfcb0,
	WTyp_TxKey	= 0xfcb1,
	WTyp_HasCrypt	= 0xfd4f,
};




@@ 119,12 119,12 @@ enum
// Controller
enum
{
	WDfltIRQ = 3,		// default irq
	WDfltIOB = 0x100,	// default IO base
	WDfltIRQ	 = 3,		// default irq
	WDfltIOB	 = 0x100,	// default IO base

	WIOLen = 0x40,	// Hermes IO length
	WIOLen		 = 0x40,	// Hermes IO length

	WTmOut = 65536,	// Cmd time out
	WTmOut		 = 65536,	// Cmd time out

	WPTypeManaged	= 1,
	WPTypeWDS	= 2,


@@ 133,7 133,7 @@ enum

	WDfltApDens	= 1,
	WDfltRtsThres	= 2347,		// == disabled
	WDfltTxRate	= WTxAuto,		// 2Mbps
	WDfltTxRate	= WTxAuto,	// 2Mbps

	WMaxLen		= 2304,
	WNameLen	= 32,


@@ 148,7 148,7 @@ enum
		WCmdEna		= 0x0001,
		WCmdDis		= 0x0002,
		WCmdMalloc	= 0x000a,
		WCmdAskStats= 0x0011,
		WCmdAskStats	= 0x0011,
		WCmdMsk		= 0x003f,
		WCmdAccRd	= 0x0021,
		WCmdAccWr	= 0x0121,


@@ 205,8 205,8 @@ enum
};

#define csr_outs(ctlr,r,arg) 	outs((ctlr)->iob+(r),(arg))
#define csr_ins(ctlr,r)			ins((ctlr)->iob+(r))
#define csr_ack(ctlr,ev)		outs((ctlr)->iob+WR_EvAck,(ev))
#define csr_ins(ctlr,r)		ins((ctlr)->iob+(r))
#define csr_ack(ctlr,ev)	outs((ctlr)->iob+WR_EvAck,(ev))

struct WKey
{


@@ 248,10 248,10 @@ struct Stats
	ulong	ntxrq;
	ulong	nrxerr;
	ulong	ntxerr;
	ulong	nalloc;		// allocation (reclaim) events
	ulong	nalloc;			// allocation (reclaim) events
	ulong	ninfo;
	ulong	nidrop;
	ulong	nwatchdogs;	// transmits time outs, actually
	ulong	nwatchdogs;		// transmits time outs, actually
};

struct Ctlr 


@@ 259,31 259,31 @@ struct Ctlr
	Lock;
	Rendez	timer;

	int		attached;
	int		slot;
	int		iob;
	int		ptype;
	int		apdensity;
	int		rtsthres;
	int		txbusy;
	int		txrate;
	int		txdid;
	int		txmid;
	int		txtmout;
	int		maxlen;
	int		chan;
	int		pmena;
	int		pmwait;
	int	attached;
	int	slot;
	int	iob;
	int	ptype;
	int	apdensity;
	int	rtsthres;
	int	txbusy;
	int	txrate;
	int	txdid;
	int	txmid;
	int	txtmout;
	int	maxlen;
	int	chan;
	int	pmena;
	int	pmwait;

	char	netname[WNameLen];
	char	wantname[WNameLen];
	char	nodename[WNameLen];
	WFrame	txf;
	uchar	txbuf[1536];
	int		txlen;
	int	txlen;

	int		keyid;			// 0 if not using WEP
	int		xclear;
	int	keyid;			// 0 if not using WEP
	int	xclear;
	WKey	key[WNKeys];

	Stats;


@@ 312,6 312,7 @@ w_cmd(Ctlr *ctlr, ushort cmd, ushort arg)
{
	int i;
	int rc;

	csr_outs(ctlr, WR_Parm0, arg);
	csr_outs(ctlr, WR_Cmd, cmd);
	for (i = 0; i<WTmOut; i++){


@@ 428,12 429,12 @@ ltv_outstr(Ctlr* ctlr, int type, char *val)
	memset(&l,0,sizeof(l));
	l.type = type;
	l.len = (len/2)+2;
	l.val = len;					// l.s[0] and l.s[1]
	l.val = len;			// l.s[0] and l.s[1]
	strncpy(l.s+2,val,strlen(val));
	w_outltv(ctlr, &l);
}

static char	Unkname[] = "who knows";
static char Unkname[] = "who knows";
static char Nilname[] = "card does not tell";

static char*


@@ 457,8 458,8 @@ ltv_inkey(Ctlr* ctlr, int id)
{
	static char k[WKeyLen+1];
	Wltv l;
	int	len;
	int i;
	int i, len;

	id--; 
	memset(&l, 0, sizeof(l));
	l.type = WTyp_Keys;


@@ 485,8 486,8 @@ ltv_inkey(Ctlr* ctlr, int id)
		if (l.key[id].dat[0] != 0){
			DEBUG("%s ", l.key[id].dat);
		} 
		else 
			DEBUG("none ");
//		else 
//			DEBUG("none ");
	}
	DEBUG("\n");
	if (l.key[id].dat[0] == 0)


@@ 504,7 505,7 @@ static int
w_read(Ctlr* ctlr, int type, int off, void* buf, ulong len)
{
	ushort *p = (ushort*)buf;
	int		i, n;
	int i, n;

	n=0;
	if (w_seek(ctlr, type, off, 1) == 0){


@@ 524,8 525,8 @@ static int
w_write(Ctlr* ctlr, int type, int off, void* buf, ulong len)
{
	ushort *p = (ushort*)buf;
	ulong	l = len / 2;
	int		i,tries;
	ulong l = len / 2;
	int i,tries;

	for (tries=0; tries < WTmOut; tries++){	
		if (w_seek(ctlr, type, off, 0)){


@@ 576,9 577,9 @@ w_alloc(Ctlr* ctlr, int len)
static int 
w_enable(Ether* ether)
{
	Wltv	l;
	Ctlr*	ctlr = (Ctlr*) ether->ctlr;
	ushort	wep;
	Wltv l;
	Ctlr* ctlr = (Ctlr*) ether->ctlr;
	ushort wep;

	if (!ctlr)
		return -1;


@@ 596,8 597,8 @@ w_enable(Ether* ether)
	ltv_outs(ctlr, WTyp_RtsThres, ctlr->rtsthres);
	ltv_outs(ctlr, WTyp_TxRate, ctlr->txrate);
	ltv_outs(ctlr, WTyp_ApDens, ctlr->apdensity);
	ltv_outs(ctlr, WTyp_PM, ctlr->pmena);
	ltv_outs(ctlr, WTyp_PMWait, ctlr->pmwait);
	ltv_outs(ctlr, WTyp_PM, ctlr->pmena);
	if (*ctlr->netname)
		ltv_outstr(ctlr, WTyp_NetName, ctlr->netname);
	if (*ctlr->wantname)


@@ 613,7 614,6 @@ w_enable(Ether* ether)
	ltv_outs(ctlr, WTyp_Prom, (ether->prom?1:0));

	wep = ltv_ins(ctlr, WTyp_HasCrypt);
iprint("wep %d\n", wep);
	if (wep)
		if (ctlr->keyid == 0)
			ltv_outs(ctlr, WTyp_Crypt, 0);


@@ 653,11 653,11 @@ iprint("wep %d\n", wep);
static void
w_rxdone(Ether* ether)
{
	Ctlr*	ctlr = (Ctlr*) ether->ctlr;
	ushort	sp;
	WFrame	f;
	Block*	bp=0;
	ulong	l;
	Ctlr* ctlr = (Ctlr*) ether->ctlr;
	ushort sp;
	WFrame f;
	Block* bp=0;
	ulong l;
	Etherpkt* ep;

	sp = csr_ins(ctlr, WR_RXId);


@@ 715,8 715,8 @@ w_txstart(Ether* ether, int again)
{

	Etherpkt* ep;
	Ctlr*	ctlr = (Ctlr*) ether->ctlr;
	Block*	bp; 
	Ctlr* ctlr = (Ctlr*) ether->ctlr;
	Block* bp; 
	int		txid;
	if (ctlr == 0 || ctlr->attached == 0 )
		return -1;


@@ 795,11 795,11 @@ w_txdone(Ctlr* ctlr, int sts)
static int
w_stats(Ctlr* ctlr)
{
	int		sp,i;
	ushort	rc;
	Wltv	l;
	ulong*	p = (ulong*)&ctlr->WStats;
	ulong*	pend= (ulong*)&ctlr->end;
	int sp,i;
	ushort rc;
	Wltv l;
	ulong* p = (ulong*)&ctlr->WStats;
	ulong* pend= (ulong*)&ctlr->end;

	sp = csr_ins(ctlr, WR_InfoId);
	l.type = l.len = 0;


@@ 820,8 820,8 @@ w_stats(Ctlr* ctlr)
static void
w_intr(Ether *ether)
{
	int 	rc, txid, i;
	Ctlr*	ctlr = (Ctlr*) ether->ctlr;
	int  rc, txid, i;
	Ctlr* ctlr = (Ctlr*) ether->ctlr;

	if (ctlr->attached == 0){
		csr_ack(ctlr, 0xffff);


@@ 876,8 876,8 @@ w_intr(Ether *ether)
static void
w_timer(void* arg)
{
	Ether*	ether = (Ether*) arg;
	Ctlr*	ctlr = (Ctlr*)ether->ctlr;
	Ether* ether = (Ether*) arg;
	Ctlr* ctlr = (Ctlr*)ether->ctlr;
	int tick=0;

	for(;;){


@@ 949,9 949,9 @@ multicast(void*, uchar*, int)
static void
attach(Ether* ether)
{
	Ctlr*	ctlr;
	char	name[NAMELEN];
	int		rc;
	Ctlr* ctlr;
	char name[NAMELEN];
	int rc;

	if (ether->ctlr == 0)
		return;


@@ 971,16 971,14 @@ attach(Ether* ether)
}

#define PRINTSTAT(fmt,val)	l += snprint(p+l, READSTR-l, (fmt), (val))
#define PRINTSTR(fmt)	l += snprint(p+l, READSTR-l, (fmt))
#define PRINTSTR(fmt)		l += snprint(p+l, READSTR-l, (fmt))

static long
ifstat(Ether* ether, void* a, long n, ulong offset)
{
	Ctlr*	ctlr = (Ctlr*) ether->ctlr;
	char*	p;
	int		l, i;
	int		txid;
	char*	k;
	Ctlr *ctlr = (Ctlr*) ether->ctlr;
	char *k, *p;
	int l, i, txid;

	if (n == 0 || ctlr == 0){
		return 0;


@@ 1081,18 1079,16 @@ ifstat(Ether* ether, void* a, long n, ulong offset)
#undef PRINTSTAT

		
#define min(a,b) (((a)<(b))?(a):(b))
static long 
ctl(Ether* ether, void* buf, long n)
{
	int i;
	int i, key;
	Ctlr *ctlr;
	Cmdbuf *cb;
	char *nessid;
	WKey *kp;
	char k[64];
	char *kn= &k[3];
	int	 key;

	if((ctlr = ether->ctlr) == nil)
		error(Enonexist);


@@ 1141,7 1137,7 @@ ctl(Ether* ether, void* buf, long n)
			error("port type not in [1-3]");
		ctlr->ptype = i;
	}
	else if(strncmp(cb->f[0], "key", 3) == 0){
	else if(strcmp(cb->f[0], "key") == 0){
		strncpy(k,cb->f[0],64);
		if (strcmp(cb->f[1], "off") == 0)
			ctlr->keyid = 0;


@@ 1168,6 1164,20 @@ ctl(Ether* ether, void* buf, long n)
				kp->len = WMinKeyLen;
		}
	} 
	else if(strcmp(cb->f[0], "pm") == 0){
		if(strcmp(cb->f[1], "off") == 0)
			ctlr->pmena = 0;
		else if(strcmp(cb->f[1], "on") == 0){
			ctlr->pmena = 1;
			if(cb->nf == 3){
				i = atoi(cb->f[2]);
				// check range here? what are the units?
				ctlr->pmwait = i;
			}
		}
		else
			error(Ebadctl);
	}
	else
		error(Ebadctl);



@@ 1199,8 1209,8 @@ transmit(Ether* ether)
static void
promiscuous(void* arg, int on)
{
	Ether*	ether = (Ether*)arg;
	Ctlr*	ctlr = ether->ctlr;
	Ether* ether = (Ether*)arg;
	Ctlr* ctlr = ether->ctlr;

	if (ctlr == nil)
		error("card not found");


@@ 1216,8 1226,8 @@ promiscuous(void* arg, int on)
static void 
interrupt(Ureg* ,void* arg)
{
	Ether*	ether = (Ether*) arg;
	Ctlr*	ctlr = (Ctlr*) ether->ctlr;
	Ether* ether = (Ether*) arg;
	Ctlr* ctlr = (Ctlr*) ether->ctlr;

	if (ctlr == 0)
		return;


@@ 1230,19 1240,17 @@ interrupt(Ureg* ,void* arg)
static void
setopt(Ctlr* ctlr, char* opt, int no)
{
	int i;
	int i, key;
	char k[64];
	char *kn = &k[3];
	WKey *kp;
	char *ke;
	int key;

	if (strncmp(opt,"essid=",6) == 0){
		if (ctlr->ptype == 3)
			strncpy(ctlr->netname,opt+6,WNameLen);
		else
			strncpy(ctlr->wantname,opt+6,WNameLen);
iprint("essid %d %s\n", ctlr->ptype, opt+6);
	} 
	else if (strncmp(opt,"station_name=",13) == 0){
		// BUG?


@@ 1250,7 1258,6 @@ iprint("essid %d %s\n", ctlr->ptype, opt+6);
		// opt is 16, and I get "na" as node name
		// when I say station_name=nautilus.
		strncpy(ctlr->nodename, opt+13,WNameLen);
iprint("nodename %s\n", ctlr->nodename);
	} 
	else if (strncmp(opt, "channel=",8) == 0){
		i = atoi(opt+8);


@@ 1258,7 1265,6 @@ iprint("nodename %s\n", ctlr->nodename);
			print("#l%d: channel (%d) not in [1-16]\n",no,i);
		else
			ctlr->chan = i;
iprint("chan %d\n", i);
	} 
	else if (strncmp(opt, "ptype=",6) == 0){
		i = atoi(opt+6);


@@ 1266,7 1272,6 @@ iprint("chan %d\n", i);
			print("#l%d: port type (%d) not in [1-3]\n",no,i);
		else
			ctlr->ptype = i;
iprint("ptype %d\n", i);
	}
	else if (strncmp(opt, "key", 3) == 0){
		if (opt[3] == 0 || opt[4] != '='){


@@ 1294,16 1299,15 @@ iprint("ptype %d\n", i);
			kp->len = WKeyLen;
		else if (kp->len > 0)
			kp->len = WMinKeyLen;
iprint("key %d <%s> len %d\n", key, kp->dat, kp->len);
	}
}

static int
reset(Ether* ether)
{
	Ctlr*	ctlr;
	Wltv	ltv;
	int		i;
	Ctlr* ctlr;
	Wltv ltv;
	int i;

	if (ether->ctlr){
		print("#l%d: only one card supported\n", ether->ctlrno);


@@ 1405,4 1409,3 @@ etherwavelanlink(void)
{
	addethercard("wavelan", reset);
}