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
阅读(3022) | 评论(1) | 转发(0) |