Получать Multicast с собственного IP

Я работаю над мастером Ethercat, написанным на Go. Основная библиотека находится по адресу http://github.com/distributed/ecat и содержит один драйвер уровня связи, использующий UDP и многоадресную рассылку. У меня проблемы с тем, чтобы этот драйвер канального уровня работал согласованно на разных платформах (OS X, Windows, Linux) и разных сетевых конфигурациях.

Для тех, кто не знаком с Ethercat, вот как это работает. Ethercat - это промышленная шинная система на основе Ethernet. Есть один мастер шины и потенциально много рабов, которые связаны в логическое кольцо. Мастер может быть построен из стандартного оборудования, то есть с обычными интерфейсными картами Ethernet. Ведущий отправляет пакет на своем интерфейсе Ethernet, ведомые изменяют пакет на лету, и после прохождения через все ведомые устройства ведущий получает пакет на том же сетевом интерфейсе, который его отправил. В зависимости от количества ведомых устройств сетевой интерфейс может начать принимать пакет, пока он все еще передает тот же пакет. Существует два возможных формата для кадров Ethercat. Первый - это пакет Ethernet со специальным типом Ethernet. Второй - это UDP-пакет, предназначенный для порта 0x88a4.

В зависимости от команд, содержащихся в пакете Ethernet, ведомые устройства могут изменять или не изменять данные Ethercat пакета. Помимо изменения данных Ethercat, единственное, что меняется в пакете, это то, что бит 1 адреса назначения Ethernet установлен в 1. IP-заголовок пакета не затрагивается подчиненными Ethercat.

Мой код работает следующим образом. Я присоединяюсь к многоадресной группе, скажем 239.255.65.10 на интерфейсе xyzгде я подключил своих рабов Ethercat. Для обмена данными с шиной отправляю пакет, назовем его pA на этом интерфейсе 239.255.65.10, ОС заполняет адрес источника, скажем, IP-адрес 192.168.5.2 интерфейса xyz, После того, как пакет прошел через шину и, возможно, был изменен, теперь это пакет pB, У заголовка IP все еще есть источник 192.168.5.2 и пункт назначения 239.255.65.10, В зависимости от сетевых настроек хоста, этот пакет может или не может достичь моего приложения. В случаях, когда оно не доходит до моего приложения, скажем, когда rp_filter на Linux установлен пакет pB отклонен, потому что похоже, что он произошел от моей машины, но мы не должны получать наши собственные пакеты по сети.

Какие шаги я могу предпринять, чтобы надежно получить обработанный пакет pB? Обратите внимание, что я не говорю о loopback - loopback о получении пакета pAмой вопрос о получении pB,

0 ответов

Другие вопросы по тегам