netif_receive_skb 函数注解
//当网络设备收到网络数据包时,最终会在软件中断环境里调用此函数
- int netif_receive_skb(struct sk_buff *skb)
- {
- //ptype_all 用于sniffer这样的程序
- // 发送一份拷贝给这些注册的sniffer程序
- list_for_each_entry_rcu(ptype, &ptype_all, list) {
- if (!ptype->dev || ptype->dev == skb->dev) {
- if (pt_prev)
- ret = deliver_skb(skb, pt_prev, orig_dev);
- pt_prev = ptype;
- }
- }
- // 内核编译开Bridge_config,则将该数据包让网桥函数来处理,否则handle_bridge定义为空操作,
- // 返回skb,让协议栈来处理上层协议。
- skb = handle_bridge(skb, &pt_prev, &ret, orig_dev);
- if (!skb)
- goto out;
- skb = handle_macvlan(skb, &pt_prev, &ret, orig_dev);
- if (!skb)
- goto out;
- //对该数据包转达到其他L3协议的处理函数
- type = skb->protocol;
- list_for_each_entry_rcu(ptype, &ptype_base[ntohs(type)&15], list) {
- if (ptype->type == type &&
- (!ptype->dev || ptype->dev == skb->dev)) {
- if (pt_prev)
- ret = deliver_skb(skb, pt_prev, orig_dev);
- pt_prev = ptype;
- }
- }
- }
int netif_receive_skb(struct sk_buff *skb)
{
//ptype_all 用于sniffer这样的程序
// 发送一份拷贝给这些注册的sniffer程序
list_for_each_entry_rcu(ptype, &ptype_all, list) {
if (!ptype->dev || ptype->dev == skb->dev) {
if (pt_prev)
ret = deliver_skb(skb, pt_prev, orig_dev);
pt_prev = ptype;
}
}
// 内核编译开Bridge_config,则将该数据包让网桥函数来处理,否则handle_bridge定义为空操作,
// 返回skb,让协议栈来处理上层协议。
skb = handle_bridge(skb, &pt_prev, &ret, orig_dev);
if (!skb)
goto out;
skb = handle_macvlan(skb, &pt_prev, &ret, orig_dev);
if (!skb)
goto out;
//对该数据包转达到其他L3协议的处理函数
type = skb->protocol;
list_for_each_entry_rcu(ptype, &ptype_base[ntohs(type)&15], list) {
if (ptype->type == type &&
(!ptype->dev || ptype->dev == skb->dev)) {
if (pt_prev)
ret = deliver_skb(skb, pt_prev, orig_dev);
pt_prev = ptype;
}
}
}
netif_receive_skb()的主要作用体现在两个遍历链表的操作中,其中之一为遍历ptype_all 链,这些为注册到内核的一些 sniffer,将上传给这些sniffer,另一个就是遍历 ptype_base,这个就是具体的协议类型。当 eth1 接收到一个IP数据包时,它首先分别发送一份副本给每个 ptype_all 链表中的 packet_type,它们都由 package_rcv 处理,然后再根据HASH 值,在遍历另一个HASH 表时,发送一份给类型为 ETH_P_IP 的类型,它由 ip_rcv处理。如果这个链中还注册有其它 IP层的协议,它也会同时发送一个副本给它。
netif_receive_skb 函数注解相关推荐
- 深入浅析Python 函数注解与匿名函数
函数注解与匿名函数 关于函数参数的定义,调用以及函数参数的内容 函数注解 在编写函数,当下肯定清楚函数如何使用的.若是函数较为复杂,过段时间,编写者有可能需要花一段时间去重新了解函数的使用,那其他使用 ...
- python3函数重载_9.20 利用函数注解实现方法重载
问题 你已经学过怎样使用函数参数注解,那么你可能会想利用它来实现基于类型的方法重载.但是你不确定应该怎样去实现(或者到底行得通不). 解决方案 本小节的技术是基于一个简单的技术,那就是Python允许 ...
- Kotlin 4. Kotlin 函数注解:Suppress,Volatile, Synchronized, Bindable, RequiresApi,SerializedName
一起来学Kotlin:概念:4. Kotlin 函数注解:Suppress,Volatile, Synchronized, Bindable, RequiresApi,SerializedName 这 ...
- python函数注解
函数参数类型注解 def test(a: str): # 声明传入的a是字符串类型print(a)test("aa") 函数返回值类型注解 返回单个值: def test() -& ...
- netif_receive_skb 函数解析
int netif_receive_skb(struct sk_buff *skb) { //略去一些代码 rcu_read_lock(); //第一步:先处理 ptype_a ...
- Java学习之注解Annotation实现原理
前言: 最近学习了EventBus.BufferKinfe.GreenDao.Retrofit 等优秀开源框架,它们新版本无一另外的都使用到了注解的方式,我们使用在使用的时候也尝到不少好处,基于这种想 ...
- libpcap实现机制及接口函数
1.Libpcap 的工作原理 Libpcap的工作原理可以描述为,当一个数据包到达网卡时,通过网络分接口(即旁路机制)将数据包发给BPF过滤器,匹配通过的数据包可以被libpcap利用创建的套接字P ...
- python中使用函数编程的意义_总结Python编程中函数的使用要点
为何使用函数 最大化代码的重用和最小化代码冗余 流程的分解 编写函数 >>def语句 在Python中创建一个函数是通过def关键字进行的,def语句将创建一个函数对象并将其赋值给一个变量 ...
- Python 3 新特性:类型注解——类似注释吧,反正解释器又不做校验
Python 3 新特性:类型注解 Crossin 上海交通大学 计算机应用技术硕士 95 人赞同了该文章 前几天有同学问到,这个写法是什么意思: def add(x:int, y:int) - ...
最新文章
- 微服务架构 — 服务治理 — 服务监控与告警、服务日志与审计
- 字节跳动客户开发_实习|字节跳动 客户端实习生 1-5面 面经
- Linux多线程实践(8) --Posix条件变量解决生产者消费者问题
- jenkins集群测试环境原理
- 2.5.1 MySQL数据库备份恢复基础讲解
- mysql如果带有换行的处理方式
- 活久见啊,WPF工资已经这么高了!
- spring mvc学习(24):配置maven环境和创建maven项目(建议收藏,超全超详细)
- LB-createLB整理架构图-loadbalancer-openstack F版
- 手动安装lzop压缩工具 - JerryMo06的专栏 - 博客频道 - CSDN.NET
- java可以看懂php代码吗_可以自己给自己理发吗?看懂这六点细节就能给自己理发了...
- 获取进程列表和结束进程
- 白帽SQL注入实战过程记录(2)——根据information_schema组装SQL注入语句
- python中的复数虚部_python复数的虚部怎么表达
- oracle裁员原因_导致Oracle全球性裁员的原因有哪些?
- python实现微信机器人 + 淘宝客自动领券(二)
- 扫雷——关于展开空格的算法
- 淘宝电商评论数据可视化分析系统-电商评论分析系统
- 【论文阅读笔记】:CGD: Multi-View Clustering via Cross-View Graph Diffusion
- 嵌入式单片机基础篇(十三)之 STM32 内部温度传感器
热门文章
- C# 如何遍历一个实体的所有字段并给另外一个实体赋值,包含子实体也可以
- Android 实现图片轮播的三种方法,android开发者论坛
- 网易互娱将星N计划空宣 要点速记
- Huffman 编码 实验报告
- sql查询 同一个字段 同时满足多个条件
- 如何在linux系统安装搜狗输入法,在Ubuntu 12.04 LTS版本下安装搜狗输入法 for Linux...
- [普通物理] 简谐运动以及例题
- 充电桩 2020:大火一年,它依然没赚到钱
- 2022-2028年全球商用密码收入年复合增长率CAGR为19.5%
- 解决tomcat 启动 An incompatible version [1.2.14] of the APR based Apache Tomcat Native library 错误