EN JA
SOURCEFILTER(3)
SOURCEFILTER(3) FreeBSD Library Functions Manual SOURCEFILTER(3)

名称

sourcefilter高度なマルチキャストグループメンバシップ API

書式

#include < sys/socket.h>
#include < netinet/in.h>

int
getipv4sourcefilter( int s, struct in_addr interface, struct in_addr group, uint32_t *fmode, uint32_t *numsrc, struct in_addr *slist);

int
getsourcefilter( int s, uint32_t interface, struct sockaddr *group, socklen_t grouplen, uint32_t *fmode, uint32_t *numsrc, struct sockaddr_storage *slist);

int
setipv4sourcefilter( int s, struct in_addr interface, struct in_addr group, uint32_t fmode, uint32_t numsrc, struct in_addr *slist);

int
setsourcefilter( int s, uint32_t interface, struct sockaddr *group, socklen_t grouplen, uint32_t fmode, uint32_t numsrc, struct sockaddr_storage *slist);

解説

sourcefilter 関数は、RFC 3678 で定義された高度で、完全な状態のマルチキャスト API を実装しています。アプリケーションは、ソケット s とマルチキャスト group に関連しているマルチキャストソースアドレスフィルタを不可分に設定して、検索するためにこれらの関数群を使用することができます。

関数 getipv4sourcefilter() と getsourcefilter() によって、アプリケーションは、既存のグループメンバシップのためのフィルタモードとソースフィルタエントリを発見できます。

カーネルは、 *numsrc のそのグループのためのソケットで、常にソースフィルタエントリの数を返します。 *numsrc 引数が 0 でないなら、カーネルは、 slist によって指された配列の *numsrc フィルタエントリまで、返すことを試みます。 *numsrc 引数が 0 に設定されている場合、 slist 引数は、無視されます。

setipv4sourcefilter() と setsourcefilter() 関数に対して、 fmode 引数は、それぞれ MCAST_INCLUDE または MCAST_EXCLUDE 定数を使用することによって、ソケットを包括的 (inclusive) または排他的 (exclusive) なグループメンバシップモードに置くために使用されます。 numsrc 引数は、 slist 配列のソースエントリの数を指定します。 numsrc 引数に 0 の値があるなら、すべてのソースフィルタは、ソケットから削除されます。 MCAST_INCLUDE フィルタモードであるメンバシップからすべてのソースフィルタを削除することは、グループが、そのソケットで残されたままとなります。

プロトコルから独立している関数 setsourcefilter() によって、アプリケーションは、 interface 引数のためのインデックスを渡すことによって、割り当てられたプロトコルアドレスがないインタフェースでマルチキャストグループに加えることができます。

これらの関数によって行われたどんな変更は、必要に応じてローカルネットワークで IGMPv3 および/または MLDv2 ルータに伝達されます。 IGMPv3 または MLDv2 ルータが存在していないなら、これらの機能によって行われたソースフィルタリストの変更は、グループに加えるか、または残される変更を除いて、状態変更は、転送されません。ソースフィルタ状態を維持し続けます。

実装に関する注

これらの関数の IPv4 特有のバージョンは、プロトコルから独立している関数に関して実装されます。アプリケーションの作者は、効率のためにプロトコルから独立している関数と IPv6 ネットワークと前方互換を使用することが奨励されています。

プロトコルから独立している関数 getsourcefilter() と setsourcefilter() について、 grouplen 引数は、 group によって指された構造体のサイズを指定します。これは、異なったアドレスファミリを区別するために必要です。

現在、 FreeBSD は、IPv4 プロトコルファミリのためのソースアドレスの選択をサポートしていません、したがって、無数の IPv4 インタフェースがあるマルチキャスト API の使用は、 推薦されません。いかなる場合でも、インタフェースで最初に割り当てられた IPv4 アドレスは、 IGMP 制御トラフィックのソースアドレスとして使用されます。このアドレスが、削除されるか、または変更されるなら、結果は、不定です。

戻り値

The getsourcefilter(), getipv4sourcefilter(), setsourcefilter(), and setipv4sourcefilter() functions return the value 0 if successful; otherwise the value -1 is returned and the global variable errno is set to indicate the error.

エラー

sourcefilter 関数は、次の理由で失敗するかもしれません:
[ EADDRNOTAVAIL]
interface 引数が参照するネットワークインタフェースが、システムで設定されていなかったか、またはシステムが group のメンバではありません。
[ EAFNOSUPPORT]
group そして/または、1 つ以上の slist 引数は、システムでサポートされていないアドレスファミリであるか、または groupslist 引数のアドレスファミリは、同じではありませんでした。
[ EINVAL]
group 引数が、マルチキャストアドレスを含んでいません。 fmode 引数が無効です。 MCAST_INCLUDE または MCAST_EXCLUDE のいずれかに設定されていなければなりません。 numsrc または slist 引数がソースリストを指定していません。
[ ENOMEM]
要求された操作を実行するために利用可能なメモリが不足しています。

関連項目

ip(4), ip6(4), multicast(4), ifmcstat(8) D. Thaler, B. Fenner, and B. Quinn, Socket Interface Extensions for Multicast Source Filters, RFC 3678, Jan 2004.

歴史

sourcefilter 関数は、 FreeBSD 7.0 ではじめて登場しました。

作者

Bruce M. Simpson <bms@FreeBSD.org>
February 13, 2009 FreeBSD