struct ipv6_hdr{
u8_t v:4,tclass:4; /*版本号和流量类型*/
u16_t flow; /*流标签*/
u16_t len;/*载荷长度*/
u8_t nexthdr; /*下一报头*/
u8_t hoplim; /*跳数限制*/
struct ip_addr src, dest; /*源地址和目的地址*/
};
(2)IPv6包
根据IPv6的协议标准,原本只支持IPv4的LwIP中的IP包也要做出相应修改,包括IP接收包、IP发送包和IP转发包。相对于IPv4,IPv6简化了包头结构,因此代码量大幅减少,在此不再一一赘述。
2.2 ICMPv6协议
ICMPv6协议,包括信息报文和错误报文等多种类型。根据嵌入式应用的特点和需求,协议栈实现了目的不可达、超时两个错误报文和简单的ECHO信息报文。
(1)ICMP数据处理
首先由ip_input()将收到的ICMP包移交到icmp_input(),它解析ICMP报头并且进行以下处理。
1) 解析ICMP报头时,用类型字段和代码字段的值代表不同的状况
type =((u8_t*)p->payload)[0];
switch (type) {
case ICMP6_ECHO;
LWIP_DEBUGF(ICMP_DEBUG,(“icmp_input: ping ”));
}
2)交换目标地址和目的地址,以便将ECHO信息送回:
ip_addr_set(&tmpaddr,&(iphdr->src));
ip_addr_set(&(iphdr->src),&(iphdr->dest));
ip_addr_set(&(iphdr->dest),&tmpaddr);
3)重新计算校验和,进行性能优化:
if (iecho->chksum>=htons(0xffff- (ICMP6_ECHO<<8))){
iecho->chksum+=htons(ICMP6_ECHO<<8)+ 1;
} else {
iecho->chksum +=htons(ICMP6_ECHO <<8);
}
4)将包交到IP层,等待传送
ip_output_if ( p ,&(ip_hdr->src), IP_HDRINCL, ip_hdr->hoplim,
IP_PROTO_ICMP, inp);
(2)错误报文
当UDP中检索不到匹配的端口时,就发送一个目的不可达报文。对于多播地址,不发送ICMP错误报文。
而超时的判断主要是对IP报头中Hoplim域值的判断,所以直接在IP协议中实现更为妥当。转发包时,首先判断跳数限制的值:
if (--ip_hdr->hoplim==0) {
if (ip_hdr->nexthdr!=IP_PROTO_ICMP) {
icmp_time_exceeded ( p,ICMP_TE_TTL);
}
pbuf free(p) ;
return;
}
对于其它传输过程中出现的问题,不发送ICMP信息,而是直接将包丢弃。
2.3 UDP协议和TCP协议
UDP协议和TCP协议属于传输层协议,在嵌入式IPv6协议栈中不需要更改协议模式,只需要基于LwIP提供的相应功能对数据格式(如地址格式等)进行适当修改即可。在此不再详述。
2.4 ND协议
IPv4中用ARP协议完成MAC地址和IP地址的解析,在IPv6中使用ND(Neighbor Discovery邻居发现)协议实现这一功能,协议栈设计了邻居请求报文和邻居宣告报文的数据结构和函数,通过这两个报文对接口的MAC地址和IPv6地址进行绑定并且保存在对方的地址缓存区中。
1)邻居请求报文
IPv6通过邻居请求报文来获得链路层地址。当下一跳IP对应的MAC地址为NULL时,调用邻居请求模块,把数据包按照邻居请求报文格式封装,然后传送给IPv6输出模块in-out(),把数据包发送到网络上。
if (netif->hwaddr[]==NULL){
ndrequest(struct pbfs p);
}
当从IPv6输入模块ip_input()中接收到邻居宣告报文时,从数据包中取出IP地址和MAC物理地址存到邻居缓存表中。:
tgaddr=p->ip6_addr;
macaddr[]=netif->hwaddr[];
2)邻居宣告报文按照结构体定义设计完成即可。
3移植和测试
本课题采用博创公司的UP-NETARM2410-S开发平台。将移植工作完成后,建立与运行微软IPv6协议栈的PC机对等通信的实验环境进行测试。设置好相应的IPv6地址后,可以通过ping命令顺利地得到开发板的响应,如图3所示。

图3 IPv6测试示意图
4结语
本文针对嵌入式系统的特点和要求,基于轻载协议栈LwIP3.0,设计并实现了一个嵌入式IPv6协议栈。利用三星S3C2410处理器(ARM9内核)和μC/OS-Ⅱ操作系统搭建了一个嵌入式系统平台,将该协议栈加载在该系统中并进行了验证,并通过连通性测试表明该协议栈可以满足嵌入式系统网络化的要求。
参考文献:
[1] 罗蕾主编,嵌入式实时操作系统及应用开发[M],北京:北京航空航天大学出版社,2005年1月:45.
[2] 石小兰.嵌入式系统中IPv6协议栈的研究与实现.安徽:合肥工业大学,2006.
[3] Adam Dunkels. LwIP source code,2001.
[4] 杨成群.嵌入式系统中IPv6协议栈的研究.湖南:嵌入式系统中IPv6协议栈的研究,2008.
2/2 首页 上一页 1 2 |