前言
忘記在哪個論壇問題里回答過這個了,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 地址字符串是否符合格式問題。
-
子網掩碼
+關注
關注
2文章
41瀏覽量
11057 -
DHCP
+關注
關注
0文章
105瀏覽量
19790 -
LwIP協議
+關注
關注
0文章
11瀏覽量
8955 -
RT-Thread
+關注
關注
31文章
1305瀏覽量
40386
發布評論請先 登錄
相關推薦
RT-Thread NUC97x 移植 LVGL
RT-Thread編程指南
RT-Thread用戶手冊
【RT-thread】如何將RT-thread系統移植到stm32
![【<b class='flag-5'>RT-thread</b>】如何將<b class='flag-5'>RT-thread</b><b class='flag-5'>系統</b>移植到stm32](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
RT-Thread STM32 配置系統時鐘(使用外部晶振)
![<b class='flag-5'>RT-Thread</b> STM32 <b class='flag-5'>配置</b><b class='flag-5'>系統</b>時鐘(使用外部晶振)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
RT-Thread Studio驅動SD卡
![<b class='flag-5'>RT-Thread</b> Studio驅動SD卡](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
【RT-Thread開源作品秀】基于RT-Thread的星務平臺研究
![【<b class='flag-5'>RT-Thread</b>開源作品秀】基于<b class='flag-5'>RT-Thread</b>的星務平臺研究](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
RT-Thread全球技術大會:RT-Thread構建配置系統
![<b class='flag-5'>RT-Thread</b>全球技術大會:<b class='flag-5'>RT-Thread</b>構建<b class='flag-5'>配置</b><b class='flag-5'>系統</b>](https://file.elecfans.com/web2/M00/46/17/pYYBAGKQcLOATXWJAAJGiRQpbMA744.png)
RT-Thread全球技術大會:RT-Thread上的單元測試框架與運行測試用例
![<b class='flag-5'>RT-Thread</b>全球技術大會:<b class='flag-5'>RT-Thread</b>上的單元測試框架與<b class='flag-5'>運行</b>測試用例](https://file.elecfans.com/web2/M00/46/20/pYYBAGKQiKqAbP-1AAbvdJ36ehM486.png)
RT-Thread學習筆記 RT-Thread的架構概述
![<b class='flag-5'>RT-Thread</b>學習筆記 <b class='flag-5'>RT-Thread</b>的架構概述](https://file.elecfans.com/web2/M00/52/31/pYYBAGLKk5WAA__jAADjdAdXhIs410.jpg)
RT-Thread文檔_RT-Thread 潘多拉 STM32L475 上手指南
![<b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> 潘多拉 STM32L475 上手指南](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論