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.

[参考译文] 在 AM437x 上启动后、从 eth0和 Eth1更改 IP 地址的奇怪行为

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1054694/strange-behavior-changing-the-ip-address-from-eth0-and-eth1-after-start-up-on-am437x

您好、团队成员:

简介:

 我 的板有两个以太网接口(eth0和 Eth1) 、就像 AM437的开发板那样、那么 我可以使用原始驱动程序。   start-up.cfg 配置 eth0、但当软件启动完成时、我需要重新配置一个或两个接口的 IP 地址。 它取决于从另一个器件的 SPI 通道接收到的配置消息。

事情几乎运转良好 、但在我看来、移除 IP 和 添加新 IP 更改的过程 有点模糊。   它看起来像是我的源代码的外观:

startup.cfg:

var osType ="tirtos";
VAR socType ="AM437X";

/加载 EMAC 封装
VAR EMAC = XDC.loadPackage ('ti.drv.emac');
emac.Settings.socType = socType;

//加载 Nimu 封装
VAR Nimu = XDC.loadPackage ('ti.transport.NDK.Nimu');
Nimu.Settings.socType = socType;

VAR Global = xdc.useModule('ti.ndk.config.Global');
VAR ICMP = xdc.useModule('ti.ndk.config.Icmp');
VAR IP = xdc.useModule('ti.ndk.config.Ip');
VAR UDP = xdc.useModule('ti.ndk.config.Udp');

ip.domainname ="ced2.net";

//静态 IP 配置的设置
ip.ResolveIP = false;
ip.CallByIP = false;
Ip.autoIp = false;

//如果不使用 IP 进行初始化。
ip.address ="192.168.10.10";
ip.mask ="255.255.255.0;
ip.gatewayIpAddr ="192.168.10.1";

//如果使用2个 IP 进行初始化(双 MAC 模式操作)
//在此处配置第二个以太网接口,并以编程方式配置第一个接口。
//对于双 MAC 模式操作,请在此处配置第二个以太网接口,然后
//使用 Global. stackInitHook 添加执行 IP 配置的挂钩
//以编程方式设置第一个接口。
ip.ifIdx = 1;

//对于双 MAC 模式操作,添加挂钩 Global. stackInitHook 以执行
//第一个接口的 IP 配置(可编程)。
//Global. stackInitHook ="&stackInitHook";
global.stackInitHook =空;

BIOS 初始化:

  空以太网:Init()

EMAC_HwAttrs_V4 hwAttrs;

//芯片配置 MII/RMII 选择
CpswPortMacModeSelect (0、Ethernet_MAC_TYPE_RGMII);
CpswPortMacModeSelect (1、Ethernet_MAC_TYPE_RGMII);

EMAC_socGetInitCfg (0、hwAttrs);

//注意:由 Nimu 调用的 emac_open (cpsw_Nimu_eth.c 中的 Nimu_start)是
//实际上是 EMAC_open_v4 (emac_drv_v4.c)。 EMAC_open_v4调用 EMAC_setupCpswInitConfig 和
//强制收发器进行自动协商。
//设置配置模式标志(macModeFlags)而不是千兆位
hwAttrs.macModeFlags = EMAC_CPSW_CONFIG_MODEFLG_FULLDUPLEX;

hwAttrs.numPorts = 2;
hwAttrs.port[0].phy_addr = EMAC_CPSW_PORT0_PHY_ADDR;
hwAttrs.port[1].phy_addr = EMAC_CPSW_Port1_PHY_ADDR;
EMAC_socSetInitCfg (0、hwAttrs);

//填充 NIMU 器件表以初始化2个器件(以太网接口)。
NIMUDeviceTable[0].init =&CpswEmacInit;
NIMUDeviceTable[1].init =&CpswEmacInit;
NIMUDeviceTable[2].init = NULL;
}//初始化

删除/添加 IP:

在比例中、索引"0"为"eth0"、索引"1"为"Eth1"。  ´s 更改 IP 地址:

首先:删除所有 IP

   执行结果= CfgGetEntry (0、CFGTAG _IPNet、1、1、&phCfgEntry);

   仅返回 startup.cfg 上定义的一个接口

然后

  结果= CfgRemoveEntry (0、phCfgEntry);

问题CfgGetEntry 的第一个参数是"0"。  为什么???  我无法找到此范围的定义位置及其用途。 我知道、如果我更改值、服务将无法正常工作。 我尝试从  Texas Library 变量定义加载 CfgGetEntry 、但 它不起作用。

删除后、我尝试为两个接口添加新 IP。 我的观点在这个 fase 中:

对于 BIOS 、eth0为索引0、Eth1为索引1。   要删除  CfgRemoveEntry ,eth0为索引0,Eth1为索引1。  当我尝试对 CfgAddEntry 使用相同的索引时(0,CFGTAG _IPNet,...   事情会很奇怪。 当我拔下以太网电缆 eth0时、Eth1 UDP 套接字停止、反之亦然。  在我看来、我的 eth0新 IP 地址是属于 Eth1的、  反之亦然。

 如果我使用 CfgAddEntry (0、CFGTAG _IPNet、2、0、sizeof (CI_IPNet)、 (unsigned char *)&nA、0) (索引2)新 IP 归结为 eth0,如果我使用  CfgAddEntry (0、CFGTAG _IPNet、1、0、sizeof (CI_IPNet), (unsigned char *)&nA、0)(索引1) 新 IP 正确归属于 Eth01。

:为什么这些指数是用于删除和添加操作的差数?   

问题:当电路板启动并且从交换机上拔下以太网电缆时 、移除和添加操作将无法正常工作。 在我看来、更改 IP 地址进程行为会发生变化、例如当我使用索引0和1来添加新 IP (连接到链路 dow/up BIOS 状态的内容)时。   

  如果电路板从插入两根电缆开始、则一切工作正常、始终使用索引 2和1。  如果拔下 电源线并插上两根或分开的电缆,则系统行为和插座 工作正常。   为什么??????

感谢你的任何帮助

      半