summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/sys/llc1.h
blob: 89d68ba2d34237e49eac32fafdf3e1a134baaa04 (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
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (the "License").  You may not use this file except in compliance
 * with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * llc1 - an LLC Class 1 MUX compatible with SunConnect LLC2 uses DLPI
 * interface.
 *
 * Copyrighted as an unpublished work.
 * Copyright 1992-2002 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#ifndef _SYS_LLC1_H
#define	_SYS_LLC1_H

#pragma ident	"%Z%%M%	%I%	%E% SMI"

#ifdef	__cplusplus
extern "C" {
#endif

struct llc_stats {
	long	llcs_nobuffer;
	long	llcs_multixmt;
	long	llcs_multircv;	/* multicast but note broadcast */
	long	llcs_brdcstxmt;
	long	llcs_brdcstrcv;
	long	llcs_blocked;	/* discard due to upstream being flow */
				/* controlled */
	long	llcs_pktxmt;
	long	llcs_pktrcv;
	long	llcs_bytexmt;
	long	llcs_bytercv;
	long	llcs_xidxmt;
	long	llcs_xidrcv;
	long	llcs_testxmt;
	long	llcs_testrcv;
	long	llcs_ierrors;
	long	llcs_oerrors;
};

#define	LLCS_NOBUFFER	0
#define	LLCS_MULTIXMT	1
#define	LLCS_MULTIRCV	2
#define	LLCS_BRDCSTXMT	3
#define	LLCS_BRDCSTRCV	4
#define	LLCS_BLOCKED	5
#define	LLCS_PKTXMT	6
#define	LLCS_PKTRCV	7
#define	LLCS_BYTEXMT	8
#define	LLCS_BYTERCV	9
#define	LLCS_XIDXMT	10
#define	LLCS_XIDRCV	11
#define	LLCS_TESTXMT	12
#define	LLCS_TESTRCV	13
#define	LLCS_IERRORS	14
#define	LLCS_OERRORS	15

/* multicast structures */
typedef struct llc1_multicast_addr {
	int		llcm_refcnt;	/* number of streams referring to */
					/* entry */
	unsigned char	llcm_addr[ETHERADDRL];
} llc_mcast_t;
#define	LLC1_MAX_MULTICAST	16	/* default max multicast table size */

typedef
struct llc_mac_info {
	struct llc_mac_info *llcp_next, *llcp_prev;
	long		llcp_flags;
	long		llcp_maxpkt;
	long		llcp_minpkt;
	long		llcp_type;
	long		llcp_addrlen;	/* usually 6 but could be 2 */
	unsigned char	llcp_macaddr[ETHERADDRL];
	unsigned char	llcp_broadcast[ETHERADDRL];
	queue_t		*llcp_queue;	/* queue to MAC device */
	long		llcp_lindex;	/* link index for unlink */
	long		llcp_ppa;	/* the PPA number */
	long		llcp_sap;	/* when doing auto bind on lower */
					/* stream */
	mblk_t		*llcp_data;	/* temporarily hold data */
	queue_t		*llcp_lqtop;	/* queue for ioctls */
	mblk_t		*llcp_mb;
	long		llcp_nstreams;
	llc_mcast_t	*llcp_mcast;	/* per device multicast table */
	struct llc_stats llcp_stats;
	kstat_t		*llcp_kstatp;
	uint_t		llcp_iocid;	/* outstanding ioc_id */
} llc_mac_info_t;

/* flags for mac info (link) status */
#define	LLC1_LINKED	0x0001	/* there is a stream linked but not ready */
#define	LLC1_AVAILABLE	0x0002	/* linked stream is now ready */
#define	LLC1_INFO_WAIT	0x0004	/* waiting on info_ack */
#define	LLC1_DEF_PPA	0x0008	/* default (system assigned PPA) */
#define	LLC1_RAW_WAIT	0x0010	/* waiting for DLIOCRAW to happen */
#define	LLC1_USING_RAW	0x0020	/* lower driver is using DLIOCRAW mode */
#define	LLC1_AUTO_XID	0x0040	/* automatically respond to XID */
#define	LLC1_AUTO_TEST	0x0080	/* automatically respond to TEST */
#define	LLC1_BINDING	0x0100	/* autmatically binding the lower stream */

typedef struct llc1 {
	struct llc1	*llc_next, *llc_prev;
	mblk_t		*llc_mb;
	long		llc_state;
	long		llc_style;
	long		llc_minor;
	long		llc_type;
	long		llc_sap;
	uchar_t		llc_snap[5];	/* SNAP header */
	long		llc_waiting_for;	/* DL request to lower layer */
	long		llc_flags;	/* flags used for controlling things */
	long		llc_multicnt;	/* number of multicast addresses for */
					/* stream */
	llc_mcast_t	**llc_mcast;	/* multicast table if multicast is */
					/* enabled */
	queue_t		*llc_qptr;
	kmutex_t	llc_lock;
	struct llc_mac_info *llc_mac_info;
	struct llc_stats *llc_stats;
} llc1_t;

/* llc_flag bits */
#define	LLC_RAW		0x0001	/* lower stream is in RAW mode */
#define	LLC_FAST	0x0002	/* use "fast" path */
#define	LLC_PROM	0x0004	/* stream is in physical promiscuous mode */
#define	LLC_SNAP	0x0008	/* stream is using SNAP header */
#define	LLC_SNAP_OID	0x0010	/* stream is SNAP, OID is defined */


typedef struct llc1device {
	long		llc1_status;
	krwlock_t	llc1_rwlock;	/* used to serialize read/write locks */
	int		llc1_minors;
	int		llc1_multisize;
	llc_mac_info_t	*llc1_mac_next, *llc1_mac_prev;	/* the various mac */
							/* layers */
	int		llc1_ndevice;	/* number of devices linked */
	int		llc1_nextppa;	/* number to use for next PPA default */
	llc1_t		*llc1_str_next, *llc1_str_prev;	/* open streams */
} llc1dev_t;

#define	LLC1_ATTACHED	0x0001	/* board is attached so mutexes are */
				/* initialized */


/*
 * definitions for debug tracing
 */
#define	LLCTRACE	0x0001	/* basic procedure level tracing */
#define	LLCERRS		0x0002	/* trace errors */
#define	LLCRECV		0x0004	/* trace receive path */
#define	LLCSEND		0x0008	/* trace send path */
#define	LLCPROT		0x0010	/* trace DLPI protocol */

/*
 * other definitions
 */
#define	LLCE_OK		-1	/* internal procedure status is OK */
#define	LLCE_NOBUFFER	0x1001	/* couldn't allocate a buffer */


/*
 * definitions for module_info
 */
#define	LLC1IDNUM	0x8022
#define	LLC1_HIWATER	32000	/* high water mark for flow control */
#define	LLC1_LOWATER	4096	/* low water mark for flow control */
#define	LLC1_DEFMAX	4096	/* default max packet size */

/* address format for unitdata */

struct llcaddr {
	unsigned char   llca_addr[ETHERADDRL];
	unsigned char   llca_sap;
};
#define	LLCADDR(p, offset) ((struct llcaddr *)(((caddr_t)(p))+(offset)))

struct llcsaddr {
	unsigned char   llca_saddr[ETHERADDRL];
	unsigned short  llca_ssap;
};
#define	LLCSADDR(p, offset) ((struct llcsaddr *)(((caddr_t)(p))+(offset)))

/*
 * 802.2 specific declarations
 */
struct llchdr {
	unsigned char   llc_dsap;
	unsigned char   llc_ssap;
	unsigned char   llc_ctl;
};
struct llchdr_xid {
	unsigned char   llcx_format;
	unsigned char   llcx_class;
	unsigned char   llcx_window;
};
struct snaphdr {
	uchar_t		snap_oid[3];
	uchar_t		snap_type[2];
};

#define	LLC_UI		0x3
#define	LLC_XID 	0xAF
#define	LLC_TEST	0xE3
#define	LLC_P		0x10	/* P bit for use with XID/TEST */
#define	LLC_XID_FMTID	0x81	/* XID format identifier */
#define	LLC_SERVICES	0x01	/* Services supported */
#define	LLC_GLOBAL_SAP	0XFF	/* Global SAP address */
#define	LLC_NULL_SAP	0x00
#define	LLC_SNAP_SAP	0xAA	/* SNAP SAP */
#define	LLC_GROUP_ADDR	0x01	/* indication in DSAP of a group address */
#define	LLC_RESPONSE	0x01	/* indication in SSAP of a response */
#define	LLC_NOVELL_SAP	-1	/* indicator that Novell 802.3 mode is used */

#define	LLC_XID_INFO_SIZE	3	/* length of the INFO field */
#define	LLC_XID_CLASS_I		(0x01)	/* Class I */
#define	LLC_XID_CLASS_II	(0x03)	/* Class II */
#define	LLC_XID_CLASS_III	(0x05)	/* Class III */
#define	LLC_XID_CLASS_IV	(0x07)	/* Class IV */

/* Types can be or'd together */
#define	LLC_XID_TYPE_1		(0x01)	/* Type 1 */
#define	LLC_XID_TYPE_2		(0x02)	/* Type 2 */
#define	LLC_XID_TYPE_3		(0x04)	/* Type 3 */

#define	LLC1_CSMACD_HDR_SIZE	(2*ETHERADDRL+2)

#define	ismulticast(cp) ((*(caddr_t)(cp)) & 0x01)

/*
 * special ioctl calls for SunSelect LLC2 conformance
 */
#define	L_GETPPA	(('L'<<8)|1)
#define	L_SETPPA	(('L'<<8)|2)
#define	L_GETSTATS	(('L'<<8)|5)
#define	L_ZEROSTATS	(('L'<<8)|6)

#define	LI_SPPA		0x02	/* type of snioc structure */

struct ll_snioc {
	uchar_t		lli_type;
	uchar_t		lli_spare[3];
	int		lli_ppa;
	int		lli_index;
};

/*
 * version of insque/remque for use by this driver
 */
struct qelem {
	struct qelem   *q_forw;
	struct qelem   *q_back;
	/* rest of structure */
};

#ifdef	__cplusplus
}
#endif

#endif /* _SYS_LLC1_H */