rt-thread系统运行期改变网卡配置

电子说

1.2w人已加入

描述

前言

忘记在哪个论坛问题里回答过这个了,rtt 配置 DHCP 或者静态 ip 是静态配置的。它只能在 menuconfig 或者 setting 的时候,或选择 DHCP 编译或选择 静态 ip编译,系统运行起来以后如果想开启或关闭 DHCP 就做不到了。

相信每一个做产品的打工人的需求都是动态配置的,需要在系统启动以后,运行期开启或关闭 DHCP。

下面简单讲讲怎么做。

第一步,配置 lwip 开启 DHCP

这一步是一定要的,因为这一步是使能 lwip 的dhcp 功能,只有使能了之后,后面才有开启/关闭 DHCP 的意义。

第二步,定义网络配置全局变量

首先,定义如下结构体类型(示意代码):

typedef struct __network_config{
rt_bool_t dhcp_enable;
char *lan_ip;
char *lan_nm;
char *lan_gw;
}NetworkConfig;

然后,定义一个全局变量 NetworkConfig network;。

第三步,修改 “ethernetif.c” 文件

这个文件修改的地方全部和 DHCP 相关,所以,在这个文件里搜索 “LWIP_DHCP” 这个宏,+凡是使用 “LWIP_DHCP” 宏的地方都需要进行修改+。

声明 NetworkConfig network; 变量

或者 extern 或者 include 头文件,首先把前边定义的全局变量在当前文件里声明一下。

netdev_flags_sync

修改前,

#if LWIP_DHCP
netdev_low_level_set_dhcp_status(netdev, RT_TRUE);
#else
netdev_low_level_set_dhcp_status(netdev, RT_FALSE);
#endif

修改后,

#if LWIP_DHCP
netdev_low_level_set_dhcp_status(netdev, network.dhcp_enable);
#else
netdev_low_level_set_dhcp_status(netdev, RT_FALSE);
#endif

修改后,我们根据全局变量 network 中的配置来决定设置 DHCP 状态。

eth_netif_device_init

修改前,

#if LWIP_DHCP
/* if this interface uses DHCP, start the DHCP client */
dhcp_start(ethif->netif);
#endif

修改后,

#if LWIP_DHCP
/* if this interface uses DHCP, start the DHCP client */
if (network.dhcp_enable == RT_TRUE) {
dhcp_start(ethif->netif);
}
#endif

修改后,根据全局变量 network 中的配置来决定是否打开 DHCP。

eth_device_init_with_flag

修改前,

#if !LWIP_DHCP
ipaddr.addr = inet_addr(RT_LWIP_IPADDR);
gw.addr = inet_addr(RT_LWIP_GWADDR);
netmask.addr = inet_addr(RT_LWIP_MSKADDR);
#else
IP4_ADDR(&ipaddr, 0, 0, 0, 0);
IP4_ADDR(&gw, 0, 0, 0, 0);
IP4_ADDR(&netmask, 0, 0, 0, 0);
#endif

修改后,

#if !LWIP_DHCP
ipaddr.addr = inet_addr(RT_LWIP_IPADDR);
gw.addr = inet_addr(RT_LWIP_GWADDR);
netmask.addr = inet_addr(RT_LWIP_MSKADDR);
#else
if (network.dhcp_enable != RT_TRUE) {
ipaddr.addr = inet_addr(network.lan_ip);
gw.addr = inet_addr(network.lan_gw);
netmask.addr = inet_addr(network.lan_nm);
} else {
IP4_ADDR(&ipaddr, 0, 0, 0, 0);
IP4_ADDR(&gw, 0, 0, 0, 0);
IP4_ADDR(&netmask, 0, 0, 0, 0);
}
#endif

修改后,根据全局变量 network 中的配置来选择初始化网卡的 ip 地址。

eth_device_deinit

修改前,

#if LWIP_DHCP
dhcp_stop(netif);
dhcp_cleanup(netif);
#endif

修改后,

#if LWIP_DHCP
if (network.dhcp_enable == RT_TRUE) {
dhcp_stop(netif);
dhcp_cleanup(netif);
}
#endif

卸载网卡设备时,需要根据当前是否开启了 DHCP 来决定需不需要停止和清理 DHCP。

第四步,应用程序接口

应用程序里,无论使用哪种解数,千方百计修改前文定义的全局变量。之后就剩下打开/关闭 DHCP、修改本地 ip 地址、修改子网掩码、修改网关 ip 等等常规操作。

通过如下代码,在系统运行期打开或者关闭 DHCP:

struct netdev *netdev = RT_NULL;
netdev = netdev_get_by_name("e0");
netdev_dhcp_enabled(netdev, (network.dhcp_enable == RT_TRUE));

注:如果关闭 DHCP 之后,想修改 ip 地址为静态 ip 。需要另行设置。
注:如上代码只是示意性代码,并不保证实际使用中包含漏洞。

在系统运行期修改 ip 地址的主要代码如下:

struct netdev *netdev = RT_NULL;
ip_addr_t addr;
netdev = netdev_get_by_name("e0");
inet_aton(network.lan_ip, &addr);
netdev_set_ipaddr(netdev, &addr);

注:如上代码只是示意性代码,并不保证实际使用中包含漏洞。

运行期修改子网掩码和网关 ip 的过程同上,不同的是调用的函数不一样。

总结

以上操作已经在项目中得到验证,目前运行良好。

请自行解决输入的 ip 地址字符串是否符合格式问题。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分