前言
忘記在哪個(gè)論壇問(wèn)題里回答過(guò)這個(gè)了,rtt 配置 DHCP 或者靜態(tài) ip 是靜態(tài)配置的。它只能在 menuconfig 或者 setting 的時(shí)候,或選擇 DHCP 編譯或選擇 靜態(tài) ip編譯,系統(tǒng)運(yùn)行起來(lái)以后如果想開(kāi)啟或關(guān)閉 DHCP 就做不到了。
相信每一個(gè)做產(chǎn)品的打工人的需求都是動(dòng)態(tài)配置的,需要在系統(tǒng)啟動(dòng)以后,運(yùn)行期開(kāi)啟或關(guān)閉 DHCP。
下面簡(jiǎn)單講講怎么做。
第一步,配置 lwip 開(kāi)啟 DHCP
這一步是一定要的,因?yàn)檫@一步是使能 lwip 的dhcp 功能,只有使能了之后,后面才有開(kāi)啟/關(guān)閉 DHCP 的意義。
第二步,定義網(wǎng)絡(luò)配置全局變量
首先,定義如下結(jié)構(gòu)體類型(示意代碼):
typedef struct __network_config{
rt_bool_t dhcp_enable;
char *lan_ip;
char *lan_nm;
char *lan_gw;
}NetworkConfig;
然后,定義一個(gè)全局變量 NetworkConfig network;。
第三步,修改 “ethernetif.c” 文件
這個(gè)文件修改的地方全部和 DHCP 相關(guān),所以,在這個(gè)文件里搜索 “LWIP_DHCP” 這個(gè)宏,+凡是使用 “LWIP_DHCP” 宏的地方都需要進(jìn)行修改+。
聲明 NetworkConfig network; 變量
或者 extern 或者 include 頭文件,首先把前邊定義的全局變量在當(dāng)前文件里聲明一下。
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
修改后,我們根據(jù)全局變量 network 中的配置來(lái)決定設(shè)置 DHCP 狀態(tài)。
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
修改后,根據(jù)全局變量 network 中的配置來(lái)決定是否打開(kāi) 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
修改后,根據(jù)全局變量 network 中的配置來(lái)選擇初始化網(wǎng)卡的 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
卸載網(wǎng)卡設(shè)備時(shí),需要根據(jù)當(dāng)前是否開(kāi)啟了 DHCP 來(lái)決定需不需要停止和清理 DHCP。
第四步,應(yīng)用程序接口
應(yīng)用程序里,無(wú)論使用哪種解數(shù),千方百計(jì)修改前文定義的全局變量。之后就剩下打開(kāi)/關(guān)閉 DHCP、修改本地 ip 地址、修改子網(wǎng)掩碼、修改網(wǎng)關(guān) ip 等等常規(guī)操作。
通過(guò)如下代碼,在系統(tǒng)運(yùn)行期打開(kāi)或者關(guān)閉 DHCP:
struct netdev *netdev = RT_NULL;
netdev = netdev_get_by_name("e0");
netdev_dhcp_enabled(netdev, (network.dhcp_enable == RT_TRUE));
注:如果關(guān)閉 DHCP 之后,想修改 ip 地址為靜態(tài) ip 。需要另行設(shè)置。
注:如上代碼只是示意性代碼,并不保證實(shí)際使用中包含漏洞。
在系統(tǒng)運(yùn)行期修改 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);
注:如上代碼只是示意性代碼,并不保證實(shí)際使用中包含漏洞。
運(yùn)行期修改子網(wǎng)掩碼和網(wǎng)關(guān) ip 的過(guò)程同上,不同的是調(diào)用的函數(shù)不一樣。
總結(jié)
以上操作已經(jīng)在項(xiàng)目中得到驗(yàn)證,目前運(yùn)行良好。
請(qǐng)自行解決輸入的 ip 地址字符串是否符合格式問(wèn)題。
-
子網(wǎng)掩碼
+關(guān)注
關(guān)注
2文章
39瀏覽量
11009 -
DHCP
+關(guān)注
關(guān)注
0文章
103瀏覽量
19648 -
LwIP協(xié)議
+關(guān)注
關(guān)注
0文章
11瀏覽量
8897 -
RT-Thread
+關(guān)注
關(guān)注
31文章
1261瀏覽量
39840
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論