if_atm.h revision 256281
1219974Smav/*      $NetBSD: if_atm.h,v 1.7 1996/11/09 23:02:27 chuck Exp $       */
2219974Smav/* $FreeBSD: stable/10/sys/net/if_atm.h 249925 2013-04-26 12:50:32Z glebius $ */
3219974Smav
4219974Smav/*-
5219974Smav *
6219974Smav * Copyright (c) 1996 Charles D. Cranor and Washington University.
7219974Smav * All rights reserved.
8219974Smav *
9219974Smav * Redistribution and use in source and binary forms, with or without
10219974Smav * modification, are permitted provided that the following conditions
11219974Smav * are met:
12219974Smav * 1. Redistributions of source code must retain the above copyright
13219974Smav *    notice, this list of conditions and the following disclaimer.
14219974Smav * 2. Redistributions in binary form must reproduce the above copyright
15219974Smav *    notice, this list of conditions and the following disclaimer in the
16219974Smav *    documentation and/or other materials provided with the distribution.
17219974Smav * 3. All advertising materials mentioning features or use of this software
18219974Smav *    must display the following acknowledgement:
19219974Smav *      This product includes software developed by Charles D. Cranor and
20219974Smav *	Washington University.
21219974Smav * 4. The name of the author may not be used to endorse or promote products
22219974Smav *    derived from this software without specific prior written permission.
23219974Smav *
24219974Smav * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
25219974Smav * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
26219974Smav * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
27219974Smav * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
28219974Smav * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
29219974Smav * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
30219974Smav * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
31219974Smav * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32219974Smav * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
33219974Smav * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34219974Smav */
35219974Smav
36219974Smav/*
37219974Smav * net/if_atm.h
38219974Smav */
39219974Smav
40219974Smav/*
41219974Smav * Classification of ATM cards.
42219974Smav */
43219974Smav#define	ATM_DEVICE_UNKNOWN	0
44219974Smav#define	ATM_DEVICE_PCA200E	1	/* Fore/Marconi PCA200-E */
45219974Smav#define	ATM_DEVICE_HE155	2	/* Fore/Marconi HE155 */
46219974Smav#define	ATM_DEVICE_HE622	3	/* Fore/Marconi HE622 */
47219974Smav#define	ATM_DEVICE_ENI155P	4	/* Efficient networks 155p */
48219974Smav#define	ATM_DEVICE_ADP155P	5	/* Adaptec 155p */
49219974Smav#define	ATM_DEVICE_FORELE25	6	/* ForeRunnerLE 25 */
50219974Smav#define	ATM_DEVICE_FORELE155	7	/* ForeRunnerLE 155 */
51219974Smav#define	ATM_DEVICE_NICSTAR25	8	/* other 77211 25.6MBit */
52219974Smav#define	ATM_DEVICE_NICSTAR155	9	/* other 77211 155MBit */
53219974Smav#define	ATM_DEVICE_IDTABR25	10	/* 77252 based card 25MBit */
54219974Smav#define	ATM_DEVICE_IDTABR155	11	/* 77252 based card 155MBit */
55219974Smav#define	ATM_DEVICE_PROATM25	12	/* 77252 based ProSum card 25MBit */
56219974Smav#define	ATM_DEVICE_PROATM155	13	/* 77252 based ProSum card 155MBit */
57219974Smav#define	ATM_DEVICE_VIRTUAL	14	/* virtual ATM device (netgraph) */
58219974Smav
59219974Smav/* map to strings and vendors */
60219974Smav#define	ATM_DEVICE_NAMES						\
61219974Smav	{ "Unknown",		"Unknown" },				\
62219974Smav	{ "PCA200-E",		"Fore/Marconi" },			\
63219974Smav	{ "HE155",		"Fore/Marconi" },			\
64219974Smav	{ "HE622",		"Fore/Marconi" },			\
65219974Smav	{ "ENI155p",		"Efficient Networks" },			\
66219974Smav	{ "ADP155p",		"Adaptec" },				\
67219974Smav	{ "ForeRunnerLE25",	"Fore/Marconi" },			\
68219974Smav	{ "ForeRunnerLE155",	"Fore/Marconi" },			\
69219974Smav	{ "IDT77211/25",	"IDT" },				\
70219974Smav	{ "IDT77211/155",	"IDT" },				\
71219974Smav	{ "IDT77252/25",	"IDT" },				\
72219974Smav	{ "IDT77252/155",	"IDT" },				\
73219974Smav	{ "ProATM/25",		"ProSum" },				\
74219974Smav	{ "ProATM/155",		"ProSum" },				\
75219974Smav	{ "Virtual",		"NetGraph" },
76219974Smav
77219974Smav/*
78219974Smav * This is the common link layer MIB for all ATM interfaces. Much of the
79219974Smav * information here is needed for ILMI. This will be augmented by statistics
80219974Smav * at some point.
81219974Smav */
82219974Smavstruct ifatm_mib {
83219974Smav	/* configuration data */
84219974Smav	uint8_t		device;		/* type of card */
85219974Smav	u_char		esi[6];		/* end system identifier (MAC) */
86219974Smav	uint32_t	serial;		/* card serial number */
87219974Smav	uint32_t	hw_version;	/* card version */
88219974Smav	uint32_t	sw_version;	/* firmware version (if any) */
89219974Smav	uint32_t	pcr;		/* supported peak cell rate */
90219974Smav	uint32_t	media;		/* physical media */
91219974Smav	uint8_t		vpi_bits;	/* number of used bits in VPI field */
92219974Smav	uint8_t		vci_bits;	/* number of used bits in VCI field */
93219974Smav	uint16_t	max_vpcs;	/* maximum number of VPCs */
94219974Smav	uint32_t	max_vccs;	/* maximum number of VCCs */
95219974Smav};
96219974Smav
97219974Smav/*
98219974Smav * Traffic parameters for ATM connections. This contains all parameters
99219974Smav * to accomodate UBR, UBR+MCR, CBR, VBR and ABR connections.
100219974Smav *
101219974Smav * Keep in sync with ng_atm.h
102219974Smav */
103219974Smavstruct atmio_tparam {
104219974Smav	uint32_t	pcr;	/* 24bit: Peak Cell Rate */
105219974Smav	uint32_t	scr;	/* 24bit: VBR Sustainable Cell Rate */
106219974Smav	uint32_t	mbs;	/* 24bit: VBR Maximum burst size */
107219974Smav	uint32_t	mcr;	/* 24bit: ABR/VBR/UBR+MCR MCR */
108219974Smav	uint32_t	icr;	/* 24bit: ABR ICR */
109219974Smav	uint32_t	tbe;	/* 24bit: ABR TBE (1...2^24-1) */
110219974Smav	uint8_t		nrm;	/*  3bit: ABR Nrm */
111219974Smav	uint8_t		trm;	/*  3bit: ABR Trm */
112219974Smav	uint16_t	adtf;	/* 10bit: ABR ADTF */
113219974Smav	uint8_t		rif;	/*  4bit: ABR RIF */
114219974Smav	uint8_t		rdf;	/*  4bit: ABR RDF */
115219974Smav	uint8_t		cdf;	/*  3bit: ABR CDF */
116219974Smav};
117219974Smav
118219974Smav/*
119219974Smav * VCC parameters
120219974Smav *
121219974Smav * Keep in sync with ng_atm.h
122219974Smav */
123219974Smavstruct atmio_vcc {
124219974Smav	uint16_t	flags;		/* VCC flags */
125219974Smav	uint16_t	vpi;
126219974Smav	uint16_t	vci;
127219974Smav	uint16_t	rmtu;		/* maximum receive PDU */
128219974Smav	uint16_t	tmtu;		/* maximum transmit PDU */
129219974Smav	uint8_t		aal;		/* aal type */
130219974Smav	uint8_t		traffic;	/* traffic type */
131219974Smav	struct atmio_tparam tparam;	/* traffic parameters */
132219974Smav};
133219974Smav
134219974Smav/* VCC flags */
135219974Smav#define	ATMIO_FLAG_LLCSNAP	0x0002	/* same as ATM_PH_LLCSNAP */
136219974Smav#define	ATMIO_FLAG_NG		0x0010	/* owned by netgraph */
137219974Smav#define	ATMIO_FLAG_HARP		0x0020	/* owned by HARP */
138219974Smav#define	ATMIO_FLAG_NORX		0x0100	/* not receiving on this VCC */
139219974Smav#define	ATMIO_FLAG_NOTX		0x0200	/* not transmitting on this VCC */
140219974Smav#define	ATMIO_FLAG_PVC		0x0400	/* this is a PVC */
141219974Smav#define	ATMIO_FLAG_ASYNC	0x0800	/* async open/close */
142219974Smav#define	ATMIO_FLAGS	"\020\2LLCSNAP\5NG\6HARP\11NORX\12NOTX\13PVC\14ASYNC"
143219974Smav
144219974Smav#define	ATMIO_AAL_0		0	/* pure cells */
145219974Smav#define	ATMIO_AAL_34		4	/* AAL3 and 4 */
146219974Smav#define	ATMIO_AAL_5		5	/* AAL5 */
147219974Smav#define	ATMIO_AAL_RAW		10	/* whatever the card does */
148219974Smav
149219974Smav#define	ATMIO_TRAFFIC_UBR	0
150219974Smav#define	ATMIO_TRAFFIC_CBR	1
151219974Smav#define	ATMIO_TRAFFIC_ABR	2
152219974Smav#define	ATMIO_TRAFFIC_VBR	3
153219974Smav
154219974Smav/*
155219974Smav * VCC table
156219974Smav *
157219974Smav * Keep in sync with ng_atm.h
158219974Smav */
159219974Smavstruct atmio_vcctable {
160219974Smav	uint32_t	count;		/* number of vccs */
161219974Smav	struct atmio_vcc vccs[0];	/* array of VCCs */
162219974Smav};
163219974Smav
164219974Smav/*
165219974Smav * Peak cell rates for various physical media. Note, that there are
166219974Smav * different opinions on what the correct values are.
167219974Smav */
168219974Smav#define	ATM_RATE_25_6M		59259
169219974Smav#define	ATM_RATE_155M		353208
170219974Smav#define	ATM_RATE_622M		1412830
171219974Smav#define	ATM_RATE_2_4G		5651320
172219974Smav
173219974Smav#ifdef _KERNEL
174219974Smav/*
175219974Smav * Common fields for all ATM interfaces. Each driver's softc must start with
176219974Smav * this structure.
177219974Smav */
178219974Smavstruct ifatm {
179219974Smav	struct ifnet	*ifp;
180219974Smav	struct ifatm_mib mib;		/* exported data */
181219974Smav	void		*phy;		/* usually SUNI */
182219974Smav	void		*ngpriv;	/* netgraph link */
183219974Smav};
184219974Smav#define	IFP2IFATM(ifp)	((struct ifatm *)(ifp)->if_l2com)
185219974Smav#endif
186219974Smav
187219974Smav/*
188219974Smav * Keep structures in sync with ng_atm.h
189219974Smav *
190219974Smav * These are used by netgraph/harp to call the driver
191219974Smav * NATM uses the atm_pseudoioctl instead.
192219974Smav */
193219974Smavstruct atmio_openvcc {
194219974Smav	void		*rxhand;	/* handle argument */
195219974Smav	struct atmio_vcc param;		/* parameters */
196219974Smav};
197219974Smav
198219974Smavstruct atmio_closevcc {
199219974Smav	uint16_t	vpi;
200219974Smav	uint16_t	vci;
201219974Smav};
202219974Smav
203219974Smav#if defined(__NetBSD__) || defined(__OpenBSD__) || defined(__bsdi__)
204219974Smav#define	RTALLOC1(A,B)		rtalloc1((A),(B))
205219974Smav#elif defined(__FreeBSD__)
206219974Smav#define	RTALLOC1(A,B)		rtalloc1((A),(B),0UL)
207219974Smav#endif
208219974Smav
209219974Smav/*
210219974Smav * pseudo header for packet transmission
211219974Smav */
212219974Smavstruct atm_pseudohdr {
213219974Smav	uint8_t		atm_ph[4];	/* flags+VPI+VCI1(msb)+VCI2(lsb) */
214219974Smav};
215219974Smav
216219974Smav#define	ATM_PH_FLAGS(X)	((X)->atm_ph[0])
217219974Smav#define	ATM_PH_VPI(X)	((X)->atm_ph[1])
218219974Smav#define	ATM_PH_VCI(X)	((((X)->atm_ph[2]) << 8) | ((X)->atm_ph[3]))
219219974Smav#define	ATM_PH_SETVCI(X,V) { \
220219974Smav	(X)->atm_ph[2] = ((V) >> 8) & 0xff; \
221219974Smav	(X)->atm_ph[3] = ((V) & 0xff); \
222219974Smav}
223219974Smav
224219974Smav/* use AAL5? (0 == aal0) */
225219974Smav#define	ATM_PH_AAL5	0x01
226219974Smav/* use the LLC SNAP encoding (iff aal5) */
227219974Smav#define	ATM_PH_LLCSNAP ATMIO_FLAG_LLCSNAP
228219974Smav
229219974Smav#define	ATM_PH_DRIVER7  0x40	/* reserve for driver's use */
230219974Smav#define	ATM_PH_DRIVER8  0x80	/* reserve for driver's use */
231219974Smav
232219974Smav#define	ATMMTU		9180	/* ATM MTU size for IP */
233219974Smav				/* XXX: could be 9188 with LLC/SNAP according
234219974Smav					to comer */
235219974Smav
236219974Smav#define	SIOCATMGETVCCS	_IOW('a', 125, struct atmio_vcctable)
237219974Smav#define	SIOCATMOPENVCC	_IOR('a', 126, struct atmio_openvcc)
238219974Smav#define	SIOCATMCLOSEVCC _IOR('a', 127, struct atmio_closevcc)
239219974Smav
240219974Smav#define	SIOCATMGVCCS	_IOWR('i', 230, struct ifreq)
241219974Smav
242219974Smav/*
243219974Smav * XXX forget all the garbage in if_llc.h and do it the easy way
244219974Smav */
245219974Smav#define	ATMLLC_HDR "\252\252\3\0\0\0"
246219974Smavstruct atmllc {
247219974Smav	uint8_t		llchdr[6];	/* aa.aa.03.00.00.00 */
248219974Smav	uint8_t		type[2];	/* "ethernet" type */
249219974Smav};
250219974Smav
251219974Smav/* ATM_LLC macros: note type code in host byte order */
252219974Smav#define	ATM_LLC_TYPE(X) (((X)->type[0] << 8) | ((X)->type[1]))
253219974Smav#define	ATM_LLC_SETTYPE(X, V) do {		\
254219974Smav	(X)->type[0] = ((V) >> 8) & 0xff;	\
255219974Smav	(X)->type[1] = ((V) & 0xff);		\
256219974Smav    } while (0)
257219974Smav
258219974Smav/*
259219974Smav * Events that are emitted by the driver. Currently the only consumer
260219974Smav * of this is the netgraph node.
261219974Smav */
262219974Smav#define	ATMEV_FLOW_CONTROL	0x0001	/* channel busy state changed */
263219974Smav#define	ATMEV_IFSTATE_CHANGED	0x0002	/* up/down or carrier */
264219974Smav#define	ATMEV_VCC_CHANGED	0x0003	/* PVC deleted/create */
265219974Smav#define	ATMEV_ACR_CHANGED	0x0004	/* ABR ACR has changed */
266219974Smav
267219974Smavstruct atmev_flow_control {
268219974Smav	uint16_t	vpi;		/* channel that is changed */
269219974Smav	uint16_t	vci;
270219974Smav	u_int		busy : 1;	/* != 0 -> ATM layer busy */
271219974Smav};
272219974Smav
273219974Smavstruct atmev_ifstate_changed {
274219974Smav	u_int		running : 1;	/* interface is running now */
275219974Smav	u_int		carrier : 1;	/* carrier detected (or not) */
276219974Smav};
277219974Smav
278219974Smavstruct atmev_vcc_changed {
279219974Smav	uint16_t	vpi;		/* channel that is changed */
280219974Smav	uint16_t	vci;
281219974Smav	u_int		up : 1;		/* 1 - created, 0 - deleted */
282219974Smav};
283219974Smav
284219974Smavstruct atmev_acr_changed {
285219974Smav	uint16_t	vpi;		/* channel that is changed */
286219974Smav	uint16_t	vci;
287219974Smav	uint32_t	acr;		/* new ACR */
288219974Smav};
289219974Smav
290219974Smav#ifdef _KERNEL
291219974Smavvoid	atm_ifattach(struct ifnet *);
292219974Smavvoid	atm_ifdetach(struct ifnet *);
293219974Smavvoid	atm_input(struct ifnet *, struct atm_pseudohdr *,
294219974Smav	    struct mbuf *, void *);
295219974Smavint	atm_output(struct ifnet *, struct mbuf *, const struct sockaddr *,
296219974Smav	    struct route *);
297219974Smavstruct atmio_vcctable *atm_getvccs(struct atmio_vcc **, u_int, u_int,
298219974Smav	    struct mtx *, int);
299219974Smav
300219974Smavvoid	atm_event(struct ifnet *, u_int, void *);
301219974Smav
302219974Smav#define	ATMEV_SEND_FLOW_CONTROL(ATMIF, VPI, VCI, BUSY)			\
303219974Smav	do {								\
304219974Smav		struct atmev_flow_control _arg;				\
305219974Smav		_arg.vpi = (VPI);					\
306219974Smav		_arg.vci = (VCI);					\
307219974Smav		_arg.busy = (BUSY);					\
308219974Smav		atm_event((ATMIF)->ifp, ATMEV_FLOW_CONTROL, &_arg);	\
309219974Smav	} while (0)
310219974Smav
311219974Smav#define	ATMEV_SEND_VCC_CHANGED(ATMIF, VPI, VCI, UP)			\
312219974Smav	do {								\
313219974Smav		struct atmev_vcc_changed _arg;				\
314219974Smav		_arg.vpi = (VPI);					\
315219974Smav		_arg.vci = (VCI);					\
316219974Smav		_arg.up = (UP);						\
317219974Smav		atm_event((ATMIF)->ifp, ATMEV_VCC_CHANGED, &_arg);	\
318219974Smav	} while (0)
319219974Smav
320219974Smav#define	ATMEV_SEND_IFSTATE_CHANGED(ATMIF, CARRIER)			\
321219974Smav	do {								\
322219974Smav		struct atmev_ifstate_changed _arg;			\
323219974Smav		_arg.running = (((ATMIF)->ifp->if_drv_flags &		\
324219974Smav		    IFF_DRV_RUNNING) != 0);				\
325219974Smav		_arg.carrier = ((CARRIER) != 0);			\
326219974Smav		atm_event((ATMIF)->ifp, ATMEV_IFSTATE_CHANGED, &_arg); \
327219974Smav	} while (0)
328219974Smav
329219974Smav#define	ATMEV_SEND_ACR_CHANGED(ATMIF, VPI, VCI, ACR)			\
330219974Smav	do {								\
331219974Smav		struct atmev_acr_changed _arg;				\
332219974Smav		_arg.vpi = (VPI);					\
333219974Smav		_arg.vci = (VCI);					\
334219974Smav		_arg.acr= (ACR);					\
335219974Smav		atm_event((ATMIF)->ifp, ATMEV_ACR_CHANGED, &_arg);	\
336219974Smav	} while (0)
337219974Smav#endif
338219974Smav