论坛风格切换切换到宽版
  • 623阅读
  • 1回复

[问题求助]linux2.6中xfrm框架的dst_output的处理过程 [复制链接]

上一主题 下一主题
离线snakeart.
 
发帖
2156
C币
-198401
威望
397
贡献值
1
银元
-7
铜钱
4855
人人网人气币
0
只看楼主 倒序阅读 使用道具 楼主  发表于: 2009-05-01
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链表.。

评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
离线klyxb.
发帖
2047
C币
-313895
威望
407
贡献值
1
银元
-1
铜钱
4726
人人网人气币
0
只看该作者 沙发  发表于: 2010-04-13
hook的遍历,效率是一个问题
快速回复
限100 字节
批量上传需要先选择文件,再选择上传
 
上一个 下一个