轉:Linux-2.6.21.1 網路函數調用流程

來源:互聯網
上載者:User

註:紅色部分是我自己的補充說明。


轉:Linux-2.6.21.1 網路函數調用流程

http://www.cublog.cn/u/12313/showart_312426.html

 

本文檔的Copyleft歸yfydz所有,使用GPL發布,可以自由拷貝,轉載,轉載時請保持文檔的完整性,嚴禁用於任何商業用途。
msn: yfydz_no1@hotmail.com

來源:http://yfydz.cublog.cn
接收以太幀:



netif_rx
  -> queue     //管理隊列

  -> netif_receive_skb    //
將幀的拷貝交給註冊的協議函數處理、初始化skb->{h,nh,mac}

    -> bond     //多個介面綁定成一個

 -> packet_type_all: deliver_skb
 -> bridge    //橋接 -> packet_type(IPV4)->func == ip_rcv    //交給IP分組處理函數

接收IPv4包:
ip_rcv
  -> NF_HOOK(PREROUTING)    //netfilter鉤子

    ->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->output是包發送的處理

      -> dst_input    //如果skb->dst有效

        -> 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)     //IPSec策略檢驗

    -> 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)   //netfilter鉤子  // 以上對分組進行各種檢測,比如進出的裝置、源路由選項、減TTL、
重新計算
校正和等。

  -> ip_forward_finish     -> ip_forward_options    //處理IP選項其他部分(不包括路由警告、嚴格源路由)、重新計算校正和

    -> dst_output       -> dst->output
(= ip_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    // tcp串連

  -> ip_route_connect
    -> ip_route_output_flow
tcp_sendmsg    // tcp發送載荷資料

  -> __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的處理,到了後面又轉成發送了??????????????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_framesip_push_pending_frames
  -> __skb_dequeue(sk_write_queue)
    -> NF_HOOK(NF_OUTPUT)
      -> dst_outputip_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 
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.