1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License").  You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
13 *
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 *
20 * CDDL HEADER END
21 */
22/*
23 * llc1 - an LLC Class 1 MUX compatible with SunConnect LLC2 uses DLPI
24 * interface.
25 *
26 * Copyrighted as an unpublished work.
27 * Copyright 1992-2002 Sun Microsystems, Inc.  All rights reserved.
28 * Use is subject to license terms.
29 */
30
31#ifndef _SYS_LLC1_H
32#define	_SYS_LLC1_H
33
34#pragma ident	"%Z%%M%	%I%	%E% SMI"
35
36#ifdef	__cplusplus
37extern "C" {
38#endif
39
40struct llc_stats {
41	long	llcs_nobuffer;
42	long	llcs_multixmt;
43	long	llcs_multircv;	/* multicast but note broadcast */
44	long	llcs_brdcstxmt;
45	long	llcs_brdcstrcv;
46	long	llcs_blocked;	/* discard due to upstream being flow */
47				/* controlled */
48	long	llcs_pktxmt;
49	long	llcs_pktrcv;
50	long	llcs_bytexmt;
51	long	llcs_bytercv;
52	long	llcs_xidxmt;
53	long	llcs_xidrcv;
54	long	llcs_testxmt;
55	long	llcs_testrcv;
56	long	llcs_ierrors;
57	long	llcs_oerrors;
58};
59
60#define	LLCS_NOBUFFER	0
61#define	LLCS_MULTIXMT	1
62#define	LLCS_MULTIRCV	2
63#define	LLCS_BRDCSTXMT	3
64#define	LLCS_BRDCSTRCV	4
65#define	LLCS_BLOCKED	5
66#define	LLCS_PKTXMT	6
67#define	LLCS_PKTRCV	7
68#define	LLCS_BYTEXMT	8
69#define	LLCS_BYTERCV	9
70#define	LLCS_XIDXMT	10
71#define	LLCS_XIDRCV	11
72#define	LLCS_TESTXMT	12
73#define	LLCS_TESTRCV	13
74#define	LLCS_IERRORS	14
75#define	LLCS_OERRORS	15
76
77/* multicast structures */
78typedef struct llc1_multicast_addr {
79	int		llcm_refcnt;	/* number of streams referring to */
80					/* entry */
81	unsigned char	llcm_addr[ETHERADDRL];
82} llc_mcast_t;
83#define	LLC1_MAX_MULTICAST	16	/* default max multicast table size */
84
85typedef
86struct llc_mac_info {
87	struct llc_mac_info *llcp_next, *llcp_prev;
88	long		llcp_flags;
89	long		llcp_maxpkt;
90	long		llcp_minpkt;
91	long		llcp_type;
92	long		llcp_addrlen;	/* usually 6 but could be 2 */
93	unsigned char	llcp_macaddr[ETHERADDRL];
94	unsigned char	llcp_broadcast[ETHERADDRL];
95	queue_t		*llcp_queue;	/* queue to MAC device */
96	long		llcp_lindex;	/* link index for unlink */
97	long		llcp_ppa;	/* the PPA number */
98	long		llcp_sap;	/* when doing auto bind on lower */
99					/* stream */
100	mblk_t		*llcp_data;	/* temporarily hold data */
101	queue_t		*llcp_lqtop;	/* queue for ioctls */
102	mblk_t		*llcp_mb;
103	long		llcp_nstreams;
104	llc_mcast_t	*llcp_mcast;	/* per device multicast table */
105	struct llc_stats llcp_stats;
106	kstat_t		*llcp_kstatp;
107	uint_t		llcp_iocid;	/* outstanding ioc_id */
108} llc_mac_info_t;
109
110/* flags for mac info (link) status */
111#define	LLC1_LINKED	0x0001	/* there is a stream linked but not ready */
112#define	LLC1_AVAILABLE	0x0002	/* linked stream is now ready */
113#define	LLC1_INFO_WAIT	0x0004	/* waiting on info_ack */
114#define	LLC1_DEF_PPA	0x0008	/* default (system assigned PPA) */
115#define	LLC1_RAW_WAIT	0x0010	/* waiting for DLIOCRAW to happen */
116#define	LLC1_USING_RAW	0x0020	/* lower driver is using DLIOCRAW mode */
117#define	LLC1_AUTO_XID	0x0040	/* automatically respond to XID */
118#define	LLC1_AUTO_TEST	0x0080	/* automatically respond to TEST */
119#define	LLC1_BINDING	0x0100	/* autmatically binding the lower stream */
120
121typedef struct llc1 {
122	struct llc1	*llc_next, *llc_prev;
123	mblk_t		*llc_mb;
124	long		llc_state;
125	long		llc_style;
126	long		llc_minor;
127	long		llc_type;
128	long		llc_sap;
129	uchar_t		llc_snap[5];	/* SNAP header */
130	long		llc_waiting_for;	/* DL request to lower layer */
131	long		llc_flags;	/* flags used for controlling things */
132	long		llc_multicnt;	/* number of multicast addresses for */
133					/* stream */
134	llc_mcast_t	**llc_mcast;	/* multicast table if multicast is */
135					/* enabled */
136	queue_t		*llc_qptr;
137	kmutex_t	llc_lock;
138	struct llc_mac_info *llc_mac_info;
139	struct llc_stats *llc_stats;
140} llc1_t;
141
142/* llc_flag bits */
143#define	LLC_RAW		0x0001	/* lower stream is in RAW mode */
144#define	LLC_FAST	0x0002	/* use "fast" path */
145#define	LLC_PROM	0x0004	/* stream is in physical promiscuous mode */
146#define	LLC_SNAP	0x0008	/* stream is using SNAP header */
147#define	LLC_SNAP_OID	0x0010	/* stream is SNAP, OID is defined */
148
149
150typedef struct llc1device {
151	long		llc1_status;
152	krwlock_t	llc1_rwlock;	/* used to serialize read/write locks */
153	int		llc1_minors;
154	int		llc1_multisize;
155	llc_mac_info_t	*llc1_mac_next, *llc1_mac_prev;	/* the various mac */
156							/* layers */
157	int		llc1_ndevice;	/* number of devices linked */
158	int		llc1_nextppa;	/* number to use for next PPA default */
159	llc1_t		*llc1_str_next, *llc1_str_prev;	/* open streams */
160} llc1dev_t;
161
162#define	LLC1_ATTACHED	0x0001	/* board is attached so mutexes are */
163				/* initialized */
164
165
166/*
167 * definitions for debug tracing
168 */
169#define	LLCTRACE	0x0001	/* basic procedure level tracing */
170#define	LLCERRS		0x0002	/* trace errors */
171#define	LLCRECV		0x0004	/* trace receive path */
172#define	LLCSEND		0x0008	/* trace send path */
173#define	LLCPROT		0x0010	/* trace DLPI protocol */
174
175/*
176 * other definitions
177 */
178#define	LLCE_OK		-1	/* internal procedure status is OK */
179#define	LLCE_NOBUFFER	0x1001	/* couldn't allocate a buffer */
180
181
182/*
183 * definitions for module_info
184 */
185#define	LLC1IDNUM	0x8022
186#define	LLC1_HIWATER	32000	/* high water mark for flow control */
187#define	LLC1_LOWATER	4096	/* low water mark for flow control */
188#define	LLC1_DEFMAX	4096	/* default max packet size */
189
190/* address format for unitdata */
191
192struct llcaddr {
193	unsigned char   llca_addr[ETHERADDRL];
194	unsigned char   llca_sap;
195};
196#define	LLCADDR(p, offset) ((struct llcaddr *)(((caddr_t)(p))+(offset)))
197
198struct llcsaddr {
199	unsigned char   llca_saddr[ETHERADDRL];
200	unsigned short  llca_ssap;
201};
202#define	LLCSADDR(p, offset) ((struct llcsaddr *)(((caddr_t)(p))+(offset)))
203
204/*
205 * 802.2 specific declarations
206 */
207struct llchdr {
208	unsigned char   llc_dsap;
209	unsigned char   llc_ssap;
210	unsigned char   llc_ctl;
211};
212struct llchdr_xid {
213	unsigned char   llcx_format;
214	unsigned char   llcx_class;
215	unsigned char   llcx_window;
216};
217struct snaphdr {
218	uchar_t		snap_oid[3];
219	uchar_t		snap_type[2];
220};
221
222#define	LLC_UI		0x3
223#define	LLC_XID 	0xAF
224#define	LLC_TEST	0xE3
225#define	LLC_P		0x10	/* P bit for use with XID/TEST */
226#define	LLC_XID_FMTID	0x81	/* XID format identifier */
227#define	LLC_SERVICES	0x01	/* Services supported */
228#define	LLC_GLOBAL_SAP	0XFF	/* Global SAP address */
229#define	LLC_NULL_SAP	0x00
230#define	LLC_SNAP_SAP	0xAA	/* SNAP SAP */
231#define	LLC_GROUP_ADDR	0x01	/* indication in DSAP of a group address */
232#define	LLC_RESPONSE	0x01	/* indication in SSAP of a response */
233#define	LLC_NOVELL_SAP	-1	/* indicator that Novell 802.3 mode is used */
234
235#define	LLC_XID_INFO_SIZE	3	/* length of the INFO field */
236#define	LLC_XID_CLASS_I		(0x01)	/* Class I */
237#define	LLC_XID_CLASS_II	(0x03)	/* Class II */
238#define	LLC_XID_CLASS_III	(0x05)	/* Class III */
239#define	LLC_XID_CLASS_IV	(0x07)	/* Class IV */
240
241/* Types can be or'd together */
242#define	LLC_XID_TYPE_1		(0x01)	/* Type 1 */
243#define	LLC_XID_TYPE_2		(0x02)	/* Type 2 */
244#define	LLC_XID_TYPE_3		(0x04)	/* Type 3 */
245
246#define	LLC1_CSMACD_HDR_SIZE	(2*ETHERADDRL+2)
247
248#define	ismulticast(cp) ((*(caddr_t)(cp)) & 0x01)
249
250/*
251 * special ioctl calls for SunSelect LLC2 conformance
252 */
253#define	L_GETPPA	(('L'<<8)|1)
254#define	L_SETPPA	(('L'<<8)|2)
255#define	L_GETSTATS	(('L'<<8)|5)
256#define	L_ZEROSTATS	(('L'<<8)|6)
257
258#define	LI_SPPA		0x02	/* type of snioc structure */
259
260struct ll_snioc {
261	uchar_t		lli_type;
262	uchar_t		lli_spare[3];
263	int		lli_ppa;
264	int		lli_index;
265};
266
267/*
268 * version of insque/remque for use by this driver
269 */
270struct qelem {
271	struct qelem   *q_forw;
272	struct qelem   *q_back;
273	/* rest of structure */
274};
275
276#ifdef	__cplusplus
277}
278#endif
279
280#endif /* _SYS_LLC1_H */
281