inventor 0 22 марта, 2018 Опубликовано 22 марта, 2018 · Жалоба на контролере миландр есть 2 eth во freertos и lwip по отдельности работают, на каждом сделал UDP echo сервер но если включаю сразу 2 работает только один задачи одинаковые, видимо проблема в инициализации netif подскажите, где ковырять. адреса получаю по DHCP для обоих интерфесов но попытка послать строку для эхо на один них заканчивается неудачно: SUCCESS: Create eth5 dhcp SUCCESS: Create eth5 task Looking for DHCP server for eth5 please wait... Looking for DHCP server for eth2 please wait... bind soket to addr 192.168.0.102 OK eth5 IP from DHCP: 192.168.0.102 eth2 IP from DHCP: 192.168.0.103 0: 933 bytes recv from (192.168.0.105) : Привет 0 Error sendto поставил светодиод - прием пакетов на "мертвый" интерфейс есть а передача умирает Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ikm 0 22 марта, 2018 Опубликовано 22 марта, 2018 · Жалоба А как при одинаковых под сетях ОС узнает в какой из eth выводить? Если у вас не прописано маршрутизация типа NAT, что для адресов 192.168.0..1-122 выводить через eth2, а остальные через eth5, то система просто выберет только один для передачи. Но, мне как то не попадалось нормальное решение работы двух сетевух на одной подсети. Хотя у меня и опыт по этому минимальный. Может более опытные коллеги подскажут. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
inventor 0 22 марта, 2018 Опубликовано 22 марта, 2018 · Жалоба А как при одинаковых под сетях ОС узнает в какой из eth выводить? Если у вас не прописано маршрутизация типа NAT, что для адресов 192.168.0..1-122 выводить через eth2, а остальные через eth5, то система просто выберет только один для передачи. Но, мне как то не попадалось нормальное решение работы двух сетевух на одной подсети. Хотя у меня и опыт по этому минимальный. Может более опытные коллеги подскажут. то есть мне нужно ставить статический маршрут и самому задавать маску, или одну из карточек ставить в другую сеть? да, спасибо за совет, помогло теперь нужно разбираться с маской, так как эти эзернеты должны быть соеденены точка-точка с похожими адресами Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
inventor 0 24 июля, 2018 Опубликовано 24 июля, 2018 · Жалоба в общем это сделать прямо никак нельзя. пришлось править lwip при посылке пакета udp есть проверка: стек ищет подходящий по маске и адресу назначения интерфейс и при его нахождении пакет туда направляется я поменял /* iterate through netifs */ for(netif = netif_list; netif != NULL; netif = netif->next) { /* network mask matches? */ if (netif_is_up(netif)) { /* return netif on which to forward IP packet */ if (ip_addr_netcmp(dest, &(netif->ip_addr), &(netif->netmask))) { return netif; } } } на /* iterate through netifs */ for(netif = netif_list; netif != NULL; netif = netif->next) { /* network mask matches? */ if (netif_is_up(netif)) { /* return netif on which to forward IP packet */ if (ip_addr_cmp(dest, &(netif->ip_gw))) { return netif; } } } при подъеме netif в самом начале программы в качестве адреса gw забиваю ip адрес конечного соединения. так все работает Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vadon 0 25 июля, 2018 Опубликовано 25 июля, 2018 · Жалоба Почему бы не использовать готовую функцию: /** * @ingroup udp_raw * Bind an UDP PCB to a specific netif. * After calling this function, all packets received via this PCB * are guaranteed to have come in via the specified netif, and all * outgoing packets will go out via the specified netif. * * @param pcb UDP PCB to be bound. * @param netif netif to bind udp pcb to. Can be NULL. * * @see udp_disconnect() */ void udp_bind_netif(struct udp_pcb *pcb, const struct netif *netif) { LWIP_ASSERT_CORE_LOCKED(); if (netif != NULL) { pcb->netif_idx = netif_get_index(netif); } else { pcb->netif_idx = NETIF_NO_INDEX; } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
inventor 0 27 июля, 2018 Опубликовано 27 июля, 2018 · Жалоба Почему бы не использовать готовую функцию: /** * @ingroup udp_raw * Bind an UDP PCB to a specific netif. * After calling this function, all packets received via this PCB * are guaranteed to have come in via the specified netif, and all * outgoing packets will go out via the specified netif. * * @param pcb UDP PCB to be bound. * @param netif netif to bind udp pcb to. Can be NULL. * * @see udp_disconnect() */ void udp_bind_netif(struct udp_pcb *pcb, const struct netif *netif) { LWIP_ASSERT_CORE_LOCKED(); if (netif != NULL) { pcb->netif_idx = netif_get_index(netif); } else { pcb->netif_idx = NETIF_NO_INDEX; } } я использую сокеты , а не pcb и мой вариант работает неизвестно как это будет работать если несколько интерфейсов останутся в одной сетке Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться