資源簡介
C語言實現(xiàn)模擬IP重組的過程,C語言實現(xiàn)模擬IP重組的過程
代碼片段和文件信息
#include?“ip_reasm.h“
unsigned?int????????init_flag;??????????????????????/*?定義一個全局的初始化標志?*/
static?struct?ipq_s?*ipq_hash[IPQ_HASHSZ];??????????/*?散列數(shù)組?*/
/*?分片重疊與掛靠處理函數(shù)?*/
static?void?resolve_overlap_link(struct?sk_buff_s?*buf?struct?ipq_s?*ipq_head);
/*?重組分片函數(shù)?*/
static?struct?sk_buff_s?*assembled_frags(struct?ipq_s?*ipq_node);
/**
?*?sys_init?-?系統(tǒng)初始化
?*?
?*?函數(shù)用于系統(tǒng)初始化,對ipq_hash表進行初始化,ipq_hash表里的每個元素都指向
?*?一個struct?ipq_s類型的表頭結(jié)點.這個表頭結(jié)點是不存儲任何的信息,即ipq表頭
?*?不指向任何一個sk_buff表的表頭,也不存儲idprotocolsaddrdaddr等
?*
?*?函數(shù)無返回值,但會設(shè)置初始化標志變量init_flag為1.
?*/
void?sys_init(void)
{
????int?i;
????
????if?(init_flag)?{
????????
????????return?;
????}
????for?(i?=?0;?i?????????ipq_hash[i]?=?frag_alloc_queue();
????????if?(!ipq_hash[i])?{
????????????while?(--i?>=?0)?{
????????????????free(ipq_hash[i]);
????????????}
????????????
????????????return?;
????????}
????????/*?初始化ipq_hash表的表頭,其fragments不指向任何sk_buff表結(jié)點?*/
????????ipq_init(ipq_hash[i]?NULL);
????}
????init_flag?=?VALID_DATA;
}
/**
?*?ip_defrag?-?提供給外部使用的IP報文分片重組接口
?*?@skb:新IP報文分片
?*
?*?函數(shù)根據(jù)剛接收的新報文進行完整性判斷,完整的報文則直接返回該報文;否則
?*?先對處理新報文分片與老分片重疊部分,并將處理后的分片加入重裝表中,然后
?*?對整個重裝表進行重組可行性探測,如果可以重組,則進行重組,并將重組后的
?*?整個報文返回;否則返回NULL
?*
?*?函數(shù)根據(jù)新報文skb得到一個完整報文后,返回完整報文;否則返回NULL
?*/
struct?sk_buff_s?*ip_defrag(struct?sk_buff_s?*skb)
{
????int??index;??????????????????????????/*?散列值?*/
????int??is_null;????????????????????????/*?標志是否存在skb對應(yīng)的ipq結(jié)點?*/
????struct?sk_buff_s?*buf;???????????????/*?報文分片緩沖區(qū)?*/
????struct?sk_buff_s?*datagram_buffer;???/*?完整報文緩沖區(qū)?*/
????struct?ipq_s?*ipq_node;??????????????/*?ipq_s表的結(jié)點?*/
????if?(!skb)?{
????????return?NULL;
????}
????if?(!init_flag)?{
????????printf(“[system?error]系統(tǒng)還沒初始化!\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++程序 多元多項式的相乘
評論
共有 條評論