options NATMを加え、カーネルの再構築を行ってください (その際 ``make clean'' を忘れずに行ってください)。
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 に接続されました! */
Fn socket コールは単純に未接続の NATM ソケットを作成します。 Fn connect コールは未接続の NATM ソケットを仮想回線に結び付け、 データの受信のためにその仮想回線を有効にするようドライバに通知します。 Fn connect コールの実行後、そのソケットに対し Fn read または Fn write を使用して ATM 入出力を行います。
仮想回線のデータ受信が有効化されると、 NATM プロトコル層はプロトコル制御ブロックのアドレスを 受信 ``ハンドル'' としてドライバへ渡します。 入力データが到着すると、 ドライバは適切な受信ハンドルと共にデータを返します。 NATM 層は、 プロトコル制御ブロックの検索のオーバヘッドを避けるために、 この情報を使用します。 これにより、ATM が既にデータをデマルチプレクスしてある結果を 利用することができます。
int size = 4000; /* bytes */ ret = ioctl(s, SIOCRAWATM, (caddr_t)&size);
この例では、通常の 48 バイトのかたまりではなく、4000 バイトの かたまりで AAL0 のデータを処理するようドライバに伝えます。 明らかにこれは少々粗雑な方法ではありますが、 我々の現在のアプリケーションには必要なものです。 将来、適した大きな AAL5 のフレームでビデオ情報源からの データ送信が行われることを期待しています。