1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License, Version 1.0 only 6 * (the "License"). You may not use this file except in compliance 7 * with the License. 8 * 9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 * or http://www.opensolaris.org/os/licensing. 11 * See the License for the specific language governing permissions 12 * and limitations under the License. 13 * 14 * When distributing Covered Code, include this CDDL HEADER in each 15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 * If applicable, add the following below this CDDL HEADER, with the 17 * fields enclosed by brackets "[]" replaced with your own identifying 18 * information: Portions Copyright [yyyy] [name of copyright owner] 19 * 20 * CDDL HEADER END 21 */ 22 /* 23 * llc1 - an LLC Class 1 MUX compatible with SunConnect LLC2 uses DLPI 24 * interface. 25 * 26 * Copyrighted as an unpublished work. 27 * Copyright 1992-2002 Sun Microsystems, Inc. All rights reserved. 28 * Use is subject to license terms. 29 */ 30 31 #ifndef _SYS_LLC1_H 32 #define _SYS_LLC1_H 33 34 #pragma ident "%Z%%M% %I% %E% SMI" 35 36 #ifdef __cplusplus 37 extern "C" { 38 #endif 39 40 struct llc_stats { 41 long llcs_nobuffer; 42 long llcs_multixmt; 43 long llcs_multircv; /* multicast but note broadcast */ 44 long llcs_brdcstxmt; 45 long llcs_brdcstrcv; 46 long llcs_blocked; /* discard due to upstream being flow */ 47 /* controlled */ 48 long llcs_pktxmt; 49 long llcs_pktrcv; 50 long llcs_bytexmt; 51 long llcs_bytercv; 52 long llcs_xidxmt; 53 long llcs_xidrcv; 54 long llcs_testxmt; 55 long llcs_testrcv; 56 long llcs_ierrors; 57 long llcs_oerrors; 58 }; 59 60 #define LLCS_NOBUFFER 0 61 #define LLCS_MULTIXMT 1 62 #define LLCS_MULTIRCV 2 63 #define LLCS_BRDCSTXMT 3 64 #define LLCS_BRDCSTRCV 4 65 #define LLCS_BLOCKED 5 66 #define LLCS_PKTXMT 6 67 #define LLCS_PKTRCV 7 68 #define LLCS_BYTEXMT 8 69 #define LLCS_BYTERCV 9 70 #define LLCS_XIDXMT 10 71 #define LLCS_XIDRCV 11 72 #define LLCS_TESTXMT 12 73 #define LLCS_TESTRCV 13 74 #define LLCS_IERRORS 14 75 #define LLCS_OERRORS 15 76 77 /* multicast structures */ 78 typedef struct llc1_multicast_addr { 79 int llcm_refcnt; /* number of streams referring to */ 80 /* entry */ 81 unsigned char llcm_addr[ETHERADDRL]; 82 } llc_mcast_t; 83 #define LLC1_MAX_MULTICAST 16 /* default max multicast table size */ 84 85 typedef 86 struct llc_mac_info { 87 struct llc_mac_info *llcp_next, *llcp_prev; 88 long llcp_flags; 89 long llcp_maxpkt; 90 long llcp_minpkt; 91 long llcp_type; 92 long llcp_addrlen; /* usually 6 but could be 2 */ 93 unsigned char llcp_macaddr[ETHERADDRL]; 94 unsigned char llcp_broadcast[ETHERADDRL]; 95 queue_t *llcp_queue; /* queue to MAC device */ 96 long llcp_lindex; /* link index for unlink */ 97 long llcp_ppa; /* the PPA number */ 98 long llcp_sap; /* when doing auto bind on lower */ 99 /* stream */ 100 mblk_t *llcp_data; /* temporarily hold data */ 101 queue_t *llcp_lqtop; /* queue for ioctls */ 102 mblk_t *llcp_mb; 103 long llcp_nstreams; 104 llc_mcast_t *llcp_mcast; /* per device multicast table */ 105 struct llc_stats llcp_stats; 106 kstat_t *llcp_kstatp; 107 uint_t llcp_iocid; /* outstanding ioc_id */ 108 } llc_mac_info_t; 109 110 /* flags for mac info (link) status */ 111 #define LLC1_LINKED 0x0001 /* there is a stream linked but not ready */ 112 #define LLC1_AVAILABLE 0x0002 /* linked stream is now ready */ 113 #define LLC1_INFO_WAIT 0x0004 /* waiting on info_ack */ 114 #define LLC1_DEF_PPA 0x0008 /* default (system assigned PPA) */ 115 #define LLC1_RAW_WAIT 0x0010 /* waiting for DLIOCRAW to happen */ 116 #define LLC1_USING_RAW 0x0020 /* lower driver is using DLIOCRAW mode */ 117 #define LLC1_AUTO_XID 0x0040 /* automatically respond to XID */ 118 #define LLC1_AUTO_TEST 0x0080 /* automatically respond to TEST */ 119 #define LLC1_BINDING 0x0100 /* autmatically binding the lower stream */ 120 121 typedef struct llc1 { 122 struct llc1 *llc_next, *llc_prev; 123 mblk_t *llc_mb; 124 long llc_state; 125 long llc_style; 126 long llc_minor; 127 long llc_type; 128 long llc_sap; 129 uchar_t llc_snap[5]; /* SNAP header */ 130 long llc_waiting_for; /* DL request to lower layer */ 131 long llc_flags; /* flags used for controlling things */ 132 long llc_multicnt; /* number of multicast addresses for */ 133 /* stream */ 134 llc_mcast_t **llc_mcast; /* multicast table if multicast is */ 135 /* enabled */ 136 queue_t *llc_qptr; 137 kmutex_t llc_lock; 138 struct llc_mac_info *llc_mac_info; 139 struct llc_stats *llc_stats; 140 } llc1_t; 141 142 /* llc_flag bits */ 143 #define LLC_RAW 0x0001 /* lower stream is in RAW mode */ 144 #define LLC_FAST 0x0002 /* use "fast" path */ 145 #define LLC_PROM 0x0004 /* stream is in physical promiscuous mode */ 146 #define LLC_SNAP 0x0008 /* stream is using SNAP header */ 147 #define LLC_SNAP_OID 0x0010 /* stream is SNAP, OID is defined */ 148 149 150 typedef struct llc1device { 151 long llc1_status; 152 krwlock_t llc1_rwlock; /* used to serialize read/write locks */ 153 int llc1_minors; 154 int llc1_multisize; 155 llc_mac_info_t *llc1_mac_next, *llc1_mac_prev; /* the various mac */ 156 /* layers */ 157 int llc1_ndevice; /* number of devices linked */ 158 int llc1_nextppa; /* number to use for next PPA default */ 159 llc1_t *llc1_str_next, *llc1_str_prev; /* open streams */ 160 } llc1dev_t; 161 162 #define LLC1_ATTACHED 0x0001 /* board is attached so mutexes are */ 163 /* initialized */ 164 165 166 /* 167 * definitions for debug tracing 168 */ 169 #define LLCTRACE 0x0001 /* basic procedure level tracing */ 170 #define LLCERRS 0x0002 /* trace errors */ 171 #define LLCRECV 0x0004 /* trace receive path */ 172 #define LLCSEND 0x0008 /* trace send path */ 173 #define LLCPROT 0x0010 /* trace DLPI protocol */ 174 175 /* 176 * other definitions 177 */ 178 #define LLCE_OK -1 /* internal procedure status is OK */ 179 #define LLCE_NOBUFFER 0x1001 /* couldn't allocate a buffer */ 180 181 182 /* 183 * definitions for module_info 184 */ 185 #define LLC1IDNUM 0x8022 186 #define LLC1_HIWATER 32000 /* high water mark for flow control */ 187 #define LLC1_LOWATER 4096 /* low water mark for flow control */ 188 #define LLC1_DEFMAX 4096 /* default max packet size */ 189 190 /* address format for unitdata */ 191 192 struct llcaddr { 193 unsigned char llca_addr[ETHERADDRL]; 194 unsigned char llca_sap; 195 }; 196 #define LLCADDR(p, offset) ((struct llcaddr *)(((caddr_t)(p))+(offset))) 197 198 struct llcsaddr { 199 unsigned char llca_saddr[ETHERADDRL]; 200 unsigned short llca_ssap; 201 }; 202 #define LLCSADDR(p, offset) ((struct llcsaddr *)(((caddr_t)(p))+(offset))) 203 204 /* 205 * 802.2 specific declarations 206 */ 207 struct llchdr { 208 unsigned char llc_dsap; 209 unsigned char llc_ssap; 210 unsigned char llc_ctl; 211 }; 212 struct llchdr_xid { 213 unsigned char llcx_format; 214 unsigned char llcx_class; 215 unsigned char llcx_window; 216 }; 217 struct snaphdr { 218 uchar_t snap_oid[3]; 219 uchar_t snap_type[2]; 220 }; 221 222 #define LLC_UI 0x3 223 #define LLC_XID 0xAF 224 #define LLC_TEST 0xE3 225 #define LLC_P 0x10 /* P bit for use with XID/TEST */ 226 #define LLC_XID_FMTID 0x81 /* XID format identifier */ 227 #define LLC_SERVICES 0x01 /* Services supported */ 228 #define LLC_GLOBAL_SAP 0XFF /* Global SAP address */ 229 #define LLC_NULL_SAP 0x00 230 #define LLC_SNAP_SAP 0xAA /* SNAP SAP */ 231 #define LLC_GROUP_ADDR 0x01 /* indication in DSAP of a group address */ 232 #define LLC_RESPONSE 0x01 /* indication in SSAP of a response */ 233 #define LLC_NOVELL_SAP -1 /* indicator that Novell 802.3 mode is used */ 234 235 #define LLC_XID_INFO_SIZE 3 /* length of the INFO field */ 236 #define LLC_XID_CLASS_I (0x01) /* Class I */ 237 #define LLC_XID_CLASS_II (0x03) /* Class II */ 238 #define LLC_XID_CLASS_III (0x05) /* Class III */ 239 #define LLC_XID_CLASS_IV (0x07) /* Class IV */ 240 241 /* Types can be or'd together */ 242 #define LLC_XID_TYPE_1 (0x01) /* Type 1 */ 243 #define LLC_XID_TYPE_2 (0x02) /* Type 2 */ 244 #define LLC_XID_TYPE_3 (0x04) /* Type 3 */ 245 246 #define LLC1_CSMACD_HDR_SIZE (2*ETHERADDRL+2) 247 248 #define ismulticast(cp) ((*(caddr_t)(cp)) & 0x01) 249 250 /* 251 * special ioctl calls for SunSelect LLC2 conformance 252 */ 253 #define L_GETPPA (('L'<<8)|1) 254 #define L_SETPPA (('L'<<8)|2) 255 #define L_GETSTATS (('L'<<8)|5) 256 #define L_ZEROSTATS (('L'<<8)|6) 257 258 #define LI_SPPA 0x02 /* type of snioc structure */ 259 260 struct ll_snioc { 261 uchar_t lli_type; 262 uchar_t lli_spare[3]; 263 int lli_ppa; 264 int lli_index; 265 }; 266 267 /* 268 * version of insque/remque for use by this driver 269 */ 270 struct qelem { 271 struct qelem *q_forw; 272 struct qelem *q_back; 273 /* rest of structure */ 274 }; 275 276 #ifdef __cplusplus 277 } 278 #endif 279 280 #endif /* _SYS_LLC1_H */ 281