Linux内核skb处理流程图,Linux内核VLAN学习笔记

四、发送流程

对于L5来说,一般的网络通讯,首先是建立一个socket结构,sockfd = socket(AF_INET,SOCK_RAW,protocol->p_proto)执行系统调用sys_socketcall(/net/socket.c),接着sendto函数调用系统调用sys_sendto(/net/socket.c),处理完用户空间和内核空间的转换后,进入L3。

L3层一方面包装好sk_buffer,一方面调用ip_route_output_flow路由表查询函数,找到net_device网卡设备,内核中的vlan模块就是注册了这样一个模拟的网络设备(eth0.y)。

对于L2来说, L3协议栈通过dev_queue_xmit(dev.c)调用dev->hard_start_xmit(),关联到了具体的网络设备处理函数,从而调用了vlan_dev_hard_start_xmit(vlan_dev.c),在这里生成vlan tag头,并压入sk_buffer中,然后找到真实的网络设备(real_dev),再次调用dev_queue_xmit,进入真实的网卡驱动L1层。

对于L1来说,hard_start_xmit就是fcc_enet.c的fcc_enet_start_xmit函数,将L2层送来的skb压入队列中,修改寄存器,将报文发送出去。注意到这时候的skb已经是一个很完整的结构了,可以很容易对skb做各种判断和处理,此次的按协议划分vlan最后就是在这里完成。虽然到现在也觉得在这里修改实在是太不优雅,太不易扩展了,但不得不承认,因为skb的完整,在这里修改的工作量是最小的,而且不需要对Linux内核网络框架有什么深入的了解就可以着手修改。

发送流程图

a6efb3d465477924a9b97d8013afabbe.png0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux内核中,skb是指socket buffer,它是用来在不同层级之间传递数据的数据结构。skb内核中的使用非常广泛,它可以包含不同协议层的报文,例如ARP、IP等。[1] 对于skb处理内核使用child结构体变量来指向第二个sk_buff结构体的内存地址。在代码中,可以通过(child + 1)来获取引用计数器的开始地址,进而对skb进行操作。 当需要释放skb时,内核使用kfree_skb()函数进行释放。该函数首先判断skb是否为空,如果为空则直接返回。然后,通过判断引用计数器的值,决定是否继续释放skb。如果引用计数器的值为1,表示只有当前正在使用的引用,那么就可以进行释放。否则,如果引用计数器的值不为1,则返回。释放skb的具体实现是通过调用__kfree_skb()函数来完成的。 在__kfree_skb()函数中,首先调用skb_release_all()函数释放skb的头部状态,然后再调用skb_release_data()函数释放skb的数据部分。 总结来说,在Linux内核中,skb是用于在不同层级之间传递数据的数据结构,对于skb处理包括分配、释放等操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [ipv4_linux内核skb处理流程图_](https://download.csdn.net/download/weixin_42666036/25945917)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [linux 内核网络 sk_buff 之申请和释放 Ⅲ](https://blog.csdn.net/wangquan1992/article/details/112603882)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [sk_buff封装和解封装网络数据包的过程详解](https://blog.csdn.net/weixin_33911824/article/details/89867585)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值