На STM32H753 я запускаю клиент tcp echo из STM32Cube_FW_H7.
Однако на плате имеется три сетевых интерфейса с разными IP-адресами, каждый из которых обслуживается LwIP (1x LAN8742 + 2x KSZ8851).
Используя ping, я проверил правильные порты, отсоединив другие.
Например, IP 192.168.0.101 назначен порту 1, IP 192.168.0.102 назначен порту 2, а IP 192.168.0.103 назначен порту 3.
В ethernetif * .c три интерфейса получили имена "st", "M1" и "M2".
Все работает нормально, но функция tcp_echoclient_connect всегда выбирает 3-й порт в качестве локального. Как я могу сказать LwIP выбрать, например, 1-й или 2-й порт?
Вызов функции tcp_echoclient_connect
/* connect to destination address/port */
tcp_connect(echoclient_pcb, &DestIPaddr, DEST_PORT, tcp_echoclient_connected);
Затем выбирается третий интерфейс (и IP-адрес).
В tcp.c функция tcp_connect показывает, как получить подходящий интерфейс:
/* check if we have a route to the remote host */
if (ip_addr_isany(&pcb->local_ip)) {
/* no local IP address set, yet. */
struct netif *netif;
const ip_addr_t *local_ip;
ip_route_get_local_ip(&pcb->local_ip, &pcb->remote_ip, netif, local_ip);
if ((netif == NULL) || (local_ip == NULL)) {
/* Don't even try to send a SYN packet if we have no route
since that will fail. */
return ERR_RTE;
}
/* Use the address as local address of the pcb. */
ip_addr_copy(pcb->local_ip, *local_ip);
}
Так что я бы хотел указать конкретный netif (интерфейс).
Как я могу это сделать?
Когда я запускаю эхо-сервер tcp, он использует правильный интерфейс.
Я могу отправить сообщение на соответствующий порт, и он ответит обратно. Неправильный порт не отвечает.
Мой источник
https://github.com/bkht/LAN8742A_KSZ8851SNL_LwIP
Примечание:
ip_route_get_local_ip вызывает ip_route, который возвращает первый netif, соответствующий маске сети. Это функция ip4_route в ip4.c.
На данный момент, так как я не мог найти другой способ выбора частичного netif, я создал несколько функций для выбора нужного netif по имени:
В ip4.c
struct netif *ip4_route_by_name(const char *name, const ip4_addr_t *dest)
In tcp.c
err_t tcp_connect_by_name(const char *name, struct tcp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port, tcp_connected_fn connected)
На сервере tcp_echoclient я указываю имя netif при создании соединения:
/* from a specified netif connect to destination address/port */
tcp_connect_by_name("m1", echoclient_pcb, &DestIPaddr, DEST_PORT, tcp_echoclient_connected);
Но, может быть, уже существовала функциональность для указания netif, которая соответствует имени netif, MAC-адресу или IP-адресу?