EN JA
ICMP6(4)
ICMP6(4) FreeBSD Kernel Interfaces Manual ICMP6(4)

名称

icmp6IPv6 のためのインターネット制御メッセージプロトコル

書式

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

int
socket( AF_INET6, SOCK_RAW, IPPROTO_ICMPV6);

解説

ICMPv6 は、IPv6 によって使用されるエラーとコントロールメッセージプロトコルと IPv6 プロトコルファミリです ( ip6(4)inet6(4) 参照)。それは、ネットワーク監視と診断機能のために“生のソケット”を通してアクセスされます。

ICMPv6 ソケットを作成するための socket(2) 呼び出しへの proto パラメータは、 getprotobyname(3) から取得できます。 ICMPv6 ソケットは、コネクションレスであり、 sendto(2)recvfrom(2) 呼び出しで通常使用されますが、 connect(2) 呼び出しは、その後のパケットのための宛先 (終点) を固定するために使用されます (この場合、 read(2) または recv(2)write(2) または send(2) システムコールが使用されます)。

発信パケットは、(宛先 (終点) アドレスに基づいて) 自動的にそれらに IPv6 ヘッダを先頭に追加します。ソケット上の着信パケットは、IPv6 ヘッダと任意の拡張ヘッダを取り除いて受信します。

タイプ

ICMPv6 メッセージは、ICMPv6 ヘッダに存在しているタイプとコードフィールドに従って分類されます。タイプとコードのための省略形は、 pf.conf(5) の規則が使用されます。次のタイプが定義されています:
番号 省略形 説明
1 unreach Destination unreachable
2 toobig Packet too big
3 timex Time exceeded
4 paramprob Invalid IPv6 header
128 echoreq Echo service request
129 echorep Echo service reply
130 groupqry Group membership query
130 listqry Multicast listener query
131 grouprep Group membership report
131 listenrep Multicast listener report
132 groupterm Group membership termination
132 listendone Multicast listener done
133 routersol Router solicitation
134 routeradv Router advertisement
135 neighbrsol Neighbor solicitation
136 neighbradv Neighbor advertisement
137 redir Shorter route exists
138 routrrenum Route renumbering
139 fqdnreq FQDN query
139 niqry Node information query
139 wrureq Who-are-you request
140 fqdnrep FQDN reply
140 nirep Node information reply
140 wrurep Who-are-you reply
200 mtraceresp mtrace response
201 mtrace mtrace messages

次のコードが定義されています:

番号 省略形 タイプ 説明
0 noroute-unr unreach No route to destination
1 admin-unr unreach Administratively prohibited
2 beyond-unr unreach Beyond scope of source address
2 notnbr-unr unreach Not a neighbor (obsolete)
3 addr-unr unreach Address unreachable
4 port-unr unreach Port unreachable
0 transit timex Time exceeded in transit
1 reassemb timex Time exceeded in reassembly
0 badhead paramprob Erroneous header field
1 nxthdr paramprob Unrecognized next header
2 redir Unrecognized option
0 redironlink redir Redirection to on-link node
1 redirrouter redir Redirection to better router

ヘッダ

すべての ICMPv6 メッセージは、ICMPv6 ヘッダと共に前に置かれます。このヘッダは、 icmp6_hdr 構造体に対応し、次の定義があります:

struct icmp6_hdr { 
 uint8_t  icmp6_type; /* タイプフィールド */ 
 uint8_t  icmp6_code; /* コードフィールド */ 
 uint16_t icmp6_cksum; /* checksum フィールド */ 
 union { 
  uint32_t  icmp6_un_data32[1]; /* タイプ特有 */ 
  uint16_t  icmp6_un_data16[2]; /* タイプ特有 */ 
  uint8_t   icmp6_un_data8[4];  /* タイプ特有 */ 
 } icmp6_dataun; 
} __packed; 
 
#define icmp6_data32 icmp6_dataun.icmp6_un_data32 
#define icmp6_data16 icmp6_dataun.icmp6_un_data16 
#define icmp6_data8 icmp6_dataun.icmp6_un_data8 
#define icmp6_pptr icmp6_data32[0] /* parameter prob */ 
#define icmp6_mtu icmp6_data32[0] /* packet too big */ 
#define icmp6_id icmp6_data16[0] /* echo request/reply */ 
#define icmp6_seq icmp6_data16[1] /* echo request/reply */ 
#define icmp6_maxdelay icmp6_data16[0] /* mcast group membership*/

icmp6_type は、メッセージのタイプを説明します。適切な値は、< netinet/icmp6.h>に定義されています。 icmp6_code は、メッセージのサブタイプを説明し、 icmp6_type に依存します。 icmp6_cksum は、メッセージのためにチェックサムを含んでいて、メッセージの発信時にカーネルによって書き込まれます。他のフィールドは、タイプ特有の目的のために使用されます。

フィルタ

ICMPv4 と比較して ICMPv6 の特別の機能のために、ICMPv6 ソケット上で潜在的により多くのメッセージを受信します。したがって、入力フィルタは、着信 ICMPv6 メッセージの部分集合に入力を制限するために使用されので、関心があるメッセージだけがアプリケーションへの呼び出しの recv(2) ファミリによって返されます。

icmp6_filter 構造体は、ICMPv6 タイプに従って入力メッセージセットを絞り込むために使用されます。デフォルトで、すべてのメッセージタイプは、新たに作成された生の ICMPv6 ソケット上で許されます。次のマクロは、入力セットを絞り込むために使用されます:

void ICMP6_FILTER_SETPASSALL( struct icmp6_filter *filterp)
すべての着信メッセージを許可します。 filterp は、すべてのメッセージタイプを許可するように変更されます。
void ICMP6_FILTER_SETBLOCKALL( struct icmp6_filter *filterp)
すべての入力メッセージを無視します。 filterp は、すべてのメッセージタイプを無視するように変更されます。
void ICMP6_FILTER_SETPASS( int type, struct icmp6_filter *filterp)
与えられた type の ICMPv6 メッセージを許可します。 filterp は、そのようなメッセージを許可するように変更されます。
void ICMP6_FILTER_SETBLOCK"( int type, struct icmp6_filter *filterp)
与えられた type の ICMPv6 メッセージを無視します。 filterp は、そのようなメッセージを無視するように変更されます。
int ICMP6_FILTER_WILLPASS"( int type, const struct icmp6_filter *filterp)
与えられたフィルタが与えられたタイプの ICMPv6 メッセージを許可するかどうか決定します。
int ICMP6_FILTER_WILLBLOCK"( int type, const struct icmp6_filter *filterp)
与えられたフィルタが与えられたタイプの ICMPv6 メッセージを無視するかどうか決定します。

getsockopt(2)setsockopt(2) 呼び出しは、オプションの値として icmp6_filter 構造体へのポインタでオプションレベル IPPROTO_ICMPV6 と名前 ICMP6_FILTER の ICMPv6 ソケット上のフィルタを取得して、インストールするために使用されます。

関連項目

getsockopt(2), recv(2), send(2), setsockopt(2), socket(2), getprotobyname(3), inet6(4), ip6(4), netintro(4) W. Stevens and M. Thomas, Advanced Sockets API for IPv6, RFC 2292, February 1998. A. Conta and S. Deering, Internet Control Message Protocol (ICMPv6) for the Internet Protocol Version 6 (IPv6) Specification, RFC 2463, December 1998.
November 7, 2012 FreeBSD