This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] AM2634-Q1:AM2634-Q1:双网络 — 通过多播发送 UDP 消息、仅通过一个以太网端口发送

Guru**** 2771175 points

Other Parts Discussed in Thread: AM2634-Q1

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1611180/am2634-q1-am2634--dual-network---udp-message-send-over-multicast-works-with-only-one-ethernet-port

器件型号: AM2634-Q1

你(们)好  

我在 AM2634-Q1 CC EVM 上使用两个具有两个不同 IP 地址和网络掩码的以太网端口。 我正在运行具有两个 IP 地址的专用 UDP 客户端。 我能够在两个具有以下 IP 地址、子网和网关的以太网实例上发送 UDP 消息。

  1. NETIF_INST_ID0 - 192.168.0.155,255255.255.255.0192.168.0.1
  2. NETIF_INST_ID1 - 192.168.5.51,255.255.252.0。 192.168.5.1。

我将两个实例都加入多播组、调用如下所示。 我的多播地址是 239.255.1.1

igmp_joingroup_netif(g_pNetif[NETIF_INST_ID0], &g_MCast_IpAddr);

igmp_joingroup_netif(g_pNetif[NETIF_INST_ID1], &g_MCast_IpAddr);

我正在 Windows 计算机的端口 9997 和 9999 上运行两个 UDP 服务器。 两个 UDP 服务器位于不同的网络上。 两个实例都已加入多播组。

UDP 消息仅通过 NETIF_INST_ID1 发送到多播的问题。 代码下方。 这是一个测试代码、当工作时将在实际目标中实施。

	#define MULTICAST_IP_ADDR_3     "239.255.1.1"

	int NW_Main(void *args)
	{
		Enet_Type enetType;
		uint32_t instId;
		int32_t status;

		static uint32_t cnt1 = 0, cnt2 = 0;
		status = EventP_construct(&hEvent);


		EnetApp_getEnetInstInfo(CONFIG_ENET_CPSW0, &enetType, &instId);
		EnetAppUtils_enableClocks(enetType, instId);
		EnetApp_driverInit();

		status = EnetApp_driverOpen(enetType, instId);
		EnetApp_initPhyStateHandlerTask(&hEvent);
		if (ENET_SOK != status)
		{
			EnetAppUtils_print("Failed to open ENET: %d\r\n", status);
			EnetAppUtils_assert(false);
			return -1;
		}

		EnetApp_addMCastEntry(enetType,
							  instId,
							  EnetSoc_getCoreId(),
							  BROADCAST_MAC_ADDRESS,
							  CPSW_ALE_ALL_PORTS_MASK);
		//call createPhyHandler here

		lwip_init();
		srand(ClockP_getTicks()/1000);
		App_setupNetif();
		App_allocateIPAddress();

		if (ENET_SOK != status)
		{
			EnetAppUtils_print("Failed to construct Event: %d\r\n", status);
			EnetAppUtils_assert(false);
			return -1;
		}

		while (false == App_isNetworkUp(netif_default))
		{
			//DebugP_log("Waiting for network UP ...\r\n");
			sys_check_timeouts();

			const uint32_t recvdEventsMask = App_receiveEvents(&hEvent);

			if (recvdEventsMask != AppEventId_NONE)
			{
				App_handleEvent(recvdEventsMask);
			}
		}

		DebugP_log("Network is UP ...\r\n");
		ClockP_sleep(1);

		// udp_dual_server();
		udp_client_pcb[0] = udp_new();
		udp_client_pcb[1] = udp_new();
		// ip4addr_aton(MULTICAST_IP_ADDR_1, &g_MCast_IpAddr);//error as non-igmp group
		ip4addr_aton(MULTICAST_IP_ADDR_3, &g_MCast_IpAddr);
		RTI_counterEnable(CONFIG_RTI0_BASE_ADDR, RTI_TMR_CNT_BLK_INDEX_0);
		uint32_t multicast_done = 1;
		while (1)
		{
			sys_check_timeouts();

			const uint32_t recvdEventsMask = App_receiveEvents(&hEvent);

			if (recvdEventsMask != AppEventId_NONE)
			{
				App_handleEvent(recvdEventsMask);
			}
			if(App_isNetworkUp(g_pNetif[NETIF_INST_ID0])){

				if(cnt1 == 0){

					igmp_joingroup_netif(g_pNetif[NETIF_INST_ID0], &g_MCast_IpAddr);
					// igmp_joingroup(&g_pNetif[NETIF_INST_ID0]->ip_addr, &g_MCast_IpAddr); 
				}
				if(cnt1 == 1){
				// Udp_Client_Send(NETIF_INST_ID0, "192.168.0.155", 9999, "RAMAN");
				Udp_Client_Send(NETIF_INST_ID0, MULTICAST_IP_ADDR_3, 9997, "RAMAN");
				// ClockP_sleep(100*1000);
				}
				cnt1++;
				if(cnt1 > 0xFFFF){
					// udp_remove(udp_client_pcb);
					cnt1 = 1;
				}
			}
			
			if(App_isNetworkUp(g_pNetif[NETIF_INST_ID1])){

				if(cnt2 == 0){

					igmp_joingroup_netif(g_pNetif[NETIF_INST_ID1], &g_MCast_IpAddr);
					// igmp_joingroup(&g_pNetif[NETIF_INST_ID1]->ip_addr, &g_MCast_IpAddr);
				}
				if(cnt2 == 1){					
					// Udp_Client_Send(NETIF_INST_ID1, "192.168.5.50", 9997, "BHABHA");
					Udp_Client_Send(NETIF_INST_ID1, MULTICAST_IP_ADDR_3, 9999, "BHABHA");
					// ClockP_sleep(100*1000);
				}
				cnt2++;
				if(cnt2 > 0xFFFF){	
					// udp_remove(udp_client_pcb);
					cnt2 = 1;
				}
			}
		}

		App_shutdownNetworkStack();
		EnetApp_driverDeInit();
		EventP_destruct(&hEvent);
		return 0;
	}

 

请求有关如何使多播适用于两个以太网端口的任何帮助。

 

谢谢、此致
Varma

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Varma:

    您是否介意与我分享您的完整应用程序、以便我能够重现问题并尝试进行调试?

    此致、
    Shaunak

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Shaunak:

    我附加了我的 CCS 测试工程。  

    e2e.ti.com/.../dual_5F00_eth.rar

    此致

    Varma

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,瓦尔马,请允许我一些时间来评估和回来

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Varma:

    1.我认为,问题是您的 UDP PCB (udp_client_pc[0]和 udp_client_pc1]) 不绑定到特定的 IP 地址。 lwIP 路由多播数据包时、它使用路由表确定要使用的接口。 如果没有绑定、lwIP 可能会默认到最后一个接口或使用其内部路由逻辑、因此只有 NETIF_INST_ID1 可以工作。

    两个 PCB 都是用 udp_new() 创建的、但只有后一个 PCB 绑定并以 IP_ADDR_ANY 的形式使用。 我们还需要将 UDP 套接字绑定到 IP 地址。 类似:

    /* Create UDP PCBs and bind to specific interfaces */
      udp_client_pcb[0] = udp_new();
      udp_client_pcb[1] = udp_new();
    
      if (udp_client_pcb[0] != NULL) {
          err = udp_bind(udp_client_pcb[0], &g_pNetif[NETIF_INST_ID0]->ip_addr, 0);  // White check mark FIX: Bind to interface 0's IP
          if (err == ERR_OK) {
              DebugP_log("UDP PCB[0] bound to %s\r\n",
                         ip4addr_ntoa(&g_pNetif[NETIF_INST_ID0]->ip_addr));
          } else {
              DebugP_log("Failed to bind UDP PCB[0]: %d\r\n", err);
          }
      }
    
      if (udp_client_pcb[1] != NULL) {
          err = udp_bind(udp_client_pcb[1], &g_pNetif[NETIF_INST_ID1]->ip_addr, 0);  // White check mark FIX: Bind to interface 1's IP
          if (err == ERR_OK) {
              DebugP_log("UDP PCB[1] bound to %s\r\n",
                         ip4addr_ntoa(&g_pNetif[NETIF_INST_ID1]->ip_addr));
          } else {
              DebugP_log("Failed to bind UDP PCB[1]: %d\r\n", err);
          }
      }
    

    2.此外、您需要确保在 CPSW ALE 中为两个端口注册多播 MAC 地址。 (您可以使用 GEL 脚本转储 ALE 表、查看 ALE 表中是否存在这两个 MAC 条目)

    3.运行应用程序时,可以停止内核,在表达式窗口中输入“lwip_stats",“,查看两个端口上是否有任何活动(预期),以及是否看到任何错误。

    此致、
    Shaunak

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Shaunak:

    感谢您的答复。 请允许我在本周进行测试、并在更新后返回。

    此致

    Varma

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Shaunak:

    在您建议的更改下、我甚至无法使用一个 MAC 来处理多播。 IGMP 上无流量。

    两个端口均未加入 IGMP 组。

    我不明白如何做你建议的第 2 点。 如何使用 GEL 脚本转储 ALE 表?

    此致

    Varma

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Varma:

    让我看看、然后回来。

    此致、
    Shaunak

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    我们需要更多的时间来恢复这一点、因为指定的专家将在 3 月的第一周休假、请期待收到延迟的回复。