17c478bd9Sstevel@tonic-gate /* 27c478bd9Sstevel@tonic-gate * CDDL HEADER START 37c478bd9Sstevel@tonic-gate * 47c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the 5*605445d5Sdg199075 * Common Development and Distribution License (the "License"). 6*605445d5Sdg199075 * You may not use this file except in compliance with the License. 77c478bd9Sstevel@tonic-gate * 87c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 97c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 107c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions 117c478bd9Sstevel@tonic-gate * and limitations under the License. 127c478bd9Sstevel@tonic-gate * 137c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 147c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 157c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 167c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 177c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 187c478bd9Sstevel@tonic-gate * 197c478bd9Sstevel@tonic-gate * CDDL HEADER END 207c478bd9Sstevel@tonic-gate */ 217c478bd9Sstevel@tonic-gate /* 22*605445d5Sdg199075 * Copyright 2006 Sun Microsystems, Inc. All rights reserved. 237c478bd9Sstevel@tonic-gate * Use is subject to license terms. 247c478bd9Sstevel@tonic-gate */ 257c478bd9Sstevel@tonic-gate 267c478bd9Sstevel@tonic-gate /* 277c478bd9Sstevel@tonic-gate * gldpriv.h - Private interfaces/structures needed by gld.c 287c478bd9Sstevel@tonic-gate * 297c478bd9Sstevel@tonic-gate * The definitions in this file are private to GLD and may change at any time. 307c478bd9Sstevel@tonic-gate * They must not be used by any driver. 317c478bd9Sstevel@tonic-gate */ 327c478bd9Sstevel@tonic-gate 337c478bd9Sstevel@tonic-gate #ifndef _SYS_GLDPRIV_H 347c478bd9Sstevel@tonic-gate #define _SYS_GLDPRIV_H 357c478bd9Sstevel@tonic-gate 367c478bd9Sstevel@tonic-gate #pragma ident "%Z%%M% %I% %E% SMI" 377c478bd9Sstevel@tonic-gate 387c478bd9Sstevel@tonic-gate #ifdef __cplusplus 397c478bd9Sstevel@tonic-gate extern "C" { 407c478bd9Sstevel@tonic-gate #endif 417c478bd9Sstevel@tonic-gate 427c478bd9Sstevel@tonic-gate #ifdef DEBUG 437c478bd9Sstevel@tonic-gate #define GLD_DEBUG 1 447c478bd9Sstevel@tonic-gate #endif 457c478bd9Sstevel@tonic-gate 467c478bd9Sstevel@tonic-gate /* 477c478bd9Sstevel@tonic-gate * The version number should not be changed. 487c478bd9Sstevel@tonic-gate */ 497c478bd9Sstevel@tonic-gate #define GLD_VERSION_200 0x200 /* version 2.0 */ 507c478bd9Sstevel@tonic-gate #define GLD_VERSION GLD_VERSION_200 /* current version */ 517c478bd9Sstevel@tonic-gate #define GLD_VERSION_STRING "v2" /* in modinfo string */ 527c478bd9Sstevel@tonic-gate 537c478bd9Sstevel@tonic-gate /* gld_global_options bits */ 547c478bd9Sstevel@tonic-gate #define GLD_OPT_NO_IPQ 0x00000001 /* don't use IP shortcut */ 557c478bd9Sstevel@tonic-gate #define GLD_OPT_NO_FASTPATH 0x00000002 /* don't implement fastpath */ 567c478bd9Sstevel@tonic-gate #define GLD_OPT_NO_ETHRXSNAP 0x00000008 /* don't interp SNAP on ether */ 577c478bd9Sstevel@tonic-gate 587c478bd9Sstevel@tonic-gate /* gld per instance options */ 597c478bd9Sstevel@tonic-gate #define GLDOPT_FAST_RECV 0x40 607c478bd9Sstevel@tonic-gate #define GLDOPT_CANONICAL_ADDR 0x08 617c478bd9Sstevel@tonic-gate #define GLDOPT_MDT 0x100 627c478bd9Sstevel@tonic-gate 637c478bd9Sstevel@tonic-gate /* 647c478bd9Sstevel@tonic-gate * This version of GLD allows a "Virtual-LAN-PPA" to be specified in 657c478bd9Sstevel@tonic-gate * the same manner as Cassini: the virtual PPA number is composed of 667c478bd9Sstevel@tonic-gate * the VLAN tag number (1-4094), multiplied by 1000(!), plus the real 677c478bd9Sstevel@tonic-gate * (hardware) PPA. Thus "bge23001" refers to the "device" which 687c478bd9Sstevel@tonic-gate * transports packets with tag VLAN "23" over the hardware of "bge1". 697c478bd9Sstevel@tonic-gate * 707c478bd9Sstevel@tonic-gate * This scheme limits the number of physical devices of a single type to 717c478bd9Sstevel@tonic-gate * 1000 e.g. bge0 .. bge999 (since bge1000 would instead be interpreted 727c478bd9Sstevel@tonic-gate * as VLAN1 over bge0). 737c478bd9Sstevel@tonic-gate */ 747c478bd9Sstevel@tonic-gate #define GLD_VLAN_SCALE 1000 757c478bd9Sstevel@tonic-gate #define GLD_MAX_PPA (GLD_VLAN_SCALE-1) 767c478bd9Sstevel@tonic-gate 777c478bd9Sstevel@tonic-gate /* 787c478bd9Sstevel@tonic-gate * Minor numbers: 797c478bd9Sstevel@tonic-gate * 807c478bd9Sstevel@tonic-gate * For each device type, GLD creates a single "style 2" node with minor 0. 817c478bd9Sstevel@tonic-gate * For each instance of that device type, GLD also creates a "style 1" 827c478bd9Sstevel@tonic-gate * node with minor number one greater than the PPA. Thus, nodes with 837c478bd9Sstevel@tonic-gate * minor numbers 0..1000 may exist in the /dev* filesystem. 847c478bd9Sstevel@tonic-gate * 857c478bd9Sstevel@tonic-gate * So, on open: 867c478bd9Sstevel@tonic-gate * 877c478bd9Sstevel@tonic-gate * Minor 0 implies DLPI "style 2": the STREAM is not intrinsically 887c478bd9Sstevel@tonic-gate * associated with any particular device/PPA. The association is set 897c478bd9Sstevel@tonic-gate * (and may be changed) dynamically, by DLPI_ATTACH/DETACH messages. 907c478bd9Sstevel@tonic-gate * 917c478bd9Sstevel@tonic-gate * Minors 1..1000 are "style 1", where the PPA is entirely defined by 927c478bd9Sstevel@tonic-gate * the minor; GLD defines the mapping as PPA=minor-1 (minor=PPA+1). 937c478bd9Sstevel@tonic-gate * Note that the upper bound of 1000 is (now) limited by the VLAN 947c478bd9Sstevel@tonic-gate * mapping scheme set out above. 957c478bd9Sstevel@tonic-gate * 967c478bd9Sstevel@tonic-gate * GLD devices are "self-cloning": each new open will cause a new minor 977c478bd9Sstevel@tonic-gate * number to be allocated; these are selected from the range 1001..0x3ffff. 987c478bd9Sstevel@tonic-gate * This minor number is only associated with the open stream and doesn't 997c478bd9Sstevel@tonic-gate * appear in the /dev* filesystem; manually created nodes with minors in 1007c478bd9Sstevel@tonic-gate * this range will be rejected by gld_open(). 1017c478bd9Sstevel@tonic-gate */ 1027c478bd9Sstevel@tonic-gate #define GLD_USE_STYLE2 0 1037c478bd9Sstevel@tonic-gate 1047c478bd9Sstevel@tonic-gate #define GLD_MIN_STYLE1_MINOR 1 1057c478bd9Sstevel@tonic-gate #define GLD_MAX_STYLE1_MINOR (GLD_MAX_PPA+1) 1067c478bd9Sstevel@tonic-gate 1077c478bd9Sstevel@tonic-gate #define GLD_STYLE1_MINOR_TO_PPA(minor) (minor - 1) 1087c478bd9Sstevel@tonic-gate #define GLD_STYLE1_PPA_TO_MINOR(ppa) (ppa + 1) 1097c478bd9Sstevel@tonic-gate 1107c478bd9Sstevel@tonic-gate #define GLD_MIN_CLONE_MINOR (GLD_MAX_STYLE1_MINOR+1) 1117c478bd9Sstevel@tonic-gate #define GLD_MAX_CLONE_MINOR 0x3ffff 1127c478bd9Sstevel@tonic-gate 1137c478bd9Sstevel@tonic-gate /* gldm_GLD_flags */ 1147c478bd9Sstevel@tonic-gate #define GLD_MAC_READY 0x0001 /* this mac has succeeded gld_register */ 1157c478bd9Sstevel@tonic-gate #define GLD_INTR_READY 0x0001 /* v0 compat name */ 1167c478bd9Sstevel@tonic-gate #define GLD_INTR_WAIT 0x0002 /* v1: waiting for interrupt to do scheduling */ 1177c478bd9Sstevel@tonic-gate #define GLD_LOCK_INITED 0x0004 /* maclock is currently initialized */ 1187c478bd9Sstevel@tonic-gate #define GLD_UNREGISTERED 0x0008 /* this mac has succeeded gld_unregister */ 1197c478bd9Sstevel@tonic-gate 1207c478bd9Sstevel@tonic-gate /* This is the largest macaddr currently supported by GLD */ 1217c478bd9Sstevel@tonic-gate #define GLD_MAX_ADDRLEN 32 /* Largest mac addr in all media */ 1227c478bd9Sstevel@tonic-gate 1237c478bd9Sstevel@tonic-gate #define GLD_MAX_MULTICAST 64 /* default multicast table size */ 1247c478bd9Sstevel@tonic-gate 1257c478bd9Sstevel@tonic-gate /* multicast structures */ 1267c478bd9Sstevel@tonic-gate typedef struct gld_multicast_addr { 1277c478bd9Sstevel@tonic-gate int gldm_refcnt; /* number of streams referring */ 1287c478bd9Sstevel@tonic-gate /* to this per-mac entry */ 1297c478bd9Sstevel@tonic-gate unsigned char gldm_addr[GLD_MAX_ADDRLEN]; 1307c478bd9Sstevel@tonic-gate } gld_mcast_t; 1317c478bd9Sstevel@tonic-gate 1327c478bd9Sstevel@tonic-gate /* gld_flag bits -- GLD PRIVATE */ 1337c478bd9Sstevel@tonic-gate #define GLD_RAW 0x0001 /* lower stream is in RAW mode */ 1347c478bd9Sstevel@tonic-gate #define GLD_FAST 0x0002 /* use "fast" path */ 1357c478bd9Sstevel@tonic-gate #define GLD_PROM_PHYS 0x0004 /* stream is in physical promiscuous mode */ 1367c478bd9Sstevel@tonic-gate #define GLD_PROM_SAP 0x0008 1377c478bd9Sstevel@tonic-gate #define GLD_PROM_MULT 0x0010 1387c478bd9Sstevel@tonic-gate #define GLD_STR_CLOSING 0x0020 /* stream is closing; don't putnext */ 1397c478bd9Sstevel@tonic-gate 1407c478bd9Sstevel@tonic-gate /* 1417c478bd9Sstevel@tonic-gate * gld structure. Used to define the per-stream information required to 1427c478bd9Sstevel@tonic-gate * implement DLPI. 1437c478bd9Sstevel@tonic-gate */ 1447c478bd9Sstevel@tonic-gate typedef struct gld { 1457c478bd9Sstevel@tonic-gate struct gld *gld_next, *gld_prev; 1467c478bd9Sstevel@tonic-gate caddr_t gld_dummy1; 1477c478bd9Sstevel@tonic-gate int32_t gld_state; /* DL_UNATTACHED, DL_UNBOUND, DL_IDLE */ 1487c478bd9Sstevel@tonic-gate int32_t gld_style; /* open style 1 or style 2 */ 1497c478bd9Sstevel@tonic-gate int32_t gld_minor; /* cloned minor number */ 1507c478bd9Sstevel@tonic-gate int32_t gld_type; /* DL_ETHER, DL_TPR, DL_FDDI, etc */ 1517c478bd9Sstevel@tonic-gate int32_t gld_sap; /* Bound SAP */ 1527c478bd9Sstevel@tonic-gate int32_t gld_flags; /* flags defined in gldpriv.h */ 1537c478bd9Sstevel@tonic-gate int32_t gld_multicnt; /* # of stream multicast addresses */ 1547c478bd9Sstevel@tonic-gate gld_mcast_t **gld_mcast; /* multicast table or NULL */ 1557c478bd9Sstevel@tonic-gate queue_t *gld_qptr; /* pointer to streams queue */ 1567c478bd9Sstevel@tonic-gate caddr_t gld_dummy2; 1577c478bd9Sstevel@tonic-gate caddr_t gld_dummy3; 1587c478bd9Sstevel@tonic-gate struct gld_mac_info *gld_mac_info; /* if not DL_UNATTACHED */ 1597c478bd9Sstevel@tonic-gate caddr_t gld_dummy4; 1607c478bd9Sstevel@tonic-gate struct glddevice *gld_device; /* per-major structure */ 1617c478bd9Sstevel@tonic-gate 1627c478bd9Sstevel@tonic-gate volatile boolean_t gld_xwait; /* want an xmit qenable */ 1637c478bd9Sstevel@tonic-gate volatile boolean_t gld_sched_ran; /* gld_sched examined this Q */ 1647c478bd9Sstevel@tonic-gate volatile boolean_t gld_in_unbind; /* DL_UNBIND in progress */ 1657c478bd9Sstevel@tonic-gate volatile uint32_t gld_wput_count; /* number of threads in wput=>start */ 1667c478bd9Sstevel@tonic-gate volatile boolean_t gld_in_wsrv; /* Q thread currently running in wsrv */ 1677c478bd9Sstevel@tonic-gate 1687c478bd9Sstevel@tonic-gate boolean_t gld_ethertype; /* ethertype/LLC stream */ 1697c478bd9Sstevel@tonic-gate uint32_t gld_notifications; 1707c478bd9Sstevel@tonic-gate uint32_t gld_upri; /* user priority */ 1717c478bd9Sstevel@tonic-gate void *gld_vlan; 1727c478bd9Sstevel@tonic-gate int (*gld_send)(); 1737c478bd9Sstevel@tonic-gate } gld_t; 1747c478bd9Sstevel@tonic-gate 1757c478bd9Sstevel@tonic-gate /* 1767c478bd9Sstevel@tonic-gate * definitions for the per driver class structure 1777c478bd9Sstevel@tonic-gate */ 1787c478bd9Sstevel@tonic-gate typedef struct glddevice { 1797c478bd9Sstevel@tonic-gate struct glddevice *gld_next, *gld_prev; 1807c478bd9Sstevel@tonic-gate int gld_ndevice; /* number of mac devices linked */ 1817c478bd9Sstevel@tonic-gate gld_mac_info_t *gld_mac_next, *gld_mac_prev; /* the various macs */ 1827c478bd9Sstevel@tonic-gate gld_t *gld_str_next, *gld_str_prev; /* open, unattached, */ 1837c478bd9Sstevel@tonic-gate /* style 2 streams */ 1847c478bd9Sstevel@tonic-gate char gld_name[16]; /* name of device */ 1857c478bd9Sstevel@tonic-gate kmutex_t gld_devlock; /* used to serialize read/write locks */ 1867c478bd9Sstevel@tonic-gate int gld_nextminor; /* next unused minor number for clone */ 1877c478bd9Sstevel@tonic-gate int gld_major; /* device's major number */ 1887c478bd9Sstevel@tonic-gate int gld_multisize; /* # of multicast entries to alloc */ 1897c478bd9Sstevel@tonic-gate int gld_type; /* for use before attach */ 1907c478bd9Sstevel@tonic-gate int gld_minsdu; 1917c478bd9Sstevel@tonic-gate int gld_maxsdu; 1927c478bd9Sstevel@tonic-gate int gld_addrlen; /* physical address length */ 1937c478bd9Sstevel@tonic-gate int gld_saplen; /* sap length, neg appends */ 1947c478bd9Sstevel@tonic-gate unsigned char *gld_broadcast; /* pointer to broadcast address */ 1957c478bd9Sstevel@tonic-gate int gld_styles; /* provider styles */ 1967c478bd9Sstevel@tonic-gate } glddev_t; 1977c478bd9Sstevel@tonic-gate 1987c478bd9Sstevel@tonic-gate typedef struct pktinfo { 1997c478bd9Sstevel@tonic-gate uint_t isBroadcast:1; 2007c478bd9Sstevel@tonic-gate uint_t isMulticast:1; 2017c478bd9Sstevel@tonic-gate uint_t isLooped:1; 2027c478bd9Sstevel@tonic-gate uint_t isForMe:1; 2037c478bd9Sstevel@tonic-gate uint_t isLLC:1; 2047c478bd9Sstevel@tonic-gate uint_t user_pri:3; 2057c478bd9Sstevel@tonic-gate uint_t cfi:1; 2067c478bd9Sstevel@tonic-gate uint_t vid:12; 2077c478bd9Sstevel@tonic-gate uint_t wasAccepted:1; 2087c478bd9Sstevel@tonic-gate uint_t nosource:1; 209*605445d5Sdg199075 uint_t isTagged:1; 2107c478bd9Sstevel@tonic-gate uint_t macLen; 2117c478bd9Sstevel@tonic-gate uint_t hdrLen; 2127c478bd9Sstevel@tonic-gate uint_t pktLen; 2137c478bd9Sstevel@tonic-gate uchar_t dhost[GLD_MAX_ADDRLEN]; 2147c478bd9Sstevel@tonic-gate uchar_t shost[GLD_MAX_ADDRLEN]; 2157c478bd9Sstevel@tonic-gate uint_t ethertype; 2167c478bd9Sstevel@tonic-gate } pktinfo_t; 2177c478bd9Sstevel@tonic-gate 2187c478bd9Sstevel@tonic-gate /* 2197c478bd9Sstevel@tonic-gate * Flags input to the gld_interpret_*() interpreter routines. 2207c478bd9Sstevel@tonic-gate */ 2217c478bd9Sstevel@tonic-gate typedef enum packet_flag { 2227c478bd9Sstevel@tonic-gate GLD_RXQUICK, 2237c478bd9Sstevel@tonic-gate GLD_RXLOOP, 2247c478bd9Sstevel@tonic-gate GLD_RX, 2257c478bd9Sstevel@tonic-gate GLD_TX 2267c478bd9Sstevel@tonic-gate } packet_flag_t; 2277c478bd9Sstevel@tonic-gate 2287c478bd9Sstevel@tonic-gate /* 2297c478bd9Sstevel@tonic-gate * Flags input to the gld_interpret_mdt_*() interpreter routines. 2307c478bd9Sstevel@tonic-gate */ 2317c478bd9Sstevel@tonic-gate typedef enum mdt_packet_flag { 2327c478bd9Sstevel@tonic-gate GLD_MDT_TX, 2337c478bd9Sstevel@tonic-gate GLD_MDT_TXPKT, 2347c478bd9Sstevel@tonic-gate GLD_MDT_RXLOOP 2357c478bd9Sstevel@tonic-gate } mdt_packet_flag_t; 2367c478bd9Sstevel@tonic-gate 2377c478bd9Sstevel@tonic-gate /* 2387c478bd9Sstevel@tonic-gate * Describes characteristics of the Media Access Layer. 2397c478bd9Sstevel@tonic-gate * The mac_type is one of the supported DLPI media types (see <sys/dlpi.h>). 2407c478bd9Sstevel@tonic-gate * The mtu_size is the size of the largest frame. 2417c478bd9Sstevel@tonic-gate * The interpreter is the function that "knows" how to interpret the frame. 2427c478bd9Sstevel@tonic-gate * The interpreter_mdt routine knows how to interpret/format MDT packets. 2437c478bd9Sstevel@tonic-gate * Other routines create and/or add headers to packets. 2447c478bd9Sstevel@tonic-gate */ 2457c478bd9Sstevel@tonic-gate typedef struct { 2467c478bd9Sstevel@tonic-gate uint_t mac_type; 2477c478bd9Sstevel@tonic-gate uint_t mtu_size; 2487c478bd9Sstevel@tonic-gate int hdr_size; 249*605445d5Sdg199075 int (*interpreter)(gld_mac_info_t *, mblk_t *, pktinfo_t *, 250*605445d5Sdg199075 packet_flag_t); 2517c478bd9Sstevel@tonic-gate void (*interpreter_mdt)(gld_mac_info_t *, mblk_t *, 252*605445d5Sdg199075 struct pdescinfo_s *, pktinfo_t *, mdt_packet_flag_t); 2537c478bd9Sstevel@tonic-gate mblk_t *(*mkfastpath)(gld_t *, mblk_t *); 2547c478bd9Sstevel@tonic-gate mblk_t *(*mkunitdata)(gld_t *, mblk_t *); 2557c478bd9Sstevel@tonic-gate void (*init)(gld_mac_info_t *); 2567c478bd9Sstevel@tonic-gate void (*uninit)(gld_mac_info_t *); 2577c478bd9Sstevel@tonic-gate char *mac_string; 2587c478bd9Sstevel@tonic-gate } gld_interface_t; 2597c478bd9Sstevel@tonic-gate 2607c478bd9Sstevel@tonic-gate /* 2617c478bd9Sstevel@tonic-gate * structure for names stat structure usage as required by "netstat" 2627c478bd9Sstevel@tonic-gate */ 2637c478bd9Sstevel@tonic-gate typedef union media_kstats { 2647c478bd9Sstevel@tonic-gate struct dot3kstat { 2657c478bd9Sstevel@tonic-gate kstat_named_t first_coll; 2667c478bd9Sstevel@tonic-gate kstat_named_t multi_coll; 2677c478bd9Sstevel@tonic-gate kstat_named_t sqe_error; 2687c478bd9Sstevel@tonic-gate kstat_named_t mac_xmt_error; 2697c478bd9Sstevel@tonic-gate kstat_named_t frame_too_long; 2707c478bd9Sstevel@tonic-gate kstat_named_t mac_rcv_error; 2717c478bd9Sstevel@tonic-gate } dot3; 2727c478bd9Sstevel@tonic-gate struct dot5kstat { 2737c478bd9Sstevel@tonic-gate kstat_named_t ace_error; 2747c478bd9Sstevel@tonic-gate kstat_named_t internal_error; 2757c478bd9Sstevel@tonic-gate kstat_named_t lost_frame_error; 2767c478bd9Sstevel@tonic-gate kstat_named_t frame_copied_error; 2777c478bd9Sstevel@tonic-gate kstat_named_t token_error; 2787c478bd9Sstevel@tonic-gate kstat_named_t freq_error; 2797c478bd9Sstevel@tonic-gate } dot5; 2807c478bd9Sstevel@tonic-gate struct fddikstat { 2817c478bd9Sstevel@tonic-gate kstat_named_t mac_error; 2827c478bd9Sstevel@tonic-gate kstat_named_t mac_lost; 2837c478bd9Sstevel@tonic-gate kstat_named_t mac_token; 2847c478bd9Sstevel@tonic-gate kstat_named_t mac_tvx_expired; 2857c478bd9Sstevel@tonic-gate kstat_named_t mac_late; 2867c478bd9Sstevel@tonic-gate kstat_named_t mac_ring_op; 2877c478bd9Sstevel@tonic-gate } fddi; 2887c478bd9Sstevel@tonic-gate } media_kstats_t; 2897c478bd9Sstevel@tonic-gate 2907c478bd9Sstevel@tonic-gate struct gldkstats { 2917c478bd9Sstevel@tonic-gate kstat_named_t glds_pktxmt; 2927c478bd9Sstevel@tonic-gate kstat_named_t glds_pktrcv; 2937c478bd9Sstevel@tonic-gate kstat_named_t glds_errxmt; 2947c478bd9Sstevel@tonic-gate kstat_named_t glds_errrcv; 2957c478bd9Sstevel@tonic-gate kstat_named_t glds_collisions; 2967c478bd9Sstevel@tonic-gate kstat_named_t glds_bytexmt; 2977c478bd9Sstevel@tonic-gate kstat_named_t glds_bytercv; 2987c478bd9Sstevel@tonic-gate kstat_named_t glds_multixmt; 2997c478bd9Sstevel@tonic-gate kstat_named_t glds_multircv; /* multicast but not broadcast */ 3007c478bd9Sstevel@tonic-gate kstat_named_t glds_brdcstxmt; 3017c478bd9Sstevel@tonic-gate kstat_named_t glds_brdcstrcv; 3027c478bd9Sstevel@tonic-gate kstat_named_t glds_unknowns; 3037c478bd9Sstevel@tonic-gate kstat_named_t glds_blocked; /* discard due to upstream flow */ 3047c478bd9Sstevel@tonic-gate /* control */ 3057c478bd9Sstevel@tonic-gate kstat_named_t glds_excoll; 3067c478bd9Sstevel@tonic-gate kstat_named_t glds_defer; 3077c478bd9Sstevel@tonic-gate kstat_named_t glds_frame; 3087c478bd9Sstevel@tonic-gate kstat_named_t glds_crc; 3097c478bd9Sstevel@tonic-gate kstat_named_t glds_overflow; 3107c478bd9Sstevel@tonic-gate kstat_named_t glds_underflow; 3117c478bd9Sstevel@tonic-gate kstat_named_t glds_short; 3127c478bd9Sstevel@tonic-gate kstat_named_t glds_missed; 3137c478bd9Sstevel@tonic-gate kstat_named_t glds_xmtlatecoll; 3147c478bd9Sstevel@tonic-gate kstat_named_t glds_nocarrier; 3157c478bd9Sstevel@tonic-gate kstat_named_t glds_noxmtbuf; 3167c478bd9Sstevel@tonic-gate kstat_named_t glds_norcvbuf; 3177c478bd9Sstevel@tonic-gate kstat_named_t glds_xmtbadinterp; 3187c478bd9Sstevel@tonic-gate kstat_named_t glds_rcvbadinterp; 3197c478bd9Sstevel@tonic-gate kstat_named_t glds_intr; 3207c478bd9Sstevel@tonic-gate kstat_named_t glds_xmtretry; 3217c478bd9Sstevel@tonic-gate kstat_named_t glds_pktxmt64; 3227c478bd9Sstevel@tonic-gate kstat_named_t glds_pktrcv64; 3237c478bd9Sstevel@tonic-gate kstat_named_t glds_bytexmt64; 3247c478bd9Sstevel@tonic-gate kstat_named_t glds_bytercv64; 3257c478bd9Sstevel@tonic-gate kstat_named_t glds_speed; 3267c478bd9Sstevel@tonic-gate kstat_named_t glds_duplex; 3277c478bd9Sstevel@tonic-gate kstat_named_t glds_media; 3287c478bd9Sstevel@tonic-gate kstat_named_t glds_prom; 3297c478bd9Sstevel@tonic-gate media_kstats_t glds_media_specific; 3307c478bd9Sstevel@tonic-gate }; 3317c478bd9Sstevel@tonic-gate 3327c478bd9Sstevel@tonic-gate typedef struct gld_mac_pvt gld_mac_pvt_t; 3337c478bd9Sstevel@tonic-gate 3347c478bd9Sstevel@tonic-gate typedef struct gld_vlan { 3357c478bd9Sstevel@tonic-gate struct gld_vlan *gldv_next, *gldv_prev; 3367c478bd9Sstevel@tonic-gate uint32_t gldv_id; 3377c478bd9Sstevel@tonic-gate uint32_t gldv_ptag; 3387c478bd9Sstevel@tonic-gate int gldv_nstreams; 3397c478bd9Sstevel@tonic-gate gld_mac_info_t *gldv_mac; 3407c478bd9Sstevel@tonic-gate queue_t *gldv_ipq; 3417c478bd9Sstevel@tonic-gate queue_t *gldv_ipv6q; 3427c478bd9Sstevel@tonic-gate struct gld *gldv_str_next; /* list of attached streams */ 3437c478bd9Sstevel@tonic-gate struct gld *gldv_str_prev; 3447c478bd9Sstevel@tonic-gate kstat_t *gldv_kstatp; 3457c478bd9Sstevel@tonic-gate struct gld_stats *gldv_stats; 346*605445d5Sdg199075 /* The number of streams that are in promiscous mode */ 347*605445d5Sdg199075 uint_t gldv_nprom; 348*605445d5Sdg199075 /* The number of streams that are interested in VLAN tagged packets. */ 349*605445d5Sdg199075 uint_t gldv_nvlan_sap; 3507c478bd9Sstevel@tonic-gate } gld_vlan_t; 3517c478bd9Sstevel@tonic-gate 3527c478bd9Sstevel@tonic-gate #define VLAN_HASHSZ 23 3537c478bd9Sstevel@tonic-gate 3547c478bd9Sstevel@tonic-gate /* Per-mac info used by GLD */ 3557c478bd9Sstevel@tonic-gate struct gld_mac_pvt { 3567c478bd9Sstevel@tonic-gate gld_interface_t *interfacep; 3577c478bd9Sstevel@tonic-gate kmutex_t datalock; /* data lock for "data" */ 3587c478bd9Sstevel@tonic-gate caddr_t data; /* media specific private data */ 3597c478bd9Sstevel@tonic-gate gld_vlan_t *vlan_hash[VLAN_HASHSZ]; 3607c478bd9Sstevel@tonic-gate struct gld *last_sched; /* last scheduled stream */ 3617c478bd9Sstevel@tonic-gate struct glddevice *major_dev; /* per-major device struct */ 3627c478bd9Sstevel@tonic-gate int nvlan; /* VLANs in use on this mac */ 3637c478bd9Sstevel@tonic-gate int nprom; /* num streams in promiscuous mode */ 3647c478bd9Sstevel@tonic-gate int nprom_multi; /* streams in promiscuous multicast */ 3657c478bd9Sstevel@tonic-gate gld_mcast_t *mcast_table; /* per device multicast table */ 3667c478bd9Sstevel@tonic-gate unsigned char *curr_macaddr; /* Currently programmed mac address */ 3677c478bd9Sstevel@tonic-gate kstat_t *kstatp; 3687c478bd9Sstevel@tonic-gate struct gld_stats *statistics; /* The ones the driver updates */ 3697c478bd9Sstevel@tonic-gate int rde_enabled; /* RDE (Source Routing) Enabled */ 3707c478bd9Sstevel@tonic-gate int rde_str_indicator_ste; /* use STE when no SR info */ 3717c478bd9Sstevel@tonic-gate int rde_timeout; /* route link inactivity timeout */ 3727c478bd9Sstevel@tonic-gate uint32_t notifications; /* DL_NOTE options supported */ 3737c478bd9Sstevel@tonic-gate boolean_t started; /* Has the MAC been started? */ 3747c478bd9Sstevel@tonic-gate }; 3757c478bd9Sstevel@tonic-gate 3767c478bd9Sstevel@tonic-gate /* return values from gld_cmds */ 3777c478bd9Sstevel@tonic-gate #define GLDE_OK (-1) /* internal procedure status is OK */ 3787c478bd9Sstevel@tonic-gate #define GLDE_RETRY 0x1002 /* want to retry later */ 3797c478bd9Sstevel@tonic-gate 3807c478bd9Sstevel@tonic-gate /* caller argument to gld_start */ 3817c478bd9Sstevel@tonic-gate #define GLD_WPUT 0 3827c478bd9Sstevel@tonic-gate #define GLD_WSRV 1 3837c478bd9Sstevel@tonic-gate 3847c478bd9Sstevel@tonic-gate #define GLD_MAX_802_SAP 0xff 3857c478bd9Sstevel@tonic-gate 3867c478bd9Sstevel@tonic-gate /* 3877c478bd9Sstevel@tonic-gate * definitions for debug tracing 3887c478bd9Sstevel@tonic-gate */ 3897c478bd9Sstevel@tonic-gate #define GLDTRACE 0x0001 /* basic procedure level tracing */ 3907c478bd9Sstevel@tonic-gate #define GLDERRS 0x0002 /* trace errors */ 3917c478bd9Sstevel@tonic-gate #define GLDRECV 0x0004 /* trace receive path */ 3927c478bd9Sstevel@tonic-gate #define GLDSEND 0x0008 /* trace send path */ 3937c478bd9Sstevel@tonic-gate #define GLDPROT 0x0010 /* trace DLPI protocol */ 3947c478bd9Sstevel@tonic-gate #define GLDNOBR 0x0020 /* do not show broadcast messages */ 3957c478bd9Sstevel@tonic-gate #define GLDETRACE 0x0040 /* trace "normal case" errors */ 3967c478bd9Sstevel@tonic-gate #define GLDRDE 0x0080 /* netstat -k dump routing table */ 3977c478bd9Sstevel@tonic-gate 3987c478bd9Sstevel@tonic-gate /* 3997c478bd9Sstevel@tonic-gate * Lock manipulation macros for GLDM_LOCK. Conceptually, the 4007c478bd9Sstevel@tonic-gate * GLD layer treats the lock as a rw lock; for v0 binary and 4017c478bd9Sstevel@tonic-gate * semantic compatibility, the underlying implementation still 4027c478bd9Sstevel@tonic-gate * uses a mutex, whereas for v2 drivers, the more scalable rwlock 4037c478bd9Sstevel@tonic-gate * is used instead. See notes in gld.h. 4047c478bd9Sstevel@tonic-gate */ 4057c478bd9Sstevel@tonic-gate #define GLDM_LOCK_INIT(macinfo) \ 4067c478bd9Sstevel@tonic-gate rw_init(&(macinfo)->gldm_lock.gldl_rw_lock, NULL, \ 4077c478bd9Sstevel@tonic-gate RW_DRIVER, (macinfo)->gldm_cookie); \ 4087c478bd9Sstevel@tonic-gate (macinfo)->gldm_GLD_flags |= GLD_LOCK_INITED 4097c478bd9Sstevel@tonic-gate 4107c478bd9Sstevel@tonic-gate #define GLDM_LOCK_INITED(macinfo) \ 4117c478bd9Sstevel@tonic-gate ((macinfo)->gldm_GLD_flags & GLD_LOCK_INITED) 4127c478bd9Sstevel@tonic-gate 4137c478bd9Sstevel@tonic-gate #define GLDM_LOCK_DESTROY(macinfo) \ 4147c478bd9Sstevel@tonic-gate if ((macinfo)->gldm_GLD_flags & GLD_LOCK_INITED) { \ 4157c478bd9Sstevel@tonic-gate rw_destroy(&(macinfo)->gldm_lock.gldl_rw_lock); \ 4167c478bd9Sstevel@tonic-gate (macinfo)->gldm_GLD_flags &= ~GLD_LOCK_INITED; \ 4177c478bd9Sstevel@tonic-gate } 4187c478bd9Sstevel@tonic-gate 4197c478bd9Sstevel@tonic-gate #define GLDM_LOCK(macinfo, rw) \ 4207c478bd9Sstevel@tonic-gate rw_enter(&(macinfo)->gldm_lock.gldl_rw_lock, (rw)) 4217c478bd9Sstevel@tonic-gate 4227c478bd9Sstevel@tonic-gate #define GLDM_UNLOCK(macinfo) \ 4237c478bd9Sstevel@tonic-gate rw_exit(&(macinfo)->gldm_lock.gldl_rw_lock) 4247c478bd9Sstevel@tonic-gate 4257c478bd9Sstevel@tonic-gate #define GLDM_TRYLOCK(macinfo, rw) \ 4267c478bd9Sstevel@tonic-gate rw_tryenter(&(macinfo)->gldm_lock.gldl_rw_lock, (rw)) 4277c478bd9Sstevel@tonic-gate 4287c478bd9Sstevel@tonic-gate /* lock held in read or write mode? */ 4297c478bd9Sstevel@tonic-gate #define GLDM_LOCK_HELD(macinfo) \ 4307c478bd9Sstevel@tonic-gate rw_lock_held(&(macinfo)->gldm_lock.gldl_rw_lock) 4317c478bd9Sstevel@tonic-gate 4327c478bd9Sstevel@tonic-gate /* lock held in write mode? */ 4337c478bd9Sstevel@tonic-gate #define GLDM_LOCK_HELD_WRITE(macinfo) \ 4347c478bd9Sstevel@tonic-gate rw_write_held(&(macinfo)->gldm_lock.gldl_rw_lock) 4357c478bd9Sstevel@tonic-gate 4367c478bd9Sstevel@tonic-gate /* 4377c478bd9Sstevel@tonic-gate * Compare/copy two MAC addresses. 4387c478bd9Sstevel@tonic-gate * Note that unlike bcmp, we return zero if they are different. 4397c478bd9Sstevel@tonic-gate */ 4407c478bd9Sstevel@tonic-gate #define mac_eq(a, b, l) (bcmp((caddr_t)(a), (caddr_t)(b), (l)) == 0) 4417c478bd9Sstevel@tonic-gate #define mac_copy(a, b, l) (bcopy((caddr_t)(a), (caddr_t)(b), (l))) 4427c478bd9Sstevel@tonic-gate /* copy a mac address to/from canonical form */ 4437c478bd9Sstevel@tonic-gate #define cmac_copy(a, b, l, macinfo) { \ 4447c478bd9Sstevel@tonic-gate if ((macinfo)->gldm_options & GLDOPT_CANONICAL_ADDR) \ 4457c478bd9Sstevel@tonic-gate gld_bitrevcopy((caddr_t)(a), (caddr_t)(b), (l)); \ 4467c478bd9Sstevel@tonic-gate else \ 4477c478bd9Sstevel@tonic-gate mac_copy((a), (b), (l)); \ 4487c478bd9Sstevel@tonic-gate } 4497c478bd9Sstevel@tonic-gate 4507c478bd9Sstevel@tonic-gate /* 4517c478bd9Sstevel@tonic-gate * Macros to access possibly-unaligned variables 4527c478bd9Sstevel@tonic-gate */ 4537c478bd9Sstevel@tonic-gate 4547c478bd9Sstevel@tonic-gate #if (_ALIGNMENT_REQUIRED == 0) 4557c478bd9Sstevel@tonic-gate 4567c478bd9Sstevel@tonic-gate #define REF_HOST_USHORT(lvalue) (lvalue) 4577c478bd9Sstevel@tonic-gate #define REF_NET_USHORT(lvalue) (ntohs(lvalue)) 4587c478bd9Sstevel@tonic-gate #define SET_NET_USHORT(lvalue, val) ((lvalue) = htons(val)) 4597c478bd9Sstevel@tonic-gate 4607c478bd9Sstevel@tonic-gate #else /* ALIGNMENT_REQUIRED */ 4617c478bd9Sstevel@tonic-gate 4627c478bd9Sstevel@tonic-gate #define REF_NET_USHORT(lvalue) \ 4637c478bd9Sstevel@tonic-gate ((ushort_t)((((uchar_t *)(&(lvalue)))[0]<<8) | \ 4647c478bd9Sstevel@tonic-gate ((uchar_t *)(&(lvalue)))[1])) 4657c478bd9Sstevel@tonic-gate 4667c478bd9Sstevel@tonic-gate #define SET_NET_USHORT(lvalue, val) { \ 4677c478bd9Sstevel@tonic-gate ((uchar_t *)(&(lvalue)))[0] = (uchar_t)((val)>>8); \ 4687c478bd9Sstevel@tonic-gate ((uchar_t *)(&(lvalue)))[1] = (uchar_t)(val); \ 4697c478bd9Sstevel@tonic-gate } 4707c478bd9Sstevel@tonic-gate 4717c478bd9Sstevel@tonic-gate #if defined(_LITTLE_ENDIAN) 4727c478bd9Sstevel@tonic-gate 4737c478bd9Sstevel@tonic-gate #define REF_HOST_USHORT(lvalue) \ 4747c478bd9Sstevel@tonic-gate ((ushort_t)((((uchar_t *)(&(lvalue)))[1]<<8) | \ 4757c478bd9Sstevel@tonic-gate ((uchar_t *)(&(lvalue)))[0])) 4767c478bd9Sstevel@tonic-gate 4777c478bd9Sstevel@tonic-gate #elif defined(_BIG_ENDIAN) 4787c478bd9Sstevel@tonic-gate 4797c478bd9Sstevel@tonic-gate #define REF_HOST_USHORT(lvalue) \ 4807c478bd9Sstevel@tonic-gate ((ushort_t)((((uchar_t *)(&(lvalue)))[0]<<8) | \ 4817c478bd9Sstevel@tonic-gate ((uchar_t *)(&(lvalue)))[1])) 4827c478bd9Sstevel@tonic-gate 4837c478bd9Sstevel@tonic-gate #else /* unknown endian */ 4847c478bd9Sstevel@tonic-gate #error "what endian is this machine?" 4857c478bd9Sstevel@tonic-gate #endif /* endian */ 4867c478bd9Sstevel@tonic-gate 4877c478bd9Sstevel@tonic-gate #endif /* ALIGNMENT_REQUIRED */ 4887c478bd9Sstevel@tonic-gate 4897c478bd9Sstevel@tonic-gate /* ================================================================ */ 4907c478bd9Sstevel@tonic-gate /* Route Determination Entity definitions (IEEE 802.2 1994 edition) */ 4917c478bd9Sstevel@tonic-gate /* ================================================================ */ 4927c478bd9Sstevel@tonic-gate 4937c478bd9Sstevel@tonic-gate struct rde_pdu { 4947c478bd9Sstevel@tonic-gate uchar_t rde_ver; 4957c478bd9Sstevel@tonic-gate uchar_t rde_ptype; 4967c478bd9Sstevel@tonic-gate uchar_t rde_target_mac[6]; 4977c478bd9Sstevel@tonic-gate uchar_t rde_orig_mac[6]; 4987c478bd9Sstevel@tonic-gate uchar_t rde_target_sap; 4997c478bd9Sstevel@tonic-gate uchar_t rde_orig_sap; 5007c478bd9Sstevel@tonic-gate }; 5017c478bd9Sstevel@tonic-gate 5027c478bd9Sstevel@tonic-gate #define LSAP_RDE 0xa6 /* IEEE 802.2 section 3.3.1.2 */ 5037c478bd9Sstevel@tonic-gate #define RDE_RQC 0x01 /* Route Query Command */ 5047c478bd9Sstevel@tonic-gate #define RDE_RQR 0x02 /* Route Query Response */ 5057c478bd9Sstevel@tonic-gate #define RDE_RS 0x03 /* Route Selected */ 5067c478bd9Sstevel@tonic-gate 5077c478bd9Sstevel@tonic-gate /* ============================================================= */ 5087c478bd9Sstevel@tonic-gate /* Source Routing fields and definitions (IEEE 802.2 and 802.1D) */ 5097c478bd9Sstevel@tonic-gate /* ============================================================= */ 5107c478bd9Sstevel@tonic-gate 5117c478bd9Sstevel@tonic-gate #define MAX_RDFLDS 14 /* changed to 14 from 8 as per IEEE */ 5127c478bd9Sstevel@tonic-gate 5137c478bd9Sstevel@tonic-gate /* 5147c478bd9Sstevel@tonic-gate * Source Routing Route Information field. 5157c478bd9Sstevel@tonic-gate */ 5167c478bd9Sstevel@tonic-gate struct gld_ri { 5177c478bd9Sstevel@tonic-gate #if defined(_BIT_FIELDS_LTOH) 5187c478bd9Sstevel@tonic-gate uchar_t len:5; /* length */ 5197c478bd9Sstevel@tonic-gate uchar_t rt:3; /* routing type */ 5207c478bd9Sstevel@tonic-gate uchar_t res:4; /* reserved */ 5217c478bd9Sstevel@tonic-gate uchar_t mtu:3; /* largest frame */ 5227c478bd9Sstevel@tonic-gate uchar_t dir:1; /* direction bit */ 5237c478bd9Sstevel@tonic-gate struct tr_rd { /* route designator fields */ 5247c478bd9Sstevel@tonic-gate ushort_t bridge:4; /* Note: assumes network order... */ 5257c478bd9Sstevel@tonic-gate ushort_t ring:12; /* ...(Big Endian) -- needs ntohs() */ 5267c478bd9Sstevel@tonic-gate } rd[MAX_RDFLDS]; 5277c478bd9Sstevel@tonic-gate #elif defined(_BIT_FIELDS_HTOL) 5287c478bd9Sstevel@tonic-gate uchar_t rt:3; /* routing type */ 5297c478bd9Sstevel@tonic-gate uchar_t len:5; /* length */ 5307c478bd9Sstevel@tonic-gate uchar_t dir:1; /* direction bit */ 5317c478bd9Sstevel@tonic-gate uchar_t mtu:3; /* largest frame */ 5327c478bd9Sstevel@tonic-gate uchar_t res:4; /* reserved */ 5337c478bd9Sstevel@tonic-gate struct tr_rd { /* route designator fields */ 5347c478bd9Sstevel@tonic-gate ushort_t ring:12; 5357c478bd9Sstevel@tonic-gate ushort_t bridge:4; 5367c478bd9Sstevel@tonic-gate } rd[MAX_RDFLDS]; 5377c478bd9Sstevel@tonic-gate #else 5387c478bd9Sstevel@tonic-gate #error "which way do bit fields get allocated?" 5397c478bd9Sstevel@tonic-gate #endif 5407c478bd9Sstevel@tonic-gate }; 5417c478bd9Sstevel@tonic-gate 5427c478bd9Sstevel@tonic-gate #define RT_SRF 0x0 /* 0xx: specifically routed frame */ 5437c478bd9Sstevel@tonic-gate #define RT_ARE 0x4 /* 10x: all routes explorer frame */ 5447c478bd9Sstevel@tonic-gate #define RT_STE 0x6 /* 11x: spanning tree explorer frame */ 5457c478bd9Sstevel@tonic-gate 5467c478bd9Sstevel@tonic-gate #define RT_MTU_MAX 0x7 /* Max MTU field (base only) */ 5477c478bd9Sstevel@tonic-gate 5487c478bd9Sstevel@tonic-gate /* 5497c478bd9Sstevel@tonic-gate * Source route table info 5507c478bd9Sstevel@tonic-gate */ 5517c478bd9Sstevel@tonic-gate struct srtab { 5527c478bd9Sstevel@tonic-gate struct srtab *sr_next; /* next in linked list */ 5537c478bd9Sstevel@tonic-gate uchar_t sr_mac[6]; /* MAC address */ 5547c478bd9Sstevel@tonic-gate struct gld_ri sr_ri; /* routing information */ 5557c478bd9Sstevel@tonic-gate clock_t sr_timer; 5567c478bd9Sstevel@tonic-gate }; 5577c478bd9Sstevel@tonic-gate 5587c478bd9Sstevel@tonic-gate #define SR_HASH_SIZE 256 /* Number of bins */ 5597c478bd9Sstevel@tonic-gate 5607c478bd9Sstevel@tonic-gate /* ================================================================= */ 5617c478bd9Sstevel@tonic-gate /* Media dependent defines for media dependent routines in gldutil.c */ 5627c478bd9Sstevel@tonic-gate /* ================================================================= */ 5637c478bd9Sstevel@tonic-gate 5647c478bd9Sstevel@tonic-gate /* 5657c478bd9Sstevel@tonic-gate * Some "semi-generic" defines used by ether, token, and fddi, 5667c478bd9Sstevel@tonic-gate * and probably anything else with addrlen == 6 && saplen == -2. 5677c478bd9Sstevel@tonic-gate */ 5687c478bd9Sstevel@tonic-gate 5697c478bd9Sstevel@tonic-gate struct gld_dlsap { 5707c478bd9Sstevel@tonic-gate unsigned char glda_addr[ETHERADDRL]; 5717c478bd9Sstevel@tonic-gate unsigned short glda_sap; 5727c478bd9Sstevel@tonic-gate }; 5737c478bd9Sstevel@tonic-gate 5747c478bd9Sstevel@tonic-gate #define DLSAP(p, offset) ((struct gld_dlsap *)((caddr_t)(p)+offset)) 5757c478bd9Sstevel@tonic-gate 5767c478bd9Sstevel@tonic-gate typedef uchar_t mac_addr_t[ETHERADDRL]; 5777c478bd9Sstevel@tonic-gate 5787c478bd9Sstevel@tonic-gate struct llc_snap_hdr { 5797c478bd9Sstevel@tonic-gate uchar_t d_lsap; /* destination service access point */ 5807c478bd9Sstevel@tonic-gate uchar_t s_lsap; /* source link service access point */ 5817c478bd9Sstevel@tonic-gate uchar_t control; /* short control field */ 5827c478bd9Sstevel@tonic-gate uchar_t org[3]; /* Ethernet style organization field */ 5837c478bd9Sstevel@tonic-gate ushort_t type; /* Ethernet style type field */ 5847c478bd9Sstevel@tonic-gate }; 5857c478bd9Sstevel@tonic-gate 5867c478bd9Sstevel@tonic-gate #define LLC_HDR1_LEN 3 /* Length of the LLC1 header */ 5877c478bd9Sstevel@tonic-gate #define LLC_SNAP_HDR_LEN 8 /* Full length of SNAP header */ 5887c478bd9Sstevel@tonic-gate #define LSAP_SNAP 0xaa /* SAP for SubNet Access Protocol */ 5897c478bd9Sstevel@tonic-gate #define CNTL_LLC_UI 0x03 /* un-numbered information packet */ 5907c478bd9Sstevel@tonic-gate 5917c478bd9Sstevel@tonic-gate /* ======================== */ 5927c478bd9Sstevel@tonic-gate /* FDDI related definitions */ 5937c478bd9Sstevel@tonic-gate /* ======================== */ 5947c478bd9Sstevel@tonic-gate 5957c478bd9Sstevel@tonic-gate struct fddi_mac_frm { 5967c478bd9Sstevel@tonic-gate uchar_t fddi_fc; 5977c478bd9Sstevel@tonic-gate mac_addr_t fddi_dhost; 5987c478bd9Sstevel@tonic-gate mac_addr_t fddi_shost; 5997c478bd9Sstevel@tonic-gate }; 6007c478bd9Sstevel@tonic-gate 6017c478bd9Sstevel@tonic-gate /* ============================== */ 6027c478bd9Sstevel@tonic-gate /* Token Ring related definitions */ 6037c478bd9Sstevel@tonic-gate /* ============================== */ 6047c478bd9Sstevel@tonic-gate 6057c478bd9Sstevel@tonic-gate struct tr_mac_frm_nori { 6067c478bd9Sstevel@tonic-gate uchar_t tr_ac; 6077c478bd9Sstevel@tonic-gate uchar_t tr_fc; 6087c478bd9Sstevel@tonic-gate mac_addr_t tr_dhost; 6097c478bd9Sstevel@tonic-gate mac_addr_t tr_shost; 6107c478bd9Sstevel@tonic-gate }; 6117c478bd9Sstevel@tonic-gate 6127c478bd9Sstevel@tonic-gate struct tr_mac_frm { 6137c478bd9Sstevel@tonic-gate uchar_t tr_ac; 6147c478bd9Sstevel@tonic-gate uchar_t tr_fc; 6157c478bd9Sstevel@tonic-gate mac_addr_t tr_dhost; 6167c478bd9Sstevel@tonic-gate mac_addr_t tr_shost; 6177c478bd9Sstevel@tonic-gate struct gld_ri tr_ri; /* Routing Information Field */ 6187c478bd9Sstevel@tonic-gate }; 6197c478bd9Sstevel@tonic-gate 620*605445d5Sdg199075 /* 621*605445d5Sdg199075 * Note that the pad field is used to save the value of tci. 622*605445d5Sdg199075 */ 623*605445d5Sdg199075 #define GLD_SAVE_MBLK_VTAG(mp, vtag) (DB_TCI(mp) = GLD_VTAG_TCI(vtag)) 624*605445d5Sdg199075 #define GLD_CLEAR_MBLK_VTAG(mp) GLD_SAVE_MBLK_VTAG(mp, 0) 625*605445d5Sdg199075 #define GLD_GET_MBLK_VTAG(mp) GLD_TCI2VTAG(DB_TCI(mp)) 626*605445d5Sdg199075 627*605445d5Sdg199075 int gld_interpret_ether(gld_mac_info_t *, mblk_t *, pktinfo_t *, packet_flag_t); 628*605445d5Sdg199075 int gld_interpret_fddi(gld_mac_info_t *, mblk_t *, pktinfo_t *, packet_flag_t); 629*605445d5Sdg199075 int gld_interpret_tr(gld_mac_info_t *, mblk_t *, pktinfo_t *, packet_flag_t); 630*605445d5Sdg199075 int gld_interpret_ib(gld_mac_info_t *, mblk_t *, pktinfo_t *, packet_flag_t); 631*605445d5Sdg199075 void gld_interpret_mdt_ib(gld_mac_info_t *, mblk_t *, pdescinfo_t *, 632*605445d5Sdg199075 pktinfo_t *, mdt_packet_flag_t); 633*605445d5Sdg199075 634*605445d5Sdg199075 mblk_t *gld_fastpath_ether(gld_t *, mblk_t *); 635*605445d5Sdg199075 mblk_t *gld_fastpath_fddi(gld_t *, mblk_t *); 636*605445d5Sdg199075 mblk_t *gld_fastpath_tr(gld_t *, mblk_t *); 637*605445d5Sdg199075 mblk_t *gld_fastpath_ib(gld_t *, mblk_t *); 638*605445d5Sdg199075 639*605445d5Sdg199075 mblk_t *gld_insert_vtag_ether(mblk_t *, uint32_t); 640*605445d5Sdg199075 641*605445d5Sdg199075 mblk_t *gld_unitdata_ether(gld_t *, mblk_t *); 642*605445d5Sdg199075 mblk_t *gld_unitdata_fddi(gld_t *, mblk_t *); 643*605445d5Sdg199075 mblk_t *gld_unitdata_tr(gld_t *, mblk_t *); 644*605445d5Sdg199075 mblk_t *gld_unitdata_ib(gld_t *, mblk_t *); 645*605445d5Sdg199075 646*605445d5Sdg199075 void gld_init_ether(gld_mac_info_t *); 647*605445d5Sdg199075 void gld_init_fddi(gld_mac_info_t *); 648*605445d5Sdg199075 void gld_init_tr(gld_mac_info_t *); 649*605445d5Sdg199075 void gld_init_ib(gld_mac_info_t *); 650*605445d5Sdg199075 651*605445d5Sdg199075 void gld_uninit_ether(gld_mac_info_t *); 652*605445d5Sdg199075 void gld_uninit_fddi(gld_mac_info_t *); 653*605445d5Sdg199075 void gld_uninit_tr(gld_mac_info_t *); 654*605445d5Sdg199075 void gld_uninit_ib(gld_mac_info_t *); 655*605445d5Sdg199075 6567c478bd9Sstevel@tonic-gate #ifdef __cplusplus 6577c478bd9Sstevel@tonic-gate } 6587c478bd9Sstevel@tonic-gate #endif 6597c478bd9Sstevel@tonic-gate 6607c478bd9Sstevel@tonic-gate #endif /* _SYS_GLDPRIV_H */ 661