Linux-2.6.21.1 网络函数调用流程

本文档的Copyleft归yfydz所有,使用GPL发布,可以自由拷贝,转载,转载时请保持文档的完整性,严禁用于任何商业用途。 

  1. 接收以太帧:  
  2. netif_rx  
  3.   -> queue  
  4.   -> netif_receive_skb  
  5.     -> bond  
  6.  -> packet_type_all: deliver_skb  
  7.  -> bridge  
  8.  -> packet_type(IPV4)->func == ip_rcv  
  9.    
  10. 接收IPv4包:  
  11. ip_rcv  
  12.   -> NF_HOOK(PREROUTING)  
  13.     ->ip_rcv_finish  
  14.       -> ip_route_input  
  15.         -> ip_route_input_cached  
  16.           -> ip_route_input_slow  
  17.             -> ip_mkroute_input  
  18.               -> __mkroute_input  
  19.                 dst->input = ip_forward  
  20.                 dst->output = ip_output  
  21.       -> dst_input  
  22.         -> LOCAL_IN: dst->input == ip_local_deliver  
  23.           -> NF_HOOK(NF_INPUT)  
  24.             -> ip_local_deliver_finish  
  25.               -> ipprot->handler(tcp, udp, icmp ...)  
  26.         -> FORWARD:  dst->input == ip_forward  
  27.     
  28. 转发:  
  29.     
  30. ip_forward  
  31.   -> xfrm4_route_forward (net/xfrm.h, get xfrm_dst)  
  32.     -> xfrm_route_forward  
  33.       -> __xfrm_route_forward  
  34.         -> xfrm_lookup  
  35.           -> xfrm_find_bundle  
  36.             -> afinfo->find_bundle == __xfrm4_find_bundle  
  37.           -> xfrm_bundle_create  
  38.             -> afinfo->bundle_create == __xfrm4_bundle_create  
  39.               tunnel mode  
  40.               -> xfrm_dst_lookup  
  41.                 -> afinfo->dst_lookup == xfrm4_dst_lookup  
  42.                   -> __ip_route_output_key  
  43.           -> dst_list: dst->list=policy_bundles, policy->bundles = dst  
  44.   -> NF_HOOK(NF_FORWARD)  
  45.   -> ip_forward_finish  
  46.   -> dst_output  
  47.    
  48. 输出:  
  49. icmp:  
  50. icmp_send  
  51.   -> ip_route_output_key  
  52.     -> ip_route_output_flow  
  53.   -> icmp_push_reply  
  54.     -> ip_append_data  
  55.  -> skb_queue_walk  
  56.     -> ip_push_appending_frames  
  57.    
  58. tcp:  
  59. tcp_connect  
  60.   -> ip_route_connect  
  61.     -> ip_route_output_flow  
  62. tcp_sendmsg  
  63.   -> __tcp_push_appending_frames  
  64.     -> tcp_write_xmit  
  65.    -> tcp_transmit_skb  
  66.         -> net_xmit_eval  
  67.           -> icsk->icsk_af_ops->queue_xmit == ipv4_specific->queue_xmit == ip_queue_xmit  
  68.   -> tcp_push_one  
  69.     -> tcp_transmit_skb  
  70.       -> net_xmit_eval  
  71.         -> icsk->icsk_af_ops->queue_xmit == ipv4_specific->queue_xmit == ip_queue_xmit  
  72.    
  73. tcp_protocol->handler == tcp_v4_rcv  
  74.   -> __inet_lookup  
  75.   -> xfrm_policy_check  
  76.   -> tcp_v4_do_rcv  
  77.     -> tcp_rcv_state_process  
  78.       -> icsk->icsk_af_ops->conn_request == tcp_v4_conn_request  
  79.         -> tcp_v4_send_synack  
  80.           -> ip_build_and_send_pkt  
  81.             -> NF_HOOK( NF_OUTPUT )  
  82.               -> dst_output  
  83.   
  84. udp:  
  85. udp_sendmsg  
  86.   -> ip_route_output_flow  
  87.   -> ip_append_data  
  88.     -> __skb_queue_tail( sk_write_queue )  
  89.   -> udp_push_pending_frames  
  90.     -> ip_push_pending_frames  
  91. raw:  
  92. raw_sendmsg  
  93.   -> ip_route_output_flow  
  94.   -> ip_append_data  
  95.     -> __skb_queue_tail( sk_write_queue )  
  96.   -> ip_push_pending_frames  
  97.   
  98. ip_push_pending_frames  
  99.   -> __skb_dequeue(sk_write_queue)  
  100.     -> NF_HOOK(NF_OUTPUT)  
  101.       -> dst_output  
  102.   
  103. ip_queue_xmit  
  104.   -> ip_route_output_flow  
  105.     -> xfrm_lookup  
  106.       -> xfrm_find_bundle  
  107.         -> bundle_create  
  108.           -> afinfo->bundle_create == __xfrm4_bundle_create  
  109.             -> xfrm_dst_lookup  
  110.               -> afinfo->dst_lookup == xfrm4_dst_lookup  
  111.                 -> __ip_route_output_key  
  112.         -> dst_list  
  113.         -> dst->list=policy_bundles, policy->bundles = dst  
  114.   -> NF_HOOK(NF_OUTPUT)  
  115.   -> dst_output  
  116.     -> dst->output  
  117.    
  118. dst_output: dst_list循环  
  119.   -> dst->output == xfrm_dst->output == xfrm4_output == xfrm4_state_afinfo->output  
  120.     -> NF_HOOK(POSTROUTING)  
  121.       -> xfrm4_output_finish  
  122.         -> gso ?  
  123.         -> xfrm4_output_finish2  
  124.           -> xfrm4_output_one  
  125.             -> mode->output  
  126.             -> type->output  
  127.             -> skb->dst=dst_pop(skb->dst)  
  128.           -> nf_hook(NF_OUTPUT)  
  129.             -> !dst->xfrm  
  130.               -> dst_output  
  131.           -> nf_hook(POSTROUTING)  
  132.   -> dst->output == ip_output  
  133.     -> NF_HOOK(POSTROUTING)  
  134.       -> ip_finish_output  
  135.         -> ip_finish_output2  
  136.           -> hh_output == dev_queue_xmit  

没有评论: