На рис. 27.6 показан формат объектов вспомогательных данных, используемый для отправки и получения параметров транзитных узлов и параметров получателя.
Рис. 27.6. Объекты вспомогательных данных, используемые для параметров транзитных узлов и параметров получателя
Чтобы уменьшить объем дублированного кода, определены семь функций, которые создают и обрабатывают эти вспомогательные объекты данных. Следующие четыре функции формируют отправляемый параметр.
#include
int inet6_opt_init(void *
int inet6_opt_append(void *
int
int inet6_opt_finish(void *
int inet6_opt_set_val(void *
const void *
Функция inet6_opt_init
возвращает количество байтов, необходимое для данного параметра. Если аргумент extbuf
не является нулевым указателем, функция инициализирует заголовок расширения. Значение -1 возвращается при аварийном завершении работы в том случае, если аргумент extlen
не кратен 8. (Все заголовки параметров транзитных узлов и получателя в IPv6 должны быть кратны 8.)
Функция inet6_opt_append
возвращает общую длину заголовка расширения после добавления указанного при вызове параметра. Если аргумент extbuf
не является нулевым указателем, функция дополнительно выполняет инициализацию параметра и вставляет необходимое заполнение. Значение -1 возвращается в случае аварийного завершения работы, если параметр не помещается в выделенный буфер. Аргумент offset
представляет собой текущую полную длину, то есть значение, возвращенное при предыдущем вызове inet6_opt_append
или inet6_opt_init
. Аргументы type
и len
задают тип и длину параметра, они копируются непосредственно в его заголовок. Аргумент align
указывает условие выравнивания, то есть значение x из выражения align
и len
, поэтому указывать его явным образом необходимости нет. Аргумент databufp
представляет собой адрес будущего указателя на значение параметра. Значение параметра копируется вызывающим процессом при помощи функции inet6_opt_set_val
или любым другим методом.
Для завершения расширяющего заголовка вызывается функция inet6_opt_finish
, которая добавляет в заголовок заполнение, делая его длину кратной 8 байтам. Как и раньше, заполнение добавляется в буфер только в том случае, если аргумент extbuf
представляет собой непустой указатель. В противном случае функция вычисляет обновленное значение длины. Подобно inet6_opt_append
, аргумент offset
задает текущую полную длину (значение, возвращаемое inet6_opt_append
и inet6_opt_init
). Функция inet6_opt_finish
возвращает полную длину возвращаемого заголовка или -1, если требуемое заполнение не помещается в предоставленный буфер.
Функция inet6_opt_set_val
копирует значение параметра в буфер данных, возвращаемый inet6_opt_append
. Аргумент databuf
представляет собой указатель, возвращаемый inet6_opt_append
. Аргумент offset
представляет собой текущую длину внутри параметра, его необходимо инициализировать нулем для каждого параметра, а затем использовать возвращаемые inet6_opt_set_val
значения по мере построения параметра. Аргументы val
и vallen
определяют значение для копирования в буфер значения параметра.