最近在用FPGA做网络实验,试验lwip在raw模式下的性能,
s3e 500的板子,mb核+xilkernel4.0+lwip130,已经调通,ping功能,tcp和udp收发数据正常,
ping开发板的平均延时在4ms左右(偶尔会超时)……跑上系统基本没任何实用价值了。
在raw模式下,官方文档只给了一个lwip协议栈初始化和添加网络接口的代码框架,无法ping通,
关于TCP/UDP的连接部分也只有一个框架,介绍了一些基本的底层接口函数,
网上的一些文档找了一下,基本就是翻译的官方文档,
广州志远的那篇内部文档我也看了,原码也研究了一下,很简单的实验,但是在板子上还是没有跑成功。
我的程序很简单,测试有没有收到UDP包,收到一个输出一次。
我用wireshark分析了一下数据包,主机首先发送ARP包的时候,开发板根本就没响应,
主机没有收到ARP应答包,然后UDP包就不发了,所以也就接受不到UDP包了,
是不是也要注册ARP包的相关处理函数。
这个问题困扰了我好多天了,也找不到一个可用的实例,那个好心人帮帮我啊……
下面就是代码,需要关注的部分我会说明,求高人指点,到底哪里出了问题。
#include <stdio.h>
#include "xparameters.h"
#include "xemaclite.h"
#include "lwip\init.h"
#include "lwip\mem.h"
#include "lwip\memp.h"
#include "lwip\ip_addr.h"
#include "lwip\netif.h"
#include "netif\xadapter.h"
#include "lwip\udp.h"
//建立UDP连接
void udp_test_init();
//接收到UDP包的回调函数
void UDP_receive(void *arg, struct udp_pcb *upcb, struct pbuf *p, struct ip_addr *addr, u16_t port);
int main(void)
{
struct netif *server_netif;
u8_t ip[] = {192,168,1,169};
u8_t mac_ethernet_address[] = {0x0, 0x0a, 0x35, 0x0, 0x2};
struct ip_addr ipaddr, netmask, gateway;
//lwip init
lwip_init();//lwip协议栈初始化
xil_printf("Lwip init success!\r\n");
server_netif = mem_malloc(sizeof(struct netif));
if(server_netif == NULL) {
xil_printf("malloc error1\r\n");
}
//initialize ip address
IP4_ADDR(&ipaddr,192,168,1,ip[3]);
IP4_ADDR(&netmask, 255,255,255,0);
IP4_ADDR(&gateway, 192,168,1,1);
//add network interface to netif_list,and set it default
//添加网络接口
if(!xemac_add(server_netif, &ipaddr, &netmask, &gateway, mac_ethernet_address,
XPAR_EMACLITE_0_BASEADDR)) {
xil_printf("Error adding N/W interface1\r\n");
return (-1);
}
xil_printf("Add interface success!\r\n");
//set default and set up
netif_set_default(server_netif);
//enable platform interrupts
//microblaze_enable_interrupts();
//interface set up
netif_set_up(server_netif);
xil_printf("interface is set up!\r\n");
//以上都是xilinx官方文档提供的初始化代码,无需关注
//start application
udp_test_init();
//
//receive and process packets
//此循环结构用于轮询网络接口,是否有数据到达,官方文档提供
while(1) {
//receive packets
xil_printf("Start to receive packets!\r\n");
xemacif_input(server_netif);//
//transfer data
}
}
void udp_test_init()
{
//struct ip_addr ipaddr;
struct udp_pcb *udp_1;
udp_1 = udp_new();//建立UDP连接
udp_bind(udp_1, IP_ADDR_ANY, 5000);//绑定端口
udp_recv(udp_1, UDP_receive, NULL);//注册接收数据的回调函数
}
void UDP_receive(void *arg, struct udp_pcb *upcb, struct pbuf *p, struct ip_addr *addr, u16_t port)
{
//struct ip_addr destaddr = *addr;
//struct pbuf *p1;
//p = pbuf_alloc(PBUF_RAW, 1080, PBUF_RAM);
if(p != NULL) {
xil_printf("data received!!!!\r\n");
pbuf_free(p);
}
}
[
本帖最后由 pocker5200 于 2011-10-31 16:50 编辑 ]