LINUX.ORG.RU

Значение sin6_scope_id в структуре sockaddr_in6

 


0

1

В целях самообразования решил поэкспериментировать с ipv6 сокетами. Но возникла проблемка - никак не могу понять суть поля sin6_scope_id в структуре sockaddr_in6

struct sockaddr_in6 {
    sa_family_t sin6_family;    /* AF_INET6 */
    in_port_t sin6_port;        /* Transport layer port # */
    uint32_t sin6_flowinfo;     /* IPv6 flow information */
    struct in6_addr sin6_addr;  /* IPv6 address */
    uint32_t sin6_scope_id;     /* IPv6 scope-id */
};
Гугль рекомендует заполнять это поле так:
addr.sin6_scope_id = if_nametoindex("eth0");
Но недопонимание сути этого scope id напрягает. Собственно вопрос: какое назначение у поля sin6_scope_id и в какое значение его правильно устанавливать?


Есть вот такое описание:

The sin6_scope_id field is a 32-bit integer that identifies a set of interfaces as appropriate for the scope of the address carried in the sin6_addr field. For a link scope sin6_addr, the application shall ensure that sin6_scope_id is a link index. For a site scope sin6_addr, the application shall ensure that sin6_scope_id is a site index. The mapping of sin6_scope_id to an interface or set of interfaces is implementation-defined.

DeVliegendeHollander ★★ ()
Ответ на: комментарий от DeVliegendeHollander

Есть вот такое описание:

если я правильно перевел, поведение этого поля is implementation-defined. Нашел такое описание:

sin6_scope_id является идентификатором id в зависимости от области адреса. Это новое добавление в версии Linux 2.4. Linux поддерживает его только для связи областей адресов, в этом случае sin6_scope_id содержит индекс интерфейса

Пробовал устанавливать значение в 0 а также совсем не устанавливать - кажется работает. Вопрос остается открытым: в какое значение его правильно устанавливать в Linux.

rom_ka ()
Ответ на: комментарий от rom_ka

Вопрос остается открытым: в какое значение его правильно устанавливать в Linux.

Так ведь у тебя в ОП рекомендация Гугла есть. Логично будет ей последовать. Но, честно говоря, я сам пока ещё до конца не утряс этот вопрос. Будет время, погуглю ещё, чтобы окончательно уяснить.

DeVliegendeHollander ★★ ()
Ответ на: комментарий от DeVliegendeHollander

Если на интерфейс прописать какой-нить глобальный адрес например:

inet6 addr: 2001:7000::10/128 Scope:Global

то биндится на него можно даже не устанавливая sin6_scope_id, а если попытаться биндится на адрес:

inet6 addr: fe80::213:8fff:fee8:b078/64 Scope:Link

то без установки правильного индекса интерфейса в sin6_scope_id, bind возвращает Invalid argument. Возможно на этот адрес нельзя биндится. Понял что у меня серьезные пробелы в понимании Ipv6. Буду изучать.

rom_ka ()
Ответ на: комментарий от DeVliegendeHollander

Согласен, говорят ipv6 не за горами, нужно быть готовым. Я при написании очередного поделия для себя, решил внедрить в функцию create_listener возможность биндится на ipv6, и столкнулся с этой проблемкой. Если найдеш ответ какой «сакральный» смысл несет это поле - напиши, если не трудно будет.

rom_ka ()
Ответ на: комментарий от DeVliegendeHollander

О спасибо, буду изучать. Я решил пока повременить с внедрением для своего поделия поддержки ipv6. Как только появится немного свободного времени, займусь изучением/экспериментами вплотную.

rom_ka ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.