Oracle® Solaris 11.2 デバイスドライバの記述

印刷ビューの終了

更新: 2014 年 9 月
 
 

GLDv2 の宣言とデータ構造体

このセクションでは、gld_mac_info (9S) および gld_stats 構造体について説明します。

gld_mac_info 構造体

GLDv2 MAC 情報 (gld_mac_info) 構造体は、デバイス固有ドライバを GLDv2 とリンクするメインデータインタフェースです。この構造体には、GLDv2 に必要なデータと、追加の省略可能なドライバ固有情報構造体へのポインタが含まれています。

gld_mac_info 構造体は gld_mac_alloc() を使用して割り当てます。構造体を解放するには gld_mac_free() を使用します。この構造体の長さは Oracle 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 はデバイス固有のドライバ専用でもあります。gldm_private が GLDv2 によって使用または変更されることはありません。gldm_private は従来、非公開データへのポインタとして使用され、ドライバによって定義と割り当ての両方が行われるインスタンスごとのデータ構造体を指し示します。

次のグループの構造体メンバーは、gld_register() を呼び出す前にドライバによって設定する必要があり、その後はドライバによって変更しないでください。gld_register() は構造体メンバーの値を使用またはキャッシュする可能性があるため、gld_register() の呼び出し後にドライバによって値が変更されると予期しない結果を招くことがあります。これらの構造体の詳細は、gld(9E) のマニュアルページを参照してください。

gldm_reset

ドライバのエントリポイントへのポインタ。

gldm_start

ドライバのエントリポイントへのポインタ。

gldm_stop

ドライバのエントリポイントへのポインタ。

gldm_set_mac_addr

ドライバのエントリポイントへのポインタ。

gldm_set_multicast

ドライバのエントリポイントへのポインタ。

gldm_set _promiscuous

ドライバのエントリポイントへのポインタ。

gldm_send

ドライバのエントリポイントへのポインタ。

gldm_intr

ドライバのエントリポイントへのポインタ。

gldm_get_stats

ドライバのエントリポイントへのポインタ。

gldm_ioctl

ドライバのエントリポイントへのポインタ。このポインタは null にすることができます。

gldm_ident

デバイスの簡単な説明を含む文字列へのポインタ。このポインタは、システムメッセージでデバイスを識別するために使用されます。

gldm_type

ドライバが扱うデバイスのタイプ。GLDv2 では現在、次の値がサポートされています。

  • DL_ETHER (ISO 8802-3 (IEEE 802.3) および Ethernet Bus)

  • DL_TPR (IEEE 802.5 Token Passing Ring)

  • DL_FDDI (ISO 9314-2 Fibre Distributed Data Interface)

GLDv2 を正しく動作させるには、この構造体メンバーを適切に設定する必要があります。

gldm_minpkt

最小の Service Data Unit サイズ: デバイスが転送できる最小のパケットサイズであり、MAC ヘッダーを含みません。必要なパディングをデバイス固有ドライバが処理する場合、このサイズは 0 に設定できます。

gldm_maxpkt

最大の Service Data Unit サイズ: デバイスが転送できる最大のパケットサイズであり、MAC ヘッダーを含みません。Ethernet の場合、この数値は 1500 です。

gldm_addrlen

デバイスが処理する物理アドレスの長さ (バイト単位)。Ethernet、トークンリング、および FDDI の場合、この構造体メンバーの値は 6 です。

gldm_saplen

ドライバが使用する SAP アドレスの長さ (バイト単位)。GLDv2 ベースのドライバの場合、この長さは常に -2 に設定されます。-2 の長さは、2 バイトの SAP 値がサポートされること、および DLSAP アドレスで物理アドレスの後ろに SAP が入ることを示します。詳細は、DLPI 仕様の Appendix A.2「Message DL_INFO_ACK」を参照してください。

gldm_broadcast_addr

転送に使用するブロードキャストアドレスが格納されたバイト配列の長さ gldm_addrlen へのポインタ。ドライバはブロードキャストアドレスを保持する領域を提供し、その領域に適切な値を入れ、そのアドレスを指し示すように gldm_broadcast_addr を設定する必要があります。Ethernet、トークンリング、および FDDI の場合、ブロードキャストアドレスは通常、0xFF-FF-FF-FF-FF-FF です。

gldm_vendor_addr

ベンダーが提供するデバイスのネットワーク物理アドレスが格納されたバイト配列の長さ gldm_addrlen へのポインタ。ドライバはこのアドレスを保持する領域を提供し、デバイスから読み取った情報をその領域に入れ、そのアドレスを指し示すように gldm_vendor_addr を設定する必要があります。

gldm_ppa

デバイスのこのインスタンスに対応する PPA 番号。PPA 番号は常に、 ddi_get_instance(9F) から返されるインスタンス番号に設定される必要があります。

gldm_devinfo

このデバイスに対応する dev_info ノードへのポインタ。

gldm_cookie

次のいずれかのルーチンによって返される割り込みブロック cookie。

この cookie は、gld_recv() の呼び出し元になる、デバイスの受信割り込みに対応する必要があります。

gld_stats 構造体

gldm_get_stats() を呼び出したあとに、GLDv2 ベースのドライバは gld_stats 構造体を使用して、統計情報および状態情報を GLDv2 に伝達します。gld (9E) および gld (7D) のマニュアルページを参照してください。この構造体のメンバーは、GLDv2 ベースのドライバによって設定され、GLDv2 が統計情報を報告するときに使用されます。次の表では、GLDv2 によって報告される統計情報変数の名前をコメントで示しています。各統計情報の意味の詳しい説明は、gld(7D) のマニュアルページを参照してください。

ドライバではこの構造体の長さについて何らかの想定を行ってはなりません。構造体の長さは Oracle 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 */

前出の統計情報変数のほとんどは、特定のイベントが検出された回数を示すカウンタです。次の統計情報は回数を表しません。

glds_speed

インタフェースの現在の推定帯域幅 (ビット/秒)。帯域幅の変動のないインタフェース、または正確な推定ができないインタフェースの場合、このオブジェクトには公称の帯域幅が入ります。

glds_media

ハードウェアで使用されているメディア (配線) またはコネクタのタイプ。次のメディア名がサポートされています。

  • 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

インタフェースの現在の二重状態。サポートされる値は GLD_DUPLEX_HALF および GLD_DUPLEX_FULL です。GLD_DUPLEX_UNKNOWN を指定することもできます。