LWIP RAW API 双以太网连接问题

问题描述 投票:0回答:1

我尝试在 Xilinx Zynq 7020 上使用双 PL 以太网连接来实现冗余。在正常情况下,以太网可以单独工作。因此,我也开始为第二个以太网添加网络接口。添加来自与以太网 2 对应的数字设计的不同地址后,我可以使用双以太网。我的问题是,当我拔掉 eth2 线时,我不能只使用第一个以太网。但是当我拔掉第一根电缆时,我只能使用第二个以太网。我注释掉了 netif_set_default 部分,但我相信因为我稍后初始化了第二个以太网,它会覆盖以太网 1。有没有办法单独和一起使用两个以太网端口?我还使用一块适用于两者的印刷电路板。当我尝试将其分离时,出现了很多问题。感谢您的任何建议。

netif = &server_netif;
netif2 = &server_netif2;
ipaddr = (ip_addr_t
            ) IPADDR4_INIT(ip);
    netif->ip_addr = ipaddr;
    local_multicast = (ip_addr_t
            ) IPADDR4_INIT(multicast_ip);
    if (!xemac_add(netif, &ipaddr, &netmask, &gw, mac_ethernet_address,
    PLATFORM_EMAC_BASEADDR_0))
        {
            xil_printf("Error adding N/W interface\r\n");
            return;
        }
//  netif_set_default(netif);
    netif_set_up(netif);
ipaddr2 = (ip_addr_t
                ) IPADDR4_INIT(ip2nd);
    netif2->ip_addr = ipaddr2;
    local_multicast2 = (ip_addr_t
            ) IPADDR4_INIT(multicast_ip2);
    if (!xemac_add(netif2, &ipaddr2, &netmask, &gw, mac_ethernet_address2,
    PLATFORM_EMAC_BASEADDR_1))
        {
            xil_printf("Error adding N/W interface\r\n");
            return;
        }
//  netif_set_default(netif2);
    netif_set_up(netif2);

err = igmp_joingroup(&ipaddr, &local_multicast);
err = igmp_joingroup(&ipaddr2, &local_multicast2);
pcb = udp_new();
err = udp_bind(pcb, IP_ANY_TYPE, IGMP_MULTICAST_PORT);
udp_recv(pcb, udp_multicast_recv, NULL);
arm ethernet bare-metal lwip zynq
1个回答
0
投票

好吧,经过长时间的斗争,我解决了问题。我上面的 LWIP 初始化实际上是正确的,并且中断可以在任何以太网电缆组合上工作。这里的主要问题是我无法从先前初始化的网络接口发送响应。经过长时间的调试,我终于发现pcb(协议控制块)声明了一个以太网,它可能是最后初始化的连接,并从中发送数据。我所做的是进入 udp.c 文件并且 将文件更改为:

err_t
udp_sendto(struct udp_pcb * pcb, struct netif * netif, struct pbuf * p,
    const ip_addr_t * dst_ip, u16_t dst_port) {
    #if LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP
    return udp_sendto_chksum(pcb, p, dst_ip, dst_port, 0, 0);
}

/** @ingroup udp_raw
 * Same as udp_sendto(), but with checksum */
err_t
udp_sendto_chksum(struct udp_pcb * pcb, struct pbuf * p,
    const ip_addr_t * dst_ip,
        u16_t dst_port, u8_t have_chksum, u16_t chksum) {
    #endif

    LWIP_ERROR("udp_sendto: invalid pcb", pcb != NULL,
        return ERR_ARG);
    LWIP_ERROR("udp_sendto: invalid pbuf", p != NULL,
        return ERR_ARG);
    LWIP_ERROR("udp_sendto: invalid dst_ip", dst_ip != NULL,
        return ERR_ARG);

    if (!IP_ADDR_PCB_VERSION_MATCH(pcb, dst_ip)) {
        return ERR_VAL;
    }

    LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, ("udp_send\n"));

    if (pcb -> netif_idx != NETIF_NO_INDEX) {
        //netif = netif_get_by_index(pcb->netif_idx);
    } else {
        #if LWIP_MULTICAST_TX_OPTIONS
        //netif = NULL;
        if (ip_addr_ismulticast(dst_ip)) {

            if (pcb -> mcast_ifindex != NETIF_NO_INDEX) {
                //netif = netif_get_by_index(pcb->mcast_ifindex);
            }
            #if LWIP_IPV4
            else
                #if LWIP_IPV6
            if (IP_IS_V4(dst_ip))
                #endif /* LWIP_IPV6 */ {

                    if (!ip4_addr_isany_val(pcb -> mcast_ip4) &&
                        !ip4_addr_cmp( & pcb -> mcast_ip4, IP4_ADDR_BROADCAST)) {
                        //netif = ip4_route_src(ip_2_ip4(&pcb->local_ip), &pcb->mcast_ip4);
                    }
                }
            #endif /* LWIP_IPV4 */
        }

        if (netif == NULL)
            #endif /* LWIP_MULTICAST_TX_OPTIONS */ {
                //netif = ip_route(&pcb->local_ip, dst_ip);
            }
    }

    if (netif == NULL) {
        LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("udp_send: No route to "));
        ip_addr_debug_print(UDP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, dst_ip);
        LWIP_DEBUGF(UDP_DEBUG, ("\n"));
        UDP_STATS_INC(udp.rterr);
        return ERR_RTE;
    }
    #if LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP
    return udp_sendto_if_chksum(pcb, p, dst_ip, dst_port, netif, have_chksum, chksum);
    #else
    return udp_sendto_if(pcb, p, dst_ip, dst_port, netif);
    #endif
}

err_t
udp_send(struct udp_pcb *pcb,struct netif *netif, struct pbuf *p)
{
  LWIP_ERROR("udp_send: invalid pcb", pcb != NULL, return ERR_ARG);
  LWIP_ERROR("udp_send: invalid pbuf", p != NULL, return ERR_ARG);

  if (IP_IS_ANY_TYPE_VAL(pcb->remote_ip)) {
    return ERR_VAL;
  }

  /* send to the packet using remote ip and port stored in the pcb */
  return udp_sendto(pcb,netif, p,  &pcb->remote_ip, pcb->remote_port);
}

#if LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP
/** @ingroup udp_raw
 * Same as udp_send() but with checksum
 */
err_t
udp_send_chksum(struct udp_pcb *pcb, struct pbuf *p,
                u8_t have_chksum, u16_t chksum)
{
  LWIP_ERROR("udp_send_chksum: invalid pcb", pcb != NULL, return ERR_ARG);
  LWIP_ERROR("udp_send_chksum: invalid pbuf", p != NULL, return ERR_ARG);

  if (IP_IS_ANY_TYPE_VAL(pcb->remote_ip)) {
    return ERR_VAL;
  }

  /* send to the packet using remote ip and port stored in the pcb */
  return udp_sendto_chksum(pcb, p, &pcb->remote_ip, pcb->remote_port,
                           have_chksum, chksum);
}
#endif /* LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP */

通过这种方式,我可以使用我选择的netif(网络接口)。

祝你有美好的一天!

© www.soinside.com 2019 - 2024. All rights reserved.