VPP以太网接口模式

以太网接口结构ethernet_interface_t如下,其成员flags为32bit,高16bit为运行状态标志,低16bit为操作标志。最低bit位表示接口的L2/L3模式设置。第16bit为1表示接口运行在L3模式。

/* Ethernet interface instance. */
typedef struct ethernet_interface
{ u32 flags;/* Top 16 bits for status and bottom 16 bits for set operation */
#define ETHERNET_INTERFACE_FLAGS_STATUS_MASK  (0xffff0000)
#define ETHERNET_INTERFACE_FLAGS_SET_OPN_MASK (0x0000ffff)/* Interface driver/hw is in L3/non-promiscuous mode so packet DMAC would already be filtered */
#define ETHERNET_INTERFACE_FLAG_STATUS_L3 (1 << 16)/* Set interface to default L3 mode */
#define ETHERNET_INTERFACE_FLAG_DEFAULT_L3 0/* Set interface to accept all packets (promiscuous mode). */
#define ETHERNET_INTERFACE_FLAG_ACCEPT_ALL 1

物理接口在注册时,例如在VPP插件DPDK中,以太网接口结构成员flags没有进行赋值。函数ethernet_set_flags设置flags的值。

vnet_eth_register_interface (vnet_main_t *vnm,vnet_eth_interface_registration_t *r)
{     ethernet_main_t *em = &ethernet_main;ethernet_interface_t *ei; vnet_hw_interface_t *hi;u32 hw_if_index;pool_get (em->interfaces, ei);clib_memcpy (&ei->cb, &r->cb, sizeof (vnet_eth_if_callbacks_t));

修改接口标志

设置以太网接口的操作标志,高16位的状态标志保持不变。

ethernet_set_flags (vnet_main_t * vnm, u32 hw_if_index, u32 flags)
{ethernet_main_t *em = &ethernet_main;vnet_hw_interface_t *hi;ethernet_interface_t *ei;u32 opn_flags = flags & ETHERNET_INTERFACE_FLAGS_SET_OPN_MASK;hi = vnet_get_hw_interface (vnm, hw_if_index);ASSERT (hi->hw_class_index == ethernet_hw_interface_class.index);ei = pool_elt_at_index (em->interfaces, hi->hw_instance);/* preserve status bits and update last set operation bits */ei->flags = (ei->flags & ETHERNET_INTERFACE_FLAGS_STATUS_MASK) | opn_flags;

对于DPDK接口,注册的flag_change函数为dpdk_flag_change。如果操作模式设置为L3,检查接口硬件是否支持MAC地址过滤功能,如果不支持,状态不能设置STATUS_L3标志。

硬件如果支持MAC地址过滤,设置STATUS_L3标志(高16bit)。

if (ei->cb.flag_change) {switch (opn_flags) {	case ETHERNET_INTERFACE_FLAG_DEFAULT_L3:if (hi->caps & VNET_HW_IF_CAP_MAC_FILTER) {if (ei->cb.flag_change (vnm, hi, opn_flags) != ~0) {ei->flags |= ETHERNET_INTERFACE_FLAG_STATUS_L3;return 0;}ei->flags &= ~ETHERNET_INTERFACE_FLAG_STATUS_L3;return ~0;}/* fall through */case ETHERNET_INTERFACE_FLAG_ACCEPT_ALL:ei->flags &= ~ETHERNET_INTERFACE_FLAG_STATUS_L3;return ei->cb.flag_change (vnm, hi, opn_flags);default:   return ~0;}
}
return ~0;

如果操作模式设置为L3,关闭网卡混杂模式。否则,开启混杂模式。返回值为混杂模式之前的状态。

dpdk_flag_change (vnet_main_t * vnm, vnet_hw_interface_t * hi, u32 flags)
{dpdk_main_t *dm = &dpdk_main;dpdk_device_t *xd = vec_elt_at_index (dm->devices, hi->dev_instance);u32 old = (xd->flags & DPDK_DEVICE_FLAG_PROMISC) != 0;switch (flags) {case ETHERNET_INTERFACE_FLAG_DEFAULT_L3:           /* set to L3/non-promisc mode */dpdk_device_flag_set (xd, DPDK_DEVICE_FLAG_PROMISC, 0);break;case ETHERNET_INTERFACE_FLAG_ACCEPT_ALL:dpdk_device_flag_set (xd, DPDK_DEVICE_FLAG_PROMISC, 1);break;default:  return ~0; }if (xd->flags & DPDK_DEVICE_FLAG_ADMIN_UP) {if (xd->flags & DPDK_DEVICE_FLAG_PROMISC)rte_eth_promiscuous_enable (xd->port_id);elserte_eth_promiscuous_disable (xd->port_id);}return old;

接口默认模式

以DPDK接口为例,DPDK接口默认设置为L3操作模式。

static clib_error_t *
dpdk_lib_init (dpdk_main_t * dm)
{ /* create interface */xd->hw_if_index = vnet_eth_register_interface (vnm, &eir);sw = vnet_get_hw_sw_interface (vnm, xd->hw_if_index);xd->sw_if_index = sw->sw_if_index;ethernet_set_flags (vnm, xd->hw_if_index,ETHERNET_INTERFACE_FLAG_DEFAULT_L3);

L2/L3模式

如下命令,设置接口GigabitEthernet0/8/0为L2二层模式,以及设置接口GigabitEthernet0/a/0为L3三层模式。

vpp# set interface l2 bridge GigabitEthernet0/8/0 200
vpp#
vpp# set interface l3 GigabitEthernet0/a/0

函数set_int_l2_mode负责接口模式处理。如果硬件接口的第一个子接口,设置为L2模式,调用ethernet_set_flags,将硬件接口设置为混杂模式(ACCEPT_ALL)。如果硬件接口的最后一个子接口设置为L3模式,将硬件接口的混杂模式关闭(DEFAULT_L3)。

u32
set_int_l2_mode (vlib_main_t * vm, vnet_main_t * vnet_main, )
{/* Adjust count of L2 interfaces */hi->l2_if_count += l2_if_adjust;if (hi->hw_class_index == ethernet_hw_interface_class.index){ if ((hi->l2_if_count == 1) && (l2_if_adjust == 1)) { /* Just added first L2 interface on this port, Set promiscuous mode on the l2 interface */ethernet_set_flags (vnet_main, hi->hw_if_index,ETHERNET_INTERFACE_FLAG_ACCEPT_ALL);} else if ((hi->l2_if_count == 0) && (l2_if_adjust == -1)) { /* Just removed only L2 subinterface on this port, Disable promiscuous mode on the l2 interface */ethernet_set_flags (vnet_main, hi->hw_if_index,/*ETHERNET_INTERFACE_FLAG_DEFAULT_L3 */ 0);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/74553.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

muduo 32 muduo项目总结

Timestamp时间管理类 ①&#xff1a;主要提供now函数显示当前时间&#xff1a;自1970年1月1日0点以来经过的秒数&#xff0c;使用time函数 ②&#xff1a; toString函数将字符串转化成时间字符串&#xff0c;使用localtime函数将秒数格式化成日历时间 解析tm_time 并以日历格…

计算机毕业设计 JSPM校园闲置物品交易平台的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

【C++模拟实现】手撕AVL树

【C模拟实现】手撕AVL树 目录 【C模拟实现】手撕AVL树AVL树的介绍&#xff08;百度百科&#xff09;AVL树insert函数的实现代码验证是否为AVL树AVL树模拟实现的要点易忘点AVL树的旋转思路 作者&#xff1a;爱写代码的刚子 时间&#xff1a;2023.9.10 前言&#xff1a;本篇博客将…

Nodejs 第十五章(child_process)

child_process 子进程 子进程是Nodejs核心API&#xff0c;如果你会shell命令&#xff0c;他会有非常大的帮助&#xff0c;或者你喜欢编写前端工程化工具之类的&#xff0c;他也有很大的用处&#xff0c;以及处理CPU密集型应用。 创建子进程 Nodejs创建子进程共有7个API Sync…

跟踪源码技巧+阅读源码工具Sourcetrail

基于Eclipse IDE 1、Quick Type Hierarchy 快速查看类继承体系 &#xff08; 快捷键&#xff1a;Ctrl T&#xff09; 查看类很多人可能都知道&#xff0c;可源码阅读的时候更多用来查看方法体系更重要&#xff0c;可以方便快速的定位到方法的实现类。如&#xff1a; 此时如…

Kafka入门与安装

为什么要用消息中间件&#xff1f; 异步处理 场景说明&#xff1a;用户注册后&#xff0c;需要发注册邮件和注册短信。传统的做法有两种1.串行的方式&#xff1b;2.并行方式。 串行方式&#xff1a;将注册信息写入数据库成功后&#xff0c;发送注册邮件&#xff0c;再发送注…

无涯教程-JavaScript - COUPDAYSNC函数

描述 COUPDAYSNC函数返回从结算日期到下一个息票日期的天数。 语法 COUPDAYSNC (settlement, maturity, frequency, [basis])争论 Argument描述Required/OptionalSettlement 证券的结算日期。 证券结算日期是指在发行日期之后将证券交易给买方的日期。 RequiredMaturity 证…

elk安装篇之 Kibana安装

Kibana是一个开源的分析与可视化平台&#xff0c;设计出来用于和Elasticsearch一起使用的。你可以用kibana搜索、查看存放在Elasticsearch中的数据。是es的可视化客户端之一。 一&#xff1a;下载 https://www.elastic.co/cn/kibana 我的es是elasticsearch-7.10.2版本&#x…

javascript中如何将多个数组的一个元素相加求和

三个数组第一个元素相加并输出 在JavaScript中&#xff0c;通过以下方式将这三个数组的每个数组的第一个元素相加并输出&#xff1a; let array1 [1,2,3]; let array2 [3,4,5]; let array3 [5,6,7];let sum array1[0] array2[0] array3[0]; console.log(sum);这段代码首…

Hilbert-Schmidt Operator

Hilbert-Schmidt Operator See https://mathworld.wolfram.com/Hilbert-SchmidtOperator.html See https://people.kth.se/~laptev/FA08/l8.pdf

OpenCV(二十九):图像腐蚀

1.图像腐蚀原理 腐蚀操作的原理是将一个结构元素&#xff08;也称为核或模板&#xff09;在图像上滑动&#xff0c;并将其与图像中对应位置的像素进行比较。如果结构元素的所有像素与图像中对应位置的像素都匹配&#xff0c;那么该位置的像素值保持不变。如果结构元素的任何一个…

[通用]计算机经典面试题基础篇Day3

[通用]计算机经典面试题基础篇Day3 1、请说明mysql的两种主要引擎 MySQL有多种存储引擎&#xff0c;但最常见的两种主要引擎是InnoDB和MyISAM。 2、说一下mysql这两种引擎的使用场景 MySQL的两种主要引擎&#xff0c;InnoDB和MyISAM&#xff0c;各自适用于不同的使用场景&…

利用python进行视频下载并界面播放快速下载素材

工具&#xff1a;python designer&#xff08;python自带&#xff09;:UI界面设计工具 VLC&#xff1a;视频播放工具 需要的库如下&#xff1a; import os,platform os.environ[PYTHON_VLC_MODULE_PATH] "./vlc-3.0.14" import vlc from 脚本 import Player from …

通过位运算打多个标记

通过位运算打多个标记 如何在一个字段上&#xff0c;记录多个标记&#xff1f; 如何在一个字段上&#xff0c;记录不同类型的多个标记&#xff1f; 如何用较少的字段&#xff0c;记录多个标记&#xff1f; 如何在不增加字段的要求下&#xff0c;记录新增的标记&#xff1f; 在实…

Oracle数据库连接之TNS-03505_无法解析服务名异常

在进行数据库开发的时候&#xff0c;通常需要连接Oralce数据库&#xff0c;在进行连接时&#xff0c;经常性的会提示TNS-03505: Failed to resolve name&#xff08;无法解析服务名&#xff09;&#xff0c;从而导致无法连接到数据库实例&#xff0c;那么通过本文对造成该问题的…

SpringMVC之文件上传下载以及jrebel的使用

目录 一、文件上传 1.1 导入依赖 1.2 配置文件上传解析器 1.3 配置服务器存放文件地址 1.3.1 点击编辑Configurations 1.3.2 将项目部署至tomcat服务器上 1.3.3 配置相对路径 1.4 导入PropertiesUtil工具类 1.5 编写resource.properties 1.6 添加sql 1.7 编写PageCo…

GIT高级使用技巧

GIT高级使用技巧 导出GIT日志到文件 按照 <哈希> - <作者名> <作者邮箱地址> - <作者日期> : <commit描述> 的格式导出日志 git log --prettyformat:"%H - %an <%ae> - %ad : %s" master > log.txt筛选日志并按照从旧到新…

2022年12月 C/C++(七级)真题解析#中国电子学会#全国青少年软件编程等级考试

C/C++编程(1~8级)全部真题・点这里 第1题:走迷宫 一个迷宫由R行C列格子组成,有的格子里有障碍物,不能走;有的格子是空地,可以走。 给定一个迷宫,求从左上角走到右下角最少需要走多少步(数据保证一定能走到)。只能在水平方向或垂直方向走,不能斜着走。 时间限制:1000 …

pandas笔记:显示中间的省略号

比如我们有这样一个数据&#xff08;Geolife中的数据&#xff09; 如何把中间的省略号完整地输出呢&#xff1f; pd.set_option(display.max_rows, None) data

机器人中的数值优化(十五)——PHR增广拉格朗日乘子法

本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考&#xff0c;主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等&#xff0c;本系列文章篇数较多&#xff0c;不定期更新&#xff0c;上半部分介绍无约束优化&#xff0c;…