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