网友:冰火枫林
问:
ethernetif_input()函数我是作为了一个任务建立的,ethernetif_input()通过查询来看太网是否有新数据我也明白。low_level_input()的作用应该是读取缓冲区得到数据吧,但是我不明白的是
static struct pbuf * low_level_input(struct netif *netif)
{
struct ethernetif *ethernetif;
struct pbuf *p = NULL, *q;
u32_t len;
int flag;
unsigned int i;
unsigned char buffer[4096];
unsigned char *des;
unsigned char *data;
data = buffer;
ethernetif = netif->state;
flag = board_eth_rcv(data,&len);
if(flag == 1) {
//p = pbuf_alloc(PBUF_RAW, len, PBUF_POOL);
//Modify by Small.Box at 06.10.16
if(p == NULL) {
p = pbuf_alloc(PBUF_RAW, len, PBUF_POOL);
}
if (p != NULL) {
for(q = p; q != NULL; q = q->next) {
memcpy(q->payload,(unsigned char *)data, q->len);
data += q->len;
}
}
}
return p;
}
这个函数怎么就能实现这个功能呢?能结合low_level_input()程序讲讲low_level_input()这个函数如何实现读取缓冲区得到的数据的呢?也就是给这个low_level_input()做一下注释,其中希望详细讲一下board_eth_rcv(data,&len);是用来做什么的?我的理解是接收数据的核心,但是那两个参数data,&len我不明白data作为参数有什么用,&len做为参数是想返回帧长吧。 上次我提的问题想表达的也是这个问题。
答:low_level_input()这个函数主要完成的就是信息包接收的功能;
在这个函数里面完成信息的接收功能的是board_eth_rcv(data,len);
对于这个函数主要功能是读取以太网缓冲区的里面的数据,这个函数的原型是这样的
int board_eth_rcv(unsigned char *data, unsigned int *len)
*data 接收到的数据
*len 接收到的数据长度
board_eth_rcv这个函数就是以太网接收功能的驱动函数,在我的博客里面有这个函数的原函数就是基于RTL8019以太网的驱动程序。