以上就是重装的流程图。在超时检查时,如果没有超时,则继续接收,直到完成为止。
(三)基本代码实现 由于只有一个模快,故没有主函数main(),以下就是函数ipintr()与ip_reass的实现以及必要的说明,其中的数据结构定义包含在chong_z.h中。 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; /*标志位*/} struct pkthdr{ int len; /*数据报总长*/ } struct mbuf{ struct m_hdr; union{ struct{ struct pkthdr MH_pkthdr; union{ char MH_databuf[MHLEN]; }MH_dat; char M_databuf[MLEN]; }M_dat; }; 本次设计用到的宏定义: #define m_next m_hdr.mh_next #define m_len m_hdr.mh_len #define m_pkthdr M_dat.MH.MH_phthdr #define dtom(x) ((struct mbuf *)((int)(x)&~(MSIZE-1) /*取得一个放在mbuf中任意位置的数据指针,并返回一mbuf * 本身结构的指针 */ 分配mbuf函数m_get实现: struct mbuf * int nowait,type; m_get(nowait,type) { struct mbuf *m; MGET(m,nowait,type); return(m);} ipintr代码: void ipintr()/*对收到分片的处理*/ { struct ip *ip; struct mbuf *m; struct ipq *fp; struct mbuf *m;/*缓冲区指针*/ int hlen; next: s=splimp();/*调用中断*/ IF_DEQUEUE(&ipintrq,m); splx(s);/*打开网络中断*/ if(m==0) return; if(ip->ip_off&&ip->IP_DF){ /*如果分片位或更多分片为*0,则必须重装,反之则跳过重装*/ if(m->m_flags&M_EXT){ if(m=m_pullup(m,sizeof(struct ip))==0) ipstat.ips_toosmall++; goto next;} ip=mtod(m,struct *ip);}/*搜索此数据报分片对列*/ for(fp=ipq.next;fp!=&ipq;fp=fp->next) if(ip->ip_id==fp->ipq_id&&ip->src.s_addr==fp->ipq_src.s_addr&&ip->ip_dst.s_addr==fp->ipq
首页 上一页 1 2 3 4 下一页 尾页 2/4/4