函数实现
static const struct net_device_ops dm9000_netdev_ops = {
.ndo_init = dm9000_init,
.ndo_open = dm9000_open,
.ndo_stop = dm9000_stop,
.ndo_start_xmit = dm9000_start_xmit,
}
register_netdev 之后的 函数调用顺序
-----------------------------------STEP1
dm9000_init
-----------------------------------STEP2
dm9000_open
dm9000_poll_work
dm9000_interrupt
dm9000_poll_work
-----------------------------------STEP3
dm9000_start_xmit
...
dm9000_start_xmit
...
dm9000_start_xmit
为什么网卡注册了之后 会一直不断 xmit
因为会有很多工作工作队列和工作任务做 xmit
Workqueue: events xprt_destroy_cb
Workqueue: rpciod rpc_async_schedule
Workqueue: xprtiod xs_tcp_setup_socket
-------------------------------------------------
下面以 xs_tcp_setup_socket 为例,介绍一下流程
xs_tcp_setup_socket
fs_initcall(init_sunrpc);
init_sunrpc
init_socket_xprt
xprt_register_transport(&xs_tcp_transport);
xs_setup_tcp
INIT_DELAYED_WORK(&transport->connect_worker, xs_tcp_setup_socket);
rpc_async_schedule
__rpc_execute
call_connect
xprt_connect
xs_connect
queue_delayed_work(xprtiod_workqueue, &transport->connect_worker, delay);
Workqueue: xprtiod xs_tcp_setup_socket
ret_from_fork->kthread->worker_thread
worker_thread
xs_tcp_setup_socket
kernel_connect
inet_stream_connect
__inet_stream_connect
tcp_v4_connect
tcp_connect
ip_queue_xmit4
__ip_queue_xmit
ip_local_out
ip_output
__ip_finish_output
ip_finish_output2
neigh_resolve_output
__neigh_event_send
neigh_probe
arp_solicit
arp_send_dst.part.1
dev_queue_xmit
__dev_queue_xmit
__qdisc_run
sch_direct_xmit
dev_hard_start_xmit
dm9000_start_xmit