新闻中心

EEPW首页>嵌入式系统>设计应用> 一种嵌入式IPv4/IPv6双协议栈的实现

一种嵌入式IPv4/IPv6双协议栈的实现

作者: 时间:2012-04-13 来源:网络 收藏

3.2网络接口的

网络接口层在设计上主要考虑下面几个目标:⑴向层提供一个统一的网络通信接口,能够将上层模块与具体的网络接口硬件隔离开来,以利于向不同操作系统的移植;⑵支持一个网络接口配置多个IP地址的功能,因为IPv6一个接口的IP地址包括本地链路、本地站点和全局三类地址;⑶支持多播报文的收发,提供动态的多播IP与多播MAC地址的映射服务;⑷提供较好的通信性能等。

针对上述目标,设计了如下的网络接口控制结构:

struct netif {
struct netif *next; /*指向下一个netif结构的指针*/
netif_ipaddr *iplist; /*指向接口的ip地址链的首指针*/
char name[2]; /*接口名称*/
err_t (* input)(struct pbuf *p, struct netif *); /*接口输入函数指针*/
err_t (* output)(struct netif *, struct pbuf *p,netif_addr *); /*接口输出函数指针*/
err_t (* linkoutput)(struct netif *, struct pbuf *p); /*链路层输出函数指针*/
void *state; /*指向接口的状态信息*/
mac_addr netifmacaddr; /*接口的MAC地址*/
netif_multi *multilist; /*本接口的MAC多播地址链首指针*/
┊ /*省略了部分信息 */
};

网络接口层是栈与下层网络设备驱动程序之间的接口,同时支持IPv4报文和IPv6报文,通过判断帧的类型字段,把接收到的不同类型的报文交给不同的协议模块进行处理。

3.3 IPv6模块

IPv6[2]模块主要包括两部分的功能,一是负责从网络接口层接收IPv6数据包,对数据包进行一定的处理后发送给上层处理模块(TCP或ICMPv6)。二是从上层接收数据,进行报文的选路,封装IPv6报头后将数据报发送给网络接口层。

3.3.1 ICMPv6[3]的简化分析

⑴ICMPv6信息报文

设备只需作为Ping的接收端,所以不需要发送回显请求报文和处理回显应答报文。为了让客户端可以测试网络状态以及测试使用,必须支持接收请求报文和发送相应的应答报文。

⑵ICMPv6错误报文

由于设备不会作为路由转发设备,所以需要发送端口不可达报文,同时要支持超时报文通告对端超时错误。在BSD中,IP层没有发送参数问题报文, ICMPv6无需支持处理参数问题报文。

3.3.2邻居发现协议(NDP)的简化分析

NDP[4]是IPv6协议的一个基本组成部分,它用于地址解析、邻居发现以及路由器及网络参数发现。本协议栈不支持路由功能,所以无需发送路由器通告报文,但必须接受路由器通告报文,以完成路由发现功能。同时支持邻居通告和邻居请求报文的接收和发送,以实现地址解析和重复探测。

3.4 TCP模块

在TCP之上实现有限的WEB服务,可以对该协议的实现机制作相应的简化及优化。

3.4.1 TCP模块的扩展

TCP对IPv4和IPv6报文的处理过程没有任何的不同,但是由于IPv4和IPv6地址结构不同,需要对使用IP地址的部分进行扩展。

⑴数据结构扩展

PCB是用来记录每个TCP连接状态的,包括本地IP地址和远程IP地址,扩展时使用union结构添加IPv6地址,同时添加标识位区别连接。

⑵操作扩展

在TCP处理过程中包括输入时对IP地址和端口号的匹配,输出时校验和的计算和路由的查找。由于对IPv4和IPv6报文调用相同的处理函数,需要在实现时在这几个函数的处理过程中加入对相应PCB中标识位的判断。

linux操作系统文章专题:linux操作系统详解(linux不再难懂)

tcp/ip相关文章:tcp/ip是什么




评论


相关推荐

技术专区

关闭