EN JA
PIM(4)
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)

規格

PIM-SM プロトコルは (draft-ietf-pim-sm-v2-new-* によって置き換えられる) RFC2362 に仕様化されています。 PIM-DM プロトコルは (draft-ietf-pim-dm-new-v2-*) に仕様化されています。

作者

IRIX と SunOS-4.x のオリジナルの IPv4 PIM カーネルサポートは、 Ahmed Helmy (USC and SGI) によって実装されました。その後コードは様々な BSD 風味に移植され、 George Edmond Eddy (Rusty) (ISI)、 Hitoshi Asaeda (WIDE Project) と Pavlin Radoslavov (USC/ISI and ICSI) によって変更されました。 IPv6 PIM カーネルサポートは、IPv4 PIM カーネルサポートに基づいて、 KAME プロジェクト ( http://www.kame.net) によって実装されました。

このマニュアルページは、 Pavlin Radoslavov (ICSI) によって書かれました。

February 12, 2007 FreeBSD