lwip2.0.2
netbuf_new——分配netbuf结构体的内存。
netbuf_alloc,分配netbuf中pbuf内存(pbuf_alloc中PBUF_RAM类型,包括pbuf结构体和payload区),如果使用nefbuf_ref的话,则不需要此步
netbuf_ref,分配netbuf中pbuf内存(pbuf_alloc中PBUF_REF类型,包括pbuf结构体,无payload区)
netbuf_free,调用的是pbuf_free
netbuf_delete,删除nef_buf结构体
使用方法:
接收过程————
定义netbuf指针,netbuf结构体协议栈会分配(没找到在哪儿分配的?见后面分析),包括pbuf和netbuf结构体
接收函数会获取协议栈分配的netbuf指针——netconn_recv(conn, &buf);
获取数据和长度——netbuf_data(bufrx, (void *)&drcv, &dlen); !!!netbuf有可能有好几个,可能需要遍历。
释放netbuf结构体(同时释放netbuf结构体和pbuf内存)——netbuf_delete(bufrx);
发送过程————
——已有数据,datasend[100]
定义netbuf指针(能否直接定义netbuf变量?)——struct netbuf *buf;
申请netbuf结构体——buf = netbuf_new();
引用待发送的数据——netbuf_ref(buf, datasend, 20);
发送数据——netconn_sendto(conn, buf, &addrto, 2020);
接收过程的netbuf在哪儿分配的:
udp.c中的udp_input中最后会调用
pcb->recv(pcb->recv_arg, pcb, p, ip_current_src_addr(), src);
pcb的recv的是新建netconn时,pcb_new时挂接的,
挂接的是api_msg.c中的recv_udp函数,在这里完成mbox post
在该函数里分配netbuf,
会往netconn的接收邮箱中发送消息(对于netconn而言,只有接收邮箱,没有发送邮箱,发送是不需要邮箱的)
sys_mbox_trypost(&conn->recvmbox, buf)
在以下函数中完成
api_lib.c中的netconn_recv,对于udp最后会调用netconn_recv_data
最后会调用sys_arch_mbox_fetch(&conn->recvmbox, &buf, conn->recv_timeout),接收邮箱