1 /*      $NetBSD: if_atm.h,v 1.21 2016/04/28 00:16:56 ozaki-r Exp $       */
2 
3 /*
4  * Copyright (c) 1996 Charles D. Cranor and Washington University.
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27 
28 /*
29  * net/if_atm.h
30  */
31 
32 #ifndef _NET_IF_ATM_H_
33 #define _NET_IF_ATM_H_
34 
35 #include <sys/ioccom.h>
36 
37 #if (defined(__FreeBSD__) || defined(__bsdi__)) && defined(KERNEL)
38 #ifndef _KERNEL
39 #define _KERNEL
40 #endif
41 #endif /* freebsd doesn't define _KERNEL */
42 
43 #ifndef NO_ATM_PVCEXT
44 /*
45  * ATM_PVCEXT enables PVC extension: VP/VC shaping
46  * and PVC shadow interfaces.
47  */
48 #define ATM_PVCEXT	/* enable pvc extension */
49 #endif
50 
51 #if defined(__NetBSD__) || defined(__OpenBSD__) || defined(__bsdi__)
52 #define RTALLOC1(A,B)		rtalloc1((A),(B))
53 #elif defined(__FreeBSD__)
54 #define RTALLOC1(A,B)		rtalloc1((A),(B),0UL)
55 #endif
56 
57 /*
58  * pseudo header for packet transmission
59  */
60 
61 struct atm_pseudohdr {
62   uint8_t atm_ph[4];	/* flags+VPI+VCI1(msb)+VCI2(lsb) */
63 };
64 
65 #define ATM_PH_FLAGS(X)	((X)->atm_ph[0])
66 #define ATM_PH_VPI(X)	((X)->atm_ph[1])
67 #define ATM_PH_VCI(X)	((((X)->atm_ph[2]) << 8) | ((X)->atm_ph[3]))
68 #define ATM_PH_SETVCI(X,V) { \
69 	(X)->atm_ph[2] = ((V) >> 8) & 0xff; \
70 	(X)->atm_ph[3] = ((V) & 0xff); \
71 }
72 
73 #define ATM_PH_AAL5    0x01	/* use AAL5? (0 == aal0) */
74 #define ATM_PH_LLCSNAP 0x02	/* use the LLC SNAP encoding (iff aal5) */
75 
76 #ifdef ATM_PVCEXT
77 #define ATM_PH_INERNAL  0x20	/* reserve for kernel internal use */
78 #endif
79 #define ATM_PH_DRIVER7  0x40	/* reserve for driver's use */
80 #define ATM_PH_DRIVER8  0x80	/* reserve for driver's use */
81 
82 #define ATMMTU		9180	/* ATM MTU size for IP */
83 				/* XXX: could be 9188 with LLC/SNAP according
84 					to comer */
85 
86 /* user's ioctl hook for raw atm mode */
87 #define SIOCRAWATM	_IOWR('a', 122, int)	/* set driver's raw mode */
88 
89 /* atm_pseudoioctl: turns on and off RX VCIs  [for internal use only!] */
90 struct atm_pseudoioctl {
91   struct atm_pseudohdr aph;
92   void *rxhand;
93 };
94 #define SIOCATMENA	_IOWR('a', 123, struct atm_pseudoioctl) /* enable */
95 #define SIOCATMDIS	_IOWR('a', 124, struct atm_pseudoioctl) /* disable */
96 
97 #ifdef ATM_PVCEXT
98 
99 /* structure to control PVC transmitter */
100 struct pvctxreq {
101     /* first entry must be compatible with struct ifreq */
102     char pvc_ifname[IFNAMSIZ];		/* if name, e.g. "en0" */
103     struct atm_pseudohdr pvc_aph;	/* (flags) + vpi:vci */
104     struct atm_pseudohdr pvc_joint;	/* for vp shaping: another vc
105 					   to share the shaper */
106     int pvc_pcr;			/* peak cell rate (shaper value) */
107 };
108 
109 /* use ifioctl for now */
110 #define SIOCSPVCTX	_IOWR('i', 95, struct pvctxreq)
111 #define SIOCGPVCTX	_IOWR('i', 96, struct pvctxreq)
112 #define SIOCSPVCSIF	_IOWR('i', 97, struct ifreq)
113 #define SIOCGPVCSIF	_IOWR('i', 98, struct ifreq)
114 
115 #endif /* ATM_PVCEXT */
116 
117 /*
118  * XXX forget all the garbage in if_llc.h and do it the easy way
119  */
120 
121 #define ATMLLC_HDR "\252\252\3\0\0\0"
122 struct atmllc {
123   uint8_t llchdr[6];	/* aa.aa.03.00.00.00 */
124   uint8_t type[2];	/* "ethernet" type */
125 } __packed;
126 
127 /* ATM_LLC macros: note type code in host byte order */
128 #define ATM_LLC_TYPE(X) (((X)->type[0] << 8) | ((X)->type[1]))
129 #define ATM_LLC_SETTYPE(X,V) { \
130 	(X)->type[0] = ((V) >> 8) & 0xff; \
131 	(X)->type[1] = ((V) & 0xff); \
132 }
133 
134 #ifdef _KERNEL
135 void	atm_ifattach(struct ifnet *);
136 void	atm_input(struct ifnet *, struct atm_pseudohdr *,
137 		struct mbuf *, void *);
138 int	atm_output(struct ifnet *, struct mbuf *, const struct sockaddr *,
139 		const struct rtentry *);
140 #endif
141 #ifdef ATM_PVCEXT
142 #ifdef _KERNEL
143 #include <sys/queue.h>
144 /*
145  * ATM PVC subinterface: a trick to assign a subinterface
146  * to a PVC.
147  * with a pvc subinterface, each PVC looks like an individual
148  * Point-to-Point interface.
149  * as opposed to the NBMA model, a pvc subinterface is inherently
150  * multicast capable (no LANE/MARS required).
151  */
152 struct pvcsif {
153 	/*
154 	 * The ifnet struct _must_ be at the head of this structure.
155 	 */
156 	struct ifnet sif_if;		/* ifnet structure per pvc */
157 	struct atm_pseudohdr sif_aph;	/* flags + vpi:vci */
158 	int	sif_vci;		/* vci no */
159 	LIST_ENTRY(pvcsif) sif_links;
160 };
161 struct ifnet *pvcsif_alloc(void);
162 #endif
163 #endif /* ATM_PVCEXT */
164 #endif /* !_NET_IF_ATM_H_ */
165