1/* $NetBSD: if_atm.h,v 1.18 2008/02/20 17:05:52 matt 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#if (defined(__FreeBSD__) || defined(__bsdi__)) && defined(KERNEL) 36#ifndef _KERNEL 37#define _KERNEL 38#endif 39#endif /* freebsd doesn't define _KERNEL */ 40 41#ifndef NO_ATM_PVCEXT 42/* 43 * ATM_PVCEXT enables PVC extension: VP/VC shaping 44 * and PVC shadow interfaces. 45 */ 46#define ATM_PVCEXT /* enable pvc extension */ 47#endif 48 49#if defined(__NetBSD__) || defined(__OpenBSD__) || defined(__bsdi__) 50#define RTALLOC1(A,B) rtalloc1((A),(B)) 51#elif defined(__FreeBSD__) 52#define RTALLOC1(A,B) rtalloc1((A),(B),0UL) 53#endif 54 55/* 56 * pseudo header for packet transmission 57 */ 58 59struct atm_pseudohdr { 60 uint8_t atm_ph[4]; /* flags+VPI+VCI1(msb)+VCI2(lsb) */ 61}; 62 63#define ATM_PH_FLAGS(X) ((X)->atm_ph[0]) 64#define ATM_PH_VPI(X) ((X)->atm_ph[1]) 65#define ATM_PH_VCI(X) ((((X)->atm_ph[2]) << 8) | ((X)->atm_ph[3])) 66#define ATM_PH_SETVCI(X,V) { \ 67 (X)->atm_ph[2] = ((V) >> 8) & 0xff; \ 68 (X)->atm_ph[3] = ((V) & 0xff); \ 69} 70 71#define ATM_PH_AAL5 0x01 /* use AAL5? (0 == aal0) */ 72#define ATM_PH_LLCSNAP 0x02 /* use the LLC SNAP encoding (iff aal5) */ 73 74#ifdef ATM_PVCEXT 75#define ATM_PH_INERNAL 0x20 /* reserve for kernel internal use */ 76#endif 77#define ATM_PH_DRIVER7 0x40 /* reserve for driver's use */ 78#define ATM_PH_DRIVER8 0x80 /* reserve for driver's use */ 79 80#define ATMMTU 9180 /* ATM MTU size for IP */ 81 /* XXX: could be 9188 with LLC/SNAP according 82 to comer */ 83 84/* user's ioctl hook for raw atm mode */ 85#define SIOCRAWATM _IOWR('a', 122, int) /* set driver's raw mode */ 86 87/* atm_pseudoioctl: turns on and off RX VCIs [for internal use only!] */ 88struct atm_pseudoioctl { 89 struct atm_pseudohdr aph; 90 void *rxhand; 91}; 92#define SIOCATMENA _IOWR('a', 123, struct atm_pseudoioctl) /* enable */ 93#define SIOCATMDIS _IOWR('a', 124, struct atm_pseudoioctl) /* disable */ 94 95#ifdef ATM_PVCEXT 96 97/* structure to control PVC transmitter */ 98struct pvctxreq { 99 /* first entry must be compatible with struct ifreq */ 100 char pvc_ifname[IFNAMSIZ]; /* if name, e.g. "en0" */ 101 struct atm_pseudohdr pvc_aph; /* (flags) + vpi:vci */ 102 struct atm_pseudohdr pvc_joint; /* for vp shaping: another vc 103 to share the shaper */ 104 int pvc_pcr; /* peak cell rate (shaper value) */ 105}; 106 107/* use ifioctl for now */ 108#define SIOCSPVCTX _IOWR('i', 95, struct pvctxreq) 109#define SIOCGPVCTX _IOWR('i', 96, struct pvctxreq) 110#define SIOCSPVCSIF _IOWR('i', 97, struct ifreq) 111#define SIOCGPVCSIF _IOWR('i', 98, struct ifreq) 112 113#endif /* ATM_PVCEXT */ 114 115/* 116 * XXX forget all the garbage in if_llc.h and do it the easy way 117 */ 118 119#define ATMLLC_HDR "\252\252\3\0\0\0" 120struct atmllc { 121 uint8_t llchdr[6]; /* aa.aa.03.00.00.00 */ 122 uint8_t type[2]; /* "ethernet" type */ 123} __packed; 124 125/* ATM_LLC macros: note type code in host byte order */ 126#define ATM_LLC_TYPE(X) (((X)->type[0] << 8) | ((X)->type[1])) 127#define ATM_LLC_SETTYPE(X,V) { \ 128 (X)->type[0] = ((V) >> 8) & 0xff; \ 129 (X)->type[1] = ((V) & 0xff); \ 130} 131 132#ifdef _KERNEL 133void atm_ifattach(struct ifnet *); 134void atm_input(struct ifnet *, struct atm_pseudohdr *, 135 struct mbuf *, void *); 136int atm_output(struct ifnet *, struct mbuf *, const struct sockaddr *, 137 struct rtentry *); 138#endif 139#ifdef ATM_PVCEXT 140#ifdef _KERNEL 141#include <sys/queue.h> 142/* 143 * ATM PVC subinterface: a trick to assign a subinterface 144 * to a PVC. 145 * with a pvc subinterface, each PVC looks like an individual 146 * Point-to-Point interface. 147 * as opposed to the NBMA model, a pvc subinterface is inherently 148 * multicast capable (no LANE/MARS required). 149 */ 150struct pvcsif { 151 /* 152 * The ifnet struct _must_ be at the head of this structure. 153 */ 154 struct ifnet sif_if; /* ifnet structure per pvc */ 155 struct atm_pseudohdr sif_aph; /* flags + vpi:vci */ 156 int sif_vci; /* vci no */ 157 LIST_ENTRY(pvcsif) sif_links; 158}; 159struct ifnet *pvcsif_alloc(void); 160#endif 161#endif /* ATM_PVCEXT */ 162#endif /* !_NET_IF_ATM_H_ */ 163