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