quhr 发表于 2011-12-21 08:43

Linux-2.6.21.1 网络函数调用流程

<div>Linux-2.6.21.1 网络函数调用流程</div>
<div>&nbsp;</div>
<div>本文档的Copyleft归yfydz所有,使用GPL发布,可以自由拷贝,转载,转载时请保持文档的完整性,严禁用于任何商业用途。<br>msn: <a href="mailto:yfydz_no1@hotmail.com" target="_blank">yfydz_no1@hotmail.com</a><br>来源:<a href="http://yfydz.cublog.cn/" target="_blank">http://yfydz.cublog.cn</a></div>
<div><br>接收以太帧:<br>netif_rx<br>&nbsp; -&gt; queue<br>&nbsp; -&gt; netif_receive_skb<br>&nbsp;&nbsp;&nbsp; -&gt; bond<br>&nbsp;-&gt; packet_type_all: deliver_skb<br>&nbsp;-&gt; bridge<br>&nbsp;-&gt; packet_type(IPV4)-&gt;func == ip_rcv</div>
<div>&nbsp; <br>接收IPv4包:</div>
<div>ip_rcv<br>&nbsp; -&gt; NF_HOOK(PREROUTING)<br>&nbsp;&nbsp;&nbsp; -&gt;ip_rcv_finish<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; ip_route_input<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; ip_route_input_cached<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; ip_route_input_slow<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; ip_mkroute_input<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; __mkroute_input<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dst-&gt;input = ip_forward<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dst-&gt;output = ip_output<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; dst_input<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; LOCAL_IN: dst-&gt;input == ip_local_deliver<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; NF_HOOK(NF_INPUT)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; ip_local_deliver_finish<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; ipprot-&gt;handler(tcp, udp, icmp ...)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; FORWARD:&nbsp; dst-&gt;input == ip_forward</div>
<div>&nbsp;&nbsp;<br>转发:<br>&nbsp;&nbsp;<br>ip_forward<br>&nbsp; -&gt; xfrm4_route_forward (net/xfrm.h, get xfrm_dst) <br>&nbsp;&nbsp;&nbsp; -&gt; xfrm_route_forward<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; __xfrm_route_forward<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; xfrm_lookup<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; xfrm_find_bundle<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; afinfo-&gt;find_bundle == __xfrm4_find_bundle<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; xfrm_bundle_create<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; afinfo-&gt;bundle_create == __xfrm4_bundle_create<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tunnel mode<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; xfrm_dst_lookup<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; afinfo-&gt;dst_lookup == xfrm4_dst_lookup<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; __ip_route_output_key<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; dst_list: dst-&gt;list=policy_bundles, policy-&gt;bundles = dst<br>&nbsp; -&gt; NF_HOOK(NF_FORWARD)<br>&nbsp; -&gt; ip_forward_finish <br>&nbsp; -&gt; dst_output </div>
<div>&nbsp;</div>
<div>输出:</div>
<div>icmp:<br>icmp_send<br>&nbsp; -&gt; ip_route_output_key<br>&nbsp;&nbsp;&nbsp; -&gt; ip_route_output_flow<br>&nbsp; -&gt; icmp_push_reply<br>&nbsp;&nbsp;&nbsp; -&gt; ip_append_data<br>&nbsp;-&gt; skb_queue_walk<br>&nbsp;&nbsp;&nbsp; -&gt; ip_push_appending_frames<br>&nbsp; <br>tcp:<br>tcp_connect<br>&nbsp; -&gt; ip_route_connect<br>&nbsp;&nbsp;&nbsp; -&gt; ip_route_output_flow<br>tcp_sendmsg<br>&nbsp; -&gt; __tcp_push_appending_frames<br>&nbsp;&nbsp;&nbsp; -&gt; tcp_write_xmit<br>&nbsp;&nbsp; -&gt; tcp_transmit_skb<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; net_xmit_eval<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; icsk-&gt;icsk_af_ops-&gt;queue_xmit == ipv4_specific-&gt;queue_xmit == ip_queue_xmit<br>&nbsp; -&gt; tcp_push_one<br>&nbsp;&nbsp;&nbsp; -&gt; tcp_transmit_skb<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; net_xmit_eval<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; icsk-&gt;icsk_af_ops-&gt;queue_xmit == ipv4_specific-&gt;queue_xmit == ip_queue_xmit<br>&nbsp; </div>
<div>tcp_protocol-&gt;handler == tcp_v4_rcv<br>&nbsp; -&gt; __inet_lookup<br>&nbsp; -&gt; xfrm_policy_check<br>&nbsp; -&gt; tcp_v4_do_rcv<br>&nbsp;&nbsp;&nbsp; -&gt; tcp_rcv_state_process<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; icsk-&gt;icsk_af_ops-&gt;conn_request == tcp_v4_conn_request<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; tcp_v4_send_synack<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; ip_build_and_send_pkt<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; NF_HOOK( NF_OUTPUT )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; dst_output</div>
<div><br>udp:<br>udp_sendmsg<br>&nbsp; -&gt; ip_route_output_flow<br>&nbsp; -&gt; ip_append_data<br>&nbsp;&nbsp;&nbsp; -&gt; __skb_queue_tail( sk_write_queue )<br>&nbsp; -&gt; udp_push_pending_frames<br>&nbsp;&nbsp;&nbsp; -&gt; ip_push_pending_frames</div>
<div>raw:<br>raw_sendmsg<br>&nbsp; -&gt; ip_route_output_flow<br>&nbsp; -&gt; ip_append_data<br>&nbsp;&nbsp;&nbsp; -&gt; __skb_queue_tail( sk_write_queue )<br>&nbsp; -&gt; ip_push_pending_frames</div>
<div><br>ip_push_pending_frames<br>&nbsp; -&gt; __skb_dequeue(sk_write_queue)<br>&nbsp;&nbsp;&nbsp; -&gt; NF_HOOK(NF_OUTPUT)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; dst_output</div>
<div><br>ip_queue_xmit<br>&nbsp; -&gt; ip_route_output_flow<br>&nbsp;&nbsp;&nbsp; -&gt; xfrm_lookup<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; xfrm_find_bundle<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; bundle_create<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; afinfo-&gt;bundle_create == __xfrm4_bundle_create<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; xfrm_dst_lookup<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; afinfo-&gt;dst_lookup == xfrm4_dst_lookup<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; __ip_route_output_key<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; dst_list<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; dst-&gt;list=policy_bundles, policy-&gt;bundles = dst</div>
<div>&nbsp; -&gt; NF_HOOK(NF_OUTPUT)<br>&nbsp; -&gt; dst_output<br>&nbsp;&nbsp;&nbsp; -&gt; dst-&gt;output</div>
<div>&nbsp;</div>
<div>dst_output: dst_list循环<br>&nbsp; -&gt; dst-&gt;output == xfrm_dst-&gt;output == xfrm4_output == xfrm4_state_afinfo-&gt;output<br>&nbsp;&nbsp;&nbsp; -&gt; NF_HOOK(POSTROUTING)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; xfrm4_output_finish<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; gso ?<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; xfrm4_output_finish2<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; xfrm4_output_one<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; mode-&gt;output<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; type-&gt;output<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; skb-&gt;dst=dst_pop(skb-&gt;dst)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; nf_hook(NF_OUTPUT)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; !dst-&gt;xfrm <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; dst_output<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; nf_hook(POSTROUTING)<br>&nbsp; -&gt; dst-&gt;output == ip_output<br>&nbsp;&nbsp;&nbsp; -&gt; NF_HOOK(POSTROUTING)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; ip_finish_output<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; ip_finish_output2<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; hh_output == dev_queue_xmit</div>
页: [1]
查看完整版本: Linux-2.6.21.1 网络函数调用流程