スポンサーリンク

NATM(4) FreeBSD カーネルインタフェースマニュアル NATM(4)

名称

natm − ネイティブモード ATM プロトコル層

解説

BSD ATM ソフトウェアはネイティブモード ATM プロトコル層を含み、 AAL0 と AAL5 の仮想回線 (バーチャルサーキット) へのソケットレベルのアクセスを提供 します。本プロトコル層を有効にするには、カーネル設定ファイルに

options NATM

を加え、カーネルの再構築を行ってください (その際 ‘‘make clean’’ を忘れず に行ってください)。

NATM API

NATM 層では仮想回線を指定するために struct sockaddr_natm を使用します:

      struct sockaddr_natm {
        u_int8_t      snatm_len;              /* 長さ */
        u_int8_t      snatm_family;           /* AF_NATM */
        char          snatm_if[IFNAMSIZ];     /* インタフェース名 */
        u_int16_t     snatm_vci;              /* vci */
        u_int8_t      snatm_vpi;              /* vpi */
      };

VPI 0, VCI 201 の仮想回線に AAL5 コネクションを作成するには次の様にしま す:

        struct sockaddr_natm snatm;
        int s, r;
        s = socket(AF_NATM, SOCK_STREAM, PROTO_NATMAAL5);
                             /* 注: PROTO_NATMAAL0 は AAL0 です */
        if (s < 0) { perror("socket"); exit(1); }
        bzero(&snatm, sizeof(snatm));
        snatm.snatm_len = sizeof(snatm);
        snatm.snatm_family = AF_NATM;
        sprintf(snatm.snatm_if, "en0");
        snatm.snatm_vci = 201;
        snatm.snatm_vpi = 0;
        r = connect(s, (struct sockaddr *)&snatm, sizeof(snatm));
        if (r < 0) { perror("connect"); exit(1); }
        /* 以上で s が ATM に接続されました! */

socket() コールは単純に未接続の NATM ソケットを作成します。 connect() コールは未接続の NATM ソケットを仮想回線に結び付け、データの受信のために その仮想回線を有効にするようドライバに通知します。 connect() コールの実行 後、そのソケットに対し read() または write() を使用して ATM 入出力を行い ます。

内部の NATM 操作

内部的に、NATM プロトコル層はそのシステム上の全てのアクティブな仮想回線の リストを natm_pcbs に保持しています。これは、NATM と IP が仮想回線上で衝 突することを防ぐために、その時 IP で使用中の回線を含みます。

仮想回線のデータ受信が有効化されると、 NATM プロトコル層はプロトコル制御 ブロックのアドレスを受信 ‘‘ハンドル’’ としてドライバへ渡します。入力デー タが到着すると、ドライバは適切な受信ハンドルと共にデータを返します。 NATM 層は、プロトコル制御ブロックの検索のオーバヘッドを避けるために、この情報 を使用します。これにより、ATM が既にデータをデマルチプレクスしてある結果 を利用することができます。

その他の NATM の問題

我々は現在ビデオサーバプロジェクトに取り組んでおり、その構成の一部として このドライバを使用しています。我々の手元には我々の作成した MMX と呼ばれる デバイスがあります。ビデオカメラを MMX に接続して、ビデオ出力を AAL0 のセ ルストリームとして送信させることができます。もちろんこのストリームはかな り速く (実際に大容量です!)、本ドライバの通常の AAL0 への処理では対処でき ません (皆さんは、小さい mbuf ごとのセルをアプリケーションに作成させよう と試みるでしょう。しかし、ソケット層がその種のデータストリームの処理につ いていけない事がわかります)。この問題を解決するため、我々は ‘‘raw’’ モー ドを実装しました。これは、カードから得た未処理の AAL0 の情報を、大きな データのかたまりへと処理します。ソケット層がおかしな振る舞いをすること無 く、このデータをリアルタイムにディスクへ保存することができます。あいに く、そのデータ内には RBD (receive buffer descriptors: 受信バッファ記述子) 及びセルヘッダが含まれていますが、これは取り込み後に除去しなければなりま せん。 ‘‘raw’’ モードを有効化するには次の様に ioctl を使用します:

        int size = 4000; /* bytes */
        ret = ioctl(s, SIOCRAWATM, (caddr_t)&size);

この例では、通常の 48 バイトのかたまりではなく、4000 バイトのかたまりで AAL0 のデータを処理するようドライバに伝えます。明らかにこれは少々粗雑な方 法ではありますが、我々の現在のアプリケーションには必要なものです。将来、 適した大きな AAL5 のフレームでビデオ情報源からのデータ送信が行われること を期待しています。

警告

NATM プロトコルのサポートは ATM プロトコルの開発により変更されやすいで す。ユーザは現在の実装の詳細に依存するべきではなく、むしろエクスポートさ れたサービスに依存すべきです。

関連項目

en(4)

作者

1996 年、NetBSD において、Washington University の Chuck Cranor が NATM プロトコル層を EN ATM ドライバと共に実装しました。

FreeBSD 10.0 December 29, 1997 FreeBSD 10.0

スポンサーリンク