最近测试rt thread 3.1.3版本+lwip 2.0.2协议的网络部分功能,程序上电运行默认是开启DHCP功能的,执行DHCP关闭后,设置一个IP地址,再执行DHCP打开后,程序就无法获取到IP地址。经过查看网络部分的相关驱动代码,发现netdev_dhcp_enabled()调用到底层后并没有实际操作dhcp相关的函数,所以不会生效,修改办法就是ethernetif.c程序中168行增加控制dhcp_start(),dhcp_stop的功能。
#ifdef RT_LWIP_DHCP
static int lwip_netdev_set_dhcp(struct netdev *netif, rt_bool_t is_enabled)
{
netdev_low_level_set_dhcp_status(netif, is_enabled);
/*zhaoshimin 20200508 add dhcp打开或关闭时停止dhcp功能*/
if(is_enabled == RT_TRUE)
{
dhcp_start((struct netif *)netif->user_data);
}
else
{
dhcp_stop((struct netif *)netif->user_data);
}
return ERR_OK;
}
#endif /* RT_LWIP_DHCP */
学长啊啊啊 发表于 2020-5-18 10:09
牛逼啊老哥, 亲测有效!
梅兰里 发表于 2020-5-21 18:30
我当时也发现了这个问题,他这里只改了网卡标志,并没有真正对DHCP操作,我用的netdev,在netdev_register ...
static void netdev_set_dhcp(char* netdev_name, rt_bool_t is_enabled)
{
struct netdev *netdev = RT_NULL;
netdev = netdev_get_by_name(netdev_name);
if (netdev == RT_NULL)
{
rt_kprintf("bad network interface device name(%s).\n", netdev_name);
return;
}
netdev_dhcp_enabled(netdev, is_enabled);
if(is_enabled == RT_TRUE)
{
dhcp_start((struct netif *)netdev->user_data);
}
else
{
dhcp_stop((struct netif *)netdev->user_data);
}
}
// 修改ifconfig 增加dhcp 开关
int netdev_ifconfig(int argc, char **argv)
{
char * str[16];
static char dhcp=1;
if (argc == 1)
{
netdev_list_if();
}
else if (argc == 3)
{
if(rt_strstr((const char *)argv[2],(const char *)"dhcpEN") != NULL)
{
netdev_set_dhcp(argv[1],RT_TRUE);
}
else if(rt_strstr((const char *)argv[2],(const char *)"dhcpDIS") != NULL){
netdev_set_dhcp(argv[1],RT_FALSE);
}
else {
rt_kprintf("bad parameter! e.g: ifconfig e0 dhcpEN or fconfig e0 dhcpDIS \n");
}
}
else if (argc == 5)
{
rt_kprintf("config : %s\n", argv[1]);
rt_kprintf("IP addr: %s\n", argv[2]);
rt_kprintf("Gateway: %s\n", argv[3]);
rt_kprintf("netmask: %s\n", argv[4]);
netdev_set_if(argv[1], argv[2], argv[3], argv[4]);
}
else
{
rt_kprintf("bad parameter! e.g: ifconfig e0 192.168.1.30 192.168.1.1 255.255.255.0\n");
}
return 0;
}