DDP
Section: Linux Programmer's Manual (7)
Updated: 2017-09-15
Index JM Home Page
名前
ddp - Linux での AppleTalk プロトコルの実装
書式
#include <sys/socket.h>
#include <netatalk/at.h>
ddp_socket = socket(AF_APPLETALK, SOCK_DGRAM, 0);
raw_socket = socket(AF_APPLETALK, SOCK_RAW, protocol);
説明
Linux は Inside AppleTalk に記述されている AppleTalk プロトコルを実装している。 カーネルにあるのは DDP 層と AARP だけである。これらは netatalk プロトコルライブラリを通して利用されるように設計されている。 このページは DDP 層を直接利用したいユーザーのために、 インターフェースを記述したものである。
AppleTalk とユーザープログラムとの通信には、 BSD 互換のソケットインターフェースを利用する。 ソケットに関するより詳しい情報は socket(7) を見よ。
AppleTalk ソケットは、 ソケットファミリーの引数に AF_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 {
unsigned short s_net;
unsigned char s_node; };
struct sockaddr_atalk {
sa_family_t sat_family; /* address family */
unsigned 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 はローカルなブロードキャストアドレスである。
ソケットオプション
プロトコル固有のソケットオプションはない。
/proc インターフェース
Appletalk のグローバルパラメーターのいくつかは、 /proc インターフェースを通して設定することができる。 これらのパラメーターには、 /proc/sys/net/atalk/ ディレクトリ内のファイルの読み書きでアクセスできる。
- aarp-expiry-time
- AARP キャッシュエントリーを破棄するまでのタイムインターバル (秒単位)。
- aarp-resolve-time
- AARP キャッシュエントリーが解決されるまでのタイムインターバル (秒単位)。
- aarp-retransmit-limit
- AARP クエリーの最大再送信回数。この回数を越えると、 そのノードは dead であるとみなされる。
- aarp-tick-time
- タイマー動作する AARP のタイマーレート (秒単位)
デフォルトの値で仕様にマッチしているので、 変更する必要は全くないはずである。
ioctl
socket(7) に記述されているすべての ioctl が DDP にも適用される。
エラー
- EACCES
- ユーザーが行おうとした操作に必要な権限を持っていない。 broadcast フラグをセットせずにブロードキャストアドレスへ送信を行おうとした、 実効ユーザー ID が 0 でなく、 CAP_NET_BIND_SERVICE 権限のないプロセスで特権ポートをバインドしようとした、などが考えられる。
- EADDRINUSE
- 既に使用されているアドレスにバインドしようとした。
- EADDRNOTAVAIL
- 存在しないインターフェースが要求された。または 要求されたソースアドレスがローカルでない。
- EAGAIN
- 非ブロッキングソケットに対してブロックする操作を行った。
- EALREADY
- 非ブロッキングソケットに対する接続操作が既に実行中である。
- ECONNABORTED
- accept(2) の途中で接続がクローズされた。
- EHOSTUNREACH
- 行き先アドレスにマッチするエントリーがルーティングテーブルにない。
- EINVAL
- 渡した引数が不正。
- EISCONN
- 接続済みのソケットに対して connect(2) が呼ばれた。
- EMSGSIZE
- データグラムが DDP MTU より大きい。
- ENODEV
- ネットワークデバイスがない。あるいは IP を送ることができない。
- ENOENT
- パケットが到着していないソケットに対して SIOCGSTAMP が呼ばれた。
- ENOMEM と ENOBUFS
- メモリーが足りない。
- ENOPKG
- カーネルサブシステムが設定されていない。
- ENOPROTOOPT と EOPNOTSUPP
- 無効なソケットオプションが渡された。
- ENOTCONN
- 接続されていないソケットに対して、 接続状態でしか定義されていない操作を行おうとした。
- EPERM
- 高い優先度に設定したり、設定を変更したり、 指定したプロセスやグループにシグナルを送るのに必要な権限を ユーザーが持っていない。
- EPIPE
- 接続が接続相手によって、予期しないやり方でクローズまたはシャットダウンされた。
- ESOCKTNOSUPPORT
- ソケットが設定されていない。または未知のソケットタイプが要求された。
バージョン
AppleTalk は Linux 2.0 以降でサポートされている。 /proc インターフェースは Linux 2.2 以降に存在する。
注意
SO_BROADCAST オプションを用いる時には慎重の上にも慎重になってほしい。 Linux ではこれに特権を必要としない。 不注意にブロードキャストアドレスに送信を行うと、 ネットワークの状態が簡単に変更されてしまう。
移植性
基本的な Appletalk ソケットインターフェースは BSD 由来のシステムにおける netatalk と互換性がある。多くの BSD システムでは、 ブロードキャストフレームを送信しようとしたときの SO_BROADCAST のチェックに失敗する。これは互換性の問題となるかもしれない。
raw ソケットモードは Linux 独特のもので、もう一方の実装である CAP パッケージや、 Appletalk モニタツールをより簡単に実装できるようになる。
バグ
エラーの値がまったく首尾一貫していない。
ルーティングテーブル、 デバイス、 AARP テーブル、 その他のデバイスを設定するために用いられる ioctl がまだ記述されていない。
関連項目
recvmsg(2), sendmsg(2), capabilities(7), socket(7)
この文書について
この man ページは Linux man-pages プロジェクトのリリース 5.10 の一部である。プロジェクトの説明とバグ報告に関する情報は https://www.kernel.org/doc/man-pages/ に書かれている。
関連キーワード
ソケット,
インターフェース,
接続,
設定,
ユーザー,
プロセス,
プロトコル,
AARP,
addr,
アドレス
Linux マニュアル 一覧
[man1]
[man2]
[man3]
[man4]
[man5]
[man6]
[man7]
[man8]
[a]
[b]
[c]
[d]
[e]
[f]
[g]
[h]
[i]
[j]
[k]
[l]
[m]
[n]
[o]
[p]
[q]
[r]
[s]
[t]
[u]
[v]
[w]
[x]
[y]
[z]
Index
- 名前
- 書式
- 説明
-
- アドレスのフォーマット
- ソケットオプション
- /proc インターフェース
- ioctl
- エラー
- バージョン
- 注意
-
- 移植性
- バグ
- 関連項目
- この文書について
This document was created by man2html, using the manual pages.
Time: 12:08:34 GMT, June 11, 2022