Declarations and Data Structures
This section describes the gld_mac_info(9S) and gld_stats structures.
gld_mac_info Structure
The GLD MAC information (gld_mac_info) structure is the main data interface that links
the device-specific driver with GLD. This structure contains data required by GLD and
a pointer to an optional additional driver-specific information structure.
Allocate the gld_mac_info structure using gld_mac_alloc(). Deallocate the structure using gld_mac_free(). Drivers must
not make any assumptions about the length of this structure, which might vary
in different releases of the Solaris OS, GLD, or both. Structure members private
to GLD, not documented here, should neither be set nor be read by
the device-specific driver.
The gld_mac_info(9S) structure contains the following fields.
caddr_t gldm_private; /* Driver private data */
int (*gldm_reset)(); /* Reset device */
int (*gldm_start)(); /* Start device */
int (*gldm_stop)(); /* Stop device */
int (*gldm_set_mac_addr)(); /* Set device phys addr */
int (*gldm_set_multicast)(); /* Set/delete multicast addr */
int (*gldm_set_promiscuous)(); /* Set/reset promiscuous mode */
int (*gldm_send)(); /* Transmit routine */
uint_t (*gldm_intr)(); /* Interrupt handler */
int (*gldm_get_stats)(); /* Get device statistics */
int (*gldm_ioctl)(); /* Driver-specific ioctls */
char *gldm_ident; /* Driver identity string */
uint32_t gldm_type; /* Device type */
uint32_t gldm_minpkt; /* Minimum packet size */
/* accepted by driver */
uint32_t gldm_maxpkt; /* Maximum packet size */
/* accepted by driver */
uint32_t gldm_addrlen; /* Physical address length */
int32_t gldm_saplen; /* SAP length for DL_INFO_ACK */
unsigned char *gldm_broadcast_addr; /* Physical broadcast addr */
unsigned char *gldm_vendor_addr; /* Factory MAC address */
t_uscalar_t gldm_ppa; /* Physical Point of */
/* Attachment (PPA) number */
dev_info_t *gldm_devinfo; /* Pointer to device's */
/* dev_info node */
ddi_iblock_cookie_t gldm_cookie; /* Device's interrupt */
/* block cookie */
The gldm_private structure member is visible to the device driver. gldm_private is also
private to the device-specific driver. gldm_private is not used or modified by GLD. Conventionally,
gldm_private is used as a pointer to private data, pointing to a per-instance
data structure that is both defined and allocated by the driver.
The following group of structure members must be set by the driver before
calling gld_register(), and should not thereafter be modified by the driver. Because gld_register()
might use or cache the values of structure members, changes made by the
driver after calling gld_register() might cause unpredictable results. For more information on these structures,
see the gld(9E) man page.
- gldm_reset
Pointer to driver entry point.
- gldm_start
Pointer to driver entry point.
- gldm_stop
Pointer to driver entry point.
- gldm_set_mac_addr
Pointer to driver entry point.
- gldm_set_multicast
Pointer to driver entry point.
- gldm_set_promiscuous
Pointer to driver entry point.
- gldm_send
Pointer to driver entry point.
- gldm_intr
Pointer to driver entry point.
- gldm_get_stats
Pointer to driver entry point.
- gldm_ioctl
Pointer to driver entry point. This pointer is allowed to be null.
- gldm_ident
Pointer to a string that contains a short description of the device. This pointer is used to identify the device in system messages.
- gldm_type
Type of device the driver handles. GLD currently supports the following values:
DL_ETHER (ISO 8802-3 (IEEE 802.3) and Ethernet Bus)
DL_TPR (IEEE 802.5 Token Passing Ring)
DL_FDDI (ISO 9314-2 Fibre Distributed Data Interface)
This structure member must be correctly set for GLD to function properly.
- gldm_minpkt
Minimum Service Data Unit size: the minimum packet size, not including the MAC header, that the device can transmit. This size is allowed to be zero if the device-specific driver handles any required padding.
- gldm_maxpkt
Maximum Service Data Unit size: the maximum size of packet, not including the MAC header, that can be transmitted by the device. For Ethernet, this number is 1500.
- gldm_addrlen
The length in bytes of physical addresses handled by the device. For Ethernet, Token Ring, and FDDI, the value of this structure member should be 6.
- gldm_saplen
The length in bytes of the SAP address used by the driver. For GLD-based drivers, the length should always be set to -2. A length of -2 indicates that 2-byte SAP values are supported and that the SAP appears after the physical address in a DLSAP address. See Appendix A.2, “Message DL_INFO_ACK,” in the DLPI specification for more details.
- gldm_broadcast_addr
Pointer to an array of bytes of length gldm_addrlen containing the broadcast address to be used for transmit. The driver must provide space to hold the broadcast address, fill the space with the appropriate value, and set gldm_broadcast_addr to point to the address. For Ethernet, Token Ring, and FDDI, the broadcast address is normally 0xFF-FF-FF-FF-FF-FF.
- gldm_vendor_addr
Pointer to an array of bytes of length gldm_addrlen that contains the vendor-provided network physical address of the device. The driver must provide space to hold the address, fill the space with information from the device, and set gldm_vendor_addr to point to the address.
- gldm_ppa
PPA number for this instance of the device. The PPA number should always be set to the instance number that is returned from ddi_get_instance(9F).
- gldm_devinfo
Pointer to the dev_info node for this device.
- gldm_cookie
Interrupt block cookie returned by one of the following routines:
This cookie must correspond to the device's receive-interrupt, from which gld_recv() is called.
gld_stats Structure
After calling gldm_get_stats(), a GLD-based driver uses the (gld_stats) structure to communicate statistics and
state information to GLD. See the gld(9E) and gld(7D) man pages. The
members of this structure, having been filled in by the GLD-based driver, are
used when GLD reports the statistics. In the tables below, the name of
the statistics variable reported by GLD is noted in the comments. See the
gld(7D) man page for a more detailed description of the meaning of each
statistic.
Drivers must not make any assumptions about the length of this structure. The
structure length might vary in different releases of the Solaris OS, GLD, or
both. Structure members private to GLD, which are not documented here, should not
be set or be read by the device-specific driver.
The following structure members are defined for all media types:
uint64_t glds_speed; /* ifspeed */
uint32_t glds_media; /* media */
uint32_t glds_intr; /* intr */
uint32_t glds_norcvbuf; /* norcvbuf */
uint32_t glds_errrcv; /* ierrors */
uint32_t glds_errxmt; /* oerrors */
uint32_t glds_missed; /* missed */
uint32_t glds_underflow; /* uflo */
uint32_t glds_overflow; /* oflo */
The following structure members are defined for media type DL_ETHER:
uint32_t glds_frame; /* align_errors */
uint32_t glds_crc; /* fcs_errors */
uint32_t glds_duplex; /* duplex */
uint32_t glds_nocarrier; /* carrier_errors */
uint32_t glds_collisions; /* collisions */
uint32_t glds_excoll; /* ex_collisions */
uint32_t glds_xmtlatecoll; /* tx_late_collisions */
uint32_t glds_defer; /* defer_xmts */
uint32_t glds_dot3_first_coll; /* first_collisions */
uint32_t glds_dot3_multi_coll; /* multi_collisions */
uint32_t glds_dot3_sqe_error; /* sqe_errors */
uint32_t glds_dot3_mac_xmt_error; /* macxmt_errors */
uint32_t glds_dot3_mac_rcv_error; /* macrcv_errors */
uint32_t glds_dot3_frame_too_long; /* toolong_errors */
uint32_t glds_short; /* runt_errors */
The following structure members are defined for media type DL_TPR:
uint32_t glds_dot5_line_error /* line_errors */
uint32_t glds_dot5_burst_error /* burst_errors */
uint32_t glds_dot5_signal_loss /* signal_losses */
uint32_t glds_dot5_ace_error /* ace_errors */
uint32_t glds_dot5_internal_error /* internal_errors */
uint32_t glds_dot5_lost_frame_error /* lost_frame_errors */
uint32_t glds_dot5_frame_copied_error /* frame_copied_errors */
uint32_t glds_dot5_token_error /* token_errors */
uint32_t glds_dot5_freq_error /* freq_errors */
The following structure members are defined for media type DL_FDDI:
uint32_t glds_fddi_mac_error; /* mac_errors */
uint32_t glds_fddi_mac_lost; /* mac_lost_errors */
uint32_t glds_fddi_mac_token; /* mac_tokens */
uint32_t glds_fddi_mac_tvx_expired; /* mac_tvx_expired */
uint32_t glds_fddi_mac_late; /* mac_late */
uint32_t glds_fddi_mac_ring_op; /* mac_ring_ops */
Most of the above statistics variables are counters that denote the number of
times that the particular event was observed. The following statistics do not represent
the number of times:
- glds_speed
Estimate of the interface's current bandwidth in bits per second. This object should contain the nominal bandwidth for those interfaces that do not vary in bandwidth or where an accurate estimate cannot be made.
- glds_media
Type of media (wiring) or connector used by the hardware. The following media names are supported:
GLDM_AUI
GLDM_BNC
GLDM_TP
GLDM_10BT
GLDM_100BT
GLDM_100BTX
GLDM_100BT4
GLDM_RING4
GLDM_RING16
GLDM_FIBER
GLDM_PHYMII
GLDM_UNKNOWN
- glds_duplex
Current duplex state of the interface. Supported values are GLD_DUPLEX_HALF and GLD_DUPLEX_FULL. GLD_DUPLEX_UNKNOWN is also allowed.