ip_confirm函数是状态跟踪的另一个重要的函数:
static unsigned int ip_confirm(unsigned int hooknum,
struct sk_buff **pskb,
const struct net_device *in,
const struct net_device *out,
int (*okfn)(struct sk_buff *))
{
return ip_conntrack_confirm(pskb);
}
函数仅是转向,将控制权转交给ip_conntrack_confirm函数:
static inline int ip_conntrack_confirm(struct sk_buff **pskb)
{
if ((*pskb)->nfct
&& !is_confirmed((struct ip_conntrack *)(*pskb)->nfct))
return __ip_conntrack_confirm(pskb);
return NF_ACCEPT;
}
is_comfirmed函数用于判断数据包是否已经被__ip_conntrack_confirm函数处理过了,它是通过IPS_CONFIRMED_BIT标志位来判断,而这个标志位当然是在__ip_conntrack_confirm函数中来设置的:
[code
int
__ip_conntrack_confirm(structsk_buff**pskb)
{
unsignedinthash,repl_hash;
structip_conntrack*ct;
enumip_conntrack_infoctinfo;
/*取得数据包的连接状态*/
ct=ip_conntrack_get(*pskb,&ctinfo);
/*如果当前包不是一个初始方向的封包,则直接返回.*/
if(CTINFO2DIR(ctinfo)!=IP_CT_DIR_ORIGINAL)
returnNF_ACCEPT;
/*计算初始及应答两个方向tuple对应的hash值*/
hash=hash_conntrack(&ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple);
repl_hash=hash_conntrack(&ct->tuplehash[IP_CT_DIR_REPLY].tuple);
/*IP_NF_ASSERT(atomic_read(&ct->ct_general.use)==1);*/
/*Noexternalreferencesmeansnooneelsecouldhave
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-31885-15.html
没成功即使说的是真理
官二代吧