Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
typedef struct Etherpkt	Etherpkt;
2
typedef struct Netaddr	Netaddr;
3
typedef struct Netfile	Netfile;
4
typedef struct Netif	Netif;
5
 
6
enum
7
{
8
	Nmaxaddr=	64,
9
	Nmhash=		31,
10
 
11
	Ncloneqid=	1,
12
	Naddrqid,
13
	N2ndqid,
14
	N3rdqid,
15
	Ndataqid,
16
	Nctlqid,
17
	Nstatqid,
18
	Ntypeqid,
19
	Nifstatqid,
20
};
21
 
22
/*
23
 *  Macros to manage Qid's used for multiplexed devices
24
 */
25
#define NETTYPE(x)	(((ulong)x)&0x1f)
26
#define NETID(x)	((((ulong)x))>>5)
27
#define NETQID(i,t)	((((ulong)i)<<5)|(t))
28
 
29
/*
30
 *  one per multiplexed connection
31
 */
32
struct Netfile
33
{
34
	QLock lk;
35
 
36
	int	inuse;
37
	ulong	mode;
38
	char	owner[KNAMELEN];
39
 
40
	int	type;			/* multiplexor type */
41
	int	prom;			/* promiscuous mode */
42
	int	scan;			/* base station scanning interval */
43
	int	bridge;			/* bridge mode */
44
	int	headersonly;		/* headers only - no data */
45
	uchar	maddr[8];		/* bitmask of multicast addresses requested */
46
	int	nmaddr;			/* number of multicast addresses */
47
 
48
	Queue	*in;			/* input buffer */
49
};
50
 
51
/*
52
 *  a network address
53
 */
54
struct Netaddr
55
{
56
	Netaddr	*next;		/* allocation chain */
57
	Netaddr	*hnext;
58
	uchar	addr[Nmaxaddr];
59
	int	ref;
60
};
61
 
62
/*
63
 *  a network interface
64
 */
65
struct Netif
66
{
67
	QLock lk;
68
 
69
	/* multiplexing */
70
	char	name[KNAMELEN];		/* for top level directory */
71
	int	nfile;			/* max number of Netfiles */
72
	Netfile	**f;
73
 
74
	/* about net */
75
	int	limit;			/* flow control */
76
	int	alen;			/* address length */
77
	int	mbps;			/* megabits per sec */
78
	uchar	addr[Nmaxaddr];
79
	uchar	bcast[Nmaxaddr];
80
	Netaddr	*maddr;			/* known multicast addresses */
81
	int	nmaddr;			/* number of known multicast addresses */
82
	Netaddr *mhash[Nmhash];		/* hash table of multicast addresses */
83
	int	prom;			/* number of promiscuous opens */
84
	int	scan;			/* number of base station scanners */
85
	int	all;			/* number of -1 multiplexors */
86
 
87
	/* statistics */
88
	int	misses;
89
	int	inpackets;
90
	int	outpackets;
91
	int	crcs;		/* input crc errors */
92
	int	oerrs;		/* output errors */
93
	int	frames;		/* framing errors */
94
	int	overflows;	/* packet overflows */
95
	int	buffs;		/* buffering errors */
96
	int	soverflows;	/* software overflow */
97
 
98
	/* routines for touching the hardware */
99
	void	*arg;
100
	void	(*promiscuous)(void*, int);
101
	void	(*multicast)(void*, uchar*, int);
102
	void	(*scanbs)(void*, uint);	/* scan for base stations */
103
};
104
 
105
void	netifinit(Netif*, char*, int, ulong);
106
Walkqid*	netifwalk(Netif*, Chan*, Chan*, char **, int);
107
Chan*	netifopen(Netif*, Chan*, int);
108
void	netifclose(Netif*, Chan*);
109
long	netifread(Netif*, Chan*, void*, long, ulong);
110
Block*	netifbread(Netif*, Chan*, long, ulong);
111
long	netifwrite(Netif*, Chan*, void*, long);
112
int	netifwstat(Netif*, Chan*, uchar*, int);
113
int	netifstat(Netif*, Chan*, uchar*, int);
114
int	activemulti(Netif*, uchar*, int);
115
 
116
/*
117
 *  Ethernet specific
118
 */
119
enum
120
{
121
	Eaddrlen=	6,
122
	ETHERMINTU =	60,		/* minimum transmit size */
123
	ETHERMAXTU =	1514,		/* maximum transmit size */
124
	ETHERHDRSIZE =	14,		/* size of an ethernet header */
125
};
126
 
127
struct Etherpkt
128
{
129
	uchar	d[Eaddrlen];
130
	uchar	s[Eaddrlen];
131
	uchar	type[2];
132
	uchar	data[1500];
133
};