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

    文章

    41

    浏览量

    11301
  • DHCP
    +关注

    关注

    0

    文章

    107

    浏览量

    20695
  • LwIP协议
    +关注

    关注

    0

    文章

    11

    浏览量

    9262
  • RT-Thread
    +关注

    关注

    32

    文章

    1540

    浏览量

    44275
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    RT-Thread NUC97x 移植 LVGL

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

    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实时操作系统环境下如何进行编 程。
    发表于 11-26 16:16 0次下载

    RT-Thread软件包定义和使用

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

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

    设备,RT-Thread 又能使用在线的软件包管理工具,配合系统配置工具实现直观快速的模块化裁剪,无缝地
    发表于 12-08 11:06 21次下载
    【<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 15次下载
    <b class='flag-5'>RT-Thread</b> STM32 <b class='flag-5'>配置</b><b class='flag-5'>系统</b>时钟(使用外部晶振)

    RT-Thread Studio驱动SD卡

    RT-Thread Studio驱动SD卡前言一、创建基本工程1、创建Bootloader2、创建项目工程二、配置RT-Thread Settings三、代码分析1.引入库2.读入数据四、效果验证
    发表于 12-27 19:13 20次下载
    <b class='flag-5'>RT-Thread</b> Studio驱动SD卡

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

    本作品为了验证星务软件在RT-Thread系统运行的可行性,底层是否能够驱动星务软件,同时扩展RT-Thread应用范围。ART-Pi作为卫星下位机,...
    发表于 01-25 18:26 6次下载
    【<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 1730次阅读
    <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 2085次阅读
    <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 5515次阅读
    <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 潘多拉 STM32L475 上手指南

    RT-Thread文档_RT-Thread 潘多拉 STM32L475 上手指南
    发表于 02-22 18:23 10次下载
    <b class='flag-5'>RT-Thread</b>文档_<b class='flag-5'>RT-Thread</b> 潘多拉 STM32L475 上手指南

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

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

    基于RT-Thread Studio学习

    前期准备:从官网下载 RT-Thread Studio,弄个账号登陆,开启rt-thread学习之旅。
    的头像 发表于 05-15 11:00 5952次阅读
    基于<b class='flag-5'>RT-Thread</b> Studio学习