IP协议设计实现—重装模块(一)-通信工程毕业论文(2)
2013-06-22 01:01
导读:ipq_dst; /*地址清单、目的与源地址*/ } ipasfrag(过度结构)结构: struct ipasfrag{ /* 预处理*/ #if BYTE_ORDER==LITTLE_ENDIAN Char ip_hl=4,ip_v=4; #endif #if BYTE_ORDER==BIG_ENDIA
ipq_dst; /*地址清单、目的与源地址*/
}
ipasfrag(过度结构)结构:
struct ipasfrag{
/* 预处理*/
#if BYTE_ORDER==LITTLE_ENDIAN
Char ip_hl=4,ip_v=4;
#endif
#if BYTE_ORDER==BIG_ENDIAN
char ip_v=4,ip_hl=4;
#endif
char ipf_mff; /* ipf_mff成员覆盖ip结构中的服务字段,*/
/*防止报头损坏,从标志字段复制*/
short ip_len/*下是报头定义,与ipq结构类似*/
unsigned short ip_id;
short ip_off;
unsigned char ip_p;
unsigned short ip_sum;
struct ipasfrag *ipf_next,*ipf_prev;
}
3详细流程:
ipintr先要对接收到的分片进行处理,如果它检查到MF或分片偏移为非0,则分组就是一个必须重装的分片,反之,就可以跳过重装。当一个缓存区无法容纳分组时,接口就将整个分组返回,在ipintr函数中在处理前应将IP首部移到缓冲区上。ipintr把一个要处理的分片传给和一个指针传给ip_reass,其中指针指向ipq中匹配的的重装首部,ip_reass可能把分片重装并返回一个完整的数据报(只有一个分片),也可能将该分片链接到数据报的重装链表上(不只一个分片),等其他分片到达后重装。ip_reass在一个由ipf_next和ipf_prev链接起来的双向循环链表上,并收集某个数据报分片。当在重装时产生错误,ip_reass就丢弃该分片,返回一个空。在设计中,最多实现重装576字节的数据报。ip_reass先创建重装表,然后切断分组,在重装表中找相应位置,插入分组,再重装数据报。
流程图:图(3)
以上就是重装的流程图。在超时检查时,如果没有超时,则继续接收,直到完成为止。
(三)基本代码实现
由于只有一个模快,故没有主函数main(),以下就是函数ipintr()与ip_reass的实现以及必要的说明,其中的数据结构定义包含在chong_z.h中。
(转载自http://www.NSEAC.com中国科教评价网)
IP数据报首部定义:
struct ip{
/* 预处理*/
#if BYTE_ORDER==LITTLE_ENDIAN
unsigned char ip_hl=4,ip_v=4;
#endif
#if BYTE_ORDER==BIG_ENDIAN
usigned char ip_v=4,ip_hl=4;
#endif
unsigned char ip_tos;/*服务类型,下面的前面已给出*/
short ip_len;
short id;
short ip_off;
#define IP_DF 0x4000;/*不分片标志*/
#define IP_MF 0x2000;/*更多分片标志*/
#define IP_OFFMASK 0x1fff;/* 分段位*/
unsigned char ip_ttl;
unsigned char ip_p;
unsigned short ip_sum;/*检验和*/
struct in_addr,ip_src,ip_dst;
};
mbuf缓冲区定义:
struct m_hdr{
struct mbuf *mh_next;/*链表的下一个缓冲区*/
struct mbuf *mh_nextpkt;/*对列中的下个链表*/
int mh_len; /*缓冲区数据总数*/
short mh_type; /*数据类型*/
short mh_flags; /*标志位*