Предполагается, что с помощью этих функций вы будете делать два прохода по списку параметров, которые вы предполагаете вставить: во время первого прохода будет вычисляться требуемая длина буфера, а во время второго прохода — выполняться фактическое построение буфера параметра. При первом проходе нужно вызвать inet6_opt_init
, inet6_opt_append
(один раз для каждого параметра) и inet6_opt_finish
, передавая нулевой указатель и 0 в качестве аргументов extbuf
и extlen
соответственно. Затем можно динамически выделить буфер, использовав в качестве размера значение, возвращенное inet6_opt_finish
. Этот буфер будет передаваться в качестве аргумента extbuf
при втором проходе. Во время второго прохода вызываются функции inet6_opt_init
и inet6_opt_append
. Копирование значений параметров может выполняться как «вручную», так и при помощи функции inet6_opt_set_val
. Наконец, мы должны вызвать inet6_opt_finish
. Альтернативный вариант действий состоит в выделении буфера достаточно большого размера для нашего параметра. В этом случае первый проход можно не выполнять. Однако если изменение параметров приведет к переполнению выделенного буфера, в программе возникнет ошибка.
Оставшиеся три функции обрабатывают полученный параметр.
#include
int inet6_opt_next(const void *
int
int inet6_opt_find(const void *
int
int inet6_opt_get_val(const void *
Функция inet6_opt_next
обрабатывает следующий параметр в буфере. Аргументы extbuf
и extlen
определяют буфер, в котором содержится заголовок. Как и у inet6_opt_append
, аргумент offset
представляет собой текущее смещение внутри буфера. При первом вызове inet6_opt_next
значение этого аргумента должно быть равно нулю, а при всех последующих — значению, возвращенному при предыдущем вызове функции. Аргументы typep
, lenp
и databufp
предназначены для возвращения функцией типа, длины и значения параметра соответственно. Функция inet6_opt_next
возвращает -1 в случае обработки заголовка с нарушенной структурой или в случае достижения конца буфера.
Функция inet6_opt_find
аналогична предыдущей функции, но позволяет вызывающему процессу задать тип параметра, который следует искать (аргумент type), вместо того чтобы каждый раз возвращать следующий параметр.
Функция inet6_opt_get_val
предназначена для извлечения значений из параметра по указателю databuf
, возвращаемому предшествующим вызовом inet6_opt_next
или inet6_opt_find
. Как и для inet6_opt_set_val
, аргумент offset
должен начинаться с 0 для каждого параметра, а затем должен приравниваться значению, возвращаемому предшествующим вызовом inet6_opt_get_val
.
27.6. Заголовок маршрутизации IPv6
Заголовок маршрутизации IPv6 используется для маршрутизации от отправителя в IPv6. Первые два байта заголовка маршрутизации такие же, как показанные на рис. 27.3: поле
Рис. 27.7. Заголовок маршрутизации IPv6