Yifan Lu
Yifan Lu
这里只展示了ip显示错误的原因,其他条目,包括FLAGS中的打印也是如此原因
将第二块网卡改名为长度为1的字符串"d"后,打印就正常了,如下: ```bash msh />ifconfig network interface device: e0 (Default) MTU: 1500 MAC: 00 80 e1 15 41 51 FLAGS: UP LINK_DOWN INTERNET_DOWN DHCP_ENABLE ETHARP BROADCAST IGMP ip address: 0.0.0.0 gw...
> ncmp传入的长度参数是1还是2?如果是2,此时应该会忽略第2个字符之后的内容的吧? > > 可以单步调下ncmp里面。或改用strncmp对比下 请教一下ncmp是在哪里看,我感觉问题应该就是这个查找netdev的时候没考虑到netif的name属性不是一个标准的字符串?
> > 没考虑到netif的name属性不是一个标准的字符串? > > 所以这里用了ncmp,而不是直接strcmp。 代码在这 > > https://github.com/RT-Thread/rt-thread/blob/f5fe1a5d7b9117339ffce00035fd58a2c0ff3f3a/src/kservice.c#L563 > > 多网口在多个项目中用过,所以你这里我感觉是第2个网卡的名称及配置信息与netdev中不同步,而非名称对比不成功,毕竟第1个成功了,且你第2个网卡虽然显示为0却实际有IP还能ping通。 我用e1时,用netif->name查询netdev会失败,此时netif->name可以被正确printf出来是e1。用常量字符串"e1"查询netdev却可以查询成功
> ncmp传入的长度参数是1还是2?如果是2,此时应该会忽略第2个字符之后的内容的吧? > > 可以单步调下ncmp里面。或改用strncmp对比下 ncmp传入的貌似是netdev中定义的一个最大名字长度的宏
> > > 没考虑到netif的name属性不是一个标准的字符串? > > > > > > 所以这里用了ncmp,而不是直接strcmp。 代码在这 > > https://github.com/RT-Thread/rt-thread/blob/f5fe1a5d7b9117339ffce00035fd58a2c0ff3f3a/src/kservice.c#L563 > > > > 多网口在多个项目中用过,所以你这里我感觉是第2个网卡的名称及配置信息与netdev中不同步,而非名称对比不成功,毕竟第1个成功了,且你第2个网卡虽然显示为0却实际有IP还能ping通。 > > 我用e1时,用netif->name查询netdev会失败,此时netif->name可以被正确printf出来是e1。用常量字符串"e1"查询netdev却可以查询成功 我曾经试过把第一块网卡直接不初始化,系统中只有一块网卡,第二块网卡一样的初始化流程,命名为e1,最后ifconfig出来是正确的
/> > 没考虑到netif的name属性不是一个标准的字符串? > > 所以这里用了ncmp,而不是直接strcmp。 代码在这 > > https://github.com/RT-Thread/rt-thread/blob/f5fe1a5d7b9117339ffce00035fd58a2c0ff3f3a/src/kservice.c#L563 > > 多网口在多个项目中用过,所以你这里我感觉是第2个网卡的名称及配置信息与netdev中不同步,而非名称对比不成功,毕竟第1个成功了,且你第2个网卡虽然显示为0却实际有IP还能ping通。 单步调试进入netdev_get_by_name中发现,传入的netif->name变成了如下图:  传入参数的地址是没有错的,但是传入参数后貌似出现了问题 传入前,netif->name查看如下:  作为对比,传入常量字符串"e1"进行查询时,进入netdev_get_by_name中的name如下: 
> ncmp传入的长度参数是1还是2?如果是2,此时应该会忽略第2个字符之后的内容的吧? > > 可以单步调下ncmp里面。或改用strncmp对比下 所以我觉得对于netif中要操作netdev的地方,查找网卡是不是单独写一个用netif->name查找netdev的函数,比netdev的那个按名称查找函数的通用方法要更合适,这个地方估计就是因为没用终止符导致查找错误的,再加上第二块网卡会把netif->name后一个netif->num从0变成1,如图:  所以导致了字符串识别失败了 @aozima
/我测试了一下,实际再netif.c中加入如下代码就一切正常了 ```c static struct netdev* netif_get_netdev_by_netifname(const char* netifname) { char temp[3] = {0}; rt_strncpy(temp, netifname, 2); return netdev_get_by_name(temp); } #define netdev_get_by_name netif_get_netdev_by_netifname ``` 输出如下: ```bash msh />ifconfig network interface device:...
> > 将第二块网卡改名为长度为1的字符串"d"后,打印就正常了,如下: > > ```shell > > msh />ifconfig > > network interface device: e0 (Default) > > MTU: 1500 > > MAC: 00 80 e1 15 41 51...