0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

冬至子 来源:出出啊 作者:出出啊 2023-11-28 17:05 次阅读

前言

忘记在哪个论坛问题里回答过这个了,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

    文章

    36

    浏览量

    10938
  • DHCP
    +关注

    关注

    0

    文章

    101

    浏览量

    19281
  • LwIP协议
    +关注

    关注

    0

    文章

    11

    浏览量

    8853
  • RT-Thread
    +关注

    关注

    31

    文章

    1151

    浏览量

    38911
收藏 人收藏

    评论

    相关推荐

    如何对RT-Thread内核有基本的了解?

    RT-Thread 的时钟管理以时钟节拍为基础,时钟节拍是 RT-Thread 操作系统中最小的时钟单位。
    的头像 发表于 07-19 10:12 6793次阅读
     如何对<b class='flag-5'>RT-Thread</b>内核有基本的了解?

    RT-Thread记录(二、RT-Thread内核启动流程)

    在前面我们RT-Thread Studio工程基础之上讲一讲RT-Thread内核启动流程.
    的头像 发表于 06-20 00:30 4426次阅读
    <b class='flag-5'>RT-Thread</b>记录(二、<b class='flag-5'>RT-Thread</b>内核启动流程)

    RT-Thread NUC97x 移植 LVGL

    不涉及 rt-thread 驱动,但是它是 LVGL 和 rt-thread 的接口。LVGL 在 rt-thread运行的基石。
    发表于 07-08 09:37 1292次阅读

    RT-Thread编程指南

    RT-Thread编程指南——RT-Thread开发组(2015-03-31)。RT-Thread做为国内有较大影响力的开源实时操作系统,本文是RT
    发表于 11-26 16:06 0次下载

    RT-Thread开发,如何有效学习RT-Thread的五个步骤

    RT-Thread推出RT-Thread Inside战略开放RT-Thread开发平台授权合作,与硬件十万个为什么合作首次推出第一款RT-Inside的开发板——iBox物联网开发套
    的头像 发表于 09-25 09:55 3.4w次阅读
    <b class='flag-5'>RT-Thread</b>开发,如何有效学习<b class='flag-5'>RT-Thread</b>的五个步骤

    RT-Thread软件包定义和使用

    RT-Thread软件包是运行RT-Thread物联网操作系统平台上,面向不同应用领域的通用软件组件 。RT-Thread 同时提供了开放
    的头像 发表于 05-21 11:29 9675次阅读
    <b class='flag-5'>RT-Thread</b>软件包定义和使用

    RT-thread】如何将RT-thread系统移植到stm32

    设备,RT-Thread 又能使用在线的软件包管理工具,配合系统配置工具实现直观快速的模块化裁剪,无缝地
    发表于 12-08 11:06 20次下载
    【<b class='flag-5'>RT-thread</b>】如何将<b class='flag-5'>RT-thread</b><b class='flag-5'>系统</b>移植到stm32

    RT-Thread STM32 配置系统时钟(使用外部晶振)

    RT-Thread STM32 配置系统时钟开发环境芯片:STM32F103RCT6RT-Thread Studio: V1.0.6(现在已经更新到1.1.3,由于本人使用RTT开发已
    发表于 12-14 18:45 14次下载
    <b class='flag-5'>RT-Thread</b> STM32 <b class='flag-5'>配置</b><b class='flag-5'>系统</b>时钟(使用外部晶振)

    RT-Thread开源作品秀】基于RT-Thread的星务平台研究

    本作品为了验证星务软件在RT-Thread系统运行的可行性,底层是否能够驱动星务软件,同时扩展RT-Thread应用范围。ART-Pi作为卫星下位机,...
    发表于 01-25 18:26 5次下载
    【<b class='flag-5'>RT-Thread</b>开源作品秀】基于<b class='flag-5'>RT-Thread</b>的星务平台研究

    RT-Thread全球技术大会:RT-Thread构建配置系统

    RT-Thread全球技术大会:RT-Thread构建配置系统,构建系统也称为组件自动化,通常需要通过脚本声明构建行为。         审
    的头像 发表于 05-27 14:39 1010次阅读
    <b class='flag-5'>RT-Thread</b>全球技术大会:<b class='flag-5'>RT-Thread</b>构建<b class='flag-5'>配置</b><b class='flag-5'>系统</b>

    RT-Thread全球技术大会:RT-Thread上的单元测试框架与运行测试用例

    RT-Thread全球技术大会:RT-Thread上的单元测试框架与运行测试用例                 审核编辑:彭静
    的头像 发表于 05-27 16:21 1267次阅读
    <b class='flag-5'>RT-Thread</b>全球技术大会:<b class='flag-5'>RT-Thread</b>上的单元测试框架与<b class='flag-5'>运行</b>测试用例

    RT-Thread学习笔记 RT-Thread的架构概述

    的种种优越之处。RT-Thread 是一款完全由国内团队开发维护的嵌入式实时操作系统(RTOS),具有完全的自主知识产权。经过 16 个年头的沉淀,伴随着物联网的兴起,它正演变成一个功能强大、组件丰富
    的头像 发表于 07-09 11:27 4005次阅读
    <b class='flag-5'>RT-Thread</b>学习笔记 <b class='flag-5'>RT-Thread</b>的架构概述

    RT-Thread文档_RT-Thread 简介

    RT-Thread文档_RT-Thread 简介
    发表于 02-22 18:22 5次下载
    <b class='flag-5'>RT-Thread</b>文档_<b class='flag-5'>RT-Thread</b> 简介

    RT-Thread文档_RT-Thread SMP 介绍与移植

    RT-Thread文档_RT-Thread SMP 介绍与移植
    发表于 02-22 18:31 7次下载
    <b class='flag-5'>RT-Thread</b>文档_<b class='flag-5'>RT-Thread</b> SMP 介绍与移植

    rt-thread源码分析之socket抽象层和网卡注册

    如图所示,rt-thread的网络分为应用层、sal_socket、netdev、协议簇(at、lwip、wiznet)、网卡驱动五层。
    的头像 发表于 11-13 12:43 405次阅读