lin.ux2.6中.xfrm框架的dst_output的处理过程 鲜花
L.inux内核中ipsec的ds.t_output处理过程,当执行第一个.dst_output时,这时会进入 xfrm4_outpot,下面是这个函数的代码:--- 印刷
int xfrm4_out.put(struct sk_buff *sk.b) 建材
{
return NF_HOOK_COND(PF_INET, NF_I.P_POST_ROU.TING,. skb, NULL, skb->dst->dev, 女人
. xfrm4_output_f.inish, 电子
!(IPCB(skb.)->fl.ags & IPSKB_REROUTED));服务器
}
static int xfrm4_output_fi.nis.h(struct sk_buff *skb).
{
int err;..
#ifde.f CONFIG_NETFILTER 健康
if (!.skb->dst->xfrm.) {.
IPCB(skb)->flags. |=. IPSKB_REROUTED; 健康
. return dst_ou.tput(skb); 女人
}
#endif
. while (likely((er.r = xfrm4_output_one(skb)) == 0)) {( 游戏 )
. nf._reset(skb);电脑
err = nf_.hook(PF_INET, NF_IP_LOCAL_OUT, &skb, NUL.L,投资
skb->dst.->.dev, dst_output); 美容
. if (.unlikely(err != 1))[成人用品]
. . break; 建材
. if (!.skb->dst->xfrm).
return dst._out.put(skb);.
err = nf_hook(PF_I..NET, NF_IP_POST_ROUTING, &skb, NULL, 鲜花
. skb->dst->dev, xfrm4_outpu.t_finish); 外汇
if .(un.likely(err != 1))服务器
. bre.ak;.
}
return err.;--------------彩票
}
static in.t xfrm4_output_one(stru.ct sk_buff *skb).
{
struct dst_entry *dst = skb->ds.t.;电影
. struct xfrm_state *x = d.st->xfrm; 汽车
. int err;.
if (.skb->ip_summed == CHECKSUM._HW) {--------------彩票
er.r = skb_checksum_h.elp(skb, 0);( 游戏 )
. if (err).
. goto err.or_nolock; 乙肝
}
. . if (x->props.mode) { 外汇
. err = xfr.m4_tunnel_check_size(skb);服务器
. if (err)健康
. go.to error_nolock;电脑
}
do {
spin_.lock_bh(&x-.>lock);.
err .= xfrm_state_ch.eck(x, skb);电脑
. if (err)虚拟主机
. . goto error; 美容
. xfr.m4_encap(skb); 鲜花
err = x->ty.pe->output(x., skb);.
. if (err).
. . goto error; 汽车
. . x->curlft.bytes += skb->len;( 游戏 )
. . x->curlft.packets++;服务器
. spin_unlo.ck_bh(&x->lock); 建材
i.f (!(skb->.dst = dst_pop(dst))) {
.. err = -EHOSTUNREACH;( 游戏 )
.goto error_nol.ock;电脑
. }.
dst .= .skb->dst;外贸
x. =. dst->xfrm;电影
} while (x && !x->pr.ops.mode).; 健康
IPCB(skb)->f.lags |= IPSKB_XFRM_TRANSFOR.MED;.
er.r = 0;.
out_exit:
return er.r; 健康
error:
sp.in_unlock_bh(&x->lock.); 杀毒
error_nolock:
kfree_.skb(skb); 外汇
goto o.ut_exit; 汽车
}
这段代码中嵌.套调用了很多NF_HOOK_COND nf._hook函数,他最终是怎么推出.循环调用到最后的ip_output的呢?在xfrm4_output_finish首先运行 xfrm4_output_one执行了esp_output和ah_output进.行了完整性认证,为什么后面还可以.调用 nf_hook(PF_INET, NF_IP_LOCAL_OUT, &skb, NULL,电影
sk.b->dst->dev, dst_output.);和nf_hook(PF_INET, NF_IP_POST_ROUTING, &skb, NU.LL,(广告)
. skb->dst->dev, xfrm4_o.utput_finish);进行NAT操作?我觉得在这里没必要调用nf_hook函数去走重新遍历hook链表.。