PIM(4) | FreeBSD Kernel Interfaces Manual | PIM(4) |
名称
pim — プロトコル独立マルチキャスト書式
options MROUTING
#include < sys/types.h>
#include < sys/socket.h>
#include < netinet/in.h>
#include < netinet/ip_mroute.h>
#include < netinet/pim.h>
int
getsockopt( int s, IPPROTO_IP, MRT_PIM, void *optval, socklen_t *optlen);
int
setsockopt( int s, IPPROTO_IP, MRT_PIM, const void *optval, socklen_t optlen);
int
getsockopt( int s, IPPROTO_IPV6, MRT6_PIM, void *optval, socklen_t *optlen);
int
setsockopt( int s, IPPROTO_IPV6, MRT6_PIM, const void *optval, socklen_t optlen);
解説
PIM は 2 つのマルチキャストルーティングプロトコルのための共通の名前です: プロトコル独立マルチキャスト - スパース (まばらな) モード (PIM-SM) とプロトコル独立マルチキャスト - デンス (密な) モード (PIM-DM) です。PIM-SM は基本的なユニキャストルーティング情報ベースか別々のマルチキャストケイパブルルーティング情報ベースを使用することができるマルチキャストルーティングプロトコルです。それは、グループ単位で集合地点 (Rendezvous Point (RP)) をルートとする単方向の共有されたツリーを構築し、ソース単位で最短パスのツリーをオプションで作成します。
oIM-DM はすべてのマルチキャストルータへマルチキャストデータグラムをあふれさせる基本的なユニキャストルーティング情報ベースを使用するマルチキャストルーティングプロトコルです。プルーンメッセージは、グループメンバシップ情報なしでルータに伝播されることから将来のデータグラムを防ぐのに使用されます。
PIM-SM と PIM-DM の両方はかなり複雑なプロトコルですが、 PIM-SM はさらに複雑です。ルータで PIM-SM か PIM-DM マルチキャストルーティングを有効にするために、ユーザは、カーネル (カーネル設定オプションに関しては、 書式 を参照してください) でマルチキャストルーティングと PIM 処理を有効にし、PIM-SM か PIM-DM 機能のユーザレベル処理を実行しなければなりません。開発者の観点から、 プログラミングガイド セクションで説明されたプログラミングガイドは、カーネルで PIM 処理を制御するのに使用されるべきです。
プログラミングガイド
マルチキャストルーティングソケットがオープンされ、マルチキャストフォワーディングがカーネルを参照) で有効にされた後に、次のソケットオプションの 1 つはカーネルで PIM 処理を有効にするか無効にするために使用されるべきです。それらのオプションは確実な特権 (すなわち、root の特権) を必要とすることに注意してください。
/* IPv4 */ int v = 1; /* 1 to enable, or 0 to disable */ setsockopt(mrouter_s4, IPPROTO_IP, MRT_PIM, (void *)&v, sizeof(v));
/* IPv6 */ int v = 1; /* 1 to enable, or 0 to disable */ setsockopt(mrouter_s6, IPPROTO_IPV6, MRT6_PIM, (void *)&v, sizeof(v));
PIM 処理が有効にされた後に、マルチキャストケイパブルインタフェースは追加されるべきです。を参照)。 PIM-SM の場合には、PIM-レジスタ仮想インタフェースは同様に追加しなければなりません。次のオプションを使用することによって、これを達成することができます。
/* IPv4 */ struct vifctl vc; memset(&vc, 0, sizeof(vc)); /* Assign all vifctl fields as appropriate */ ... if (is_pim_register_vif) vc.vifc_flags |= VIFF_REGISTER; setsockopt(mrouter_s4, IPPROTO_IP, MRT_ADD_VIF, (void *)&vc, sizeof(vc));
/* IPv6 */ struct mif6ctl mc; memset(&mc, 0, sizeof(mc)); /* Assign all mif6ctl fields as appropriate */ ... if (is_pim_register_vif) mc.mif6c_flags |= MIFF_REGISTER; setsockopt(mrouter_s6, IPPROTO_IPV6, MRT6_ADD_MIF, (void *)&mc, sizeof(mc));
PIM パケットの送信か受信は最初に、 IPPROTO_PIM のプロトコル値で“生のソケット” ( socket(2) を参照) をオープンすることによって、達成することができます。
/* IPv4 */ int pim_s4; pim_s4 = socket(AF_INET, SOCK_RAW, IPPROTO_PIM);
/* IPv6 */ int pim_s6; pim_s6 = socket(AF_INET6, SOCK_RAW, IPPROTO_PIM);
次に、つぎのシステムコールは PIM パケットを送信するか受信するために使用できます: sendto(2), sendmsg(2), recvfrom(2), recvmsg(2)。
関連項目
getsockopt(2), recvfrom(2), recvmsg(2), sendmsg(2), sendto(2), setsockopt(2), socket(2), inet(4), intro(4), ip(4), multicast(4)規格
PIM-SM プロトコルは (draft-ietf-pim-sm-v2-new-* によって置き換えられる) RFC2362 に仕様化されています。 PIM-DM プロトコルは (draft-ietf-pim-dm-new-v2-*) に仕様化されています。作者
IRIX と SunOS-4.x のオリジナルの IPv4 PIM カーネルサポートは、 (USC and SGI) によって実装されました。その後コードは様々な BSD 風味に移植され、 (Rusty) (ISI)、 (WIDE Project) と (USC/ISI and ICSI) によって変更されました。 IPv6 PIM カーネルサポートは、IPv4 PIM カーネルサポートに基づいて、 KAME プロジェクト ( http://www.kame.net) によって実装されました。このマニュアルページは、
(ICSI) によって書かれました。February 12, 2007 | FreeBSD |