7335|3

1

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

lwip无操作系统下的raw api应用问题 [复制链接]

最近在用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 编辑 ]

最新回复

楼主,你的LWIP整出来了吗,能给小弟交流交流吗,我的QQ244816711.希望赐教啊!!!!!!!!!!!!!!!!!!!!!!!  详情 回复 发表于 2015-10-20 19:43
点赞 关注

回复
举报

1

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
我也遇到了在raw模式下ping不通的问题,不知道楼主这个问题解决了没啊?
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
你没有回调过程中没有获取远程主机ip地址导致的。。
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

4
 
楼主,你的LWIP整出来了吗,能给小弟交流交流吗,我的QQ244816711.希望赐教啊!!!!!!!!!!!!!!!!!!!!!!!
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表