• 大小: 5KB
    文件类型: .c
    金币: 1
    下载: 0 次
    发布日期: 2021-05-23
  • 语言: C/C++
  • 标签: 重组  

资源简介

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-

评论

共有 条评论