Сначала вводная часть:
В простейшем случае есть схема, представленная в прикрепленном файле. 1 и 2 - устройства на базе FPGA с гигабитным портом, 3 - обычный компьютер, всё это связано через обычный неуправляемый коммутатор. Устройство 1 шлет UDP-поток данных на устройство 2, в котором происходит обработка, и результирующие данные отсылаются опять-таки через UDP с 2 на компьютер 3. По логике работы, в коммутаторе есть таблица соответствия MAC-адресов портам и в нормальном режиме работы коммутатор должен слать поток от устройства 1 только на четвертый порт, а на восьмом пакетов этого потока быть не должно, и соответственно данные с устройства 2 должны приходить только на восьмой порт. Именно такое поведение наблюдается, если слать данные с 2 на 3 или напрямую с 1 на 3 - пакеты приходят только на восьмой порт, остальные остаются неактивными.
Однако если слать данные с 1 на 2, то коммутатор начинает спамить пакетами на все порты. Насколько я понимаю, это связано с отсуствием записи в MAC-таблице коммутатора о соответствии устройства 2 определенному порту.
Ну а теперь сам вопрос: как добавить эту запись?
Что было испробовано:
1. Устройство 2 шлет UDP-поток на 3.
2. Устройство 2 шлет широковещательные ARP-сообщения со своими MAC и IP адресами.
3. Устройство 2 шлет ICMP echo запрос (Ping) на 3.
4. Устройство 2 принимает ARP-запрос со своим IP-адресом и отвечает отправителю верным ARP-ответом.
Однако же, ни один из приведенных методов ассоциации устройства определенному порту не вызвал.
Совместное использование двух последних решений привело к тому, что устройство 2 может беспрепятственно пинговать компьютер 3, т.е. через коммутатор проходит цепочка сообщений Ping request от 2 к 3 -> ARP request от 3 к 2 -> ARP reply от 2 к 3 -> Ping reply от 3 к 2. Следовательно, сами сообщения составлены правильно, через коммутатор проходят, но желаемого результата не дают.
Куда следует копать дальше? Может, для заполнения MAC-таблицы нужны TCP-пакеты?
Эскизы прикрепленных изображений