125603Skjc/* $NetBSD: if_atm.h,v 1.7 1996/11/09 23:02:27 chuck Exp $ */ 255205Speter/* $FreeBSD$ */ 325603Skjc 4139823Simp/*- 525603Skjc * 625603Skjc * Copyright (c) 1996 Charles D. Cranor and Washington University. 725603Skjc * All rights reserved. 825603Skjc * 925603Skjc * Redistribution and use in source and binary forms, with or without 1025603Skjc * modification, are permitted provided that the following conditions 1125603Skjc * are met: 1225603Skjc * 1. Redistributions of source code must retain the above copyright 1325603Skjc * notice, this list of conditions and the following disclaimer. 1425603Skjc * 2. Redistributions in binary form must reproduce the above copyright 1525603Skjc * notice, this list of conditions and the following disclaimer in the 1625603Skjc * documentation and/or other materials provided with the distribution. 1725603Skjc * 3. All advertising materials mentioning features or use of this software 1825603Skjc * must display the following acknowledgement: 1925603Skjc * This product includes software developed by Charles D. Cranor and 2025603Skjc * Washington University. 2125603Skjc * 4. The name of the author may not be used to endorse or promote products 2225603Skjc * derived from this software without specific prior written permission. 2325603Skjc * 2425603Skjc * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 2525603Skjc * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 2625603Skjc * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 2725603Skjc * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 2825603Skjc * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 2925603Skjc * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 3025603Skjc * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 3125603Skjc * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 3225603Skjc * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 3325603Skjc * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3425603Skjc */ 3525603Skjc 3625603Skjc/* 3725603Skjc * net/if_atm.h 3825603Skjc */ 3925603Skjc 40114739Sharti/* 41114739Sharti * Classification of ATM cards. 42114739Sharti */ 43116523Sharti#define ATM_DEVICE_UNKNOWN 0 44116523Sharti#define ATM_DEVICE_PCA200E 1 /* Fore/Marconi PCA200-E */ 45116523Sharti#define ATM_DEVICE_HE155 2 /* Fore/Marconi HE155 */ 46116523Sharti#define ATM_DEVICE_HE622 3 /* Fore/Marconi HE622 */ 47116523Sharti#define ATM_DEVICE_ENI155P 4 /* Efficient networks 155p */ 48116523Sharti#define ATM_DEVICE_ADP155P 5 /* Adaptec 155p */ 49116441Sharti#define ATM_DEVICE_FORELE25 6 /* ForeRunnerLE 25 */ 50116441Sharti#define ATM_DEVICE_FORELE155 7 /* ForeRunnerLE 155 */ 51116523Sharti#define ATM_DEVICE_NICSTAR25 8 /* other 77211 25.6MBit */ 52116441Sharti#define ATM_DEVICE_NICSTAR155 9 /* other 77211 155MBit */ 53117628Sharti#define ATM_DEVICE_IDTABR25 10 /* 77252 based card 25MBit */ 54117628Sharti#define ATM_DEVICE_IDTABR155 11 /* 77252 based card 155MBit */ 55117721Sharti#define ATM_DEVICE_PROATM25 12 /* 77252 based ProSum card 25MBit */ 56117721Sharti#define ATM_DEVICE_PROATM155 13 /* 77252 based ProSum card 155MBit */ 57125017Sharti#define ATM_DEVICE_VIRTUAL 14 /* virtual ATM device (netgraph) */ 58114739Sharti 59114739Sharti/* map to strings and vendors */ 60116523Sharti#define ATM_DEVICE_NAMES \ 61116441Sharti { "Unknown", "Unknown" }, \ 62116441Sharti { "PCA200-E", "Fore/Marconi" }, \ 63116441Sharti { "HE155", "Fore/Marconi" }, \ 64116441Sharti { "HE622", "Fore/Marconi" }, \ 65116441Sharti { "ENI155p", "Efficient Networks" }, \ 66116441Sharti { "ADP155p", "Adaptec" }, \ 67116441Sharti { "ForeRunnerLE25", "Fore/Marconi" }, \ 68116441Sharti { "ForeRunnerLE155", "Fore/Marconi" }, \ 69116441Sharti { "IDT77211/25", "IDT" }, \ 70117628Sharti { "IDT77211/155", "IDT" }, \ 71117628Sharti { "IDT77252/25", "IDT" }, \ 72117628Sharti { "IDT77252/155", "IDT" }, \ 73117628Sharti { "ProATM/25", "ProSum" }, \ 74125017Sharti { "ProATM/155", "ProSum" }, \ 75125017Sharti { "Virtual", "NetGraph" }, 76114739Sharti 77114739Sharti/* 78114739Sharti * This is the common link layer MIB for all ATM interfaces. Much of the 79114739Sharti * information here is needed for ILMI. This will be augmented by statistics 80114739Sharti * at some point. 81114739Sharti */ 82114739Shartistruct ifatm_mib { 83114739Sharti /* configuration data */ 84114739Sharti uint8_t device; /* type of card */ 85114739Sharti u_char esi[6]; /* end system identifier (MAC) */ 86114739Sharti uint32_t serial; /* card serial number */ 87114739Sharti uint32_t hw_version; /* card version */ 88114739Sharti uint32_t sw_version; /* firmware version (if any) */ 89114739Sharti uint32_t pcr; /* supported peak cell rate */ 90114739Sharti uint32_t media; /* physical media */ 91114739Sharti uint8_t vpi_bits; /* number of used bits in VPI field */ 92114739Sharti uint8_t vci_bits; /* number of used bits in VCI field */ 93114739Sharti uint16_t max_vpcs; /* maximum number of VPCs */ 94114739Sharti uint32_t max_vccs; /* maximum number of VCCs */ 95114739Sharti}; 96114739Sharti 97114739Sharti/* 98116441Sharti * Traffic parameters for ATM connections. This contains all parameters 99116441Sharti * to accomodate UBR, UBR+MCR, CBR, VBR and ABR connections. 100116441Sharti * 101116441Sharti * Keep in sync with ng_atm.h 102116441Sharti */ 103116441Shartistruct atmio_tparam { 104116441Sharti uint32_t pcr; /* 24bit: Peak Cell Rate */ 105116441Sharti uint32_t scr; /* 24bit: VBR Sustainable Cell Rate */ 106116441Sharti uint32_t mbs; /* 24bit: VBR Maximum burst size */ 107116441Sharti uint32_t mcr; /* 24bit: ABR/VBR/UBR+MCR MCR */ 108116441Sharti uint32_t icr; /* 24bit: ABR ICR */ 109116441Sharti uint32_t tbe; /* 24bit: ABR TBE (1...2^24-1) */ 110116441Sharti uint8_t nrm; /* 3bit: ABR Nrm */ 111116441Sharti uint8_t trm; /* 3bit: ABR Trm */ 112116441Sharti uint16_t adtf; /* 10bit: ABR ADTF */ 113116441Sharti uint8_t rif; /* 4bit: ABR RIF */ 114116441Sharti uint8_t rdf; /* 4bit: ABR RDF */ 115116441Sharti uint8_t cdf; /* 3bit: ABR CDF */ 116116441Sharti}; 117116441Sharti 118116441Sharti/* 119116441Sharti * VCC parameters 120116441Sharti * 121116441Sharti * Keep in sync with ng_atm.h 122116441Sharti */ 123116441Shartistruct atmio_vcc { 124116441Sharti uint16_t flags; /* VCC flags */ 125116441Sharti uint16_t vpi; 126116441Sharti uint16_t vci; 127116441Sharti uint16_t rmtu; /* maximum receive PDU */ 128116441Sharti uint16_t tmtu; /* maximum transmit PDU */ 129116441Sharti uint8_t aal; /* aal type */ 130116441Sharti uint8_t traffic; /* traffic type */ 131116441Sharti struct atmio_tparam tparam; /* traffic parameters */ 132116441Sharti}; 133116441Sharti 134116441Sharti/* VCC flags */ 135116523Sharti#define ATMIO_FLAG_LLCSNAP 0x0002 /* same as ATM_PH_LLCSNAP */ 136116523Sharti#define ATMIO_FLAG_NG 0x0010 /* owned by netgraph */ 137116523Sharti#define ATMIO_FLAG_HARP 0x0020 /* owned by HARP */ 138116523Sharti#define ATMIO_FLAG_NORX 0x0100 /* not receiving on this VCC */ 139116523Sharti#define ATMIO_FLAG_NOTX 0x0200 /* not transmitting on this VCC */ 140116523Sharti#define ATMIO_FLAG_PVC 0x0400 /* this is a PVC */ 141118496Sharti#define ATMIO_FLAG_ASYNC 0x0800 /* async open/close */ 142118496Sharti#define ATMIO_FLAGS "\020\2LLCSNAP\5NG\6HARP\11NORX\12NOTX\13PVC\14ASYNC" 143116441Sharti 144116523Sharti#define ATMIO_AAL_0 0 /* pure cells */ 145116523Sharti#define ATMIO_AAL_34 4 /* AAL3 and 4 */ 146116523Sharti#define ATMIO_AAL_5 5 /* AAL5 */ 147116523Sharti#define ATMIO_AAL_RAW 10 /* whatever the card does */ 148116441Sharti 149116523Sharti#define ATMIO_TRAFFIC_UBR 0 150116523Sharti#define ATMIO_TRAFFIC_CBR 1 151116523Sharti#define ATMIO_TRAFFIC_ABR 2 152116523Sharti#define ATMIO_TRAFFIC_VBR 3 153116441Sharti 154116441Sharti/* 155116441Sharti * VCC table 156116441Sharti * 157116441Sharti * Keep in sync with ng_atm.h 158116441Sharti */ 159116441Shartistruct atmio_vcctable { 160116441Sharti uint32_t count; /* number of vccs */ 161116441Sharti struct atmio_vcc vccs[0]; /* array of VCCs */ 162116441Sharti}; 163116441Sharti 164116441Sharti/* 165116441Sharti * Peak cell rates for various physical media. Note, that there are 166116441Sharti * different opinions on what the correct values are. 167116441Sharti */ 168116441Sharti#define ATM_RATE_25_6M 59259 169116523Sharti#define ATM_RATE_155M 353208 170116523Sharti#define ATM_RATE_622M 1412830 171116523Sharti#define ATM_RATE_2_4G 5651320 172116441Sharti 173117625Sharti#ifdef _KERNEL 174116441Sharti/* 175114739Sharti * Common fields for all ATM interfaces. Each driver's softc must start with 176114739Sharti * this structure. 177114739Sharti */ 178114739Shartistruct ifatm { 179147256Sbrooks struct ifnet *ifp; 180114739Sharti struct ifatm_mib mib; /* exported data */ 181114739Sharti void *phy; /* usually SUNI */ 182114739Sharti void *ngpriv; /* netgraph link */ 183114739Sharti}; 184147256Sbrooks#define IFP2IFATM(ifp) ((struct ifatm *)(ifp)->if_l2com) 185117625Sharti#endif 186114739Sharti 187116480Sharti/* 188116480Sharti * Keep structures in sync with ng_atm.h 189116480Sharti * 190116480Sharti * These are used by netgraph/harp to call the driver 191116480Sharti * NATM uses the atm_pseudoioctl instead. 192116480Sharti */ 193116480Shartistruct atmio_openvcc { 194116480Sharti void *rxhand; /* handle argument */ 195116480Sharti struct atmio_vcc param; /* parameters */ 196116480Sharti}; 197116480Sharti 198116480Shartistruct atmio_closevcc { 199116480Sharti uint16_t vpi; 200116480Sharti uint16_t vci; 201116480Sharti}; 202116480Sharti 20325603Skjc#if defined(__NetBSD__) || defined(__OpenBSD__) || defined(__bsdi__) 204116523Sharti#define RTALLOC1(A,B) rtalloc1((A),(B)) 20525603Skjc#elif defined(__FreeBSD__) 206116523Sharti#define RTALLOC1(A,B) rtalloc1((A),(B),0UL) 20725603Skjc#endif 20825603Skjc 20925603Skjc/* 21025603Skjc * pseudo header for packet transmission 21125603Skjc */ 21225603Skjcstruct atm_pseudohdr { 213116523Sharti uint8_t atm_ph[4]; /* flags+VPI+VCI1(msb)+VCI2(lsb) */ 21425603Skjc}; 21525603Skjc 216116523Sharti#define ATM_PH_FLAGS(X) ((X)->atm_ph[0]) 217116523Sharti#define ATM_PH_VPI(X) ((X)->atm_ph[1]) 218116523Sharti#define ATM_PH_VCI(X) ((((X)->atm_ph[2]) << 8) | ((X)->atm_ph[3])) 219116523Sharti#define ATM_PH_SETVCI(X,V) { \ 22025603Skjc (X)->atm_ph[2] = ((V) >> 8) & 0xff; \ 22125603Skjc (X)->atm_ph[3] = ((V) & 0xff); \ 22225603Skjc} 22325603Skjc 224117627Sharti/* use AAL5? (0 == aal0) */ 225118548Sharti#define ATM_PH_AAL5 0x01 226117627Sharti/* use the LLC SNAP encoding (iff aal5) */ 227117627Sharti#define ATM_PH_LLCSNAP ATMIO_FLAG_LLCSNAP 22825603Skjc 229116523Sharti#define ATM_PH_DRIVER7 0x40 /* reserve for driver's use */ 230116523Sharti#define ATM_PH_DRIVER8 0x80 /* reserve for driver's use */ 23125603Skjc 232116523Sharti#define ATMMTU 9180 /* ATM MTU size for IP */ 23325603Skjc /* XXX: could be 9188 with LLC/SNAP according 23425603Skjc to comer */ 23525603Skjc 236116523Sharti#define SIOCATMGETVCCS _IOW('a', 125, struct atmio_vcctable) 237116523Sharti#define SIOCATMOPENVCC _IOR('a', 126, struct atmio_openvcc) 238116523Sharti#define SIOCATMCLOSEVCC _IOR('a', 127, struct atmio_closevcc) 23925603Skjc 240116523Sharti#define SIOCATMGVCCS _IOWR('i', 230, struct ifreq) 24137939Skjc 24225603Skjc/* 24325603Skjc * XXX forget all the garbage in if_llc.h and do it the easy way 24425603Skjc */ 245116523Sharti#define ATMLLC_HDR "\252\252\3\0\0\0" 24625603Skjcstruct atmllc { 247116523Sharti uint8_t llchdr[6]; /* aa.aa.03.00.00.00 */ 248116523Sharti uint8_t type[2]; /* "ethernet" type */ 24925603Skjc}; 25025603Skjc 25125603Skjc/* ATM_LLC macros: note type code in host byte order */ 252116523Sharti#define ATM_LLC_TYPE(X) (((X)->type[0] << 8) | ((X)->type[1])) 253116523Sharti#define ATM_LLC_SETTYPE(X, V) do { \ 254116523Sharti (X)->type[0] = ((V) >> 8) & 0xff; \ 255116523Sharti (X)->type[1] = ((V) & 0xff); \ 256116523Sharti } while (0) 25725603Skjc 258118157Sharti/* 259118157Sharti * Events that are emitted by the driver. Currently the only consumer 260118157Sharti * of this is the netgraph node. 261118157Sharti */ 262118157Sharti#define ATMEV_FLOW_CONTROL 0x0001 /* channel busy state changed */ 263118157Sharti#define ATMEV_IFSTATE_CHANGED 0x0002 /* up/down or carrier */ 264118157Sharti#define ATMEV_VCC_CHANGED 0x0003 /* PVC deleted/create */ 265118157Sharti#define ATMEV_ACR_CHANGED 0x0004 /* ABR ACR has changed */ 266118157Sharti 267118157Shartistruct atmev_flow_control { 268118157Sharti uint16_t vpi; /* channel that is changed */ 269118157Sharti uint16_t vci; 270118157Sharti u_int busy : 1; /* != 0 -> ATM layer busy */ 271118157Sharti}; 272118157Sharti 273118157Shartistruct atmev_ifstate_changed { 274118157Sharti u_int running : 1; /* interface is running now */ 275118157Sharti u_int carrier : 1; /* carrier detected (or not) */ 276118157Sharti}; 277118157Sharti 278118157Shartistruct atmev_vcc_changed { 279118157Sharti uint16_t vpi; /* channel that is changed */ 280118157Sharti uint16_t vci; 281118157Sharti u_int up : 1; /* 1 - created, 0 - deleted */ 282118157Sharti}; 283118157Sharti 284118157Shartistruct atmev_acr_changed { 285118157Sharti uint16_t vpi; /* channel that is changed */ 286118157Sharti uint16_t vci; 287118157Sharti uint32_t acr; /* new ACR */ 288118157Sharti}; 289118157Sharti 29025603Skjc#ifdef _KERNEL 29192725Salfredvoid atm_ifattach(struct ifnet *); 292114201Shartivoid atm_ifdetach(struct ifnet *); 29392725Salfredvoid atm_input(struct ifnet *, struct atm_pseudohdr *, 294116523Sharti struct mbuf *, void *); 295249925Sglebiusint atm_output(struct ifnet *, struct mbuf *, const struct sockaddr *, 296191148Skmacy struct route *); 297117630Shartistruct atmio_vcctable *atm_getvccs(struct atmio_vcc **, u_int, u_int, 298117630Sharti struct mtx *, int); 299118157Sharti 300118157Shartivoid atm_event(struct ifnet *, u_int, void *); 301118157Sharti 302118157Sharti#define ATMEV_SEND_FLOW_CONTROL(ATMIF, VPI, VCI, BUSY) \ 303118157Sharti do { \ 304118157Sharti struct atmev_flow_control _arg; \ 305118157Sharti _arg.vpi = (VPI); \ 306118157Sharti _arg.vci = (VCI); \ 307118157Sharti _arg.busy = (BUSY); \ 308147256Sbrooks atm_event((ATMIF)->ifp, ATMEV_FLOW_CONTROL, &_arg); \ 309118157Sharti } while (0) 310118157Sharti 311118157Sharti#define ATMEV_SEND_VCC_CHANGED(ATMIF, VPI, VCI, UP) \ 312118157Sharti do { \ 313118157Sharti struct atmev_vcc_changed _arg; \ 314118157Sharti _arg.vpi = (VPI); \ 315118157Sharti _arg.vci = (VCI); \ 316118157Sharti _arg.up = (UP); \ 317147256Sbrooks atm_event((ATMIF)->ifp, ATMEV_VCC_CHANGED, &_arg); \ 318118157Sharti } while (0) 319118157Sharti 320118157Sharti#define ATMEV_SEND_IFSTATE_CHANGED(ATMIF, CARRIER) \ 321118157Sharti do { \ 322118157Sharti struct atmev_ifstate_changed _arg; \ 323148887Srwatson _arg.running = (((ATMIF)->ifp->if_drv_flags & \ 324148887Srwatson IFF_DRV_RUNNING) != 0); \ 325118157Sharti _arg.carrier = ((CARRIER) != 0); \ 326147256Sbrooks atm_event((ATMIF)->ifp, ATMEV_IFSTATE_CHANGED, &_arg); \ 327118157Sharti } while (0) 328118157Sharti 329118157Sharti#define ATMEV_SEND_ACR_CHANGED(ATMIF, VPI, VCI, ACR) \ 330118157Sharti do { \ 331118157Sharti struct atmev_acr_changed _arg; \ 332118157Sharti _arg.vpi = (VPI); \ 333118157Sharti _arg.vci = (VCI); \ 334118157Sharti _arg.acr= (ACR); \ 335147256Sbrooks atm_event((ATMIF)->ifp, ATMEV_ACR_CHANGED, &_arg); \ 336118157Sharti } while (0) 33725603Skjc#endif 338