この章の目次にもどる
前頁:第13章 プリンタイメージドライバにもどる

第14章 ネットワークデバイス

14.1 対象デバイス

14.2 固有機能

14.3 タスク起動パラメータ

OS とは独立してリンクされ、システム起動時に以下のコマンドで起動される。

kerext netdrv [!優先度]    (デフォールト優先度は 25)

14.4 属性データ

以下の属性データをサポートする。

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 :
事象通知用メッセージバッファID (RW)
data:   ID

事象通知用メッセージバッファID を取得 / 設定する。

DN_NETREST :
リセット (RW)
data:   W

任意のデータの書き込み、または読み込みにより、ネットワークアダプタを リセットして動作を再開する。(読み込みでもリセットされる点に注意)。

DN_NETADDR :
ネットワーク物理アドレス (R)
data:   NetAddr

typedef struct  {
    UB    c[6];
} NetAddr;

ネットワークアダプタに設定されているイサーネット物理アドレスを取得する。

DN_NETDEVINFO :
ネットワークデバイス情報 (R)
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;

ネットワークアダプタのデバイス情報を取得する。

製品名 :
認識したネットワークアダプタの製品名を 40 文字の ASCII 文字で示す。 40 文字に満たないときは 0 パッドされる。
I/O 開始アドレス :
ネットワークアダプタの I/O 開始アドレス。
I/O サイズ :
ネットワークアダプタの I/O アドレスサイズ。
割り込み番号 :
ネットワークアダプタが使用する割り込み番号。
ハードウェア種別インデックス :
DEVCONF で設定されたハードウェア種別インデックス。
接続コネクタ :
接続されているコネクタ / ケーブルを示す。
#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 */
動作状態 :
ネットワークアダプタの動作状態。
>= 0 : 正常動作、< 0 : 動作不能

DN_NETSTINFO :
ネットワーク統計情報 (R)
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 :
ネットワーク統計情報クリア (R)
data:   NetStInfo

ネットワークアダプタの統計情報をを取得し、 取得後に、すべての状態を 0 にクリアする。

DN_NETRXBUF :
受信バッファ (W)
data:   VP

受信バッファを設定する。

受信バッファは、DN_NETRXBUFSZ で設定した最大受信パケットサイズ以上の領域を 持っていなくてはいけない。 NULL を設定すると、今まで設定した受信バッファをすべて廃棄する。

パケットの受信を行うためには、あらかじめ、適当な数の受信バッファを設定して おく必要がある。パケットを受信すると設定された受信バッファのうちの 1 つに データを設定して、DN_NETEVENT で設定されたメッセージバッファに受信イベントを 通知する。受信することにより、設定されていた受信バッファが 1 つ減るため、 新たな受信バッファを設定する必要がある。

受信バッファはメモリ常駐でなくてはいけないが、一般のアプリケーションでは 使用しない前提のため、アクセスに関してのチェックは行われない。

DN_NETRXBUFSZ :
受信バッファサイズ (RW)
data:   NetRxBufSz

typedef struct {
    W     minsz;     /* 最小受信パケットサイズ */
    W     maxsz;     /* 最大受信パケットサイズ */
} NetRxBufSz;

受信するパケットの最大、最小サイズを取得 / 設定する。

受信したパケットのサイズが設定した範囲外のとき、そのパケットは廃棄される。
デフォールトは、minsz = 60、maxsz = 1520 である。

設定した値が、不正なときはエラーとなる。 ただし、maxsz が、ドライバで定義されている最大値を超えるときは、 エラーとはならずに最大値が設定される。

14.5 固有データ

データ番号:0 (W)
データ数: 書き込みバイト数

一回の書き込みを一つのパケットとして送信を行う。
送信可能な最大パケットサイズを超えた場合はエラーとなる。
送信ができないときは、ER_BUSY となる。

14.6 事象通知

DN_NETEVENT で設定されたメッセージバッファに、以下のメッセージを事象通知する。

typedef struct {
    UH    len;       /* 受信したデータのバイト数 */
    VP    buf;       /* 受信バッファアドレス */
} NetEvent;

受信メッセージ :
パケットを受信したときの事象通知。
buf は、DN_NETRXBUF で設定した受信バッファのいずれかのアドレス であるが、設定した順とは限らない。
len は buf 内に格納された受信パケットの実際のバイト数であり、 DN_NETRXBUFSZ で設定した minsz 〜 maxsz の範囲の値となる。

送信可メッセージ :
以下のときの事象通知で、len = 0、buf = NULL となる。

14.7 使用方法

上位 (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) で、排他書き込みオープンすることにより、 他のユーティリティにより、デバイスを読み込みオープンして、 ネットワークデバイス情報、ネットワーク統計情報を取得することが できる。また、異常時にリセットすることができる。

14.8 コンフィグレーション

ドライバレコード :

ドライバファイル (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 ファイル :

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 (省略) は自動検出/設定となる。


この章の目次にもどる
前頁:第13章 プリンタイメージドライバにもどる