本节介绍 gld_mac_info(9S) 和 gld_stats 结构。
GLDv2 MAC 信息 (gld_mac_info) 结构是用于链接特定于设备的驱动程序与 GLDv2 的主数据接口。此结构包含 GLDv2 所需的数据,以及指向可选的其他特定于驱动程序的信息结构的指针。
可使用 gld_mac_alloc 分配 gld_mac_info() 结构,可使用 gld_mac_free() 解除分配此结构。驱动程序不能做出有关此结构长度的任何假设,因为此长度在不同发行版的 Solaris OS 和/或 GLDv2 中可能会有所不同。专用于 GLDv2 的结构成员(未在此处介绍)既不应该由特定于设备的驱动程序设置,也不应该由其读取。
gld_mac_info(9S) 结构包含以下字段。
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 */
gldm_private 结构成员对设备驱动程序可见。gldm_private 还专用于特定于设备的驱动程序。GLDv2 无法使用或修改 gldm_private。通常,gldm_private 用作指向专用数据的指针,指向同时由驱动程序定义和分配的每个实例的数据结构。
以下结构成员组必须由驱动程序在调用 gld_register() 之前设置,并且此后不应该由驱动程序进行修改。由于 gld_register() 可能会使用或高速缓存结构成员的值,因此,驱动程序在调用 gld_register() 之后进行的更改可能会导致不可预测的结果。有关这些结构的更多信息,请参见 gld(9E) 手册页。
指向驱动程序入口点的指针。
指向驱动程序入口点的指针。
指向驱动程序入口点的指针。
指向驱动程序入口点的指针。
指向驱动程序入口点的指针。
指向驱动程序入口点的指针。
指向驱动程序入口点的指针。
指向驱动程序入口点的指针。
指向驱动程序入口点的指针。
指向驱动程序入口点的指针。允许此指针为 null。
指向包含设备简短说明的字符串的指针。此指针用于在系统消息中标识设备。
驱动程序处理的设备的类型。GLDv2 目前支持以下值:
DL_ETHER(ISO 8802-3 (IEEE 802.3) 和以太网总线)
DL_TPR(IEEE 802.5 令牌传递环)
DL_FDDI(ISO 9314-2 光纤分布式数据接口)
必须正确设置此结构成员,GLDv2 才能正常运行。
最小服务数据单元大小:设备可以传输的最小包大小(不包括 MAC 头)。如果特定于设备的驱动程序处理任何所需的填充,则允许此大小为 0。
最大服务数据单元大小:设备可以传输的最大包大小(不包括 MAC 头)。对于以太网,此数值为 1500。
设备所处理的物理地址的长度(以字节为单位)。对于以太网、令牌环和 FDDI,此结构成员的值应该为 6。
驱动程序所使用的 SAP 地址的长度(以字节为单位)。对于基于 GLDv2 的驱动程序,应该始终将长度设置为 -2。长度为 -2 表示支持 2 个字节的 SAP 值,并且 SAP 出现在 DLSAP 地址中的物理地址之后。有关更多详细信息,请参见 DLPI 规范中的附录 A.2“消息 DL_INFO_ACK”。
指向长度 gldm_addrlen 字节数组的指针,该数组包含要用于传输的广播地址。驱动程序必须提供保存广播地址的空间,使用相应的值填充此空间,并将 gldm_broadcast_addr 设置为指向此地址。对于以太网、令牌环和 FDDI,广播地址通常为 0xFF-FF-FF-FF-FF-FF。
指向长度为 gldm_addrlen 字节的数组的指针,该数组包含供应商提供的设备网络物理地址。驱动程序必须提供保存地址的空间,使用来自设备的信息填充此空间,并将 gldm_vendor_addr 设置为指向此地址。
此设备实例的 PPA 编号。应该始终将 PPA 编号设置为从 ddi_get_instance(9F) 返回的实例编号。
指向此设备的 dev_info 节点的指针。
以下例程之一返回的中断块 cookie:
此 cookie 必须对应于设备的接收中断,可从该中断中调用 gld_recv()。
调用 gldm_get_stats() 之后,基于 GLDv2 的驱动程序会使用 (gld_stats) 结构将统计信息和状态信息传递给 GLDv2。请参见 gld(9E) 和 gld(7D) 手册页。当 GLDv2 报告统计信息时,将使用已由基于 GLDv2 的驱动程序填充的此结构的成员。在下面各表的注释中说明了 GLDv2 所报告的统计变量的名称。有关每条统计信息含义的更详细说明,请参见 gld(7D) 手册页。
驱动程序不得做出有关此结构长度的任何假设。此结构长度在不同发行版的 Solaris OS 和/或 GLDv2 中可能会有所不同。专用于 GLDv2 的结构成员(未在此处介绍)既不应该由特定于设备的驱动程序设置,也不应该由其读取。
针对所有介质类型定义了以下结构成员:
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 */
针对介质类型 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 */
针对介质类型 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 */
针对介质类型 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 */
上述大多数统计变量均为表示发现特定事件次数的计数器。以下统计信息不表示次数:
接口的当前带宽估算(以 bps 为单位)。此对象应该包含那些带宽不变或无法进行准确估算的接口的标称带宽。
硬件所使用的介质(连线)或连接器的类型。支持以下介质名称:
GLDM_AUI
GLDM_BNC
GLDM_TP
GLDM_10BT
GLDM_100BT
GLDM_100BTX
GLDM_100BT4
GLDM_RING4
GLDM_RING16
GLDM_FIBER
GLDM_PHYMII
GLDM_UNKNOWN
接口的当前双工状态。支持的值包括 GLD_DUPLEX_HALF 和 GLD_DUPLEX_FULL。此外,还允许 GLD_DUPLEX_UNKNOWN。