Перейти к содержанию
    

несколько eth через lwIP

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

 

поставил светодиод - прием пакетов на "мертвый" интерфейс есть

а передача умирает

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

или одну из карточек ставить в другую сеть?

 

да, спасибо за совет, помогло

теперь нужно разбираться с маской, так как

эти эзернеты должны быть соеденены

точка-точка с похожими адресами

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

в общем это сделать прямо никак нельзя.

пришлось править 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 адрес конечного соединения.

так все работает

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Почему бы не использовать готовую функцию:

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Почему бы не использовать готовую функцию:

/**
* @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

и мой вариант работает

неизвестно как это будет работать если несколько интерфейсов останутся в одной сетке

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...