电子说
前言
忘记在哪个论坛问题里回答过这个了,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 地址字符串是否符合格式问题。
全部0条评论
快来发表一下你的评论吧 !