2018-01-02 01:00:07 +01:00
|
|
|
/* Copyright (C) Charles Forsyth
|
|
|
|
* See /doc/license/NOTICE.Plan9-9k.txt for details about the licensing.
|
|
|
|
*/
|
|
|
|
/* Portions of this file are Copyright (C) 9front's team.
|
|
|
|
* See /doc/license/9front-mit for details about the licensing.
|
|
|
|
* See http://code.9front.org/hg/plan9front/ for a list of authors.
|
|
|
|
*/
|
|
|
|
|
2016-11-25 17:18:40 +01:00
|
|
|
enum
|
|
|
|
{
|
|
|
|
Eaddrlen = 6,
|
|
|
|
ETHERMINTU = 60, /* minimum transmit size */
|
|
|
|
ETHERMAXTU = 1514, /* maximum transmit size */
|
|
|
|
ETHERHDRSIZE = 14, /* size of an ethernet header */
|
|
|
|
|
|
|
|
MaxEther = 48,
|
|
|
|
Ntypes = 16,
|
|
|
|
|
|
|
|
/* ethernet packet types */
|
|
|
|
ETARP = 0x0806,
|
|
|
|
ETIP4 = 0x0800,
|
|
|
|
ETIP6 = 0x86DD,
|
|
|
|
};
|
|
|
|
|
|
|
|
typedef struct Ether Ether;
|
|
|
|
struct Ether {
|
|
|
|
ISAConf; /* hardware info */
|
|
|
|
|
|
|
|
int ctlrno;
|
|
|
|
int minmtu;
|
|
|
|
int maxmtu;
|
|
|
|
uint8_t ea[Eaddrlen];
|
|
|
|
|
|
|
|
void (*attach)(Ether*); /* filled in by reset routine */
|
|
|
|
void (*detach)(Ether*);
|
|
|
|
void (*transmit)(Ether*);
|
|
|
|
void (*interrupt)(Ureg*, void*);
|
|
|
|
long (*ifstat)(Ether*, void*, long, uint32_t);
|
|
|
|
long (*ctl)(Ether*, void*, long); /* custom ctl messages */
|
|
|
|
void (*power)(Ether*, int); /* power on/off */
|
|
|
|
void (*shutdown)(Ether*); /* shutdown hardware before reboot */
|
|
|
|
void *ctlr;
|
|
|
|
void *vector;
|
|
|
|
|
|
|
|
int scan[Ntypes]; /* base station scanning interval */
|
|
|
|
int nscan; /* number of base station scanners */
|
|
|
|
|
|
|
|
Netif netif;
|
|
|
|
};
|
|
|
|
|
|
|
|
typedef struct Etherpkt Etherpkt;
|
|
|
|
struct Etherpkt
|
|
|
|
{
|
|
|
|
uint8_t d[Eaddrlen];
|
|
|
|
uint8_t s[Eaddrlen];
|
|
|
|
uint8_t type[2];
|
|
|
|
uint8_t data[1500];
|
|
|
|
};
|
|
|
|
|
|
|
|
extern Block* etheriq(Ether*, Block*, int);
|
|
|
|
extern void addethercard(char*, int(*)(Ether*));
|
|
|
|
extern uint32_t ethercrc(uint8_t*, int);
|
|
|
|
extern int parseether(uint8_t*, char*);
|
|
|
|
extern int ethercfgmatch(Ether*, Pcidev*, uintmem);
|
|
|
|
|
|
|
|
#define NEXT(x, l) (((x)+1)%(l))
|
|
|
|
#define PREV(x, l) (((x) == 0) ? (l)-1: (x)-1)
|