0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

RT-Thread eth 模塊(Lwip)修改為靜態(tài)IP時(shí),DNS設(shè)置問題

冬至子 ? 來源: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); /
用網(wǎng)關(guān)地址替代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); /
默認(rèn)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);

以上代碼為應(yīng)用部分代碼,設(shè)備是接入到正常網(wǎng)絡(luò)中,網(wǎng)絡(luò)中有DHCP服務(wù)器,可以正常獲取到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
手動(dòng)設(shè)置為靜態(tài)IP時(shí),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

可以很明顯的發(fā)現(xiàn) dns server #0:與設(shè)置的并不相同

修改代碼

.dns_address[0] = "1.1.1.1",

發(fā)現(xiàn)能正確修改,故判斷代碼沒有問題,問題肯定是網(wǎng)卡層或者協(xié)議棧有限制

發(fā)現(xiàn)代碼問題如下:

代碼位于”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;
}
/
問題代碼就在這里

設(shè)置DNS不能兩個(gè)同時(shí)設(shè)置,需要分兩次設(shè)置

由于測試環(huán)境是動(dòng)態(tài)獲取IP后設(shè)置為靜態(tài),之前DNS #1 是 新設(shè)置的 DNS #2
這里循環(huán)判斷了歷史的兩個(gè)DNS是否與新的相同,只要其中一個(gè)相同就返回
此處這樣寫:我猜測有兩個(gè)原因,1是防止兩個(gè)DNS設(shè)置為一樣了,2是相同DNS不重復(fù)設(shè)置
此問題可以說是一個(gè)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);
}
}
}

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • DHCP服務(wù)器
    +關(guān)注

    關(guān)注

    0

    文章

    8

    瀏覽量

    7364
  • DNS
    DNS
    +關(guān)注

    關(guān)注

    0

    文章

    214

    瀏覽量

    19751
  • RT-Thread
    +關(guān)注

    關(guān)注

    31

    文章

    1249

    瀏覽量

    39727
收藏 人收藏

    評論

    相關(guān)推薦

    RT-Thread學(xué)習(xí)筆記】使用scons命令生成靜態(tài)

    RT-Thread學(xué)習(xí)筆記】如何使用scons 命令中buildlib的生成靜態(tài)庫?
    的頭像 發(fā)表于 07-27 09:13 ?5718次閱讀
    【<b class='flag-5'>RT-Thread</b>學(xué)習(xí)筆記】使用scons命令生成<b class='flag-5'>靜態(tài)</b>庫

    如何使用RT-Thread Studio添加以太網(wǎng)驅(qū)動(dòng)和lwIP協(xié)議棧?

    用戶快速開發(fā)自己的網(wǎng)絡(luò)應(yīng)用。 本文將基于正點(diǎn)原子 stm32f407-atk-explorer 開發(fā)板主要介紹如何使用 RT-Thread Studio 來添加以太網(wǎng)驅(qū)動(dòng)和 lwIP 協(xié)議棧。 ETH
    發(fā)表于 03-29 06:29

    如何去處理RT-Thread/LwIP TCP發(fā)送速度偏低的情況呢

    RT-Thread使用LwIP做為TCP/IP協(xié)議棧,LwIP包含了非常多的選項(xiàng),不同的選項(xiàng)進(jìn)行不同功能的剪裁,部分選項(xiàng)RT-Thread
    發(fā)表于 08-10 11:48

    SC0085 AT32在RT-Thread上運(yùn)行LwIP協(xié)議棧

    示例目的演示在RT-Thread上運(yùn)行LwIP協(xié)議棧,并搭建一個(gè)UDP echo server支持型號(hào)列表:支持型號(hào)AT32F407xxAT32F437xx主要使用外設(shè)列表:主要使用外設(shè)
    發(fā)表于 08-23 20:40

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

    求助,那位大佬有RT-threadLWIP NAT使用例子或者配置流程,麻煩指導(dǎo)一下,目前做出了以下配置但是沒有效果:ip4.c中的ip4_input()函數(shù)中
    發(fā)表于 10-08 14:39

    RT-Thread中Lan8720和lwip協(xié)議棧的使用

    ?!?b class='flag-5'>修改工程使用外部晶振,可參考第一篇文章rt-thread studio新建stm32f407工程。查看野火工程的資料,可知芯片的使用引腳為:  PG11 : RMII_TX_EN;  PG13
    發(fā)表于 02-13 14:55

    RT-Thread編程指南

    RT-Thread編程指南——RT-Thread開發(fā)組(2015-03-31)。RT-Thread做為國內(nèi)有較大影響力的開源實(shí)時(shí)操作系統(tǒng),本文是RT-Thread實(shí)時(shí)操作系統(tǒng)的編程指南
    發(fā)表于 11-26 16:06 ?0次下載

    RT-Thread全球技術(shù)大會(huì):RT-Thread測試用例集合案例

    RT-Thread全球技術(shù)大會(huì):RT-Thread測試用例集合案例 ? ? ? ? ? 審核編輯:彭靜
    的頭像 發(fā)表于 05-27 16:34 ?2014次閱讀
    <b class='flag-5'>RT-Thread</b>全球技術(shù)大會(huì):<b class='flag-5'>RT-Thread</b>測試用例集合案例

    RT-Thread學(xué)習(xí)筆記 RT-Thread的架構(gòu)概述

    RT-Thread 簡介 作為一名 RTOS 的初學(xué)者,也許你對 RT-Thread 還比較陌生。然而,隨著你的深入接觸,你會(huì)逐漸發(fā)現(xiàn) RT-Thread 的魅力和它相較于其他同類型 RTOS
    的頭像 發(fā)表于 07-09 11:27 ?4388次閱讀
    <b class='flag-5'>RT-Thread</b>學(xué)習(xí)筆記 <b class='flag-5'>RT-Thread</b>的架構(gòu)概述

    RT-Thread文檔_RT-Thread 簡介

    RT-Thread文檔_RT-Thread 簡介
    發(fā)表于 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 上手指南
    發(fā)表于 02-22 18:23 ?9次下載
    <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 介紹與移植
    發(fā)表于 02-22 18:31 ?9次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> SMP 介紹與移植

    基于RT-Thread Studio學(xué)習(xí)

    前期準(zhǔn)備:從官網(wǎng)下載 RT-Thread Studio,弄個(gè)賬號(hào)登陸,開啟rt-thread學(xué)習(xí)之旅。
    的頭像 發(fā)表于 05-15 11:00 ?3658次閱讀
    基于<b class='flag-5'>RT-Thread</b> Studio學(xué)習(xí)

    RT-Thread移植使用webserver (lwip+httpd)

    開發(fā)環(huán)境:野火的stm32f407,rt-thread studio版本是版本: 2.2.6,stm32f4的資源包為0.2.2,rt-thread版本為4.0.3。
    的頭像 發(fā)表于 10-12 12:49 ?1176次閱讀
    <b class='flag-5'>RT-Thread</b>移植使用webserver (<b class='flag-5'>lwip</b>+httpd)

    RT-Thread在Lan8720a和 lwip基礎(chǔ)上移植ntp流程

    開發(fā)環(huán)境:野火的stm32f407,rt-thread studio版本是版本: 2.2.6,stm32f4的資源包為0.2.2。以RT-Thread中Lan8720和lwip協(xié)議棧的使用文章創(chuàng)建的工程為基礎(chǔ)。
    的頭像 發(fā)表于 10-12 16:59 ?1628次閱讀
    <b class='flag-5'>RT-Thread</b>在Lan8720a和 <b class='flag-5'>lwip</b>基礎(chǔ)上移植ntp流程