资源简介
C语言实现模拟IP重组的过程,C语言实现模拟IP重组的过程
代码片段和文件信息
#include “ip_reasm.h“
unsigned int init_flag; /* 定义一个全局的初始化标志 */
static struct ipq_s *ipq_hash[IPQ_HASHSZ]; /* 散列数组 */
/* 分片重叠与挂靠处理函数 */
static void resolve_overlap_link(struct sk_buff_s *buf struct ipq_s *ipq_head);
/* 重组分片函数 */
static struct sk_buff_s *assembled_frags(struct ipq_s *ipq_node);
/**
* sys_init - 系统初始化
*
* 函数用于系统初始化,对ipq_hash表进行初始化,ipq_hash表里的每个元素都指向
* 一个struct ipq_s类型的表头结点.这个表头结点是不存储任何的信息,即ipq表头
* 不指向任何一个sk_buff表的表头,也不存储idprotocolsaddrdaddr等
*
* 函数无返回值,但会设置初始化标志变量init_flag为1.
*/
void sys_init(void)
{
int i;
if (init_flag) {
return ;
}
for (i = 0; i < IPQ_HASHSZ; i++) {
ipq_hash[i] = frag_alloc_queue();
if (!ipq_hash[i]) {
while (--i >= 0) {
free(ipq_hash[i]);
}
return ;
}
/* 初始化ipq_hash表的表头,其fragments不指向任何sk_buff表结点 */
ipq_init(ipq_hash[i] NULL);
}
init_flag = VALID_DATA;
}
/**
* ip_defrag - 提供给外部使用的IP报文分片重组接口
* @skb:新IP报文分片
*
* 函数根据刚接收的新报文进行完整性判断,完整的报文则直接返回该报文;否则
* 先对处理新报文分片与老分片重叠部分,并将处理后的分片加入重装表中,然后
* 对整个重装表进行重组可行性探测,如果可以重组,则进行重组,并将重组后的
* 整个报文返回;否则返回NULL
*
* 函数根据新报文skb得到一个完整报文后,返回完整报文;否则返回NULL
*/
struct sk_buff_s *ip_defrag(struct sk_buff_s *skb)
{
int index; /* 散列值 */
int is_null; /* 标志是否存在skb对应的ipq结点 */
struct sk_buff_s *buf; /* 报文分片缓冲区 */
struct sk_buff_s *datagram_buffer; /* 完整报文缓冲区 */
struct ipq_s *ipq_node; /* ipq_s表的结点 */
if (!skb) {
return NULL;
}
if (!init_flag) {
printf(“[system error]系统还没初始化!\n“);
return NULL;
}
/* 如果skb是完整报文,则返回skb */
if (!(skb->iph->frag_off & (IP_MF | IP_OFFSET))) {
return skb;
}
index = ipqhashfn(skb->iph->id skb->iph->saddr skb->iph->daddr skb->iph->protocol);
ipq_node = ipq_hash[index]->next;
is_null = INVALID_DATA;
while (ipq_node) {
if ((ipq_node->id == skb->iph->id) && (ipq_node->saddr == skb->iph->saddr)
&& (ipq_node->daddr == skb->iph-
- 上一篇:等值线的绘制程序算法
- 下一篇:C/C++程序 多元多项式的相乘
评论
共有 条评论