summaryrefslogtreecommitdiff
path: root/include/device/net_status.h
blob: 9ab95b96a791c594c7afc22b8755beab5ff3463c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
/*
 * Mach Operating System
 * Copyright (c) 1991,1990,1989 Carnegie Mellon University
 * All Rights Reserved.
 *
 * Permission to use, copy, modify and distribute this software and its
 * documentation is hereby granted, provided that both the copyright
 * notice and this permission notice appear in all copies of the
 * software, derivative works or modified versions, and any portions
 * thereof, and that both notices appear in supporting documentation.
 *
 * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
 * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
 * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
 *
 * Carnegie Mellon requests users of this software to return to
 *
 *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
 *  School of Computer Science
 *  Carnegie Mellon University
 *  Pittsburgh PA 15213-3890
 *
 * any improvements or extensions that they make and grant Carnegie Mellon
 * the rights to redistribute these changes.
 */
/*
 *	Author: David B. Golub, Carnegie Mellon University
 *	Date:	3/89
 *
 * 	Status information for network interfaces.
 */

#ifndef	_DEVICE_NET_STATUS_H_
#define	_DEVICE_NET_STATUS_H_

#include <device/device_types.h>
#include <mach/message.h>

/*
 * General interface status
 */
struct net_status {
	int	min_packet_size;	/* minimum size, including header */
	int	max_packet_size;	/* maximum size, including header */
	int	header_format;		/* format of network header */
	int	header_size;		/* size of network header */
	int	address_size;		/* size of network address */
	int	flags;			/* interface status */
	int	mapped_size;		/* if mappable, virtual mem needed */
};
#define	NET_STATUS_COUNT	(sizeof(struct net_status)/sizeof(int))
#define	NET_STATUS		(('n'<<16) + 1)

/*
 * Header formats, as given by RFC 826/1010 for ARP:
 */
#define	HDR_ETHERNET		1	/* Ethernet hardware address */
#define	HDR_EXP_ETHERNET	2	/* 3Mhz experimental Ethernet
					   hardware address */
#define	HDR_PRO_NET		4	/* Proteon ProNET Token Ring */
#define	HDR_CHAOS		5	/* Chaosnet */
#define	HDR_802			6	/* IEEE 802 networks */


/*
 * A network address is an array of bytes.  In order to return
 * this in an array of (long) integers, it is returned in net order.
 * Use 'ntohl' on each element of the array to retrieve the original
 * ordering.
 */
#define	NET_ADDRESS		(('n'<<16) + 2)

#define	NET_DSTADDR		(('n'<<16) + 3)

#define	NET_FLAGS		(('n'<<16) + 4)

/*
 * Input packet filter definition
 */
#define	NET_MAX_FILTER		128 /* was 64, bpf programs are big */
#define	NET_FILTER_STACK_DEPTH	32

/*
 *  We allow specification of up to NET_MAX_FILTER (short) words of a filter
 *  command list to be applied to incoming packets to determine if
 *  those packets should be given to a particular network input filter.
 *
 *  Each network filter specifies the filter command list via net_add_filter.
 *  Each filter command list specifies a sequences of actions which leave a
 *  boolean value on the top of an internal stack.  Each word of the
 *  command list specifies an action from the set {PUSHLIT, PUSHZERO,
 *  PUSHWORD+N} which respectively push the next word of the filter, zero,
 *  or word N of the incoming packet on the stack, and a binary operator
 *  from the set {EQ, LT, LE, GT, GE, AND, OR, XOR} which operates on the
 *  top two elements of the stack and replaces them with its result.  The
 *  special action NOPUSH and the special operator NOP can be used to only
 *  perform the binary operation or to only push a value on the stack.
 *
 *  If the final value of the filter operation is true, then the packet is
 *  accepted for the filter.
 *
 *  The first filter_t object is a header which allows to set flags for the
 *  filter code. Main flags concern the direction of packets. This header is
 *  split in the same way NETF words are : the 6 MSB bits indicate the type
 *  of filter while the 10 LSB bits are the flags. For native NETF filters,
 *  clear the 6 MSB bits (which is why there is no dedicated macro).
 */

typedef	unsigned short	filter_t;
typedef filter_t	*filter_array_t;

#define CSPF_BYTES(n) ((n) * sizeof (filter_t))

/*  these must sum to 16!  */
#define NETF_NBPA	10			/* # bits / argument */
#define NETF_NBPO	6			/* # bits / operator */

#define	NETF_ARG(word)	((word) & 0x3ff)
#define	NETF_OP(word)	(((word)>>NETF_NBPA)&0x3f)

/*  filter types  */
#define NETF_TYPE_MASK	(((1 << NETF_NBPO) - 1) << NETF_NBPA)
#define NETF_BPF	(1 << NETF_NBPA)

/*  flags  */
#define NETF_IN		0x1
#define NETF_OUT	0x2

/*  binary operators  */
#define NETF_NOP	(0<<NETF_NBPA)
#define NETF_EQ		(1<<NETF_NBPA)
#define NETF_LT		(2<<NETF_NBPA)
#define NETF_LE		(3<<NETF_NBPA)
#define NETF_GT		(4<<NETF_NBPA)
#define NETF_GE		(5<<NETF_NBPA)
#define NETF_AND	(6<<NETF_NBPA)
#define NETF_OR		(7<<NETF_NBPA)
#define NETF_XOR	(8<<NETF_NBPA)
#define NETF_COR	(9<<NETF_NBPA)
#define NETF_CAND	(10<<NETF_NBPA)
#define NETF_CNOR	(11<<NETF_NBPA)
#define NETF_CNAND	(12<<NETF_NBPA)
#define NETF_NEQ	(13<<NETF_NBPA)
#define	NETF_LSH	(14<<NETF_NBPA)
#define	NETF_RSH	(15<<NETF_NBPA)
#define	NETF_ADD	(16<<NETF_NBPA)
#define	NETF_SUB	(17<<NETF_NBPA)


/*  stack arguments  */
#define NETF_NOPUSH	0		/* don`t push */
#define NETF_PUSHLIT	1		/* next word in filter */
#define NETF_PUSHZERO	2		/* 0 */
#define	NETF_PUSHIND	14		/* word indexed by stack top */
#define	NETF_PUSHHDRIND	15		/* header word indexed by stack top */
#define NETF_PUSHWORD	16		/* word 0 .. 944 in packet */
#define	NETF_PUSHHDR	960		/* word 0 .. 31  in header */
#define	NETF_PUSHSTK	992		/* word 0 .. 31  in stack */

/* priorities */
#define	NET_HI_PRI	100
#define	NET_PRI_MAX	255

/*
 * BPF support.
 */
#include <device/bpf.h>

/*
 * Net receive message format.
 *
 * The header and data are packaged separately, since some hardware
 * supports variable-length headers.  We prefix the packet with
 * a packet_hdr structure so that the real data portion begins
 * on a long-word boundary, and so that packet filters can address
 * the type field and packet size uniformly.
 */
#define	NET_RCV_MAX	4095
#define	NET_HDW_HDR_MAX	64

#define	NET_RCV_MSG_ID	2999	/* in device.defs reply range */

struct packet_header {
	unsigned short	length;
	unsigned short	type;	/* network order */
};

struct net_rcv_msg {
	mach_msg_header_t msg_hdr;
	mach_msg_type_t	header_type;
	char		header[NET_HDW_HDR_MAX];
	mach_msg_type_t	packet_type;
	char		packet[NET_RCV_MAX];
	boolean_t	sent;
};
typedef struct net_rcv_msg 	*net_rcv_msg_t;
#define	net_rcv_msg_packet_count packet_type.msgt_number



#endif	/* _DEVICE_NET_STATUS_H_ */