Можно ли установить свой собственный основной адрес в SCTP? - PullRequest
1 голос
/ 08 февраля 2012

Я пытаюсь установить SCTP-соединение между сервером и клиентами (Linux).Сервер имеет несколько IP-адресов, и исходящие IP-пакеты маршрутизируются в зависимости от адресов source .Я хочу, чтобы соединения sctp использовали определенный адрес по умолчанию (для использования определенного маршрута по умолчанию)

Единственные варианты, которые я нашел:

   SCTP_SET_PEER_PRIMARY_ADDR
          Requests that the peer mark the enclosed address as the association primary. The enclosed address must be one of the association's locally bound addresses. The struc‐
          ture sctp_setpeerprim defined in /usr/include/netinet/sctp.h is used to make a set peer primary request.

   SCTP_PRIMARY_ADDR
          Requests that the local SCTP stack use the enclosed peer address as the association primary. The enclosed address must be one of the association peer's addresses. The
          structure sctp_prim defined in /usr/include/netinet/sctp.h is used to make a get/set primary request.

Насколько я понимаю, этоОпции позволяют выбрать основной адрес партнера (при отправке) и попросить его использовать один из локальных адресов (при получении).

Вопрос: Есть ли способ выбрать локальный адрес, из которогоисходящие сообщения отправляются?

Ответы [ 3 ]

0 голосов
/ 25 мая 2012

Отказ от ответственности: я не использую многолучевое lksctp или ASCONF, но я прочитал исходный код модуля ядра.

Для каждого адреса однорангового узла создается отдельный sctp_transport, поэтому все будет зависеть от того, является ли ваш локальныйАддеры умножаются на один или два удаленных адреса.

Ассоциация сохраняет адрес назначения полученных пакетов для повторного использования в качестве предпочтительного источника при отправке через определенный sctp_transport.Установка SCTP_SET_PEER_PRIMARY_ADDR поможет партнеру сохранить правильный локальный адрес в качестве основного для определенного транспорта, и, если есть только один транспорт, возможно, все готово.Если существует более одного транспорта, это может заставить пира выбрать конкретный.Установка SCTP_PRIMARY_ADDR - это случай переворота, и если существует более одного транспорта, он определенно обновляет, какой транспорт является основным.

Для более чем одного транспорта не должно быть переключения от «основного» транспорта.если верхний слой не говорит.Однако то, какой транспорт является «активным», зависит от ошибок и т. Д., А для повторных передач спецификация явно рекомендует использовать альтернативные транспортные адреса.В целом, я бы сказал, что довольно бесполезно пытаться контролировать, какой транспорт активен (по сравнению с основным) все время.Простые вещи, такие как отправка INIT до запуска однорангового узла, будут переключать его назад и вперед.

Не упускайте из виду тот факт, что если вы привязываете / bindx к определенным адресам (вместо 0.0.0.0), он будет использовать их только в том случае, если у вас есть адреса, которые вы абсолютно не хотите использовать.

Желаю тебе удачи.

0 голосов
/ 02 октября 2012

sctp_sendmessage имеет опцию.http://linux.die.net/man/3/sctp_sendmsg [SCTP_SendMessage] [1]

0 голосов
/ 08 февраля 2012

Выбор интерфейса, вам поможет?

Вы можете использовать setsockopt для этого:

struct ifreq ifr;
strncpy_IFNAMSIZ(ifr.ifr_name, "ethX");
setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, &ifr, sizeof(ifr));
...