免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5092 | 回复: 4
打印 上一主题 下一主题

[网络管理] IP报文经由函数路径 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-06-04 10:13 |只看该作者 |倒序浏览
以下是debug出来的IP报文的行走路径。对理解网络部分可能有一点帮助。

可能不完全。欢迎补遗和更正。

IP报文经由函数路径
帖子给出的是调用树。右面的函数是调用者,左面的是被调用者。<>括号中的是iptables的钩子点。
()括号中的是一些关键动作,比如路由。


转发的报文
(route if need)dev_queue_xmit |
ip_finish_output2 | <POSTROUTING> ip_finish_output | ip_output | ip_dst_output |<FORWARD> ip_forward |(PREROUTING)(route) ip_rcv | netif_receive_skb | process_backlog | net_rx_action | __do_softirq | do_softirq | irq_exit | do_IRQ | common_interrupt | cpu_idle | rest_init | start_kernel

(route if need)dev_queue_xmit |
ip_finish_output2 | <POSTROUTING> ip_finish_output | ip_output | ip_dst_output |<FORWARD> ip_forward |(PREROUTING)(route) ip_rcv | netif_receive_skb | process_backlog | net_rx_action | __do_softirq | do_softirq | ksoftirqd

转发的报文仅在中断(硬,软)中运行。当机器作为网关时就是这样。



到本机的报文
ip_local_deliver_finish |
<LOCALIN> ip_local_deliver |<PREROUTING>(route) ip_rcv | netif_receive_skb | process_backlog | net_rx_action | __do_softirq | do_softirq | irq_exit | do_IRQ | common_interrupt | cpu_idle | rest_init | start_kernel

ip_local_deliver_finish |
<LOCALIN> ip_local_deliver | <PREROUTING>(route) ip_rcv | netif_receive_skb | e100_poll | net_rx_action | __do_softirq | do_softirq | irq_exit | do_IRQ | common_interrupt | cpu_idle | rest_init | start_kernel

到本机的报文会被APP取走。路径主要函数是tpc_recvmsg | inet_recvmsg | sock_recvmsg | sys_recvfrom | sys_recv
, udp_recvmsg | .... 等。


本机发出的报文
(route if need)dev_queue_xmit |
ip_finish_output2 |<POSTROUTING> ip_finish_output | ip_output | ip_dst_output | <LOCALOUT> ip_push_pending_frames | raw_sendmsg | inet_sendmsg | sock_sendmsg | sys_sendmsg | sys_socketcall | sysenter_past_esp

论坛徽章:
0
2 [报告]
发表于 2007-06-07 08:03 |只看该作者
我也贴一个

转载:http://blog.chinaunix.net/u/12313/showart_312426.html

==== cut ====
Linux-2.6.21.1 网络函数调用流程

本文档的Copyleft归yfydz所有,使用GPL发布,可以自由拷贝,转载,转载时请保持文档的完整性,严禁用于任何商业用途。
msn: yfydz_no1@hotmail.com
来源:http://yfydz.cublog.cn

接收以太帧:
netif_rx
  -> queue
  -> netif_receive_skb
    -> bond
-> packet_type_all: deliver_skb
-> bridge
-> packet_type(IPV4)->func == ip_rcv

接收IPv4包:
ip_rcv
  -> NF_HOOK(PREROUTING)
    ->ip_rcv_finish
      -> ip_route_input
        -> ip_route_input_cached
          -> ip_route_input_slow
            -> ip_mkroute_input
              -> __mkroute_input
                dst->input = ip_forward
                dst->output = ip_output
      -> dst_input
        -> LOCAL_IN: dst->input == ip_local_deliver
          -> NF_HOOK(NF_INPUT)
            -> ip_local_deliver_finish
              -> ipprot->handler(tcp, udp, icmp ...)
        -> FORWARD:  dst->input == ip_forward
  
转发:
  
ip_forward
  -> xfrm4_route_forward (net/xfrm.h, get xfrm_dst)
    -> xfrm_route_forward
      -> __xfrm_route_forward
        -> xfrm_lookup
          -> xfrm_find_bundle
            -> afinfo->find_bundle == __xfrm4_find_bundle
          -> xfrm_bundle_create
            -> afinfo->bundle_create == __xfrm4_bundle_create
              tunnel mode
              -> xfrm_dst_lookup
                -> afinfo->dst_lookup == xfrm4_dst_lookup
                  -> __ip_route_output_key
          -> dst_list: dst->list=policy_bundles, policy->bundles = dst
  -> NF_HOOK(NF_FORWARD)
  -> ip_forward_finish
  -> dst_output

输出:
icmp:
icmp_send
  -> ip_route_output_key
    -> ip_route_output_flow
  -> icmp_push_reply
    -> ip_append_data
-> skb_queue_walk
    -> ip_push_appending_frames

tcp:
tcp_connect
  -> ip_route_connect
    -> ip_route_output_flow
tcp_sendmsg
  -> __tcp_push_appending_frames
    -> tcp_write_xmit
   -> tcp_transmit_skb
        -> net_xmit_eval
          -> icsk->icsk_af_ops->queue_xmit == ipv4_specific->queue_xmit == ip_queue_xmit
  -> tcp_push_one
    -> tcp_transmit_skb
      -> net_xmit_eval
        -> icsk->icsk_af_ops->queue_xmit == ipv4_specific->queue_xmit == ip_queue_xmit

tcp_protocol->handler == tcp_v4_rcv
  -> __inet_lookup
  -> xfrm_policy_check
  -> tcp_v4_do_rcv
    -> tcp_rcv_state_process
      -> icsk->icsk_af_ops->conn_request == tcp_v4_conn_request
        -> tcp_v4_send_synack
          -> ip_build_and_send_pkt
            -> NF_HOOK( NF_OUTPUT )
              -> dst_output

udp:
udp_sendmsg
  -> ip_route_output_flow
  -> ip_append_data
    -> __skb_queue_tail( sk_write_queue )
  -> udp_push_pending_frames
    -> ip_push_pending_frames
raw:
raw_sendmsg
  -> ip_route_output_flow
  -> ip_append_data
    -> __skb_queue_tail( sk_write_queue )
  -> ip_push_pending_frames

ip_push_pending_frames
  -> __skb_dequeue(sk_write_queue)
    -> NF_HOOK(NF_OUTPUT)
      -> dst_output

ip_queue_xmit
  -> ip_route_output_flow
    -> xfrm_lookup
      -> xfrm_find_bundle
        -> bundle_create
          -> afinfo->bundle_create == __xfrm4_bundle_create
            -> xfrm_dst_lookup
              -> afinfo->dst_lookup == xfrm4_dst_lookup
                -> __ip_route_output_key
        -> dst_list
        -> dst->list=policy_bundles, policy->bundles = dst
  -> NF_HOOK(NF_OUTPUT)
  -> dst_output
    -> dst->output

dst_output: dst_list循环
  -> dst->output == xfrm_dst->output == xfrm4_output == xfrm4_state_afinfo->output
    -> NF_HOOK(POSTROUTING)
      -> xfrm4_output_finish
        -> gso ?
        -> xfrm4_output_finish2
          -> xfrm4_output_one
            -> mode->output
            -> type->output
            -> skb->dst=dst_pop(skb->dst)
          -> nf_hook(NF_OUTPUT)
            -> !dst->xfrm
              -> dst_output
          -> nf_hook(POSTROUTING)
  -> dst->output == ip_output
    -> NF_HOOK(POSTROUTING)
      -> ip_finish_output
        -> ip_finish_output2
          -> hh_output == dev_queue_xmit
==== cut ====

论坛徽章:
0
3 [报告]
发表于 2007-06-07 09:29 |只看该作者
更详细了。

XFRM  XFRM4是IPSEC的包吧

论坛徽章:
0
4 [报告]
发表于 2007-06-07 10:38 |只看该作者
原帖由 思一克 于 2007-6-7 09:29 发表于 3楼  
更详细了。

XFRM  XFRM4是IPSEC的包吧

google 了一下,好像的确是 2.6 内核特有的 IPSEC 的东西
http://www.google.com/search?q=X ... 0949001954757324620

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:54:45
5 [报告]
发表于 2008-03-03 23:39 |只看该作者
雖然是很久以前的 文章 但是我想問一個問題....

這個trace 路徑 是怎麼做的?

有用什麼tool嗎 可以教一下嗎

感恩cc
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP