Linux-2.6.21.1 网络函数调用流程
<div>Linux-2.6.21.1 网络函数调用流程</div><div> </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> -> queue<br> -> netif_receive_skb<br> -> bond<br> -> packet_type_all: deliver_skb<br> -> bridge<br> -> packet_type(IPV4)->func == ip_rcv</div>
<div> <br>接收IPv4包:</div>
<div>ip_rcv<br> -> NF_HOOK(PREROUTING)<br> ->ip_rcv_finish<br> -> ip_route_input<br> -> ip_route_input_cached<br> -> ip_route_input_slow<br> -> ip_mkroute_input<br> -> __mkroute_input<br> dst->input = ip_forward<br> dst->output = ip_output<br> -> dst_input<br> -> LOCAL_IN: dst->input == ip_local_deliver<br> -> NF_HOOK(NF_INPUT)<br> -> ip_local_deliver_finish<br> -> ipprot->handler(tcp, udp, icmp ...)<br> -> FORWARD: dst->input == ip_forward</div>
<div> <br>转发:<br> <br>ip_forward<br> -> xfrm4_route_forward (net/xfrm.h, get xfrm_dst) <br> -> xfrm_route_forward<br> -> __xfrm_route_forward<br> -> xfrm_lookup<br> -> xfrm_find_bundle<br> -> afinfo->find_bundle == __xfrm4_find_bundle<br> -> xfrm_bundle_create<br> -> afinfo->bundle_create == __xfrm4_bundle_create<br> tunnel mode<br> -> xfrm_dst_lookup<br> -> afinfo->dst_lookup == xfrm4_dst_lookup<br> -> __ip_route_output_key<br> -> dst_list: dst->list=policy_bundles, policy->bundles = dst<br> -> NF_HOOK(NF_FORWARD)<br> -> ip_forward_finish <br> -> dst_output </div>
<div> </div>
<div>输出:</div>
<div>icmp:<br>icmp_send<br> -> ip_route_output_key<br> -> ip_route_output_flow<br> -> icmp_push_reply<br> -> ip_append_data<br> -> skb_queue_walk<br> -> ip_push_appending_frames<br> <br>tcp:<br>tcp_connect<br> -> ip_route_connect<br> -> ip_route_output_flow<br>tcp_sendmsg<br> -> __tcp_push_appending_frames<br> -> tcp_write_xmit<br> -> tcp_transmit_skb<br> -> net_xmit_eval<br> -> icsk->icsk_af_ops->queue_xmit == ipv4_specific->queue_xmit == ip_queue_xmit<br> -> tcp_push_one<br> -> tcp_transmit_skb<br> -> net_xmit_eval<br> -> icsk->icsk_af_ops->queue_xmit == ipv4_specific->queue_xmit == ip_queue_xmit<br> </div>
<div>tcp_protocol->handler == tcp_v4_rcv<br> -> __inet_lookup<br> -> xfrm_policy_check<br> -> tcp_v4_do_rcv<br> -> tcp_rcv_state_process<br> -> icsk->icsk_af_ops->conn_request == tcp_v4_conn_request<br> -> tcp_v4_send_synack<br> -> ip_build_and_send_pkt<br> -> NF_HOOK( NF_OUTPUT )<br> -> dst_output</div>
<div><br>udp:<br>udp_sendmsg<br> -> ip_route_output_flow<br> -> ip_append_data<br> -> __skb_queue_tail( sk_write_queue )<br> -> udp_push_pending_frames<br> -> ip_push_pending_frames</div>
<div>raw:<br>raw_sendmsg<br> -> ip_route_output_flow<br> -> ip_append_data<br> -> __skb_queue_tail( sk_write_queue )<br> -> ip_push_pending_frames</div>
<div><br>ip_push_pending_frames<br> -> __skb_dequeue(sk_write_queue)<br> -> NF_HOOK(NF_OUTPUT)<br> -> dst_output</div>
<div><br>ip_queue_xmit<br> -> ip_route_output_flow<br> -> xfrm_lookup<br> -> xfrm_find_bundle<br> -> bundle_create<br> -> afinfo->bundle_create == __xfrm4_bundle_create<br> -> xfrm_dst_lookup<br> -> afinfo->dst_lookup == xfrm4_dst_lookup<br> -> __ip_route_output_key<br> -> dst_list<br> -> dst->list=policy_bundles, policy->bundles = dst</div>
<div> -> NF_HOOK(NF_OUTPUT)<br> -> dst_output<br> -> dst->output</div>
<div> </div>
<div>dst_output: dst_list循环<br> -> dst->output == xfrm_dst->output == xfrm4_output == xfrm4_state_afinfo->output<br> -> NF_HOOK(POSTROUTING)<br> -> xfrm4_output_finish<br> -> gso ?<br> -> xfrm4_output_finish2<br> -> xfrm4_output_one<br> -> mode->output<br> -> type->output<br> -> skb->dst=dst_pop(skb->dst)<br> -> nf_hook(NF_OUTPUT)<br> -> !dst->xfrm <br> -> dst_output<br> -> nf_hook(POSTROUTING)<br> -> dst->output == ip_output<br> -> NF_HOOK(POSTROUTING)<br> -> ip_finish_output<br> -> ip_finish_output2<br> -> hh_output == dev_queue_xmit</div>
页:
[1]