//当网络设备收到网络数据包时,最终会在软件中断环境里调用此函数    
//当网络设备收到网络数据包时,最终会在软件中断环境里调用此函数  
[cpp] view plaincopyprint?
  1. int netif_receive_skb(struct sk_buff *skb)
  2. {
  3. //ptype_all 用于sniffer这样的程序
  4. // 发送一份拷贝给这些注册的sniffer程序
  5. list_for_each_entry_rcu(ptype, &ptype_all, list) {
  6. if (!ptype->dev || ptype->dev == skb->dev) {
  7. if (pt_prev)
  8. ret = deliver_skb(skb, pt_prev, orig_dev);
  9. pt_prev = ptype;
  10. }
  11. }
  12. // 内核编译开Bridge_config,则将该数据包让网桥函数来处理,否则handle_bridge定义为空操作,
  13. // 返回skb,让协议栈来处理上层协议。
  14. skb = handle_bridge(skb, &pt_prev, &ret, orig_dev);
  15. if (!skb)
  16. goto out;
  17. skb = handle_macvlan(skb, &pt_prev, &ret, orig_dev);
  18. if (!skb)
  19. goto out;
  20. //对该数据包转达到其他L3协议的处理函数
  21. type = skb->protocol;
  22. list_for_each_entry_rcu(ptype, &ptype_base[ntohs(type)&15], list) {
  23. if (ptype->type == type &&
  24. (!ptype->dev || ptype->dev == skb->dev)) {
  25. if (pt_prev)
  26. ret = deliver_skb(skb, pt_prev, orig_dev);
  27. pt_prev = ptype;
  28. }
  29. }
  30. }
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 函数注解相关推荐

  1. 深入浅析Python 函数注解与匿名函数

    函数注解与匿名函数 关于函数参数的定义,调用以及函数参数的内容 函数注解 在编写函数,当下肯定清楚函数如何使用的.若是函数较为复杂,过段时间,编写者有可能需要花一段时间去重新了解函数的使用,那其他使用 ...

  2. python3函数重载_9.20 利用函数注解实现方法重载

    问题 你已经学过怎样使用函数参数注解,那么你可能会想利用它来实现基于类型的方法重载.但是你不确定应该怎样去实现(或者到底行得通不). 解决方案 本小节的技术是基于一个简单的技术,那就是Python允许 ...

  3. Kotlin 4. Kotlin 函数注解:Suppress,Volatile, Synchronized, Bindable, RequiresApi,SerializedName

    一起来学Kotlin:概念:4. Kotlin 函数注解:Suppress,Volatile, Synchronized, Bindable, RequiresApi,SerializedName 这 ...

  4. python函数注解

    函数参数类型注解 def test(a: str): # 声明传入的a是字符串类型print(a)test("aa") 函数返回值类型注解 返回单个值: def test() -& ...

  5. netif_receive_skb 函数解析

    int netif_receive_skb(struct sk_buff *skb) {     //略去一些代码     rcu_read_lock();     //第一步:先处理 ptype_a ...

  6. Java学习之注解Annotation实现原理

    前言: 最近学习了EventBus.BufferKinfe.GreenDao.Retrofit 等优秀开源框架,它们新版本无一另外的都使用到了注解的方式,我们使用在使用的时候也尝到不少好处,基于这种想 ...

  7. libpcap实现机制及接口函数

    1.Libpcap 的工作原理 Libpcap的工作原理可以描述为,当一个数据包到达网卡时,通过网络分接口(即旁路机制)将数据包发给BPF过滤器,匹配通过的数据包可以被libpcap利用创建的套接字P ...

  8. python中使用函数编程的意义_总结Python编程中函数的使用要点

    为何使用函数 最大化代码的重用和最小化代码冗余 流程的分解 编写函数 >>def语句 在Python中创建一个函数是通过def关键字进行的,def语句将创建一个函数对象并将其赋值给一个变量 ...

  9. ​Python 3 新特性:类型注解——类似注释吧,反正解释器又不做校验

    ​Python 3 新特性:类型注解 Crossin ​ 上海交通大学 计算机应用技术硕士 95 人赞同了该文章 前几天有同学问到,这个写法是什么意思: def add(x:int, y:int) - ...

最新文章

  1. 微服务架构 — 服务治理 — 服务监控与告警、服务日志与审计
  2. 字节跳动客户开发_实习|字节跳动 客户端实习生 1-5面 面经
  3. Linux多线程实践(8) --Posix条件变量解决生产者消费者问题
  4. jenkins集群测试环境原理
  5. 2.5.1 MySQL数据库备份恢复基础讲解
  6. mysql如果带有换行的处理方式
  7. 活久见啊,WPF工资已经这么高了!
  8. spring mvc学习(24):配置maven环境和创建maven项目(建议收藏,超全超详细)
  9. LB-createLB整理架构图-loadbalancer-openstack F版
  10. 手动安装lzop压缩工具 - JerryMo06的专栏 - 博客频道 - CSDN.NET
  11. java可以看懂php代码吗_可以自己给自己理发吗?看懂这六点细节就能给自己理发了...
  12. 获取进程列表和结束进程
  13. 白帽SQL注入实战过程记录(2)——根据information_schema组装SQL注入语句
  14. python中的复数虚部_python复数的虚部怎么表达
  15. oracle裁员原因_导致Oracle全球性裁员的原因有哪些?
  16. python实现微信机器人 + 淘宝客自动领券(二)
  17. 扫雷——关于展开空格的算法
  18. 淘宝电商评论数据可视化分析系统-电商评论分析系统
  19. 【论文阅读笔记】:CGD: Multi-View Clustering via Cross-View Graph Diffusion
  20. 嵌入式单片机基础篇(十三)之 STM32 内部温度传感器

热门文章

  1. C# 如何遍历一个实体的所有字段并给另外一个实体赋值,包含子实体也可以
  2. Android 实现图片轮播的三种方法,android开发者论坛
  3. 网易互娱将星N计划空宣 要点速记
  4. Huffman 编码 实验报告
  5. sql查询 同一个字段 同时满足多个条件
  6. 如何在linux系统安装搜狗输入法,在Ubuntu 12.04 LTS版本下安装搜狗输入法 for Linux...
  7. [普通物理] 简谐运动以及例题
  8. 充电桩 2020:大火一年,它依然没赚到钱
  9. 2022-2028年全球商用密码收入年复合增长率CAGR为19.5%
  10. 解决tomcat 启动 An incompatible version [1.2.14] of the APR based Apache Tomcat Native library 错误