Chinaunix首页 | 论坛 | 博客
  • 博客访问: 835864
  • 博文数量: 91
  • 博客积分: 2544
  • 博客等级: 少校
  • 技术积分: 1885
  • 用 户 组: 普通用户
  • 注册时间: 2006-12-12 09:08
文章存档

2016年(10)

2014年(2)

2013年(4)

2012年(23)

2011年(23)

2010年(13)

2009年(14)

2007年(2)

分类: LINUX

2012-03-01 13:57:22

klips处理ip数据包的函数调用关系

    前面有位前辈分析了pluto和xfrm框架的源码,写得非常不错,受益匪浅。这里我自己分析和总结了一下klips的一些东西,一家之言,若有错误请大家指正!



1, 收包:
netif_rx()  //接收以太网帧
^
|    ->ip_rcv()          //ip包接收上半部
|        ->ip_rcv_finish()       //ip包接收下半部
|            ->ip_forward()    //包转发
|                ->ip_forward_finish()
|                    ->ip_output()        //回到发送部分的函数ip_output
|            ->ip_local_deliver()        //本地数据包
|                ->.handler=ipsec_rcv()         //进入klips的ipsec数据包处理流程
|                    ->netif_rx()
|                          |
|<------------------------|


.klips中ipsec数据包接收处理
#

#ipsec_rcv函数调用关系
ipsec_rcv()
    ->ipsec_rcv_decap()
        ->ipsec_rcv_decap_once()
           ^
           | ->proto_funcs(esp,ah,ipcomp).rcv_check()
           | ->proto_funcs(esp,ah,ipcomp).rcv_calc_auth()
           | ->proto_funcs(esp,ah,ipcomp).rcv_decrypt()
           |         |   //处理完成后再次循环
           --------

.ipsec_rcv_decap_once()函数的处理流程如下:
(1)获取下一个包的包头
(2)检查该包的封装协议是否是: esp,ah,ipcomp三者之一
(3)若是,调用proto_funcs的函数进行封包处理(可能是认证,可能是解密处理),处理完成后跳到(1)
(4)若不是,跳出处理函数


2, 发包
ip_queue_xmit()
    ->ip_local_out()
        ->nf_hook(NF_INET_LOCAL_OUT)
            ->dst_output()
                ->dst.output()
                    ->ip_output() //单播
                        ->ip_finish_output()
                            ->ip_finish_output2()
                                ->dev_queue_xmit() #若路由到ipsec虚拟接口,则进行下面的处理
                                    ->hard_start_xmit->ipsec_tunnel_start_xmit()
                    ->ip_mc_output() //多播
                    ->ip_fragment()


.通过ipsec口发包函数调用
ipsec_tunnel_start_xmit()
    ->ipsec_xmit_sanity_check_dev()        //检查网络设备dev的值
    ->ipsec_xmit_sanity_check_skb()       //检查skb的值
    ->ipsec_tunnel_SAlookup()            //查找eroute
    ->ipsec_xmit_encap_bundle()        //主要函数加密ip数据包
    ->ipsec_tunnel_restore_hard_header()    //填充硬件头
    ->ipsec_tunnel_send()
        ->IP_SEND()->dev_queue_xmit()
            ->hard_start_xmit()        //相应的网卡驱动发送数据包


.说明
内核版本:      2.6.27
openswan版本:     2.4.7


阅读(3000) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

月是夜的明2015-10-23 15:47:41

楼主好,我想请教一下:内核组件 KLIPS和26sec的作用是什么,还有就是他们的区别