- 论坛徽章:
- 0
|
几乎所有介绍tcp socket中send函数的地方都会提到,send只是把数据拷贝到socket的发送队列就返回了,并不等待从网卡发送出去。按照这么理解的话应该有另外一个内核线程负责把数据从socket发送队列取出然后发送到网络上。
但是我在dev_hard_start_xmit调用了dump_stack(),通过查看函数栈发现send函数事实上一直调到了驱动注册的发送函数ndo_start_xmit。也就是说send是从网卡发送完成后才返回的。这个是不是有矛盾了呢?
[<ffffffff8161bdb8>] dev_hard_start_xmit+
[<ffffffff8161c318>] __dev_queue_xmit+0x3
[<ffffffff8161c510>] dev_queue_xmit+0x10/
[<ffffffff81654df9>] ip_finish_output+0x2
[<ffffffff81656248>] ip_output+0x58/0x90
[<ffffffff816559a5>] ip_local_out+0x25/0x
[<ffffffff81655d0a>] ip_queue_xmit+0x13a/
[<ffffffff8166c889>] tcp_transmit_skb+0x4
[<ffffffff8166cdfa>] tcp_write_xmit+0x10a
[<ffffffff8166da7e>] __tcp_push_pending_f
[<ffffffff8165f1b8>] tcp_sendmsg+0x118/0x
[<ffffffff81097508>] ? finish_task_switch
[<ffffffff81688a74>] inet_sendmsg+0x64/0x
[<ffffffff81312517>] ? apparmor_socket_se
[<ffffffff81601e2b>] sock_sendmsg+0x8b/0x
[<ffffffff8144c442>] ? n_tty_read+0x402/0
[<ffffffff81602371>] SYSC_sendto+0x121/0x
[<ffffffff8109ddf4>] ? vtime_account_user
[<ffffffff810210b5>] ? syscall_trace_ente
[<ffffffff81602d5e>] SyS_sendto+0xe/0x10
[<ffffffff81724f4f>] tracesys+0xe1/0xe6
|
|