typedef struct Block Block;
struct Block
{
       Block   *next;

       uchar   *rp;
       uchar   *wp;
       uchar   *lim;

       uchar   base[];
};

#define BLEN(s) ((s)->wp - (s)->rp)

Block*  allocb(int size);
Block*  copyblock(Block*, int);
#define freeb(b) free(b)

enum {
       Eaddrlen=       6,
       ETHERHDRSIZE=   14,             /* size of an ethernet header */
       Maxpkt=         2000,
};

typedef struct Macent Macent;
struct Macent
{
       uchar   ea[Eaddrlen];
       ushort  port;
};

typedef struct Etherpkt Etherpkt;
struct Etherpkt
{
       uchar   d[Eaddrlen];
       uchar   s[Eaddrlen];
       uchar   type[2];
       uchar   data[1500];
};

enum
{
       Cdcunion = 6,
       Scether = 6,
       Fnether = 15,
};

int debug;
int setmac;

int nprom;
int nmulti;
uchar multiaddr[32][Eaddrlen];

/* to be filled in by *init() */
uchar macaddr[Eaddrlen];

Macent mactab[127];

void    etheriq(Block*);

int     (*epreceive)(Dev*);
void    (*eptransmit)(Dev*, Block*);
int     (*eppromiscuous)(Dev*, int);
int     (*epmulticast)(Dev*, uchar*, int);