eric2013 发表于 2013-11-3 10:26:48

【转载】UIP中文文档第一 与设备驱动接口

转载地址:http://www.usr.cc/thread-51107-1-1.html
实现设备驱动与uIP的对接,需要开发者实现如下七个接口程序:
#define uip_input() 处理一个输入的数据包。
#define uip_periodic(conn) 通过连接号,对连接周期性进行处理。
#define uip_conn_active(conn)(uip_conns.tcpstateflags!=UIP_CLOSED)
#define uip_periodic_conn(conn)周期性处理一个连接,此操作要借助指向这个连接的结构体的指针。
#define uip_poll_conn(conn)请求轮询(poll)某一指定连接.
#define uip_udp_periodic(conn) 周期性处理udp连接,此操作要借助连接号。
#define uip_udp_periodic_conn(conn) 周期性处理一udp连接,要借助指向此连接结构体的指针。
还有一个变量在接口中用到:
u8_t uip_buf
uip包缓冲区。下面对以上接口进行详细介绍:
1. #define uip_input()
处理输入数据包。
此函数应该在设备从网络上接收到数据包时得到调用。设备驱动应该在调用此函数之前,将接收到的数据包内容存入uip_buf缓冲区,
并将其长度赋给uip_len变量。此函数返回时,如果系统有数据要输出,会直接将数据存入uip_buf,并将其长度值赋给uip_len。如果
没有数据要发送,则将uip_len赋0.通常使用此函数的方法如下:
uip_len = devicedriver_poll();
if(uip_len > 0) {
uip_input();
if(uip_len > 0) {
devicedriver_send();
}
}注意:
如果你写的uip设备驱动需要使用ARP协议(Address Resolution Protocal),比如说在以太网内使用uip的时候,你就得在调用此函数
之前先调用uip的ARP代码:
#define BUF ((struct uip_eth_hdr *)&uip_buf)
uip_len = ethernet_devicedrver_poll();
if(uip_len > 0) {
if(BUF->type == HTONS(UIP_ETHTYPE_IP)) {
uip_arp_ipin();
uip_input();
if(uip_len > 0) {
uip_arp_out();
ethernet_devicedriver_send();
}
} else if(BUF->type == HTONS(UIP_ETHTYPE_ARP)) {
uip_arp_arpin();
if(uip_len > 0) {
ethernet_devicedriver_send();
}
}2. #define uip_periodic(conn)
周期性处理一连接,需借助其连接号。
此函数对uip的tcp连接进行一些必要的周期性处理(定时器,轮询等),它应该在周期性uip定时器消息到来时被调用。它应该对每一个连接都
得到调用,不管连接是打开的还是关闭的。此函数返回时,可能会有要传送出去的数据包等待得到服务,包内容会被放到uip包缓冲区中。如
果真的有数据包需要送出,则uip_len的值会被置为一个大于零的数,此时设备驱动应该将数据包发送出去。(这一段与(1)中相应段落的意思
应该是一致的。)通常调用此函数时,会使用一个如下的for循环:
for(i = 0; i < UIP_CONNS; ++i) {
uip_periodic(i);
if(uip_len > 0) {
devicedriver_send();
}
}注意:
如果你所写的设备驱动需要使用ARP协议(Address Resolution Protocal),例如是在以太网中使用uip,你就得在调用驱动函数发送传出数据之间
调用uip_arp_out()函数:
for(i = 0; i < UIP_CONNS; ++i) {
uip_periodic(i);
if(uip_len > 0) {
uip_arp_out();
ethernet_devicedriver_send();
}
}参数:
conn将要轮询的连接号。
使用例程:
example-mainloop-with-arp.c, and example-mainloop-without-arp.c.
此接口函数定义于uip.h的301行。
3. #define uip_periodic_conn(conn)
对一个连接进行周期性处理,需要借助指向其结构体的指针
这个函数与uip_periodic执行的操作是相同的,不同之处仅在于传入的参数是一个指向uip_conn结构体的指针。此函数可以用于对某个连接强
制进行周期性处理。
参数:
conn 指向要进行处理的连接结构体的指针。
此接口函数定义于uip.h的323行。
4. #define uip_poll_conn(conn)
请求对特定连接进行轮询
函数功能与uip_periodic_conn()相同,但不是执行任何定时器处理。轮询以得到新数据。
参数:
conn 指向要进行处理的连接结构体uip_conn的指针。
此接口函数定义于uip.h的337行。
5. #define uip_udp_periodic(conn)
借助连接号,周期性处理udp连接。
此函数基本上与uip_periodic()相同,区别之处仅在于这里处理的是udp连接。其调用方式也与uip_periodic()类似:
for(i = 0; i < UIP_UDP_CONNS; i++) {
    uip_udp_periodic(i);
    if(uip_len > 0) {
      devicedriver_send();
    }
}注意:
对于uip_periodic()函数,在uip中使用arp和以太网时,要特别注意一些事情,这对于uip_udp_periodic()也一样:
for(i = 0; i < UIP_UDP_CONNS; i++) {
uip_udp_periodic(i);
if(uip_len > 0) {
uip_arp_out();
ethernet_devicedriver_send();
}
}参数:
conn 要处理的udp连接号
使用例程:
example-mainloop-with-arp.c, and
example-mainloop-without-arp.c.
此接口定义于uip.h的373行。
6. #define uip_udp_periodic_conn(conn)
周期性处理udp连接,需借助指向该连接结构体的指针。
函数功能与uip_udp_periodic(conn)相同,不同之处在于所用参数为指向连接结构体的指针而非连接号。此函数可
用于强制执行周期性处理某连接。
参数:
conn 指向要处理的udp连接的uip_udp_conn结构体的指针。
此接口定义于uip.h的
390 行。
7. 变量 u8_t uip_buf
uip数据包缓冲区
uip_buf数列用于盛放传入/传出的数据包。设备驱动应将传入的数据放于此缓冲区中。发送数据时,设备驱动从缓冲
区中读取链路层的头和TCP/IP头。链路层头的大小在UIP_LLH_LEN中定义。
注意:
应用数据无需放在这个缓冲区中,所以设备驱动需要从uip_appdata指针所指的地方读取数据。下面是一个例子:
void
devicedriver_send(void)
{
hwsend(&uip_buf, UIP_LLH_LEN);
if(uip_len <= UIP_LLH_LEN + UIP_TCPIP_HLEN) {
hwsend(&uip_buf, uip_len - UIP_LLH_LEN);
} else {
hwsend(&uip_buf, UIP_TCPIP_HLEN);
hwsend(uip_appdata, uip_len - UIP_TCPIP_HLEN - UIP_LLH_LEN);
}
}

tianqi911 发表于 2019-8-9 15:53:29

MARK。:victory:

xtaozi001 发表于 2022-7-26 10:49:34

Uip的介绍很少了,最近在纠结,把原先项目的uIP替换掉,还是继续从NXP的平台移植到stm32的平台,中间还绑定了一个别的系统,费劲!
页: [1]
查看完整版本: 【转载】UIP中文文档第一 与设备驱动接口