реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> несколько eth через lwIP
inventor
сообщение Mar 22 2018, 06:54
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



на контролере миландр есть 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

поставил светодиод - прием пакетов на "мертвый" интерфейс есть
а передача умирает
Go to the top of the page
 
+Quote Post
ikm
сообщение Mar 22 2018, 07:13
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 891
Регистрация: 25-12-06
Из: С-Пб
Пользователь №: 23 894



А как при одинаковых под сетях ОС узнает в какой из eth выводить? Если у вас не прописано маршрутизация типа NAT, что для адресов 192.168.0..1-122 выводить через eth2, а остальные через eth5, то система просто выберет только один для передачи. Но, мне как то не попадалось нормальное решение работы двух сетевух на одной подсети. Хотя у меня и опыт по этому минимальный. Может более опытные коллеги подскажут.


--------------------
ОБХОДЯ РАЗЛОЖЕННЫЕ ГРАБЛИ - ТЫ ТЕРЯЕШЬ ДРАГОЦЕННЫЙ ОПЫТ!!!
Go to the top of the page
 
+Quote Post
inventor
сообщение Mar 22 2018, 07:24
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



Цитата(ikm @ Mar 22 2018, 10:13) *
А как при одинаковых под сетях ОС узнает в какой из eth выводить? Если у вас не прописано маршрутизация типа NAT, что для адресов 192.168.0..1-122 выводить через eth2, а остальные через eth5, то система просто выберет только один для передачи. Но, мне как то не попадалось нормальное решение работы двух сетевух на одной подсети. Хотя у меня и опыт по этому минимальный. Может более опытные коллеги подскажут.

то есть мне нужно ставить статический маршрут и самому задавать маску,
или одну из карточек ставить в другую сеть?

да, спасибо за совет, помогло
теперь нужно разбираться с маской, так как
эти эзернеты должны быть соеденены
точка-точка с похожими адресами
Go to the top of the page
 
+Quote Post
inventor
сообщение Jul 24 2018, 13:29
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



в общем это сделать прямо никак нельзя.
пришлось править lwip
при посылке пакета udp есть проверка:
стек ищет подходящий по маске и адресу назначения интерфейс
и при его нахождении пакет туда направляется
я поменял

CODE

/* 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;
}
}
}


на
CODE

/* 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 адрес конечного соединения.
так все работает
Go to the top of the page
 
+Quote Post
vadon
сообщение Jul 25 2018, 18:23
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 97
Регистрация: 27-07-10
Из: харьков
Пользователь №: 58 632



Почему бы не использовать готовую функцию:
Код
/**
* @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;
  }
}
Go to the top of the page
 
+Quote Post
inventor
сообщение Jul 27 2018, 07:21
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



Цитата(vadon @ Jul 25 2018, 21:23) *
Почему бы не использовать готовую функцию:
Код
/**
* @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
и мой вариант работает
неизвестно как это будет работать если несколько интерфейсов останутся в одной сетке
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th April 2024 - 23:57
Рейтинг@Mail.ru


Страница сгенерированна за 0.014 секунд с 7
ELECTRONIX ©2004-2016