内核获取网络设备的网桥接口
Linux内核中有两种获取网络设备的桥接口方法,其中一种是在控制路径上;另一种是在数据路径上。
控制路径
用户平面的程序brctl下发控制命令,比如setpathcost和setportprio命令以port number为参数下发到内核,内核使用br_get_port函数遍历网桥上的接口列表,最终找到对应的网桥接口。br_get_port函数需要在获得了网桥spinlock锁后调用,防止对port_list操作的不一致发送。
Usage: brctl [commands]
commands:setpathcost <bridge> <port> <cost> set path costsetportprio <bridge> <port> <prio> set port prioritystruct net_bridge_port *br_get_port(struct net_bridge *br, u16 port_no)
{struct net_bridge_port *p;list_for_each_entry_rcu(p, &br->port_list, list) {if (p->port_no == port_no)return p;}
}
数据路径
在数据路径上,调用函数br_port_get_rcu获取对应网桥接口,效率高于控制路径上的br_get_port函数。首先在添加桥接口时(br_add_if),调用函数(netdev_rx_handler_register)注册rx_handler,将网桥接口赋值给rx_handler_data变量,在数据路径上,比如br_handle_frame_finish中,使用br_port_get_rcu可直接获得网桥接口结构体。
static inline struct net_bridge_port *br_port_get_rcu(const struct net_device *dev)
{return rcu_dereference(dev->rx_handler_data);
}int netdev_rx_handler_register(struct net_device *dev,rx_handler_func_t *rx_handler,void *rx_handler_data)
{rcu_assign_pointer(dev->rx_handler_data, rx_handler_data);rcu_assign_pointer(dev->rx_handler, rx_handler);
}
int br_add_if(struct net_bridge *br, struct net_device *dev)
{struct net_bridge_port *p;p = new_nbp(br, dev);err = netdev_rx_handler_register(dev, br_handle_frame, p);
}
内核版本
Linux-3.10.0
内核获取网络设备的网桥接口相关推荐
- 【VS开发】使用WinPcap编程(1)——获取网络设备信息
pcap_if_t是一个interface数据结构,表明网络接口的信息.网络接口就是interface,就是我们用来上网的设备,一般为网卡,还有一些虚拟网卡也算作这样的接口.它的结构如下: struc ...
- 网桥接口非混杂模式下数据包转发
网桥接口处在非混杂模式下,只能接收目的MAC地址为自身的数据包,也就是说如果数据包的目的MAC为其它地址,将会被丢弃掉.对于单网口的设备这样没有问题,但是对于存在多个网卡的交换设备,如果从一个网口接收 ...
- C语言socket getsockopt() setsockopt()函数(获取和设置套接口的选项?)
文章目录 man 文档(越看越懵逼啊!) 解释 getsockopt()函数用于获取任意类型.任意状态套接口的选项当前值,并把结果存入optval. setsockopt()函数用于任意类型.任意状态 ...
- jmeter根据循环获取参数_jmeter forEach循环获取response参数值进行接口请求
jmeter forEach循环获取response参数值进行接口请求 注意: 一,ForEach控制器 输入变量前缀:输入正则表达式变量的引用名称即可 Start index for loop(ex ...
- Linux 内核获取、初次编译、源码目录分析
目录 Linux 内核获取 Linux 内核初次编译 Linux 内核源码目录分析 1.arch 目录 2.block 目录 3.crypto 目录 4.Documentation 目录 5.driv ...
- 字符设备驱动高级篇6——内核提供的读写寄存器接口
以下内容源于朱有鹏<物联网大讲堂>课程的学习整理,如有侵权,请告知删除. 1.前面访问寄存器的方式 通过定义指向寄存器的指针,然后解引用来对寄存器进行操作. (1)行不行?sure! (2 ...
- Linux3种进程,linux内核获取进程的全路径3种方法
本文档的CopyRight归jonathan所有,可自由转载,转载时请保持文档的完整性. /*----------------------------------------------------- ...
- VUE获取网易云音乐接口,并实现歌词滚动效果
VUE获取网易云音乐接口,并实现歌词滚动效果 最近在捣腾个人博客,加了个播放音乐的模块,所以在这里记录一下歌曲播放歌词实时滚动效果的实现,顺便总结加深一下对各个知识点的理解. GitHub地址 演示地 ...
- 不写一段代码来获取扇贝单词的接口数据
不写一段代码来获取扇贝单词的接口数据 第一步,登录并寻找可以爬取的数据(想直接看结论可以到第四步) 第二步,对症下药 第三步,解密接口 第四步,使用现成的方法获取数据 最近想做一个背单词相关的app, ...
- 淘宝获取商品详情API接口
淘宝获取商品详情API接口如下: 淘宝获取商品详情API返回参数: data.productTitle string 商品标题 data.productId string 商品ID data.sell ...
最新文章
- oracle数据库按照城市分组_大数据分组怎样才会更快
- Serverless 下的微服务实践
- SpringMVC-applicationContent.xml和Spring-servlet.xml的配置设置
- 2009-12-12
- HDU - 3336 next运用+递推
- Oracle Library Cache 的 lock 与 pin 说明
- Java语法糖之foreach
- 今日推荐:如何设计一个支撑数亿用户的系统
- 1^2+2^2+……+n^2的公式证明
- java 找不到符号 con_我的java程序运行时,提示找不到符号,求解!
- windows安装MySQL数据库【附安装文档和安装包】
- Nature公开1300多篇论文工厂论文的期刊分布,这个杂志高居榜首
- 国内首家!腾讯云密钥管理系统通过密码应用验证,积极探索行业标准边界
- 用后端接口调试工具Insomnia发送请求
- 【TSP】基于matlab GUI蚁群算法求解旅行商问题【含Matlab源码 929期】
- iOS获取DSYM文件
- isSelected() 的使用
- 给设计团队管理者的6个建议
- python开发板卡驱动开发_IC卡驱动程序开发
- win10无法登录到你的账户->注销->重启->桌面初始化(只剩回收站+默认浏览器)等一系列问题出现
热门文章
- excel常用函数公式及技巧搜集4
- 数据结构问题解决2.1——单链表存储结构定义详细解释,struct LNode* next解释,为啥next定义成指针类型
- VMware安装win7操作系统
- 四种XML解析方式详解
- 最最最简单从官方获取最新行政区划代码、区划拼音
- mac虚拟机服务器设置u盘启动不了,mac虚拟机如何使用u盘启动盘
- 世界各国时区表以及与北京时差
- openg离线包_高级openg 混合,一个完整程序
- 论文笔记:Bridging Textual and Tabular Data for Cross-Domain Text-to-SQL Semantic Parsing
- 2021年中国纯碱行业发展现状分析,下游需求快速增长,供需关系紧张导致价格走高「图」