- 论坛徽章:
- 0
|
IP报文经由函数路径。还是发在这里,看程序的人多。对读KERNEL网络部分程序会有帮助的。
(原来发在linux 网络问题 上)
以下是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 |
|