网络设备驱动
2020-05-25 13:59:25 0 举报
根据linux内核5.3版本整理的网络协议栈中的网络设备驱动流程框图,方便大家学习linux内核网络设备驱动的报文转发逻辑
作者其他创作
大纲/内容
enqueue_to_backlog
validate_xmit_vlan
ppp_receive_mp_frame查找对应的多个通道
ppp_send_frame
dev_hard_start_xmit
dev_queue_xmit
PPPIOCCONNECT将通道加入到接口单元的链表中
在二层进行转发
__netif_receive_skb_core
NF_BR_POST_ROUTING
释放设备缓冲区资源并查看cpu发送队列还有无数据需要发送
ppp_push
1
netif_rx
br_netif_receive_skb此时skb的dev已经变成网桥的dev
NF_BR_LOCAL_OUT
ppp_do_recv
ppp_async_push
ppp_async_encode在发送前对数据进行成帧封装使其能在tty链路上发送
PPPIOCATTACH绑定通道tty
对组播报文进行洪泛
NF_BR_LOCAL_IN
网卡驱动接收报文
vlan_do_receive
网桥注册的发送函数 br_dev_xmit
ppp_receive_frame
是
触发NET_TX_SOFTIRQ软中断
ppp设备流程图
2
__netdev_start_xmit
ppp链路初始化
否
添加到cpu的input_pkt_queue队列
__qdisc_run
触发软件中断
设置NET_RX_SOFTIRQ触发软中断
使用register_vlan_device注册一个vlan设备
触发硬件中断
若接收队列不为空
br_handle_frame
若是网桥设备
在字符设备上接收到数据
CPU
通过tasklet_schedule触发软中断调用ppp_async_process
__netif_receive_skb
__napi_schedule
判断是否是ETH_P_8021Q,ETH_P_8021AD
napi_poll
将设备添加网桥中br_add_if
读取网卡数据并填充到skb中
发包
ppp_receive_nonmp_frame从ppp协议封装里去除报文内容
将backlog添加到poll list中
广播地址或找不到单播的br_fdb转发表项
在字符设备上发送数据
判断vlan_present,vlan_tci标志,是否需要在skb里添加tag
____napi_schedule
内核协议栈
二层转发
__dev_queue_xmit
br_pass_frame_up
pppoe
收包
__br_forward
能够通过br_fdb找到转发的接口
判断驱动是否支持流量控制队列
判断接收的网络设备是否注册了rx_handler回调函数
通过 PPPIOCATTCHAN绑定现有的接口单元ppp0
通过流量算法q->dequeue(q)从队列中取出skb
异步传输
br_forward_finish
当目的MAC为本地主机时
qdisc_restart
NF_BR_PRE_ROUTING
pppd进程判段接口单元是否已经创建
若发送队列为空
将组播报文送到组播协议栈处理
net_rx_action
驱动中断处理函数
ppp_async_process
PPPIOCNEWUNIT来创建新的接口单元ppp0,并将file->private_data赋值为ppp->file
调用网卡驱动发送
CPU的output_queue有数据需要发送
同步传输
判断backlog虚拟设备是否启动
vlan_dev_hard_start_xmit给报文设置vlan_present,vlan_tci标志并将 skb->dev改为 vlan->real_dev
通过查找skb->protocol对应的协议处理函数来处理报文
ppp_start_xmit通过skb的skb->protocol字段选择ncp协议类型,给报文封装ppp协议字段
ppp_async_send
br_flood
br_multicast_rcv
br_forward
net_tx_action
组播igmp snooping协议栈
NF_BR_FORWARD
vlan设备流程图
dev_kfree_skb_any
dequeue_skb
调用backlog 设备的process_backlog
ppp_input
ppp_async_input将数据还原成报文
nf_hook_bridge_pre
netdev_rx_handler_register
是否使用多传输通道
ppp_unattached_ioctl
br_dev_queue_push_xmit
将skb的dev改为vlan设备的dev
调用tty设备进行发送tty->ops->write
ppp_asynctty_receive
调用netif_napi_add 注册napi的poll函数,同时关闭硬件中断
br_handle_frame_finish
skb_vlan_untag去掉vlan,给报文设置vlan_present,vlan_tci标志
br_multicast_flood
开始通过lcp协商建立链路
0 条评论
下一页