"Neta" 1番目のユニット"Netb" 2番目のユニット
OS とは独立してリンクされ、システム起動時に以下のコマンドで起動される。
kerext netdrv [!優先度] (デフォールト優先度は 25)
以下の属性データをサポートする。
| R | 読み込みのみ可 |
| W | 書き込みのみ可 |
| RW | 読み込み / 書き込み可 |
/* NEDRV データ番号 */
typedef enum {
/* 個別属性 */
DN_NETEVENT = -100,
DN_NETRESET = -103,
DN_NETADDR = -105,
DN_NETDEVINFO = -110,
DN_NETSTINFO = -111,
DN_NETCSTINFO = -112,
DN_NETRXBUF = -113,
DN_NETRXBUFSZ = -114
} NetDrvDataNo;
DN_NETEVENT :
data: ID
事象通知用メッセージバッファID を取得 / 設定する。
DN_NETREST :
data: W
任意のデータの書き込み、または読み込みにより、ネットワークアダプタを リセットして動作を再開する。(読み込みでもリセットされる点に注意)。
DN_NETADDR :
data: NetAddr
typedef struct {
UB c[6];
} NetAddr;
ネットワークアダプタに設定されているイサーネット物理アドレスを取得する。
DN_NETDEVINFO :
data: NetDevInfo
#define L_NETPNAME (40) /* 製品名長さ */
typedef struct {
UB name[L_NETPNAME]; /* 製品名(ASCII) */
UW iobase; /* I/O 開始アドレス */
UW iosize; /* I/O サイズ */
UW intno; /* 割り込み番号 */
UW kind; /* ハードウェア種別インデックス */
UW ifconn; /* 接続コネクタ */
W stat; /* 動作状態 (>= 0: 正常) */
} NetDevInfo;
ネットワークアダプタのデバイス情報を取得する。
#define IFC_UNKNOWN (0) /* 不明 / デフォールト */ #define IFC_AUI (1) /* AUI (10 Base 5) */ #define IFC_TPE (2) /* TPE (10 Base T) */ #define IFC_BNC (3) /* BNC (10 Base 2) */ #define IFC_100TX (4) /* 100 Base TX */ #define IFC_100FX (5) /* 100 Base FX */ #define IFC_AUTO (6) /* Auto */
DN_NETSTINFO :
data: NetStInfo
typedef struct {
UW rxpkt; /* 受信したパケット数 */
UW rxerr; /* 受信エラー発生回数 */
UW misspkt; /* 受信して廃棄したパケット数 */
UW invpkt; /* 不正パケット数 */
UW txpkt; /* 送信パケット(要求)数 */
UW txerr; /* 送信エラー発生回数 */
UW txbusy; /* 送信ビジー回数 */
UW collision; /* コリジョン数 */
UW nint; /* 割り込み発生回数 */
UW rxint; /* 受信割り込み回数 */
UW txint; /* 送信割り込み回数 */
UW overrun; /* ハードオーバーラン回数 */
UW hwerr; /* ハードエラー回数 */
UW other[3]; /* その他 */
} NetStInfo;
ネットワークアダプタの統計情報を取得する。
DN_NETCSTINFO :
data: NetStInfo
ネットワークアダプタの統計情報をを取得し、 取得後に、すべての状態を 0 にクリアする。
DN_NETRXBUF :
data: VP
受信バッファを設定する。
受信バッファは、DN_NETRXBUFSZ で設定した最大受信パケットサイズ以上の領域を
持っていなくてはいけない。
NULL を設定すると、今まで設定した受信バッファをすべて廃棄する。
パケットの受信を行うためには、あらかじめ、適当な数の受信バッファを設定して
おく必要がある。パケットを受信すると設定された受信バッファのうちの 1 つに
データを設定して、DN_NETEVENT で設定されたメッセージバッファに受信イベントを
通知する。受信することにより、設定されていた受信バッファが 1 つ減るため、
新たな受信バッファを設定する必要がある。
受信バッファはメモリ常駐でなくてはいけないが、一般のアプリケーションでは
使用しない前提のため、アクセスに関してのチェックは行われない。
DN_NETRXBUFSZ :
data: NetRxBufSz
typedef struct {
W minsz; /* 最小受信パケットサイズ */
W maxsz; /* 最大受信パケットサイズ */
} NetRxBufSz;
受信するパケットの最大、最小サイズを取得 / 設定する。
受信したパケットのサイズが設定した範囲外のとき、そのパケットは廃棄される。
デフォールトは、minsz = 60、maxsz = 1520 である。
設定した値が、不正なときはエラーとなる。
ただし、maxsz が、ドライバで定義されている最大値を超えるときは、
エラーとはならずに最大値が設定される。
| データ番号: | 0 (W) |
| データ数: | 書き込みバイト数 |
一回の書き込みを一つのパケットとして送信を行う。
送信可能な最大パケットサイズを超えた場合はエラーとなる。
送信ができないときは、ER_BUSY となる。
DN_NETEVENT で設定されたメッセージバッファに、以下のメッセージを事象通知する。
typedef struct {
UH len; /* 受信したデータのバイト数 */
VP buf; /* 受信バッファアドレス */
} NetEvent;
上位 (TCPIP) での標準的な使用方法は以下のようになる。
1. デバイスを排他書き込みオープンする。
2. 物理アドレスを読み込む。(DN_NETADDR)
3. 受信バッファサイズを設定する。(DN_NETRXBUFSZ)
4. 受信バッファを適当な数だけ設定する。 (DN_NETRXBUF)
5. 事象通知用メッセージバッファ ID を書き込む。(DN_NETEVENT)
6. 事象通知用メッセージバッファの待ち、および送信要求の待ちに入る。
受信メッセージのとき
受信したパケットを処理する。
受信バッファを補充設定する。(DN_NETRXBUF)
送信要求のとき
送信可メッセージのとき
送信するパケットがあれば、送信する。(データ番号 0)
7. 受信バッファを廃棄する。(DN_NETRXBUF への NULL 書き込み)
8. 事象通知用メッセージバッファを空にする。
9. デバイスをクローズする。
上位 (TCPIP) で、排他書き込みオープンすることにより、 他のユーティリティにより、デバイスを読み込みオープンして、 ネットワークデバイス情報、ネットワーク統計情報を取得することが できる。また、異常時にリセットすることができる。
ドライバファイル (netdrv) のレコードタイプ 15 のレコードに、 サポートしているネットワークアダプタのハードウェア種別 (kind) と 名称 (name) を示す以下の形式のデータが入っている。
UH kind-1, TC name-1[], TNULL
UH kind-2, TC name-2[], TNULL
: :
UH 0 (終了)
以下にドライバレコードの具体的な内容を示す。
0x0000 "使用しない\0" 0x0001 "Intel EE−PRO/10[ISA]\0" 0x0107 "Intel EE−PRO/100[PCI]\0" 0x0002 "3Com 3C509[ISA]\0" 0x0102 "3Com 3C590/595[PCI]\0" 0x0103 "3Com 3C900/905[PCI]\0" 0x0202 "3Com 3C589[PCカード]\0" 0x0004 "NE2000互換[ISA]\0" 0x0104 "NE2000互換[PCI]\0" 0x0204 "NE2000互換[PCカード]\0" 0x0106 "DEC 21140互換[PCI]\0" 0x0108 "Realtek RTL8139[PCI]\0" 0x0100 "自動検出[PCI]\0" 0
DEVCONF ファイルの以下のエントリによりコンフィグレーションを行う。
NETDEV0 kind [ioaddr] [irq] -- 1 番目のユニット
NETDEV1 kind [ioaddr] [irq] -- 2 番目のユニット
kind : ハードウェア種別 = CCCC FBBB KKKK KKKK
C : 接続コネクタ指定
NetDevInfo の ifconn と同じ。
通常は 0 (IFC_UNKNOWN) を指定する。
F : 強制オープン指定
= 0: デバイスをオープンしたときに動作の初期化を行なう。
PC カードでは挿入されていても、オープンされていな
ければ、電源を供給しない。(オープンに多少時間がかかる)。
= 1: デバイスを検出したときに動作の初期化を行なう。
PC カードでは挿入されている間、常に電源を供給する。
WOL(Wakeup On LAN) 機能を有しているネットワークアダプタでは、
F = 0 を指定した場合に、WOL 機能が有効になる。
B..K : ハードウェア種別 (B : バスタイプ)
B = 0 : ISA、1 : PCI、2 : PC カード
ドライバレコードで設定されている値。
ioaddr: I/O 開始アドレス
0 (省略) は自動検出/設定となる。
irq: 割り込み番号
0 (省略) は自動検出/設定となる。