名前
ddp - Linux での AppleTalk プロトコルの実装
書式
#include <sys/socket.h> #include <netatalk/at.h>
ddp_socket = socket(PF_APPLETALK, SOCK_DGRAM, 0); raw_socket = socket(PF_APPLETALK, SOCK_RAW, protocol);
説明
Linux は Inside Appletalk に記述されている Appletalk プロトコルを実装している。 カーネルにあるのは DDP 層と AARP だけである。これらは netatalk プロトコルライブラリを通して利用されるように設計されている。 このページは DDP 層を直接利用したいユーザーのために、 インターフェースを記述したものである。
Appletalk とユーザープログラムとの通信には、 BSD 互換のソケットインターフェースを利用する。 ソケットに関するより詳しい情報は socket(7) を見よ。
Appletalk ソケットは、 ソケットファミリーの引数に PF_APPLETALK を指定して socket(2) 関数を呼び出すことによって生成される。指定できるソケットタイプは、 ddp ソケットをオープンする場合には SOCK_DGRAM、 raw ソケットをオープンする場合には SOCK_RAW である。 protocol は送受信される Appletalk プロトコルである。 ソケットタイプに SOCK_RAW を指定した場合は、プロトコルに ATPROTO_DDP を指定しなければならない。
raw ソケットは実効ユーザー ID が 0 のプロセスか、 CAT_NEW_RAW 権限を持ったプロセスでないとオープンできない。
アドレスのフォーマット
Appletalk ソケットアドレスはネットワーク番号・ノード番号・ポート番号の 組み合わせで定義される。
struct at_addr {
u_short s_net;
u_char s_node;
};
struct sockaddr_atalk {
sa_family_t sat_family; /* address family */
u_char sat_port; /* port */
struct at_addr sat_addr; /* net/node */
};
sat_family は常に AF_APPLETALK に設定する。 sat_port はポートを与える。ポート番号が 129 以下のポートは 「予約ポート(reserved port)」 と呼ばれる。実効ユーザー ID が 0 のプロセスか、 CAP_NET_BIND_SERVICE 権限を持つプロセスだけが、このようなソケットを bind(2) できる。 sat_addr はホストアドレスである。 struct at_addr のメンバー s_net にはホストのネットワークをネットワークバイトオーダーで与える。値 AT_ANYNET はワイルドカードで、「このネットワーク」も暗黙のうちに含まれる。 struct at_addr のメンバー s_node にはホストのノード番号を与える。値 AT_ANYNODE はワイルドカードで、「このノード」も暗黙のうちに含まれる。値 ATADDR_BCAST はローカルなブロードキャストアドレスである。
ソケットオプション
プロトコル固有のソケットオプションはない。
SYSCTL
Appletalk のグローバルパラメータのいくつかは、 sysctl を通して設定することができる。 これらの sysctl へアクセスするには、 proc/sys/net/atalk/* ファイルを読み書きする方法と、インターフェースに対して sysctl(2) を用いる方法がある。
aarp-expiry-time | |
AARP キャッシュエントリを破棄するまでのタイムインターバル (秒単位)。 | |
aarp-resolve-time | |
AARP キャッシュエントリが解決されるまでのタイムインターバル (秒単位)。 | |
aarp-retransmit-limit | |
AARP クエリーの最大再送信回数。この回数を越えると、 そのノードは dead であるとみなされる。 | |
aarp-tick-time | |
タイマー動作する AARP のタイマーレート (秒単位) | |
ioctl
socket(7) に記述されているすべての ioctl が ddp にも適用される。
エラー
ENOTCONN | |
行おうとした操作は接続済みのソケットに対してのみ定義されているものだが、 そのソケットは接続されていなかった。 | |
EINVAL | 渡した引数が不正。 |
EMSGSIZE | |
データグラムが DDP MTU より大きい。 | |
EACCES | ユーザが行おうとした操作に必要な権限を持っていない。 broadcast フラグをセットせずにブロードキャストアドレスへ送信を行おうとした、 実効ユーザー ID が 0 でなく、 CAP_NET_BIND_SERVICE 権限のないプロセスで特権ポートをバインドしようとした、などが考えられる。 |
EADDRINUSE | |
既に使用されているアドレスにバインドしようとした。 | |
ENOMEM と ENOBUFS | |
メモリが足りない。 | |
ENOPROTOOPT と EOPNOTSUPP | |
渡したソケットオプションが不正。 | |
EPERM | 高い優先度に設定したり、設定を変更したり、 指定したプロセスやグループにシグナルを送るのに必要な権限を ユーザが持っていない。 |
EADDRNOTAVAIL | |
存在しないインターフェースが要求された。または 要求されたソースアドレスがローカルなものでない。 | |
EAGAIN | 非ブロッキングソケットに対してブロックする操作を行った。 |
ESOCKTNOSUPPORT | |
ソケットが設定されていない。または未知のソケットタイプが要求された。 | |
EISCONN | |
接続済みのソケットに対して connect(2) が呼ばれた。 | |
EALREADY | |
非ブロッキングソケットに対する接続操作が既に実行中である。 | |
ECONNABORTED | |
accept(2) の途中で接続がクローズされた。 | |
EPIPE | 接続が先方によって、通常以外のやり方でクローズまたはシャットダウンされた。 |
ENOENT | パケットが到着していないソケットに対して SIOCGSTAMP が呼ばれた。 |
EHOSTUNREACH | |
行き先アドレスにマッチするエントリがルーティングテーブルにない。 | |
ENODEV | ネットワークデバイスがない。あるいは IP を送ることができない。 |
ENOPKG | カーネルのサブシステムが設定されていない。 |
バージョン
Appletalk は Linux 2.0 以降でサポートされている。 sysctl インターフェースは Linux 2.2 から新たに導入された。
注意
SO_BROADCAST オプションを用いる時には慎重の上にも慎重になってほしい。 Linux ではこれに特権を必要としない。 不注意にブロードキャストアドレスに送信を行うと、 ネットワークの状態が簡単に変更されてしまう。
移植性
基本的な Appletalk ソケットインターフェースは BSD 由来のシステムにおける netatalk と互換性がある。多くの BSD システムでは、 ブロードキャストフレームを送信しようとしたときの SO_BROADCAST のチェックに失敗する。これは互換性の問題となるかもしれない。
raw ソケットモードは Linux 独特のもので、もう一方の実装である CAP パッケージや、 Appletalk モニタツールをより簡単に実装できるようになる。
バグ
エラーの値がまったく首尾一貫していない。
ルーティングテーブル・デバイス・ AARP テーブル・その他のデバイスを 設定するために用いられる ioctl がまだ記述されていない。