版本说明

Linux版本: 3.10.103
网卡驱动: ixgbe

网络协议注册

  • br_add_if主要是注册桥处理函数br_handle_frame给skb->edv->rx_handler。
  • netdev_create–>netdev_rx_handler_register主要是注册接收函数netdev_frame_hook,此处是给openvswitch的datapath用的。

报文接收

网卡调用__netif_receivve_skb_core后,会调用skb->dev->rx_handler处理2层协议函数,此处只关注桥的,暂不关注ovs的。

br_handle_frame

  • 首先判定mac是否本地,是本地的报文则进入到NFPROTO_BRIDGE的NF_HOOK,即NF_BR_LOCAL_IN,进入处理链,最终完成后调用br_handle_local_finish完成操作,等着进入再上一层的协议。
  • 如果不是本地,则进入转发流程,如果直接转发状态,则调用br_should_route_hook,即ebt_route;如果是学习状态是NF_HOOK,即NF_BR_PRE_ROUTING,进入处理链,最终完成调用br_handle_frame_finish。
  • 然后调用br_fdb_update学习源MAC地址,更新MAC地址表,__br_fdb_get或者目的MAC对应的端口。
  • 如果查找到了端口,调用br_forward转发到对应的端口。 找不到端口,调用br_flood_forward进行广播。
  • br_forward继续调用NF_HOOK的NF_BR_FORWARD,完成后调用br_forward_finish,继续调用NF_HOOK的NF_BR_POST_ROUTING,最终调用br_dev_queue_push_xmit。
  • br_dev_queue_push_xmit–>dev_queue_xmit进行L2的发送。

报文发送

dev_queue_xmit

  • netdev_pick_tx主要是选择发送设备设置的映射关系,查找当前CPU对应的队列,如果多个则计算hash,确定队列。
  • 支持入队的话,调用__dev_xmit_skb进行下一步的操作。不支持队列的话调用dev_hard_start_xmit进行数据的发送。

__dev_xmit_skb

  • 如果队列的状态是非活跃的,则丢包。
  • 如果是支持bypass,则调用sch_direct_xmit直接发送数据包,没有发送完成,继续调用__qdisc_run。
  • 其他情况入队并且调用__qdisc_run。

__qdisc_run

  • while循环调用qdisc_restart,进行的操作为skb出队,并且调用sch_direct_xmit直接发送数据包,没有发送完成,返回值非0,继续参与循环。
  • 一直循环到数据包发送完毕,或者权重耗完或者需要重新调度,此时调用__netif_schedule–>__netif_reschedule,将当前的队列记录在CPU的softnet_data,触发软中断NET_TX_SOFTIRQ,调用net_tx_action。

sch_direct_xmit

  • 直接调用dev_hard_start_xmit–>ops->ndo_start_xmit–>ixgbe_xmit_frame发送数据包。
  • 如果发送成功,则返回值为队列剩下的数据包量。
  • 如果被自己CPU锁了则报错,被其他CPU锁了则重新入队,等以后再发送。
  • 如果busy的话重新入队,等以后发送。
  • 所以其实就是发送完成则返回成功0,否则发送非0。

L2报文处理流程图:

原文链接:https://zhaozhanxu.com/2016/07/13/Linux/2016-07-13-Linux-Kernel-Pkts_Processing2/

linux内核网络协议栈--2层报文处理(十七)相关推荐

  1. linux内核网络协议栈--ip层报文转发之ip_local_out()函数(六)

    IP层本地报文发送有两个函数ip_local_out和ip_local_out_sk,实际实现两者是等同的,因为本地发送的报文,skb必然关联着一个sock对象. 1.ip_local_out函数 s ...

  2. linux 内核网络协议栈--IP层开始直到包被处理(三)

    先看看ip头结构: struct iphdr struct iphdr {#if defined(__LITTLE_ENDIAN_BITFIELD) // 小端__u8 ihl:4, // 首部长度( ...

  3. Linux内核网络协议栈流程及架构

    文章目录 Linux内核网络报文处理流程 Linux内核网络协议栈架构 Linux内核网络报文处理流程 linux网络协议栈是由若干个层组成的,网络数据的处理流程主要是指在协议栈的各个层之间的传递. ...

  4. Linux内核网络协议栈:udp数据包发送(源码解读)

    <监视和调整Linux网络协议栈:接收数据> <监控和调整Linux网络协议栈的图解指南:接收数据> <Linux网络 - 数据包的接收过程> <Linux网 ...

  5. 深入浅出Linux内核网络协议栈|结构sk_buff|Iptables|Netfilter丨内核源码丨驱动开发丨内核开发丨C/C++Linux服务器开发

    深入浅出Linux内核网络协议栈 视频讲解如下,点击观看: 深入浅出Linux内核网络协议栈|结构sk C/C++Linux服务器开发高级架构师知识点精彩内容包括:C/C++,Linux,Nginx, ...

  6. Linux 内核网络协议栈运行原理

    封装:当应用程序用 TCP 协议传送数据时,数据首先进入内核网络协议栈中,然后逐一通过 TCP/IP 协议族的每层直到被当作一串比特流送入网络.对于每一层而言,对收到的数据都会封装相应的协议首部信息( ...

  7. linux内核网络协议栈--linux网络设备理解(十三)

    网络层次 linux网络设备驱动与字符设备和块设备有很大的不同. 字符设备和块设备对应/dev下的一个设备文件.而网络设备不存在这样的设备文件.网络设备使用套接字socket访问,虽然也使用read, ...

  8. linux内核网络协议栈--网卡报文收发(十六)

    版本说明 Linux版本: 3.10.103 网卡驱动: ixgbev 报文收发简单流程 网卡驱动默认采用的是NAPI的报文处理方式.即中断+轮询的方式,网卡收到一个报文之后会产生接收中断,并且屏蔽中 ...

  9. 一文讲解Linux 内核网络协议栈-数据从接收到ip层

    [推荐阅读] 一文了解Linux上TCP的几个内核参数调优 一文剖析Linux内核中内存管理 分析linux启动内核源码 此处主要讲的是从数据来到,中断到最终数据包被处理的过程. 0:首先来介绍一下I ...

最新文章

  1. 画原理图和PCB图该注意什么?
  2. 删除链表的中间节点和a/b处的节点
  3. excel只对筛选后的结果单独用公式
  4. BlockChain:Python一步一步实现(流程最清楚)区块链底层技术流程图(理解一目了然,值得收藏)
  5. 1小时学会建站(二):购买及绑定域名
  6. 简单的 php 防注入、防跨站 函数
  7. jquery-基础事件[下]
  8. ListView列表刷新方法的区别
  9. linux系统下find命令的使用
  10. 用usbserver实现加密狗共享
  11. 华为交换机 查ip冲突_华为交换机根据ip查端口号
  12. 读史可以明智_明智之举:获得满意的广告
  13. 红米手机html文件,红米手机怎么传文件到电脑
  14. 测试开发之路-我的处女作
  15. 网页里如何嵌入服务器控制,在嵌入式设备中实现Web动态服务与Web控制的实现思路...
  16. 一键制作所有微信好友头像墙照
  17. 微软在文件夹里插广告,把用户恶心到了,官方:试验功能,不小心推送了!...
  18. ESXi社区版网卡驱动2022年3月更新
  19. ios 弹起软键盘position: fixed;失效
  20. 动态规划特训:切木棍(UVA10003)区间切分dp

热门文章

  1. python填写excel-python读写Excel
  2. python心得体会-终于懂得python基础学习心得
  3. python2好还是python3好-Python 2 和 Python 3 有哪些主要区别?
  4. python真的很厉害吗-学会Python后都能做什么?网友们的回答简直不要太厉害
  5. python requests下载文件很慢-python requests 下载大文件不完整
  6. 用python的turtle画圆-(python海龟绘图怎么增加每次画圆的半径)
  7. 济南python工资一般多少钱-济南学Python的机构排名
  8. python处理excel视频-从零基础开始用Python处理Excel数据 视频教程
  9. python主要运用于-python主要应用领域有哪些?看这一篇就够了
  10. 安装yaml报错:ERROR: Cannot uninstall 'PyYAML'.