Полученное предельное количество транзитных узлов возвращается в виде вспомогательных данных функцией recvmsg
, только если приложение включает параметр сокета IPV6_RECVHOPLIMIT
. В структуре cmsghdr
, содержащей эти вспомогательные данные, элемент cmsg_level
будет иметь значение IPPROTO_IPV6
, элемент cmsg_type
— значение IPV6_HOPLIMIT
, а первый байт данных будет первым байтом целочисленного предела повторных передач. Мы показали это на рис. 22.5. Нужно понимать, что значение, возвращаемое в качестве вспомогательных данных, — это действительное значение из полученной дейтаграммы, в то время как значение, возвращаемое функцией getsockopt
с параметром IPV6_UNICAST_HOPS
, является значением по умолчанию, которое ядро будет использовать для исходящих дейтаграмм на сокете.
Чтобы задать предельное количество транзитных узлов для исходящих пакетов, никаких специальных действий не требуется — нам нужно только указать управляющую информацию в виде вспомогательных данных для функции sendmsg
. Обычные значения для предельного количества транзитных узлов лежат в диапазоне от 0 до 255 включительно, но если целочисленное значение равно -1, это указывает ядру, что следует использовать значение по умолчанию.
Предельное количество транзитных узлов не содержится в структуре in6_pktinfo — некоторые серверы UDP хотят отвечать на запросы клиентов, посылая ответы на том же интерфейсе, на котором был получен запрос, с совпадением IPv6-адреса отправителя ответа и IPv6-адреса получателя запроса. Для этого приложение может включить параметр сокета IPV6_RECVPKTINFO, а затем использовать полученную управляющую информацию из функции recvmsg в качестве управляющей информации для функции sendmsg при отправке ответа. Приложению вообще никак не нужно проверять или изменять структуру in6_pktinfo. Но если в этой структуре содержался бы предел количества транзитных узлов, приложение должно было бы проанализировать полученную управляющую информацию и изменить значение этого предела, поскольку полученный предел не является желательным значением для исходящего пакета.
Задание адреса следующего транзитного узла
Объект вспомогательных данных IPV6_NEXTHOP
задает адрес следующего транзитного узла дейтаграммы в виде структуры адреса сокета. В структуре cmsghdr
, содержащей эти вспомогательные данные, элемент cmsg_level
будет иметь значение IPPROTO_IPV6
, элемент cmsg_type
— значение IPV6_NEXTHOP
, а первый байт данных будет первым байтом структуры адреса сокета.
На рис. 22.5 мы показали пример такого объекта вспомогательных данных, считая, что структура адреса сокета — это 24-байтовая структура sockaddr_in6
. В этом случае узел, идентифицируемый данным адресом, должен быть соседним для отправляющего узла. Если этот адрес совпадает с адресом получателя IPv6-дейтаграммы, мы получаем эквивалент параметра сокета SO_DONTROUTE
. Установка этого параметра требует прав привилегированного пользователя. Адрес следующего транзитного узла можно устанавливать для всех пакетов на сокете, если включить параметр сокета IPV6_NEXTHOP
со значением sockaddr_in6
(раздел 27.7). Для этого необходимо обладать правами привилегированного пользователя.
Задание и получение класса трафика