ICMP6(4) | FreeBSD Kernel Interfaces Manual | ICMP6(4) |
名称
icmp6 — IPv6 のためのインターネット制御メッセージプロトコル書式
#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 |