linux 网络协议栈(链路层)

2023-11-15

1.int netif_receive_skb(struct sk_buff *skb),该函数是网络设备驱动到链路层协议栈的接口函数,该函数最后会调用__netif_receive_skb_core函数,下面主要介绍函数流程

1.1

  list_for_each_entry_rcu(ptype, &ptype_all, list) {  //遍历ptype_all,如果有则做相应处理,例如raw socket和tcpdump实现  
        if (pt_prev)  
            ret = deliver_skb(skb, pt_prev, orig_dev);  
        pt_prev = ptype;  
    } 

主要遍历ptype_all链表的所有成员,然后执行成员里的处理函数,PF_PACKETsocket和tcpdump等实现都在这里了

1.2

rx_handler = rcu_dereference(skb->dev->rx_handler);   
     if (rx_handler) {  
         if (pt_prev) {  
             ret = deliver_skb(skb, pt_prev, orig_dev);  
             pt_prev = NULL;  
         }  
//根据处理结果,判断接下来对数据包如何进一步处理。  
         switch (rx_handler(&skb)) {  
//数据包已成功接收,不需要再处理  
         case RX_HANDLER_CONSUMED:  
             ret = NET_RX_SUCCESS;  
             goto unlock;  
//当rx_handler改变过skb->dev时,在接收回路中再一次处理。  
         case RX_HANDLER_ANOTHER:  
             goto another_round;  
//不使用匹配的方式,精确传递。  
         case RX_HANDLER_EXACT:  
             deliver_exact = true;  
//忽略rx_handler的影响。  
         case RX_HANDLER_PASS:  
             break;  
        default:  
             BUG();  
         }  
     }  

 可以看到这里首先从设备结构net_device中获取其rx_handler指针,该指针在网卡的混杂模式下指向一个处理函数叫做br_handle_frame,即网桥的处理流程

1.3

    if (likely(!deliver_exact)) {  
        deliver_ptype_list_skb(skb, &pt_prev, orig_dev, type,   //根据全局定义的协议处理报文  
                       &ptype_base[ntohs(type) &  
                           PTYPE_HASH_MASK]);  
    }

这里是从链路层进入上层的地方

 

链路层和上层连接主要通过:ptype_all  ptype_base两链表

(1)    ptype_all管理的协议主要用于分析目的,它接收所有到达第3层协议的数据包。
(2)    ptype_base管理正常的3层协议,仅接收具有正确协议标志符的数据包,例如,Internet的0x0800。

这个目前支持的协议类型:其中ETH_P_IP, ETH_P_ARP, ETH_P_8021Q,  是我们比较关注的

2. 下面介绍桥处理:br_handle_frame

先上一张图

2.

首先根据dev->br_port判断收到报文的接口是否加入某个桥,如果加入则该报文进入桥处理。

桥处理首先判断该报文是否是 stp协议,如果是stp报文,则判断是否stp开启,如果开启,进去stp处理流程,如果,没有则不处理。

如果报文不是stp协议,则判断目的mac是否是网桥下的某个接口的mac,如果是则把in_dev改成网桥自己,然后重新走一遍协议栈,然后这个报文被送进网络层进行路由。如果目的mac不是网桥下的接口的mac,直接进行二层转发。

 上面讲到进行三层路由,如果路由的目的ip任然是一个网桥,在调用dev_queue_xmit发送的时候,因为出接口是网桥,则会被br_dev_xmit接管,然后进行二层转发,找到实际出接口,再次调用dev_queue_xmit发送。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux 网络协议栈(链路层) 的相关文章

  • 用于时间线数据的类似 gnuplot 的程序

    我正在寻找一个类似 gnuplot用于在时间轴中绘制数据图表的程序 类似 gnuplot 在 Linux 上运行 命令行功能 GUI 对我帮助不大 可编写脚本的语法 输出为 jpg png svg 或 gif 输出应该是这样的 set5 s
  • 套接字发送调用被阻塞很长时间

    我每 10 秒在套接字上发送 2 个字节的应用程序数据 阻塞 但发送调用在下面的最后一个实例中被阻塞超过 40 秒 2012 06 13 12 02 46 653417 信息 发送前 2012 06 13 12 02 46 653457 信
  • 为什么 call_usermodehelper 大多数时候都会失败?

    从内核模块中 我尝试使用 call usermodehelper 函数来执行可执行文件 sha1 该可执行文件将文件作为参数并将文件的 SHA1 哈希和写入另一个文件 名为输出 可执行文件完美运行 int result 1 name hom
  • Apache LOG:子进程 pid xxxx 退出信号分段错误 (11)

    Apache PHP Mysql Linux 注意 子进程 pid 23145 退出信号分段错误 11 tmp 中可能存在 coredump 但 tmp下没有找到任何东西 我怎样才能找到错误 PHP 代码中函数的无限循环导致了此错误
  • 从哪里获取 iostream.h

    我正在尝试在 Linux 中做一些事情 但它抱怨找不到 iostream h 我需要安装什么才能获取此文件 这个标准头的正确名称是iostream没有扩展名 如果您的编译器仍然找不到它 请尝试以下操作 find usr include na
  • 如果输入被重定向则执行操作

    我想知道如果我的输入被重定向 我应该如何在 C 程序中执行操作 例如 假设我有已编译的程序 prog 并且我将输入 input txt 重定向到它 我这样做 prog lt input txt 我如何在代码中检测到这一点 一般来说 您无法判
  • 如何在 bash_profile 文件中添加导出语句?

    我正在尝试了解是否必须添加导出语句来在 bash profile 文件中设置变量 我该怎么做呢 例如 如果我必须添加 export AX name 那么我应该将其简单地写在文件末尾还是我还需要编写其他内容 简单写一下export AS na
  • 无法连接到 Azure Ubuntu VM - 公钥被拒绝

    我们在 Azure 上使用 Ubuntu VM 一段时间了 很少遇到任何问题 然而 其中一台虚拟机最近出现了问题 出乎意料的是 Ubuntu VM 开始拒绝公钥 ssh i azure key email protected cdn cgi
  • C++ Linux GCC 应用程序中的 GUID

    我有很多服务器运行这个 Linux 应用程序 我希望他们能够生成一个碰撞概率较低的 GUID 我确信我可以从 dev urandom 中提取 128 个字节 这可能没问题 但是有没有一种简单易用的方法来生成与 Win32 更等效的 GUID
  • Linux 中有没有一种轻量级的方法来获取当前进程数?

    我希望我的 基于 C C 的 程序显示一个数字指示器 指示本地系统上当前有多少个进程 将经常查询正在运行的进程数值 例如每秒一次 以更新我的显示 有没有一种轻量级的方法来获取该数字 显然我可以调用 ps ax wc l 但我不想强迫计算机生
  • BeagleBone Black 如何用作大容量存储设备?

    是否可以使用 BB 作为大容量存储设备 我希望将其连接到可以从 USB 连接 例如 USB 闪存驱动器 读取文件的音频播放器并充当包含一个特定文件夹的数据存储设备 及其子文件夹 从文件系统 如果可能 在连接到开发板的闪存驱动器上 正如设备规
  • grep 彩色线条

    我编写了一个简单的 PHP shell 脚本 它解析文件并输出某些元素 它产生大量的输出 采用不同的 bash 颜色 绿色表示正常 黄色表示警告 红色表示错误等 在开发过程中我想过滤掉一些行 例如 所有包含红色文本的行 我可以使用grep
  • 在 Linux 服务器上创建和编辑 MS-Word 文档?

    希望开发处理文档的服务器端应用程序 源文档大多是MS Word 2003 2007 即MS版本的Docx 希望服务器应用程序能够在linux或windows上运行 想知道在linux下读写MS Word文件最好的工具或库是什么 兼容性是最重
  • 如何使用 PyAudio 选择特定的输入设备

    通过 PyAudio 录制音频时 如何指定要使用的确切输入设备 我的电脑有两个麦克风 一个内置 一个通过 USB 我想使用 USB 麦克风进行录音 这流类 https people csail mit edu hubert pyaudio
  • 如何在C程序中直接改变显存映射来绘制像素(无需库函数)

    是否可以通过使用 C 程序更改 RAM 中屏幕 视频即监视器 内存映射中的值来显示黑点 我不想使用任何库函数 因为我的主要目标是学习如何开发简单的操作系统 我尝试访问起始屏幕内存映射 即 0xA0000 在 C 中 我尝试运行该程序 但由于
  • 进程如何知道它已收到信号

    如果我错了 请纠正我 以下是我对信号的理解 据我所知 信号生成 和信号传递有2个不同 事物 为了产生信号 操作系统只是在位数组中设置一个位 在过程控制中维护 工艺块 PCB 每一位 对应于特定信号 当设置一个位时 这意味着 该位对应的信号为
  • 删除 Python 中某些操作的 root 权限

    在我的 Python 脚本中 我执行了一些需要 root 权限的操作 我还创建并写入文件 我不想由 root 独占所有 而是由运行我的脚本的用户独占所有 通常 我使用以下命令运行脚本sudo 有办法做到上述吗 您可以使用以下方式在 uid
  • sudo pip install python-Levenshtein 失败,错误代码 1

    我正在尝试在 Linux 上安装 python Levenshtein 库 但每当我尝试通过以下方式安装它时 sudo pip install python Levenshtein 我收到此错误 命令 usr bin python c 导入
  • “./somescript.sh”和“. ./somescript.sh”有什么区别

    今天我按照一些说明在 Linux 中安装软件 有一个需要首先运行的脚本 它设置一些环境变量 指令告诉我执行 setup sh 但是我执行时犯了一个错误 setup sh 所以环境没有设置 最后我注意到了这一点并继续进行 我想知道这两种调用脚
  • php56 - CentOS - Remi 仓库

    我刚刚在测试盒上安装了 php 5 6 正常的 cli php 解释器似乎不存在 gt php v bash php command not found gt php56 v PHP 5 6 13 cli built Sep 3 2015

随机推荐

  • 内窥镜去反光的论文整理

    文章目录 内窥镜去反光的论文整理 Detection and correction of specular reflections for automatic surgical tool segmentation in thoracosco
  • YSlow--Web前端性能测试工具

    1 介绍 YSlow是Yahoo发布的一款基于FireFox的插件 这个插件可以分析网站的页面 并告诉你为了提高网站性能 如何基于某些规则进行优化 它可以分析任何网站 并为每一个规则产生一个整体报告 如果页面可以进行优化 则YSlow会列出
  • mysql workbench 错误  Error Code: 1046. No database selected Select the default DB to be used by doubl

    mysql workbench 错误 Error Code 1046 No database selected Select the default DB to be used by double clicking its name in
  • mac 本地打安卓包 platforms;android-28 Android SDK Platform 28

    A newer version of the Android SDK is required To update run Users xxx Library Android sdk tools bin sdkmanager update 转
  • 自己理解的智能指针

    看安卓内核 第一章就碰到智能指针了 看了网上的一些文章 自己实践了一下 自己的体会 普通指针直接为某个具体类型分配空间 对该空间的管理直接由指针来操作 T p new T t 智能指针相当于对该空间进行封装 智能指针实际是一个类 share
  • SPOJ QTREE4 Query on a tree IV (边分治 + 堆)

    题意 给定一棵树 节点有黑白两种颜色 有正负的边权 有两种操作 一种是修改反转某个节点的颜色 另一种是询问树上最远的两个白色节点的距离 思路 树剖 堆维护的代码还是没敢去码 以后再补了 这里用边分治 堆来维护 边分治的优点比起点分支来说 优
  • 编写一个程序,提示用户输入一周工作的小时数,然后打印工资总额、税金和净收入。

    编写一个程序 提示用户输入一周工作的小时数 然后打印工资总额 税金和净收入 首先做如下假设 基本工资 10 00美元 小时 加班 超过40小时 1 5倍的时间 税率 前300美元为15 续150美元为20 余下的为25 用 define定义
  • 【马士兵】Python基础--10(集合)

    Python基础 10 文章目录 Python基础 10 什么是集合 集合的创建 集合的相关操作 集合间的关系 集合的数据操作 集合生成式 列表 字典 元组 集合总结 什么是集合 集合的创建 集合中元素不允许重复 集合中元素无序 s 23
  • Android 去掉Button自带边框

    android background null 将边框去掉
  • Vue - 安装less-loader

    文章目录 直接安装 遇到问题 与webpack版本不兼容 查看当前使用webpack版本 查看所有webpack版本 查看less loader历史版本 安装兼容版本less loader 直接安装 npm i less loader 下面
  • 字节流和字符流的转化

    Java中字节流和字符流是可以相互转换的 OutputStreamWriter 将字节输出流转换成字符输出流 是 writer 的子类 InputStreamReader 将字节流转换成字符输入流 是Reader 的子类 一般操作输入输出内
  • AOP JoinPoint中的方法

    获取参数的值数组 Object args point getArgs 1 参数的值 获取目标对象 被加强的对象 Object target point getTarget 获取signature 该注解作用在方法上 强转为 MethodSi
  • MySQL卸载不干净回不到初始安装页面(MySQL Connector Net卸载不了),重装报错Database initialization failed等问题解决办法

    首先 这篇文章适合 1 常规卸载方法无法卸载干净导致重装始终回不到初始安装页面 即回不到下图初始状态 始终是welcome back 这部分我会单独讲一下MySQL Connector Net卸载不了的问题 2 重装过程中Database
  • java之socket编程(NIO)

    效果展示 原理分析 NIO 非阻塞型 IO 自从 jdk 1 4 之后 增加了 nio 库 支持非阻塞型 IO 操作 代码展示 package NIO import java net InetSocketAddress import jav
  • 使用 Styled Components 编写样式化组件

    本文已整理到 Github 地址 blog 如果我的内容帮助到了您 欢迎点个 Star 鼓励鼓励 我希望我的内容可以帮助你 现在我专注于前端领域 但我也将分享我在有限的时间内看到和感受到的东西 Styled Components 是一个 C
  • 【ios开发技术】Swift 语言深入--Swift设计模式 (2/2)

    Getting Started 让我们开始 你可以下载the project source from the end of part 1与我们共同来探索 这是你在第一部分结束时完成的音乐库App样品 应用程序的最初设计包括在屏幕的顶端上上水
  • Mybatis--sql多对一的处理

    我们先来看看下图所示的例子 学生和老师之间就是一种多对一的关系 对于学生这边而言 多个学生关联一个老师 多对一 这是关联 对于老师这边而言 一个老师包含多个学生 一对多 这是集合 测试多对一实例 数据库表如下图所示 步骤一 构造学生实体类S
  • 雷蛇鼠标宏文件_雷蛇毒蝰终极版无线游戏鼠标评测

    目前的游戏鼠标产品已经逐渐向着轻量化的道路发展 目前上市的鼠标中 有不少都是以极致轻盈的重量惊艳四座 不久前 一款主打轻量化的Razer Viper有线鼠标上市 作为一款中大手型鼠标 它仅有69g的重量 并且还拥有不错的操控感和性能表现 从
  • 在直流电源(Vcc)和地之间并接电容的作用

    本文整理自网络 1 在直流电源 Vcc 和地之间并接电容的电容可称为滤波电容 滤波电容滤除电源的杂波和交流成分 平滑脉动直流电压 储存电能 取值一般100 4700uF 取值与负载电流和对电源的纯净度有关 容量越大越好 有时在大电容傍边会并
  • linux 网络协议栈(链路层)

    1 int netif receive skb struct sk buff skb 该函数是网络设备驱动到链路层协议栈的接口函数 该函数最后会调用 netif receive skb core函数 下面主要介绍函数流程 1 1 list