Эта проблема
В нашей системе с RTEMS 4.9.2 мы столкнулись с очень странной проблемой связи через сокеты. Мы настраиваем сокет и используем следующую команду для привязки:
// Bind the socket to set the local port
sockaddr_in localSocketAddress = {0};
localSocketAddress.sin_family = AF_INET;
localSocketAddress.sin_port = (u_short)localPort;
localSocketAddress.sin_addr.s_addr = localAddress;
if (bind( mSocket, (sockaddr *)&localSocketAddress, sizeof(sockaddr_in)) == SOCKET_ERROR)
{
int errorOut = errno;
...
И это работает для связи UDP, за исключением странного конкретного сценария, который объясняется ниже. Проблема, с которой мы сталкиваемся, заключается в сбое этого вызова bind
, даже если установка правильная. Мы получаем ошибку 125
, которая для RTEMS равна EADDRNOTAVAIL
:
Был запрошен несуществующий интерфейс или запрошенный адрес не был локальным.
Видимая причина
При загрузке устройства мы можем настроить нашу сеть одним из двух способов:
Сетевой IP-адрес и подсеть настраиваются автоматически на основе того, что находится в загрузчике по умолчанию (UBOOT), и настраивается через ОС RTEMS.
Функция RTEMS
rtems_bsdnet_ifconfig
вызывается для изменения IP-адреса единственного интерфейса Ethernet после загрузки.
Для уточнения вариант 2 называется так:
rtems_bsdnet_ifconfig(eth_interface, SIOCSIFADDR, &ipaddr);
Если сеть настроена в соответствии с параметром 1, все работает, как и ожидалось, но если используется вариант 2 (даже в случае, когда настройка соответствует параметрам сети, определенным параметром 1), то привязка сокета завершается ошибкой.
Есть ли известная причина или ошибка для RTEMS, которая указывает на то, что эта привязка не будет работать, если вы перенастроите свой IP-адрес?
Дополнительная информация
Мы настраиваем новый IP-адрес (вариант 2), используя метод, который по существу использует
ioctl("eht1", SIOCSIFADDR, ...)
.Если мы привязываем наш сокет без указания локального АДРЕСА (т.е. используем
INADDR_ANY
), то он работает в любом случае.rtems_bsdnet_ifconfig
— это простой интерфейс для функцииioctl
. Это отrtems_glue.c
и имеет функциональную сигнатуруint rtems_bsdnet_ifconfig(const char *ifname, uint32_t cmd, void *param)
Все нормальные сетевые функции работают, кроме этой привязки.
Посмотрев на это, я подумал, что, возможно, мне нужно сделать больше для сброса моего IP адрес. Но это не работает, использование первого ответа или даже какие-либо действия с
SIOCSIFFLAGS
приводят к прекращению работы всей сети.
bind
происходит до завершения настройки интерфейса? будет продолжаться сбой, если вы продолжите повторять попыткуbind
? - person mark   schedule 08.06.20164.6.1
), ноrtems_bsdnet_ifconfig
это структура, а не функция... - person LPs   schedule 14.06.2016rtems_glue.c
. - person Fantastic Mr Fox   schedule 14.06.2016sockaddr
сравниваются по байтам: выmemset
свою структуру sockaddr устанавливали в 0 перед настройкой ее значений и переходом кbind
? - person grasbueschel   schedule 16.06.2016bind()
с помощью отладчика и посмотреть, где именно происходитreturn EADDRNOTAVAIL
? - person exilit   schedule 17.06.2016sockaddr_in localSocketAddress = {0};
- person Fantastic Mr Fox   schedule 17.06.2016sin_len
членsockaddr_in
, который вы должны инициализировать какsizeof struct sockaddr_in
. - person grasbueschel   schedule 17.06.2016