硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5792|回复: 2
收起左侧

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

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106622
QQ
发表于 2013-11-3 10:26:48 | 显示全部楼层 |阅读模式
转载地址:http://www.usr.cc/thread-51107-1-1.html
  1. 实现设备驱动与uIP的对接,需要开发者实现如下七个接口程序:
  2. #define uip_input() 处理一个输入的数据包。
  3. #define uip_periodic(conn) 通过连接号,对连接周期性进行处理。
  4. #define uip_conn_active(conn)  (uip_conns[conn].tcpstateflags!=UIP_CLOSED)  
  5. #define uip_periodic_conn(conn)  周期性处理一个连接,此操作要借助指向这个连接的结构体的指针。
  6. #define uip_poll_conn(conn)  请求轮询(poll)某一指定连接.
  7. #define uip_udp_periodic(conn) 周期性处理udp连接,此操作要借助连接号。
  8. #define uip_udp_periodic_conn(conn) 周期性处理一udp连接,要借助指向此连接结构体的指针。
  9. 还有一个变量在接口中用到:
  10. u8_t uip_buf [UIP_BUFSIZE+2]
  11. uip包缓冲区。
复制代码
下面对以上接口进行详细介绍:
1. #define uip_input()
处理输入数据包。
此函数应该在设备从网络上接收到数据包时得到调用。设备驱动应该在调用此函数之前,将接收到的数据包内容存入uip_buf缓冲区,
并将其长度赋给uip_len变量。此函数返回时,如果系统有数据要输出,会直接将数据存入uip_buf,并将其长度值赋给uip_len。如果
没有数据要发送,则将uip_len赋0.  通常使用此函数的方法如下:
  1. uip_len = devicedriver_poll();
  2. if(uip_len > 0) {
  3. uip_input();
  4. if(uip_len > 0) {
  5. devicedriver_send();
  6. }
  7. }
复制代码
注意:
如果你写的uip设备驱动需要使用ARP协议(Address Resolution Protocal),比如说在以太网内使用uip的时候,你就得在调用此函数

之前先调用uip的ARP代码:
  1. #define BUF ((struct uip_eth_hdr *)&uip_buf[0])
  2. uip_len = ethernet_devicedrver_poll();
  3. if(uip_len > 0) {
  4. if(BUF->type == HTONS(UIP_ETHTYPE_IP)) {
  5. uip_arp_ipin();
  6. uip_input();
  7. if(uip_len > 0) {
  8. uip_arp_out();
  9. ethernet_devicedriver_send();
  10. }
  11. } else if(BUF->type == HTONS(UIP_ETHTYPE_ARP)) {
  12. uip_arp_arpin();
  13. if(uip_len > 0) {
  14. ethernet_devicedriver_send();
  15. }
  16. }
复制代码
2. #define uip_periodic(conn)
周期性处理一连接,需借助其连接号。
此函数对uip的tcp连接进行一些必要的周期性处理(定时器,轮询等),它应该在周期性uip定时器消息到来时被调用。它应该对每一个连接都
得到调用,不管连接是打开的还是关闭的。此函数返回时,可能会有要传送出去的数据包等待得到服务,包内容会被放到uip包缓冲区中。如
果真的有数据包需要送出,则uip_len的值会被置为一个大于零的数,此时设备驱动应该将数据包发送出去。(这一段与(1)中相应段落的意思
应该是一致的。)通常调用此函数时,会使用一个如下的for循环:
  1. for(i = 0; i < UIP_CONNS; ++i) {
  2. uip_periodic(i);
  3. if(uip_len > 0) {
  4. devicedriver_send();
  5. }
  6. }
复制代码
注意:
如果你所写的设备驱动需要使用ARP协议(Address Resolution Protocal),例如是在以太网中使用uip,你就得在调用驱动函数发送传出数据之间
调用uip_arp_out()函数:
  1. for(i = 0; i < UIP_CONNS; ++i) {
  2. uip_periodic(i);
  3. if(uip_len > 0) {
  4. uip_arp_out();
  5. ethernet_devicedriver_send();
  6. }
  7. }
复制代码
参数:
conn  将要轮询的连接号。
使用例程:
example-mainloop-with-arp.c, and example-mainloop-without-arp.c.
此接口函数定义于uip.h301行
3. #define uip_periodic_conn(conn)
对一个连接进行周期性处理,需要借助指向其结构体的指针
这个函数与uip_periodic执行的操作是相同的,不同之处仅在于传入的参数是一个指向uip_conn结构体的指针。此函数可以用于对某个连接强
制进行周期性处理。
参数:
conn 指向要进行处理的连接结构体的指针。
此接口函数定义于uip.h323行
4. #define uip_poll_conn(conn)
请求对特定连接进行轮询
函数功能与uip_periodic_conn()相同,但不是执行任何定时器处理。轮询以得到新数据。
参数:
conn 指向要进行处理的连接结构体uip_conn的指针。
此接口函数定义于uip.h337行
5. #define uip_udp_periodic(conn)
借助连接号,周期性处理udp连接。
此函数基本上与uip_periodic()相同,区别之处仅在于这里处理的是udp连接。其调用方式也与uip_periodic()类似:
  1. for(i = 0; i < UIP_UDP_CONNS; i++) {
  2.     uip_udp_periodic(i);
  3.     if(uip_len > 0) {
  4.       devicedriver_send();
  5.     }
  6.   }
复制代码
注意:
对于uip_periodic()函数,在uip中使用arp和以太网时,要特别注意一些事情,这对于uip_udp_periodic()也一样:

  1. for(i = 0; i < UIP_UDP_CONNS; i++) {
  2. uip_udp_periodic(i);
  3. if(uip_len > 0) {
  4. uip_arp_out();
  5. ethernet_devicedriver_send();
  6. }
  7. }
复制代码
参数:
conn 要处理的udp连接号
使用例程:
example-mainloop-with-arp.c, and
example-mainloop-without-arp.c.
此接口定义于uip.h373行。
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_BUFSIZE+2]
uip数据包缓冲区
uip_buf数列用于盛放传入/传出的数据包。设备驱动应将传入的数据放于此缓冲区中。发送数据时,设备驱动从缓冲
区中读取链路层的头和TCP/IP头。链路层头的大小在UIP_LLH_LEN中定义。
注意:
应用数据无需放在这个缓冲区中,所以设备驱动需要从uip_appdata指针所指的地方读取数据。下面是一个例子:
  1. void
  2. devicedriver_send(void)
  3. {
  4. hwsend(&uip_buf[0], UIP_LLH_LEN);
  5. if(uip_len <= UIP_LLH_LEN + UIP_TCPIP_HLEN) {
  6. hwsend(&uip_buf[UIP_LLH_LEN], uip_len - UIP_LLH_LEN);
  7. } else {
  8. hwsend(&uip_buf[UIP_LLH_LEN], UIP_TCPIP_HLEN);
  9. hwsend(uip_appdata, uip_len - UIP_TCPIP_HLEN - UIP_LLH_LEN);
  10. }
  11. }
复制代码
回复

使用道具 举报

19

主题

150

回帖

207

积分

高级会员

积分
207
发表于 2019-8-9 15:53:29 | 显示全部楼层
MARK。
回复

使用道具 举报

0

主题

19

回帖

19

积分

新手上路

积分
19
发表于 2022-7-26 10:49:34 | 显示全部楼层
Uip的介绍很少了,最近在纠结,把原先项目的uIP替换掉,还是继续从NXP的平台移植到stm32的平台,中间还绑定了一个别的系统,费劲!
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-27 00:55 , Processed in 0.253119 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表