Эхо-клиент LwIP с несколькими интерфейсами netif, как выбрать конкретный интерфейс netif - PullRequest
0 голосов
/ 01 апреля 2019

На 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-адресу?

...