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

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

3天内不再提示

RT-Thread eth 模块(Lwip)修改为静态IP时,DNS设置问题

冬至子 来源:yuleying 作者:yuleying 2023-09-18 17:45 次阅读

tsIpAddrress staticIp={
.ip_address = "192.168.0.240",
.netmask = "255.255.0.0",
.gw_address = "192.168.1.1",
.dns_address[0] = "8.8.8.8",
.dns_address[1] = "114.114.114.114"};
void setStaticIp(const char *name, tsIpAddrress *ipaddr)
{
struct netdev netdev = RT_NULL;
ip_addr_t addr;
int ret;
netdev = netdev_get_by_name(name);
if (netdev == RT_NULL)
{
rt_kprintf("bad network interface device name(%s).n", name);
return;
}
netdev_dhcp_enabled(netdev,RT_FALSE);
/
set IP address /
if ((ipaddr->ip_address != NULL) && inet_aton(ipaddr->ip_address, &addr))
{
netdev_set_ipaddr(netdev, &addr);
}
/
set netmask address /
if ((ipaddr->netmask != NULL) && inet_aton(ipaddr->netmask, &addr))
{
netdev_set_netmask(netdev, &addr);
}
/
set gateway address /
if ((ipaddr->gw_address != NULL) && inet_aton(ipaddr->gw_address, &addr))
{
netdev_set_gw(netdev, &addr);
}
/
set dns 0 /
if ((ipaddr->dns_address[0] != NULL) && inet_aton(ipaddr->dns_address[0], &addr))
{
rt_kprintf("dns0 aton (%s).n", ipaddr->dns_address[0]);
ret = netdev_set_dns_server(netdev, 0, &addr);
if(ret != RT_EOK)
rt_kprintf("netdev_set_dns_server ERR %d!!!n",ret);
}
else
{
if(ipaddr->dns_address[0] != NULL)
rt_kprintf("dns0 aton err (%s).n", ipaddr->dns_address[0]);
inet_aton(ipaddr->gw_address, &addr); /
用网关地址替代DNS0 /
ret = netdev_set_dns_server(netdev, 0, &addr);
if(ret != RT_EOK)
rt_kprintf("netdev_set_dns_server ERR %d!!!n",ret);
}
/
set dns 1 /
if ((ipaddr->dns_address[1] != NULL) && inet_aton(ipaddr->dns_address[1], &addr))
{
rt_kprintf("dns1 aton (%s).n", ipaddr->dns_address[1]);
ret = netdev_set_dns_server(netdev, 1, &addr);
if(ret != RT_EOK)
rt_kprintf("netdev_set_dns_server ERR %d!!!n",ret);
}
else
{
if(ipaddr->dns_address[1] != NULL)
rt_kprintf("dns1 aton err (%s).n", ipaddr->dns_address[1]);
inet_aton("8.8.8.8", &addr); /
默认DNS1 */
ret = netdev_set_dns_server(netdev, 1, &addr);
if(ret != RT_EOK)
rt_kprintf("netdev_set_dns_server ERR %d!!!n",ret);
}
}
setStaticIp("e0",&staticIp);

以上代码为应用部分代码,设备是接入到正常网络中,网络中有DHCP服务器,可以正常获取到IP和DNS

获取的地址如下:

ip address: 192.168.0.64
gw address: 192.168.0.1
net mask : 255.255.0.0
dns server #0: 192.168.0.1
dns server #1: 8.8.8.8
手动设置为静态IP时,IP如下:

ip address: 192.168.0.240
gw address: 192.168.1.1
net mask : 255.255.0.0
dns server #0: 192.168.0.1
dns server #1: 114.114.114.114

可以很明显的发现 dns server #0:与设置的并不相同

修改代码

.dns_address[0] = "1.1.1.1",

发现能正确修改,故判断代码没有问题,问题肯定是网卡层或者协议栈有限制

发现代码问题如下:

代码位于”netdev下”

void netdev_low_level_set_dns_server(struct netdev *netdev, uint8_t dns_num, const ip_addr_t dns_server)
{
int index;
RT_ASSERT(dns_server);
if (netdev == RT_NULL)
{
return;
}
/
问题代码就在这里

设置DNS不能两个同时设置,需要分两次设置

由于测试环境是动态获取IP后设置为静态,之前DNS #1 是 新设置的 DNS #2
这里循环判断了历史的两个DNS是否与新的相同,只要其中一个相同就返回
此处这样写:我猜测有两个原因,1是防止两个DNS设置为一样了,2是相同DNS不重复设置
此问题可以说是一个BUG,希望官方能修正
/
/
check DNS servers is exist */
for (index = 0; index < NETDEV_DNS_SERVERS_NUM; index++)
{
if (ip_addr_cmp(&(netdev->dns_servers[index]), dns_server))
{
return;
}
}
if (dns_num < NETDEV_DNS_SERVERS_NUM)
{
ip_addr_copy(netdev->dns_servers[dns_num], dns_server);
/
execute DNS servers address change callback function */
if (netdev->addr_callback)
{
netdev->addr_callback(netdev, NETDEV_CB_ADDR_DNS_SERVER);
}
}
}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • DHCP服务器
    +关注

    关注

    0

    文章

    7

    浏览量

    7305
  • DNS
    DNS
    +关注

    关注

    0

    文章

    199

    浏览量

    19605
  • RT-Thread
    +关注

    关注

    31

    文章

    1150

    浏览量

    38909
收藏 人收藏

    评论

    相关推荐

    RT-Thread学习笔记】使用scons命令生成静态

    RT-Thread学习笔记】如何使用scons 命令中buildlib的生成静态库?
    的头像 发表于 07-27 09:13 4781次阅读
    【<b class='flag-5'>RT-Thread</b>学习笔记】使用scons命令生成<b class='flag-5'>静态</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 Studio添加以太网驱动和lwIP协议栈?

    用户快速开发自己的网络应用。 本文将基于正点原子 stm32f407-atk-explorer 开发板主要介绍如何使用 RT-Thread Studio 来添加以太网驱动和 lwIP 协议栈。 ETH
    发表于 03-29 06:29

    如何去处理RT-Thread/LwIP TCP发送速度偏低的情况呢

    RT-Thread使用LwIP做为TCP/IP协议栈,LwIP包含了非常多的选项,不同的选项进行不同功能的剪裁,部分选项RT-Thread
    发表于 08-10 11:48

    SC0085 AT32在RT-Thread上运行LwIP协议栈

    示例目的演示在RT-Thread上运行LwIP协议栈,并搭建一个UDP echo server支持型号列表:支持型号AT32F407xxAT32F437xx主要使用外设列表:主要使用外设
    发表于 08-23 20:40

    新手求助RT-ThreadLWIP NAT使用例子

    求助,那位大佬有RT-threadLWIP NAT使用例子或者配置流程,麻烦指导一下,目前做出了以下配置但是没有效果:ip4.c中的ip4_input()函数中
    发表于 10-08 14:39

    RT-Thread中Lan8720和lwip协议栈的使用

    。 修改工程使用外部晶振,可参考第一篇文章rt-thread studio新建stm32f407工程。查看野火工程的资料,可知芯片的使用引脚为:  PG11 : RMII_TX_EN;  PG13
    发表于 02-13 14:55

    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 Studio如何测试Ethernet连网

    RT-Thread 是一款开源实时操作系统,包括 RT-Thread 内核、FinSH 命令行工具、设备文件系统、TCP/IP 协议栈、RT-Thread/GUI、大量的 CPU 架构
    的头像 发表于 05-31 11:17 2333次阅读
    <b class='flag-5'>RT-Thread</b> Studio如何测试Ethernet连网

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

    RT-Thread 简介 作为一名 RTOS 的初学者,也许你对 RT-Thread 还比较陌生。然而,随着你的深入接触,你会逐渐发现 RT-Thread 的魅力和它相较于其他同类型 RTOS
    的头像 发表于 07-09 11:27 4004次阅读
    <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移植使用webserver (lwip+httpd)

    开发环境:野火的stm32f407,rt-thread studio版本是版本: 2.2.6,stm32f4的资源包为0.2.2,rt-thread版本为4.0.3。
    的头像 发表于 10-12 12:49 568次阅读
    <b class='flag-5'>RT-Thread</b>移植使用webserver (<b class='flag-5'>lwip</b>+httpd)

    RT-Thread在Lan8720a和 lwip基础上移植ntp流程

    开发环境:野火的stm32f407,rt-thread studio版本是版本: 2.2.6,stm32f4的资源包为0.2.2。以RT-Thread中Lan8720和lwip协议栈的使用文章创建的工程为基础。
    的头像 发表于 10-12 16:59 882次阅读
    <b class='flag-5'>RT-Thread</b>在Lan8720a和 <b class='flag-5'>lwip</b>基础上移植ntp流程

    centos7怎么设置静态IP

    在CentOS 7中,要设置静态IP,您可以遵循以下步骤: 查看网络接口 在终端中输入 ip addr 命令,找到您想要设置
    的头像 发表于 11-27 14:27 616次阅读