if_atm.h revision 118548
125603Skjc/*      $NetBSD: if_atm.h,v 1.7 1996/11/09 23:02:27 chuck Exp $       */
255205Speter/* $FreeBSD: head/sys/net/if_atm.h 118548 2003-08-06 14:53:27Z harti $ */
325603Skjc
425603Skjc/*
525603Skjc *
625603Skjc * Copyright (c) 1996 Charles D. Cranor and Washington University.
725603Skjc * All rights reserved.
825603Skjc *
925603Skjc * Redistribution and use in source and binary forms, with or without
1025603Skjc * modification, are permitted provided that the following conditions
1125603Skjc * are met:
1225603Skjc * 1. Redistributions of source code must retain the above copyright
1325603Skjc *    notice, this list of conditions and the following disclaimer.
1425603Skjc * 2. Redistributions in binary form must reproduce the above copyright
1525603Skjc *    notice, this list of conditions and the following disclaimer in the
1625603Skjc *    documentation and/or other materials provided with the distribution.
1725603Skjc * 3. All advertising materials mentioning features or use of this software
1825603Skjc *    must display the following acknowledgement:
1925603Skjc *      This product includes software developed by Charles D. Cranor and
2025603Skjc *	Washington University.
2125603Skjc * 4. The name of the author may not be used to endorse or promote products
2225603Skjc *    derived from this software without specific prior written permission.
2325603Skjc *
2425603Skjc * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
2525603Skjc * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
2625603Skjc * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
2725603Skjc * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
2825603Skjc * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
2925603Skjc * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
3025603Skjc * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
3125603Skjc * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3225603Skjc * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
3325603Skjc * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3425603Skjc */
3525603Skjc
3625603Skjc/*
3725603Skjc * net/if_atm.h
3825603Skjc */
3925603Skjc
40114739Sharti/*
41114739Sharti * Classification of ATM cards.
42114739Sharti */
43116523Sharti#define	ATM_DEVICE_UNKNOWN	0
44116523Sharti#define	ATM_DEVICE_PCA200E	1	/* Fore/Marconi PCA200-E */
45116523Sharti#define	ATM_DEVICE_HE155	2	/* Fore/Marconi HE155 */
46116523Sharti#define	ATM_DEVICE_HE622	3	/* Fore/Marconi HE622 */
47116523Sharti#define	ATM_DEVICE_ENI155P	4	/* Efficient networks 155p */
48116523Sharti#define	ATM_DEVICE_ADP155P	5	/* Adaptec 155p */
49116441Sharti#define	ATM_DEVICE_FORELE25	6	/* ForeRunnerLE 25 */
50116441Sharti#define	ATM_DEVICE_FORELE155	7	/* ForeRunnerLE 155 */
51116523Sharti#define	ATM_DEVICE_NICSTAR25	8	/* other 77211 25.6MBit */
52116441Sharti#define	ATM_DEVICE_NICSTAR155	9	/* other 77211 155MBit */
53117628Sharti#define	ATM_DEVICE_IDTABR25	10	/* 77252 based card 25MBit */
54117628Sharti#define	ATM_DEVICE_IDTABR155	11	/* 77252 based card 155MBit */
55117721Sharti#define	ATM_DEVICE_PROATM25	12	/* 77252 based ProSum card 25MBit */
56117721Sharti#define	ATM_DEVICE_PROATM155	13	/* 77252 based ProSum card 155MBit */
57114739Sharti
58114739Sharti/* map to strings and vendors */
59116523Sharti#define	ATM_DEVICE_NAMES						\
60116441Sharti	{ "Unknown",		"Unknown" },				\
61116441Sharti	{ "PCA200-E",		"Fore/Marconi" },			\
62116441Sharti	{ "HE155",		"Fore/Marconi" },			\
63116441Sharti	{ "HE622",		"Fore/Marconi" },			\
64116441Sharti	{ "ENI155p",		"Efficient Networks" },			\
65116441Sharti	{ "ADP155p",		"Adaptec" },				\
66116441Sharti	{ "ForeRunnerLE25",	"Fore/Marconi" },			\
67116441Sharti	{ "ForeRunnerLE155",	"Fore/Marconi" },			\
68116441Sharti	{ "IDT77211/25",	"IDT" },				\
69117628Sharti	{ "IDT77211/155",	"IDT" },				\
70117628Sharti	{ "IDT77252/25",	"IDT" },				\
71117628Sharti	{ "IDT77252/155",	"IDT" },				\
72117628Sharti	{ "ProATM/25",		"ProSum" },				\
73117628Sharti	{ "ProATM/155",		"ProSum" },
74114739Sharti
75114739Sharti/*
76114739Sharti * This is the common link layer MIB for all ATM interfaces. Much of the
77114739Sharti * information here is needed for ILMI. This will be augmented by statistics
78114739Sharti * at some point.
79114739Sharti */
80114739Shartistruct ifatm_mib {
81114739Sharti	/* configuration data */
82114739Sharti	uint8_t		device;		/* type of card */
83114739Sharti	u_char		esi[6];		/* end system identifier (MAC) */
84114739Sharti	uint32_t	serial;		/* card serial number */
85114739Sharti	uint32_t	hw_version;	/* card version */
86114739Sharti	uint32_t	sw_version;	/* firmware version (if any) */
87114739Sharti	uint32_t	pcr;		/* supported peak cell rate */
88114739Sharti	uint32_t	media;		/* physical media */
89114739Sharti	uint8_t		vpi_bits;	/* number of used bits in VPI field */
90114739Sharti	uint8_t		vci_bits;	/* number of used bits in VCI field */
91114739Sharti	uint16_t	max_vpcs;	/* maximum number of VPCs */
92114739Sharti	uint32_t	max_vccs;	/* maximum number of VCCs */
93114739Sharti};
94114739Sharti
95114739Sharti/*
96116441Sharti * Traffic parameters for ATM connections. This contains all parameters
97116441Sharti * to accomodate UBR, UBR+MCR, CBR, VBR and ABR connections.
98116441Sharti *
99116441Sharti * Keep in sync with ng_atm.h
100116441Sharti */
101116441Shartistruct atmio_tparam {
102116441Sharti	uint32_t	pcr;	/* 24bit: Peak Cell Rate */
103116441Sharti	uint32_t	scr;	/* 24bit: VBR Sustainable Cell Rate */
104116441Sharti	uint32_t	mbs;	/* 24bit: VBR Maximum burst size */
105116441Sharti	uint32_t	mcr;	/* 24bit: ABR/VBR/UBR+MCR MCR */
106116441Sharti	uint32_t	icr;	/* 24bit: ABR ICR */
107116441Sharti	uint32_t	tbe;	/* 24bit: ABR TBE (1...2^24-1) */
108116441Sharti	uint8_t		nrm;	/*  3bit: ABR Nrm */
109116441Sharti	uint8_t		trm;	/*  3bit: ABR Trm */
110116441Sharti	uint16_t	adtf;	/* 10bit: ABR ADTF */
111116441Sharti	uint8_t		rif;	/*  4bit: ABR RIF */
112116441Sharti	uint8_t		rdf;	/*  4bit: ABR RDF */
113116441Sharti	uint8_t		cdf;	/*  3bit: ABR CDF */
114116441Sharti};
115116441Sharti
116116441Sharti/*
117116441Sharti * VCC parameters
118116441Sharti *
119116441Sharti * Keep in sync with ng_atm.h
120116441Sharti */
121116441Shartistruct atmio_vcc {
122116441Sharti	uint16_t	flags;		/* VCC flags */
123116441Sharti	uint16_t	vpi;
124116441Sharti	uint16_t	vci;
125116441Sharti	uint16_t	rmtu;		/* maximum receive PDU */
126116441Sharti	uint16_t	tmtu;		/* maximum transmit PDU */
127116441Sharti	uint8_t		aal;		/* aal type */
128116441Sharti	uint8_t		traffic;	/* traffic type */
129116441Sharti	struct atmio_tparam tparam;	/* traffic parameters */
130116441Sharti};
131116441Sharti
132116441Sharti/* VCC flags */
133116523Sharti#define	ATMIO_FLAG_LLCSNAP	0x0002	/* same as ATM_PH_LLCSNAP */
134116523Sharti#define	ATMIO_FLAG_NG		0x0010	/* owned by netgraph */
135116523Sharti#define	ATMIO_FLAG_HARP		0x0020	/* owned by HARP */
136116523Sharti#define	ATMIO_FLAG_NORX		0x0100	/* not receiving on this VCC */
137116523Sharti#define	ATMIO_FLAG_NOTX		0x0200	/* not transmitting on this VCC */
138116523Sharti#define	ATMIO_FLAG_PVC		0x0400	/* this is a PVC */
139118496Sharti#define	ATMIO_FLAG_ASYNC	0x0800	/* async open/close */
140118496Sharti#define	ATMIO_FLAGS	"\020\2LLCSNAP\5NG\6HARP\11NORX\12NOTX\13PVC\14ASYNC"
141116441Sharti
142116523Sharti#define	ATMIO_AAL_0		0	/* pure cells */
143116523Sharti#define	ATMIO_AAL_34		4	/* AAL3 and 4 */
144116523Sharti#define	ATMIO_AAL_5		5	/* AAL5 */
145116523Sharti#define	ATMIO_AAL_RAW		10	/* whatever the card does */
146116441Sharti
147116523Sharti#define	ATMIO_TRAFFIC_UBR	0
148116523Sharti#define	ATMIO_TRAFFIC_CBR	1
149116523Sharti#define	ATMIO_TRAFFIC_ABR	2
150116523Sharti#define	ATMIO_TRAFFIC_VBR	3
151116441Sharti
152116441Sharti/*
153116441Sharti * VCC table
154116441Sharti *
155116441Sharti * Keep in sync with ng_atm.h
156116441Sharti */
157116441Shartistruct atmio_vcctable {
158116441Sharti	uint32_t	count;		/* number of vccs */
159116441Sharti	struct atmio_vcc vccs[0];	/* array of VCCs */
160116441Sharti};
161116441Sharti
162116441Sharti/*
163116441Sharti * Peak cell rates for various physical media. Note, that there are
164116441Sharti * different opinions on what the correct values are.
165116441Sharti */
166116441Sharti#define	ATM_RATE_25_6M		59259
167116523Sharti#define	ATM_RATE_155M		353208
168116523Sharti#define	ATM_RATE_622M		1412830
169116523Sharti#define	ATM_RATE_2_4G		5651320
170116441Sharti
171117625Sharti#ifdef _KERNEL
172116441Sharti/*
173114739Sharti * Common fields for all ATM interfaces. Each driver's softc must start with
174114739Sharti * this structure.
175114739Sharti */
176114739Shartistruct ifatm {
177114739Sharti	struct ifnet	ifnet;		/* required by if_var.h */
178114739Sharti	struct ifatm_mib mib;		/* exported data */
179114739Sharti	void		*phy;		/* usually SUNI */
180114739Sharti	void		*ngpriv;	/* netgraph link */
181114739Sharti};
182117625Sharti#endif
183114739Sharti
184116480Sharti/*
185116480Sharti * Keep structures in sync with ng_atm.h
186116480Sharti *
187116480Sharti * These are used by netgraph/harp to call the driver
188116480Sharti * NATM uses the atm_pseudoioctl instead.
189116480Sharti */
190116480Shartistruct atmio_openvcc {
191116480Sharti	void		*rxhand;	/* handle argument */
192116480Sharti	struct atmio_vcc param;		/* parameters */
193116480Sharti};
194116480Sharti
195116480Shartistruct atmio_closevcc {
196116480Sharti	uint16_t	vpi;
197116480Sharti	uint16_t	vci;
198116480Sharti};
199116480Sharti
20025603Skjc#if defined(__NetBSD__) || defined(__OpenBSD__) || defined(__bsdi__)
201116523Sharti#define	RTALLOC1(A,B)		rtalloc1((A),(B))
20225603Skjc#elif defined(__FreeBSD__)
203116523Sharti#define	RTALLOC1(A,B)		rtalloc1((A),(B),0UL)
20425603Skjc#endif
20525603Skjc
20625603Skjc/*
20725603Skjc * pseudo header for packet transmission
20825603Skjc */
20925603Skjcstruct atm_pseudohdr {
210116523Sharti	uint8_t		atm_ph[4];	/* flags+VPI+VCI1(msb)+VCI2(lsb) */
21125603Skjc};
21225603Skjc
213116523Sharti#define	ATM_PH_FLAGS(X)	((X)->atm_ph[0])
214116523Sharti#define	ATM_PH_VPI(X)	((X)->atm_ph[1])
215116523Sharti#define	ATM_PH_VCI(X)	((((X)->atm_ph[2]) << 8) | ((X)->atm_ph[3]))
216116523Sharti#define	ATM_PH_SETVCI(X,V) { \
21725603Skjc	(X)->atm_ph[2] = ((V) >> 8) & 0xff; \
21825603Skjc	(X)->atm_ph[3] = ((V) & 0xff); \
21925603Skjc}
22025603Skjc
221117627Sharti/* use AAL5? (0 == aal0) */
222118548Sharti#define	ATM_PH_AAL5	0x01
223117627Sharti/* use the LLC SNAP encoding (iff aal5) */
224117627Sharti#define	ATM_PH_LLCSNAP ATMIO_FLAG_LLCSNAP
22525603Skjc
226116523Sharti#define	ATM_PH_DRIVER7  0x40	/* reserve for driver's use */
227116523Sharti#define	ATM_PH_DRIVER8  0x80	/* reserve for driver's use */
22825603Skjc
229116523Sharti#define	ATMMTU		9180	/* ATM MTU size for IP */
23025603Skjc				/* XXX: could be 9188 with LLC/SNAP according
23125603Skjc					to comer */
23225603Skjc
233116523Sharti#define	SIOCATMGETVCCS	_IOW('a', 125, struct atmio_vcctable)
234116523Sharti#define	SIOCATMOPENVCC	_IOR('a', 126, struct atmio_openvcc)
235116523Sharti#define	SIOCATMCLOSEVCC _IOR('a', 127, struct atmio_closevcc)
23625603Skjc
237116523Sharti#define	SIOCATMGVCCS	_IOWR('i', 230, struct ifreq)
23837939Skjc
23925603Skjc/*
24025603Skjc * XXX forget all the garbage in if_llc.h and do it the easy way
24125603Skjc */
242116523Sharti#define	ATMLLC_HDR "\252\252\3\0\0\0"
24325603Skjcstruct atmllc {
244116523Sharti	uint8_t		llchdr[6];	/* aa.aa.03.00.00.00 */
245116523Sharti	uint8_t		type[2];	/* "ethernet" type */
24625603Skjc};
24725603Skjc
24825603Skjc/* ATM_LLC macros: note type code in host byte order */
249116523Sharti#define	ATM_LLC_TYPE(X) (((X)->type[0] << 8) | ((X)->type[1]))
250116523Sharti#define	ATM_LLC_SETTYPE(X, V) do {		\
251116523Sharti	(X)->type[0] = ((V) >> 8) & 0xff;	\
252116523Sharti	(X)->type[1] = ((V) & 0xff);		\
253116523Sharti    } while (0)
25425603Skjc
255118157Sharti/*
256118157Sharti * Events that are emitted by the driver. Currently the only consumer
257118157Sharti * of this is the netgraph node.
258118157Sharti */
259118157Sharti#define	ATMEV_FLOW_CONTROL	0x0001	/* channel busy state changed */
260118157Sharti#define	ATMEV_IFSTATE_CHANGED	0x0002	/* up/down or carrier */
261118157Sharti#define	ATMEV_VCC_CHANGED	0x0003	/* PVC deleted/create */
262118157Sharti#define	ATMEV_ACR_CHANGED	0x0004	/* ABR ACR has changed */
263118157Sharti
264118157Shartistruct atmev_flow_control {
265118157Sharti	uint16_t	vpi;		/* channel that is changed */
266118157Sharti	uint16_t	vci;
267118157Sharti	u_int		busy : 1;	/* != 0 -> ATM layer busy */
268118157Sharti};
269118157Sharti
270118157Shartistruct atmev_ifstate_changed {
271118157Sharti	u_int		running : 1;	/* interface is running now */
272118157Sharti	u_int		carrier : 1;	/* carrier detected (or not) */
273118157Sharti};
274118157Sharti
275118157Shartistruct atmev_vcc_changed {
276118157Sharti	uint16_t	vpi;		/* channel that is changed */
277118157Sharti	uint16_t	vci;
278118157Sharti	u_int		up : 1;		/* 1 - created, 0 - deleted */
279118157Sharti};
280118157Sharti
281118157Shartistruct atmev_acr_changed {
282118157Sharti	uint16_t	vpi;		/* channel that is changed */
283118157Sharti	uint16_t	vci;
284118157Sharti	uint32_t	acr;		/* new ACR */
285118157Sharti};
286118157Sharti
28725603Skjc#ifdef _KERNEL
28892725Salfredvoid	atm_ifattach(struct ifnet *);
289114201Shartivoid	atm_ifdetach(struct ifnet *);
29092725Salfredvoid	atm_input(struct ifnet *, struct atm_pseudohdr *,
291116523Sharti	    struct mbuf *, void *);
29292725Salfredint	atm_output(struct ifnet *, struct mbuf *, struct sockaddr *,
293116523Sharti	    struct rtentry *);
294117630Shartistruct atmio_vcctable *atm_getvccs(struct atmio_vcc **, u_int, u_int,
295117630Sharti	    struct mtx *, int);
296118157Sharti
297118157Shartivoid	atm_event(struct ifnet *, u_int, void *);
298118157Sharti
299118157Sharti#define	ATMEV_SEND_FLOW_CONTROL(ATMIF, VPI, VCI, BUSY)			\
300118157Sharti	do {								\
301118157Sharti		struct atmev_flow_control _arg;				\
302118157Sharti		_arg.vpi = (VPI);					\
303118157Sharti		_arg.vci = (VCI);					\
304118157Sharti		_arg.busy = (BUSY);					\
305118157Sharti		atm_event(&(ATMIF)->ifnet, ATMEV_FLOW_CONTROL, &_arg);	\
306118157Sharti	} while (0)
307118157Sharti
308118157Sharti#define	ATMEV_SEND_VCC_CHANGED(ATMIF, VPI, VCI, UP)			\
309118157Sharti	do {								\
310118157Sharti		struct atmev_vcc_changed _arg;				\
311118157Sharti		_arg.vpi = (VPI);					\
312118157Sharti		_arg.vci = (VCI);					\
313118157Sharti		_arg.up = (UP);						\
314118157Sharti		atm_event(&(ATMIF)->ifnet, ATMEV_VCC_CHANGED, &_arg);	\
315118157Sharti	} while (0)
316118157Sharti
317118157Sharti#define	ATMEV_SEND_IFSTATE_CHANGED(ATMIF, CARRIER)			\
318118157Sharti	do {								\
319118157Sharti		struct atmev_ifstate_changed _arg;			\
320118157Sharti		_arg.running = (((ATMIF)->ifnet.if_flags &		\
321118157Sharti		    IFF_RUNNING) != 0);					\
322118157Sharti		_arg.carrier = ((CARRIER) != 0);			\
323118157Sharti		atm_event(&(ATMIF)->ifnet, ATMEV_IFSTATE_CHANGED, &_arg); \
324118157Sharti	} while (0)
325118157Sharti
326118157Sharti#define	ATMEV_SEND_ACR_CHANGED(ATMIF, VPI, VCI, ACR)			\
327118157Sharti	do {								\
328118157Sharti		struct atmev_acr_changed _arg;				\
329118157Sharti		_arg.vpi = (VPI);					\
330118157Sharti		_arg.vci = (VCI);					\
331118157Sharti		_arg.acr= (ACR);					\
332118157Sharti		atm_event(&(ATMIF)->ifnet, ATMEV_ACR_CHANGED, &_arg);	\
333118157Sharti	} while (0)
33425603Skjc#endif
335