netdev网卡接口DHCP功能不好使bug的解决

发布于 2020-05-08 19:15:38
最近测试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 */



查看更多

关注者
0
被浏览
761
7 个回答
学长啊啊啊
学长啊啊啊 2020-05-18
牛逼啊老哥, 亲测有效!
fhqmcu
fhqmcu 认证专家 2020-05-19
学长啊啊啊 发表于 2020-5-18 10:09
牛逼啊老哥, 亲测有效!


哈哈,最近正在测试lwip 2.0.2 + rtthread 3.1.3系统,发现一些问题,都发帖告诉大家了,可以搜索我写的帖子的,查看验证一下。
fhqmcu
fhqmcu 认证专家 2020-05-21
已经提交pr:
梅兰里
梅兰里 2020-05-21
我当时也发现了这个问题,他这里只改了网卡标志,并没有真正对DHCP操作,我用的netdev,在netdev_register中设置了netdev->status_callback状态改变回调函数,然后在回调函数中开关DHCP
59I()_K$@{[OW`A2BPA8N1W.png
Lee_Z
Lee_Z 2020-06-02
梅兰里 发表于 2020-5-21 18:30
我当时也发现了这个问题,他这里只改了网卡标志,并没有真正对DHCP操作,我用的netdev,在netdev_register ...


我看了您的回复,但是我还是很不懂的地方,您能有时间解答一下么?
lazyguoguo
lazyguoguo 2021-06-03
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;
}

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览