二:linux内核接收网络数据包处理流程
1,收包
^
|--------------bsd socket层---------
| sys_read fs/read_write.c
| sock_read net/socket.c
| sock_recvmsg net/socket.c
|--------------inet socket层(也可以是PF_pocket层)-----------
inet_create
| inet_recvmsg net/ipv4/af_inet.c
| udp_recvmsg net/ipv4/udp.c
| skb_recv_datagram net/core/datagram.c
| ------------------------------------------- 传输层--------
| sock_queue_rcv_skb include/net/sock.h
| udp_queue_rcv_skb net/ipv4/udp.c
| udp_rcv net/ipv4/udp.c
| ip_local_deliver_finish net/ipv4/ip_input.c
| ip_local_deliver net/ipv4/ip_input.c
| ip_recv net/ipv4/ip_input.c
| net_rx_action net/dev.c
| ----------------------------------链路层----------
| netif_rx net/dev.c
| el3_rx driver/net/3c309.c
| el3_interrupt driver/net/3c309.c
三:linux内核网络数据包发送流程
如果socket(PF_INET,SOCK_DGRAM,IPPROTO_IP)
|--------------socket
| sys_write fs/read_write.c
| sock_writev net/socket.c
| sock_sendmsg net/socket.c
| inet_sendmsg net/ipv4/af_inet.c
|----------------传输层(协议栈)-----------
| udp_sendmsg net/ipv4/udp.c
| ip_build_xmit net/ipv4/ip_output.c
| output_maybe_reroute net/ipv4/ip_output.c
| ip_output net/ipv4/ip_output.c
| ip_finish_output net/ipv4/ip_output.c
|--------------链路层(网卡驱动)---------------
| dev_queue_xmit net/dev.c
| --------------------------------------------
| el3_start_xmit driver/net/3c309.c
V
推断使用socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL))
|--------------socket
| sys_write fs/read_write.c
| sock_writev net/socket.c
| sock_sendmsg net/socket.c (sock->ops = &packet_ops_spkt;)
|----------------传输层(协议栈)-----------
|packet_sendmsg_spkt net/packet/af_packet.c
|--------------链路层(网卡驱动)---------------
| dev_queue_xmit net/dev.c
| --------------------------------------------
| el3_start_xmit driver/net/3c309.c
V