linux發包流程


轉載: http://www.verydemo.com/demo_c167_i125773.html

sendto-->sys_sendto(socket.c)-->sock_sendmsg(socket.c)-->__sock_sendmsg(socket.c)-->sendmsg(socket.c)這個調用是通過sock->ops->sendmsg實現的,sock是socket結構類型,
socket->ops(inet_dgram_ops)->sendmsg(Af_inet.c上定義) UDP報文是sendmsg = inet_sendmsg
調用inet_sendmsg--> (調用sk->sk_prot->sendmsg(udp.c)) sk->sk_prot->sendmsg在udp.c上定義,此處sendmsg=udp_sendmsg-->udp_push_pending_frames-->ip_push_pending_frames-->
ip_local_out-->dst_output-->(skb_dst(skb)->output(skb))skb_dst(skb)得到struct dst_entry,路由頂層?? (route.c 定義了output = ip_output input = ip_forward)  此處output = ip_output(Ip_output.c)-->ip_finish_output-->ip_finish_output2-->dst->neighbour->output or neigh_hh_output

dst->neighbour->output = neigh_resolve_output(arp.c指向neighbour中實現)-->(neigh->ops->queue_xmit)實際queue_xmit = dev_queue_xmit(arp.c)
neigh_hh_output-->hh->hh_output = dev_queue_xmit(arp.c,dev.c實現)

dev_queue_xmit(dev.c)-->dev_hard_start_xmit-->ops->ndo_start_xmit(ops->ndo_start_xmitstruct net_device_ops *ops = dev->netdev_ops)
到達網卡將數據包發送出去


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM