18.2. Структура адреса сокета канального уровня

We use cookies. Read the Privacy and Cookie Policy

18.2. Структура адреса сокета канального уровня

Структуры адреса сокета канального уровня будут встречаться нам как значения, содержащиеся в некоторых сообщениях, возвращаемых на маршрутизирующем сокете. В листинге 18.1[1] показано определение структуры, задаваемой в заголовочном файле <net/if_dl.h>.

Листинг 18.1. Структура адреса сокета канального уровня

struct sockaddr_dl {

 uint8_t     sdl_len;

 sa_family_t sdl_family;   /* AF_LINK */

 uint16_t    sdl_index;    /* индекс интерфейса, присвоенный системой,

                              если > 0 */

 uint8_t     sdl_type;     /* тип интерфейса из <net/if_types.h>.

 IFT_ETHER и т.д. */

 uint8_t     sdl_nlen;     /* длина имени, начинается с sdl_data[0] */

 uint8_t     sdl_alen;     /* длина адреса канального уровня */

 uint8_t     sdl_slen;     /* адрес селектора канального уровня */

 char        sdl_data[12]; /* минимальная рабочая область.

                              может быть больше; содержит имя

                              интерфейса и адрес канального уровня */

};

У каждого интерфейса имеется уникальный положительный индекс. Далее в этой главе мы увидим, каким образом он возвращается функциями if_nametoindex и if_nameindex. В главе 21 при обсуждении параметров многоадресных сокетов IPv6 и в главе 27 при обсуждении дополнительных параметров сокетов IPv6 и IPv4 мы вновь вернемся к этим функциям.

Элемент sdl_data содержит и имя, и адрес канального уровня (например, 48-разрядный MAC-адрес интерфейса Ethernet). Имя начинается с sdl_data[0] и не заканчивается нулем. Начало адреса канального уровня смещено на sdl_nlen байтов относительно начала имени. В этом заголовочном файле для возвращения указателя на адрес канального уровня задается следующий макрос:

#define LLADDR(s) ((caddr_t)((s)->sdl_data + (s)->sdl_nlen))

Эти структуры адреса сокета имеют переменную длину [128, с. 89]. Если адрес канального уровня и имя превышают 12 байт, размер структуры будет больше 20 байт. В 32-разрядных системах размер обычно округляется в большую сторону, до следующего числа, кратного 4 байтам. Мы также увидим на рис. 22.1, что когда одна из этих структур возвращается параметром сокета IP_RECVIF, все три длины становятся нулевыми, а элемента sdl_data не существует.

Данный текст является ознакомительным фрагментом.