news 2026/5/21 14:37:06

zynqmp+lwip学习2:dhcp static切换和热插拔检测

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
zynqmp+lwip学习2:dhcp static切换和热插拔检测

思路

  • 参考文章修改bsp,重新新建工程,确保宏定义生效
  • 只有callback的宏定义生效,回调函数才能有用
  • link down释放所有资源,link up先检测dhcp,如果超时在用静态ip

实现

/* * Xilinx/Vitis lwIP RAW API netif event callback demo. * * BSP requirements: * - standalone OS * - lwip211 RAW_API mode * - lwipopts.h enables: * #define LWIP_NETIF_STATUS_CALLBACK 1 * #define LWIP_NETIF_LINK_CALLBACK 1 * * This demo prints netif up/down, link up/down, and IPv4 address changes over * the UART through xil_printf(). */#include"platform.h"#include"platform_config.h"#include"xil_printf.h"#include"xparameters.h"#include"lwip/init.h"#include"lwip/dhcp.h"#include"lwip/ip4_addr.h"#include"lwip/netif.h"#include"lwip/tcp.h"#include"netif/xadapter.h"#if!defined(LWIP_NETIF_STATUS_CALLBACK)||(LWIP_NETIF_STATUS_CALLBACK!=1)#error"Enable LWIP_NETIF_STATUS_CALLBACK in lwipopts.h"#endif#if!defined(LWIP_NETIF_LINK_CALLBACK)||(LWIP_NETIF_LINK_CALLBACK!=1)#error"Enable LWIP_NETIF_LINK_CALLBACK in lwipopts.h"#endif#if!defined(LWIP_DHCP)||(LWIP_DHCP!=1)#error"Enable LWIP_DHCP in lwipopts.h"#endif#ifndefPLATFORM_EMAC_BASEADDR#error"PLATFORM_EMAC_BASEADDR is not defined. Check platform_config.h."#endif#defineDHCP_TIMEOUT_SLOW_TICKS20U#defineDHCP_COARSE_TIMER_SLOW_TICKS120UexternvolatileintTcpFastTmrFlag;externvolatileintTcpSlowTmrFlag;externvoidtcp_fasttmr(void);externvoidtcp_slowtmr(void);structnetifserver_netif;structnetif_event_state{ip4_addr_told_ip;ip4_addr_told_netmask;ip4_addr_told_gw;u8_told_is_up;u8_told_link_up;};enumip_addr_source{IP_ADDR_SOURCE_UNKNOWN=0,IP_ADDR_SOURCE_DHCP,IP_ADDR_SOURCE_STATIC};staticstructnetif_event_statenetif_state;staticunsignedintdhcp_coarse_timer_tick;staticenumip_addr_sourcecurrent_ip_addr_source=IP_ADDR_SOURCE_UNKNOWN;staticvolatileintlink_down_release_requested;staticvolatileintlink_up_address_probe_requested;staticconstchar*ip_addr_source_name(void){switch(current_ip_addr_source){caseIP_ADDR_SOURCE_DHCP:return"dhcp";caseIP_ADDR_SOURCE_STATIC:return"static";default:return"unknown";}}staticvoidprint_ip4_addr(constchar*name,constip4_addr_t*addr){xil_printf("%s%d.%d.%d.%d",name,ip4_addr1(addr),ip4_addr2(addr),ip4_addr3(addr),ip4_addr4(addr));}staticvoidprint_netif_addr(structnetif*netif){print_ip4_addr(" ip=",netif_ip4_addr(netif));print_ip4_addr(" mask=",netif_ip4_netmask(netif));print_ip4_addr(" gw=",netif_ip4_gw(netif));xil_printf("\r\n");}staticintip4_changed(constip4_addr_t*old_addr,constip4_addr_t*new_addr){return!ip4_addr_cmp(old_addr,new_addr);}staticvoidsave_netif_state(structnetif*netif){ip4_addr_copy(netif_state.old_ip,*netif_ip4_addr(netif));ip4_addr_copy(netif_state.old_netmask,*netif_ip4_netmask(netif));ip4_addr_copy(netif_state.old_gw,*netif_ip4_gw(netif));netif_state.old_is_up=netif_is_up(netif)?1U:0U;netif_state.old_link_up=netif_is_link_up(netif)?1U:0U;}staticvoidnetif_status_callback(structnetif*netif){u8_tis_up=netif_is_up(netif)?1U:0U;intip_changed=ip4_changed(&netif_state.old_ip,netif_ip4_addr(netif));intmask_changed=ip4_changed(&netif_state.old_netmask,netif_ip4_netmask(netif));intgw_changed=ip4_changed(&netif_state.old_gw,netif_ip4_gw(netif));if(is_up!=netif_state.old_is_up){xil_printf("[lwIP] netif %c%c status: %s\r\n",netif->name[0],netif->name[1],is_up?"UP":"DOWN");}if(ip_changed||mask_changed||gw_changed){xil_printf("[lwIP] netif %c%c IPv4 changed:",netif->name[0],netif->name[1]);print_netif_addr(netif);}save_netif_state(netif);}staticvoidnetif_link_callback(structnetif*netif){u8_tlink_up=netif_is_link_up(netif)?1U:0U;if(link_up!=netif_state.old_link_up){xil_printf("[lwIP] netif %c%c link: %s\r\n",netif->name[0],netif->name[1],link_up?"UP":"DOWN");if(link_up){xil_printf("[lwIP] netif %c%c current IPv4 (%s):",netif->name[0],netif->name[1],ip_addr_source_name());print_netif_addr(netif);link_up_address_probe_requested=1;}else{link_down_release_requested=1;}}netif_state.old_link_up=link_up;}staticvoidregister_netif_callbacks(structnetif*netif){save_netif_state(netif);netif_set_status_callback(netif,netif_status_callback);netif_set_link_callback(netif,netif_link_callback);xil_printf("[lwIP] netif %c%c callbacks registered:",netif->name[0],netif->name[1]);print_netif_addr(netif);}staticintservice_lwip(void){intslow_tick=0;if(TcpFastTmrFlag){tcp_fasttmr();TcpFastTmrFlag=0;}if(TcpSlowTmrFlag){tcp_slowtmr();dhcp_fine_tmr();dhcp_coarse_timer_tick++;if(dhcp_coarse_timer_tick>=DHCP_COARSE_TIMER_SLOW_TICKS){dhcp_coarse_timer_tick=0;dhcp_coarse_tmr();}TcpSlowTmrFlag=0;slow_tick=1;}xemacif_input(&server_netif);returnslow_tick;}staticintnetif_has_ipv4_addr(structnetif*netif){returnip4_addr_get_u32(netif_ip4_addr(netif))!=0U;}staticvoidclear_netif_addr_for_dhcp(structnetif*netif){ip4_addr_tzero;IP4_ADDR(&zero,0,0,0,0);current_ip_addr_source=IP_ADDR_SOURCE_UNKNOWN;netif_set_addr(netif,&zero,&zero,&zero);}staticvoidrelease_netif_address(structnetif*netif){xil_printf("[lwIP] link down, release DHCP/address resources\r\n");dhcp_stop(netif);clear_netif_addr_for_dhcp(netif);dhcp_coarse_timer_tick=0;}staticintwait_for_dhcp_or_timeout(structnetif*netif){unsignedinttimeout_ticks=0;xil_printf("[lwIP] DHCP start\r\n");clear_netif_addr_for_dhcp(netif);dhcp_start(netif);while(timeout_ticks<DHCP_TIMEOUT_SLOW_TICKS){if(service_lwip()){timeout_ticks++;}if(!netif_is_link_up(netif)){xil_printf("[lwIP] DHCP stopped: link down\r\n");dhcp_stop(netif);return0;}if(netif_has_ipv4_addr(netif)){current_ip_addr_source=IP_ADDR_SOURCE_DHCP;xil_printf("[lwIP] DHCP acquired:");print_netif_addr(netif);return1;}}xil_printf("[lwIP] DHCP timeout after 10 seconds\r\n");dhcp_stop(netif);return0;}staticvoiduse_static_fallback_addr(structnetif*netif){ip4_addr_tipaddr;ip4_addr_tnetmask;ip4_addr_tgw;IP4_ADDR(&ipaddr,192,168,1,10);IP4_ADDR(&netmask,255,255,255,0);IP4_ADDR(&gw,192,168,1,1);current_ip_addr_source=IP_ADDR_SOURCE_STATIC;netif_set_addr(netif,&ipaddr,&netmask,&gw);xil_printf("[lwIP] static fallback address:");print_netif_addr(netif);}intmain(void){ip4_addr_tipaddr;ip4_addr_tnetmask;ip4_addr_tgw;unsignedcharmac_ethernet_address[]={0x00,0x0A,0x35,0x00,0x01,0x02};init_platform();xil_printf("\r\n");xil_printf("lwIP RAW API netif event callback demo\r\n");lwip_init();IP4_ADDR(&ipaddr,0,0,0,0);IP4_ADDR(&netmask,0,0,0,0);IP4_ADDR(&gw,0,0,0,0);if(!xemac_add(&server_netif,&ipaddr,&netmask,&gw,mac_ethernet_address,PLATFORM_EMAC_BASEADDR)){xil_printf("ERROR: failed to add network interface\r\n");cleanup_platform();return-1;}netif_set_default(&server_netif);register_netif_callbacks(&server_netif);platform_enable_interrupts();netif_set_up(&server_netif);xil_printf("[lwIP] netif set up requested\r\n");if(netif_is_link_up(&server_netif)){link_up_address_probe_requested=1;}xil_printf("[lwIP] waiting for netif status/link/address events...\r\n");while(1){if(link_down_release_requested){link_down_release_requested=0;release_netif_address(&server_netif);}if(link_up_address_probe_requested){link_up_address_probe_requested=0;if(!wait_for_dhcp_or_timeout(&server_netif)){if(netif_is_link_up(&server_netif)){use_static_fallback_addr(&server_netif);}}}service_lwip();}cleanup_platform();return0;}
  • platform_zynqmp.c里面也要修改,timer_callback函数
/* For detecting Ethernet phy link status periodically */if(DetectEthLinkStatus==ETH_LINK_DETECT_INTERVAL){externstructnetifserver_netif;eth_link_detect(&server_netif);DetectEthLinkStatus=0;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/21 14:33:55

Windows 环境 OpenClaw 2.7.5 一键安装避坑指南

OpenClaw 一键安装包&#xff5c;可视化部署&#xff0c;简化环境配置流程✨适配系统&#xff1a;Windows10/11 64 位当前版本&#xff1a;v2.7.5&#xff08;虾壳云版&#xff09;✨核心优势&#xff1a;全程可视化操作&#xff0c;不用命令行、不用手动配置 Python/Node.js&a…

作者头像 李华
网站建设 2026/5/21 14:32:42

Obsidian Local REST API终极指南:如何快速自动化你的笔记工作流

Obsidian Local REST API终极指南&#xff1a;如何快速自动化你的笔记工作流 【免费下载链接】obsidian-local-rest-api A secure REST API and Model Context Protocol (MCP) server for your vault. 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-local-rest-api …

作者头像 李华
网站建设 2026/5/21 14:31:42

ElevenLabs挪威文语音生成质量断崖式下滑真相:我们逆向分析了112个API响应包,发现隐藏在X-Voice-Profile头里的方言权重泄露漏洞

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;ElevenLabs挪威文语音生成质量断崖式下滑真相概览 近期&#xff0c;大量挪威语内容创作者与本地化团队反馈&#xff0c;ElevenLabs平台针对挪威语&#xff08;Bokml&#xff09;的语音合成输出出现显著退化&a…

作者头像 李华
网站建设 2026/5/21 14:30:18

Academic Research Skills:面向 Claude Code 的学术研究全流程智能协作工具

前言&#xff1a;项目简介 在科研写作过程中&#xff0c;研究者通常需要完成选题构思、文献调研、论文撰写、同行评审、修改润色、引用检查、格式转换和最终归档等一系列工作。传统方式下&#xff0c;这些任务高度依赖人工经验&#xff0c;不仅流程繁琐&#xff0c;而且容易出…

作者头像 李华
网站建设 2026/5/21 14:29:50

新手入门指南,五分钟完成Taotoken账号注册与第一个API调用

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 新手入门指南&#xff0c;五分钟完成Taotoken账号注册与第一个API调用 对于初次接触大模型API的开发者来说&#xff0c;如何快速上…

作者头像 李华