kazmax - Linux で自宅サーバー

ddp - 約束事その他の説明 - Linux コマンド集 一覧表

  1. 名前
  2. 書式
  3. 説明
  4. アドレスのフォーマット
  5. ソケットオプション
  6. SYSCTL
  7. IOCTL
  8. 注意
  9. バージョン
  10. エラー
  11. 移植性
  12. バグ
  13. 関連項目

名前

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_DGRAMraw ソケットをオープンする場合には 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 にも適用される。

注意

SO_BROADCAST オプションを用いる時には慎重の上にも慎重になってほしい。 Linux ではこれに特権を必要としない。 不注意にブロードキャストアドレスに送信を行うと、 ネットワークの状態が簡単に変更されてしまう。

バージョン

Appletalk は Linux 2.0 以降でサポートされている。 sysctl インターフェースは Linux 2.2 から新たに導入された。

エラー

ENOTCONN
行おうとした操作は接続済みのソケットに対してのみ定義されているものだが、 そのソケットは接続されていなかった。
EINVAL
渡した引数が不正。
EMSGSIZE
データグラムが DDP MTU より大きい。
EACCES
ユーザが行おうとした操作に必要な権限を持っていない。 broadcast フラグをセットせずにブロードキャストアドレスへ送信を行おうとした、 実効ユーザー ID が 0 でなく、 CAP_NET_BIND_SERVICE 権限のないプロセスで特権ポートをバインドしようとした、などが考えられる。
EADDRINUSE
既に使用されているアドレスにバインドしようとした。
ENOMEMENOBUFS
メモリが足りない。
ENOPROTOOPTEOPNOTSUPP
渡したソケットオプションが不正。
EPERM
高い優先度に設定したり、設定を変更したり、 指定したプロセスやグループにシグナルを送るのに必要な権限を ユーザが持っていない。
EADDRNOTAVAIL
存在しないインターフェースが要求された。または 要求されたソースアドレスがローカルなものでない。
EAGAIN
非ブロッキングソケットに対してブロックする操作を行った。
ESOCKTNOSUPPORT
ソケットが設定されていない。または未知のソケットタイプが要求された。
EISCONN
接続済みのソケットに対して   connect (2) が呼ばれた。
EALREADY
非ブロッキングソケットに対する接続操作が既に実行中である。
ECONNABORTED
  accept (2) の途中で接続がクローズされた。
EPIPE
接続が先方によって、通常以外のやり方でクローズまたはシャットダウンされた。
ENOENT
パケットが到着していないソケットに対して SIOCGSTAMP が呼ばれた。
EHOSTUNREACH
行き先アドレスにマッチするエントリがルーティングテーブルにない。
ENODEV
ネットワークデバイスがない。あるいは IP を送ることができない。
ENOPKG
カーネルのサブシステムが設定されていない。

移植性

基本的な Appletalk ソケットインターフェースは BSD 由来のシステムにおける netatalk と互換性がある。多くの BSD システムでは、 ブロードキャストフレームを送信しようとしたときの SO_BROADCAST のチェックに失敗する。これは互換性の問題となるかもしれない。

raw ソケットモードは Linux 独特のもので、もう一方の実装である CAP パッケージや、 Appletalk モニタツールをより簡単に実装できるようになる。

バグ

エラーの値がまったく首尾一貫していない。

ルーティングテーブル・デバイス・ AARP テーブル・その他のデバイスを 設定するために用いられる ioctl がまだ記述されていない。

関連項目

recvmsg (2), sendmsg (2),  capabilities (7),   socket (7)