uip协议栈分析(1)
转载地址:https://blog.csdn.net/angle0615303/article/details/7716151
Uip源代码可以从http://www.sics.se/~adam/uip/index.php/Main_Page上下载得到。
Uip的源码目录结构:
D:.
├─apps
│ ├─dhcpc
│ ├─hello-world
│ ├─resolv
│ ├─smtp
│ ├─telnetd
│ ├─webclient
│ └─webserver
│ └─httpd-fs
├─doc
│ └─html
├─lib
├─sourceinsight
├─uip
└─unix
App目录是一些应用层的协议和实例,Doc目录是文档,lib目录下有内存块管理函数,uip下uip协议栈的源代码,unix下是unix环境里的uip应用例子。
研究unix下的代码可以知道uip是如何使用的,关键是理解uip协议栈的主控制循环。
int main(void)
{
int i;
uip_ipaddr_t ipaddr;
struct timer periodic_timer, arp_timer;
//设置TCP超时处理时间和ARP老化时间
timer_set(&periodic_timer, CLOCK_SECOND / 2);
timer_set(&arp_timer, CLOCK_SECOND * 10);
//驱动初始化
tapdev_init();
//协议栈初始化
uip_init();
//设置IP地址、网关等参数
uip_ipaddr(ipaddr, 192,168,0,2);
uip_sethostaddr(ipaddr);
uip_ipaddr(ipaddr, 192,168,0,1);
uip_setdraddr(ipaddr);
uip_ipaddr(ipaddr, 255,255,255,0);
uip_setnetmask(ipaddr);
//应用层初始化
httpd_init();
//主循环
while(1)
{
//从网卡读取数据
uip_len = tapdev_read();
//如果数据存在则按协议处理
if(uip_len > 0)
{
//如果收到的是IP数据,调用uip_input()处理
if(BUF->type == htons(UIP_ETHTYPE_IP))
{
uip_arp_ipin();
uip_input();
/* 处理完成后如果UIP_BUF里有数据,即
uip_len>0,则调用tapdev_send发送出去*/
if(uip_len > 0) {
uip_arp_out();
tapdev_send();
}
}
//如果收到的是ARP数据,调用uip_arp_arpin处理
else if(BUF->type == htons(UIP_ETHTYPE_ARP))
{
uip_arp_arpin();
/* 查看是否有要发送的数据并发送*/
if(uip_len > 0)
{
tapdev_send();
}
}
}
//查看0.5s是否到了,调用uip_periodic处理TCP超时程序
else if(timer_expired(&periodic_timer))
{
timer_reset(&periodic_timer);
for(i = 0; i < UIP_CONNS; i++)
{
uip_periodic(i);
if(uip_len > 0)
{
uip_arp_out();
tapdev_send();
}
}
#if UIP_UDP
//处理udp超时程序
for(i = 0; i < UIP_UDP_CONNS; i++)
{
uip_udp_periodic(i);
if(uip_len > 0)
{
uip_arp_out();
tapdev_send();
}
}
#endif /* UIP_UDP */
/* 10s到了就处理ARP*/
if(timer_expired(&arp_timer))
{
timer_reset(&arp_timer);
uip_arp_timer();
}
}
}
return 0;
}
uip协议栈分析(1)相关推荐
- uip协议栈分析(2)
uip的内存管理方法: 内存管理的实现在memb.c/memb.h里. 这两个文件负责uip的内存块的管理,内存块是由MEMB()宏声明.内存从声明的内存块里用memb_alloc()分配,用memb ...
- UIP协议栈移植到u-boot详解
Author: 杨正 date:2014.11.5 Email:y2012ww@gmail.com QQ: 1209758756 1.uip简介 Uip网络是一个简单好用的嵌入式协议栈,易于移植且 ...
- STM32+ENC28J60+UIP协议栈实现WEB服务器示例
一.环境介绍 MCU: STM32F103ZET6 网卡: ENC28J60 协议栈: UIP 开发软件: Keil5 二.功能介绍 完整项目源码下载链接:https://download.csdn ...
- GD32F4xx uIP协议栈移植记录
uIP是一个非常小的TCP/IP栈.完全用C编写,可移植到各种不同的结构和操作系统上,一个编译过的栈可以在几KB ROM或几百字节RAM中运行. 1.uIP中需要移植的文件 首先在项目中创建一个eth ...
- 【uip移植】在AVR单片机ATMega16A上运行uip协议栈,网卡使用ENC28J60
开发环境:Atmel Studio 7.0 使用的开发板:锐志51单片机开发板+AVR转接座 单片机:40脚直插的ATMega16A Flash容量:16KB SRAM容量:1KB(这个是最紧缺的资源 ...
- linux下iptables和netfilter详解(4):洞悉实现流程及协议栈分析
(一)洞悉linux下的Netfilter&iptables:什么是Netfilter? 很多人在接触iptables之后就会这么一种感觉:我通过iptables命令配下去的每一条规则,到底是 ...
- 几种开源的TCP/IP协议栈分析
1.BSD TCP/IP协议栈 BSD栈历史上是其他商业栈的起点,大多数专业TCP/IP栈(VxWorks内嵌的TCP/IP栈)是BSD栈派生的.这是因为BSD栈在BSD许可协 议下提供了这些专业栈的 ...
- UIP协议栈笔记·二
转载地址:http://blog.chinaunix.net/uid-23247944-id-2974928.html 1. 网卡如何与uIP协议交互(包括arp, icmp等) 在我看来,CP ...
- Asterisk 1.8 sip 协议栈分析
引用自:http://blog.csdn.net/z1623866465/archive/2011/01/02/6113057.aspx 看了一下 asterisk 1.8 ,chan_sip 更新了 ...
最新文章
- 欧盟中止对中国数据卡产品“两反一保”调查
- 20135310陈巧然 20135305姚歌 实验一:开发环境的熟悉
- IOS Swift5.5的通知写法
- python中单下划线(_)和双下划线(__)的特殊用法 还等什么
- 微信第三方平台相关的转发
- [转]经典正则表达式
- docker+MySQL+读写分离
- 【Nginx探究系列二】Nginx配置篇之客户Nginx白名单访问配置
- Basic INFO: InstallShield 2012安装过程
- 实战:基于Node的控制台记事本开发
- b站主页面视频推荐油猴脚本(更新)
- Microsoft Visio 专业版 2019
- 计算机应用基础搜题答案,大一计算机应用基础试题及答案
- Adams 线性多步积分器(一)
- Fab-PIE(制程整合工程师)详细介绍
- 更好的 java 重试框架 sisyphus 背后的故事
- django 常用static\media\邮箱\富文本编辑器配置(备忘)
- Photoshop(CC2020)未完
- 我爱计算机:张俊林专访
- php 类型 打印机,php LPR打印机类