ICMP6

Протокол межсетевых управляющих сообщений для IP6

Прототип:

#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/icmp6.h>
int socket( AF_INET6,
SOCK_RAW,
proto );

Описание:

ICMP6 - это протокол сообщений об ошибках и управляющих сообщений, используемый IP6 и семейством интернет-протоколов. Доступ к нему можно получить через «сырой сокет» для функций мониторинга и диагностики сети. Используйте функцию getprotobyname(), чтобы получить параметр proto для функции socket(), или просто передайте IPPROTO_ICMPV6.

ICMPv6 сокеты не требуют установления соединения. Предполагается использование ICMP сокетов, которые не требуют установления соединения, с sendto() и recvfrom(), хотя также можно использовать и connect() для исправления назначения будущих пакетов (в этом случае можно использовать системные вызовы read() или recv(), и write() или send()).

К исходящим пакетам автоматически в начало добавляется IP заголовок, основанный на адресе назначения. Поле контрольной суммы псевдозаголовка ICMP6 (icmp6_cksum, находится в структуре icmp6_hdr в <netinet/icmp6.h>) автоматически заполняется менеджером сокетов. Входящие пакеты принимаются без заголовка IP6 или расширенных заголовков.


Note: Данное поведение отличается как от сырых сокетов IPv4, так и от сокетов ICMPv4.

Фильтр тип/код ICMP6

Каждый сырой сокет ICMP6 имеет связанный фильтр, тип данных которого определен как struct icmp6_filter. Эта структура, а также макросы и константы, определенные ниже, определены в заголовке <netinet/icmp6.h>.

Можно получить и установить текущий фильтр, вызвав getsockopt() и setsockopt() с уровнем IPPROTO_ICMPV6 и ICMP6_FILTER.

Следующие макросы работают со структурой icmp6_filter. Если первый аргумент является целым числом, он представляет тип сообщения ICMP6 со значением от 0 до 255. Аргументы указателя - это указатели на фильтры, которые либо устанавливаются, либо проверяются, в зависимости от макроса:

ICMP6_FILTER_SETPASSALL( struct icmp6_filter * )
Передать в приложение все сообщения ICMPv6.
ICMP6_FILTER_SETBLOCKALL( struct icmp6_filter * )
Заблокировать все сообщения ICMPv6 из приложения.
ICMP6_FILTER_SETPASS( int, struct icmp6_filter * )
Передавать в приложение сообщения определенного типа ICMPv6.
ICMP6_FILTER_SETBLOCK( int, struct icmp6_filter * )
Блокировать сообщения определенного типа ICMPv6 от приложения.
ICMP6_FILTER_WILLPASS( int, const struct icmp6_filter * )
Вернуть true или false, в зависимости от того, передается ли в приложение указанный тип сообщения.
ICMP6_FILTER_WILLBLOCK( int, const struct icmp6_filter * )
Вернуть true или false, в зависимости от того, заблокирован ли указанный тип сообщения для приложения.

При создании сырого сокета ICMP6, он по умолчанию передает в приложение все типы сообщений ICMPv6.

Для получения более детальной информации, обратитесь к RFC 2292.

Тематические ссылки:

INET6, IP6 протоколы

connect(), getprotobyname(), getsockopt(), read(), recv(), recvfrom(), send(), sendto(), setsockopt(), socket(), write()

Основано на RFC 2292




Предыдущий раздел: Описание API сетевой библиотеки