2021-09-19 当SONiC遇到P4之二

2023-05-16

当SONiC遇到P4之二

P4描述SAI

在当SONiC遇到P4中介绍了用P4来实现SAI Model的方式,这种方式利用了P4数据平面编程的功能实现了SAI模型,将P4和SONiC这两个分别位于网络数据平面和控制平面的开源编程实现结合起来了,看起来是强强联合。
可是问题是SAI支持的模型就是固定Pipeline的那几种,每一步做什么操作都定义的清清楚楚,好处是方便把不同交换芯片的共同点抽取出来,方便芯片供应商通过各自的闭源驱动程序实现对SAI接口的支持。用P4去实现SAI的Pipeline就是削足适履,完全放弃了P4通过编程实现灵活网络功能的特点。SONiC通过对P4的支持收获是得到了一个软件交换机,方便没有硬件平台的同学也可以用P4-BM软件交换机体验一下SONiC。
P4支持SAI模型的部分代码如下,代码描述的结构和这篇SONiC SAI结构4 L3介绍的SAI模型相同。

// This is P4 source for sai bridge
// includes
#include "../inc/headers.p4"
#include "../inc/parser.p4"
#include "../inc/defines.p4"
#include "../inc/field_lists.p4"
#include "tables.p4"
#include "actions.p4"

control ingress {
	if (ingress_metadata.cpu_port == 0) {
		// phy
		control_ingress_port();	
    	if((ingress_metadata.l2_if_type == L2_1Q_BRIDGE) or (ingress_metadata.l2_if_type == L2_1D_BRIDGE)) {
    		control_bridge();  //bridging
		}
		// router
		if ((ingress_metadata.l2_if_type == L2_ROUTER_TYPE)) { 
			control_router_flow();
		}
		//todo: bridge after router
	}
}

control control_bridge { 
	if(ingress_metadata.l2_if_type == L2_1D_BRIDGE){
		control_1d_bridge_flow();
	} else{
		control_1q_bridge_flow();
	}
	if (standard_metadata.ingress_port != PORT_BRIDGE_ROUTER) {
		apply(table_learn_fdb); 
	}
	if((ethernet.dstAddr&0x010000000000)==0x0){   //unicast 
		control_unicast_fdb();
	} else if(ethernet.dstAddr==0xffffffffffff){  //broadcast
		control_bc_fdb();
	} else { //multicast
	    control_mc_fdb();
	}
}

control control_ingress_port{
	apply(table_ingress_lag); //TODO: rename table?
	apply(table_port_configurations);
	// apply(table_accepted_frame_type);
	if (ingress_metadata.is_tagged==1) { 
	    // apply(table_port_PVID);
	// } else {
		apply(table_port_set_packet_vid_internal);
		apply(table_drop_tagged_internal);
	} else {
		apply(table_drop_untagged_internal);
	}
	// apply(table_port_mode);
	apply(table_l2_trap);
	apply(table_trap_id); //TODO: move this
	// apply(table_check_port_mtu; //TODO
	//apply(table_ingress_acl); // TODO
	if(ingress_metadata.bind_mode == PORT_MODE_PORT) 
	    apply(table_port_ingress_interface_type);
	else
	    apply(table_subport_ingress_interface_type);
}

control control_1d_bridge_flow{
	apply(table_bridge_id_1d);
	apply(table_vbridge_STP);
}

control control_1q_bridge_flow{
	apply(table_bridge_id_1q);
 	apply(table_ingress_vlan_filtering);
 	apply(table_xSTP_instance);
 	apply(table_xSTP);
}

control control_router_flow{
	// TODO
}

// control control_learn_fdb{
//     apply(table_learn_fdb);
// }

control control_unicast_fdb{
	apply(table_l3_interface){//should be for unicast only TDB
		miss{ 
				apply(table_fdb) {
					miss { 
						apply(table_flood);
					}
				}
			}
	 }
}
					
control control_bc_fdb{
	apply(table_broadcast); 
}	

control control_mc_fdb{ 
      apply(table_mc_lookup_mode);
	//non ip multicast 
	 if((ingress_metadata.isip==0) or (ingress_metadata.mcast_mode==MAC_BASE_MC_LOOKUP))//non ip or multicast mode == FDB
	         apply(table_mc_fdb);
     else if((ingress_metadata.isip==1) and (ingress_metadata.mcast_mode==SG_IP_BASE_MC_LOOKUP))
		    apply(table_mc_l2_sg_g); 
	//TBD add * G table 		     
    //FDB miss flow 
	 if(ingress_metadata.mc_fdb_miss==1)
	 {
		//non ip
		if(ingress_metadata.isip==1)
		    apply(table_unknown_multicast_ipv4);
		 else 
		    apply(table_unknown_multicast_nonip);
		   	    
	 }
}


control egress{
	if (ingress_metadata.cpu_port == 1) {
		control_cpu();
	} else {
		apply(table_egress_br_port_to_if);

		if ((ingress_metadata.bridge_port == egress_metadata.bridge_port) and (standard_metadata.instance_type != 1)) { // not cpu, TODO: better?
			apply(table_bridge_loopback_filter);
		}
		if(ingress_metadata.l2_if_type == L2_1D_BRIDGE){
			apply(table_egress_vbridge_STP);
		}
		if(ingress_metadata.l2_if_type == L2_1Q_BRIDGE){
			apply(table_egress_xSTP);
			apply(table_egress_vlan_filtering);
		}
		if(ingress_metadata.l2_if_type == L2_1D_BRIDGE){
			apply(table_egress_set_vlan);
		}
		apply(table_egress_vlan_tag);

		if (egress_metadata.out_if_type == OUT_IF_IS_LAG) { 
			apply(table_lag_hash);
			apply(table_egress_lag);
		}
		else if(egress_metadata.out_if == OUT_IF_IS_ROUTER){
			control_1q_egress_uni_router();
		}
		//apply(egress_acl); // TODO
		//if((egress_metadata.stp_state == STP_FORWARDING) and (egress_metadata.tag_mode == TAG) ){
			// TODO: go to egress
		//}
		apply(table_egress_clone_internal) {
			hit {
				apply(table_hostif_vlan_tag);
			}
		}
	}
}

control control_cpu {
	apply(table_cpu_forward);
}

control control_1q_egress_uni_router {

}


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

2021-09-19 当SONiC遇到P4之二 的相关文章

  • Redis面试题(2021最新)

    文章目录 概述什么是RedisRedis有哪些优缺点为什么要用 Redis 为什么要用缓存 为什么要用 Redis 而不用 map guava 做缓存 Redis为什么这么快 数据类型Redis有哪些数据类型Redis的应用场景 持久化什么
  • sonic 架构学习

    射人先射马 xff0c 擒贼先擒王 在我们学习sonic的过程中 xff0c 无疑了解sonic的架构是非常重要的 xff0c 然后再去了解各个模块的细节 xff0c 总分学习模式 下面是我自我学习并翻译的链接https github co
  • 北航2系921 2021考研历年真题及参考答案(2020-2004)

    需要自取 百度网盘 提取码 xff1a iwbg 关于2020北航921试题 相信大家都听说了 xff0c 2020年的921试题整体难度较2019年小 2019考完后 xff0c 群里面怨声载道 xff0c 信号10年没考电路题了怎么就今
  • 2021-03-19

    输出 数字直角三角形 1 2 3 4 5 6 7 8 9 10 11 12 可根据需要增加行数 public class trangle 64 param args public static void main String args T
  • 2021-03-19

    switch语句实现成绩选择 注意强制转换 import java util Scanner public class Grade Switch 64 param args public static void main String ar
  • 2021-04-03

    Java代码 importjava util Scanner public classTest public static voidmain String args p br Scanner scan 61 newScanner Syste
  • 编译SONiC交换机镜像(转,参考2)

    sonic buildimage 编译SONiC交换机镜像 描述 以下是关于如何为网络交换机构建 ONIE 兼容网络操作系统 xff08 NOS xff09 安装程序镜像的说明 xff0c 以及如何构建在NOS内运行的Docker镜像 请注
  • 【2021年8月】解决 rosdep update超时问题

    修改两个文件即可快速解决超时问题 1 修改 etc ros rosdep sources list d 20 default list 执行sudo gedit etc ros rosdep sources list d 20 defaul
  • 2021论文解读:Learning To Count Everything

    此文着眼于仅用少量标注样本完成物体计数的任务 1 研究近况 1 1 小样本 当前的小样本学习研究主要集中在分类任务上 xff0c 例如图片 xff08 物体 xff09 分类 文本分类 较少触及检测 分割等任务的 xff0c 因为小样本学习
  • 10 个 GitHub 上最火的程序员简历项目,2021 金三银四必备!

    大家好 xff0c 我是你们的 猫哥 xff0c 一个不喜欢吃鱼 又不喜欢喵 的超级猫 前言 猫哥是一个常年混迹在 GitHub 上的猫星人 xff0c 所以发现了不少好的前端开源项目 常用技巧 xff0c 在此分享给大家 公众号 xff1
  • 串口通信学习(GPS模块)2021.5.10

    GPS串口通信学习实践 2021 5 10 1 串口通信简介1 1 波特率1 2 数据位1 3 停止位1 4 奇偶校验位 2 GPS模块串口通信配置2 1 驱动安装2 2 插入GPS模块2 3 GPS模块串口通信数据简介 3 Java实现G
  • VsCode+LaTexWorkshop外置PDF预览配置(2021.3.3)

    随着插件版本的升级有些配置命令发生了改变 xff0c 这里只是做个简单记录 xff0c 写的比较粗糙 后面有闲工夫再来做做美工 VsCode一侧配置 34 latex workshop view pdf viewer 34 34 exter
  • 2021-02-18

    多旋翼飞行器学习笔记 二 机架设计 2 1布局设计 1 机身基本布局 交叉型 xff1a 目前常用的是X字型布局 xff0c 因为 xff1a xff08 1 xff09 机动性更强 xff1b xff08 2 xff09 前视相机的视场角
  • 2021-03-08

    大疆无人机自己动手更换电芯的注意事项 xff0c 当电池多电芯出现均大压差且调整数据无效后 xff0c 或发现某块或多块电芯鼓包 xff0c 说明电芯已经老化 xff0c 寿命用尽 xff0c 就需要更换电芯了 xff0c 厂家为保护消费者
  • 2021-11-11 机械臂路径规划学习进展

    机械臂关节空间和末端空间路径规划 关节空间路径规划简单障碍物情况 xff1a 之后搭建复杂障碍物场景 xff1a 测试发现路径规划的两个步骤 xff1a 采用了关节空间进行路径规划的方案 xff0c 原因主要是在关节空间也就是构型空间中 x
  • 2021-11-12 轨迹规划了解

    1 机器人中的轨迹规划 曲线柔顺 xff1a 五次多项式曲线 起终点位置 速度 加速度约束六个方程 虽然这三条曲线都是连续且光滑的 xff0c 但却存在一个很实际的问题 从速图曲线中可以看出在t 61 25时速度达到最大值 xff0c 没有
  • 2021-10-07

    舵机PWM信号转继电器开关信号 本文由 麦粒电子 撰写 xff0c 并提供相应产品服务 叙述 航模玩家经常需要DIY改装 譬如飞行器做一个投弹的开关 xff0c 船用模型做一个投食机关 再或者弄一些彩灯控制 往往这些功能只需要有一个简单的开
  • 2021-08-31

    二次规划求解器OOQP的基础使用 前言一 OOQP所包含参数的定义二 简单调用1 头文件2 参数设置3 进行求解4 取出计算结果 总结 前言 OOQP作为一款强大的开源凸优化库 支持C 43 43 Matlab调用 现在这里记录下其简单的使
  • 2021-08-10

    LEGO loam第一次测试运行数据包nsh indoor outdoor成功 xff1a 记录以下 xff0c 以免自己忘记步骤 在第一个终端里 xff1a 1 source catkin ws devel setup bash xff0
  • 2021美赛 MCM\ICM D题

    自古以来 音乐就已成为人类社会的一部分 已成为文化遗产的重要组成部分 为了理解音乐在人类集体经验中所扮演的角色 我们被要求开发一种量化音乐发展的方法 在创作新音乐时 有许多因素会影响艺术家 包括其天赋的创造力 当前的社会或政治事件 使用新乐

随机推荐

  • 2021-01-16 SONiC系统管理9 TPID配置

    SONiC系统管理9 TPID配置 SONiC TPID配置 从SONiC VLAN YANG里面没有看到有TPID的配置能力 xff0c VLAN Range在SONiC VLAN YANG里面也没有 xff0c 二层转发功能的增强让SO
  • 2021-01-17 SONiC系统管理12 零接触部署ZTP

    2021 01 16 SONiC系统管理12 零接触部署ZTP SONiC系统管理12 零接触部署ZTP SONiC系统支持基于DHCP协议Option 67的ZTP零接触部署 SONiC系统启动以后 xff0c 系统自动在所有UP起来的端
  • 2021-02-02 SONiC系统管理 18配置文件格式

    SONiC系统管理 18 配置文件格式 前面说到了SONiC系统启动时通过读取初始配置文件的内容来配置系统 xff0c SONiC系统默认初始配置文件的位置在 etc sonic startup config 文件内容再进一步指示各种不同类
  • 2021-02-06 SONiC SAI结构 Adapter&Adapter Host

    SONiC SAI SAI 结构 SAI是SONiC系统最精华的部分 xff0c SAI spec对SAI如何定义的以及SAI如何被SONiC系统初始化和调用有一些具体的介绍 首先还是一个High Level Design的图 xff1a
  • 2021-02-07 SONiC SAI结构2 1D Bridge

    SONiC SAI结构2 1D Bridge 以太网交换流水线结构 SONiC SAI对交换机 路由器的报文处理流程建立了标准化的行为模型 即使不同的交换芯片内部实现报文处理的方式各不相同 xff0c 由于行为模型是报文处理过程的抽象描述
  • 2021-02-21 SONiC SAI结构5 VXLAN

    SONiC SAI结构5 VXLAN VXLAN报文处理模型流水线结构 SONiC SAI支持VXLAN协议 xff0c 具备支持VTEP的能力 根据报文处理功能模型的特点 xff0c 不同的功能块可以好像搭积木一样组合在一起形成新的功能
  • 2021-02-27 SONiC系统管理 21系统运行平台管理

    2021 02 27 SONiC系统管理 21 系统运行平台管理 SONiC系统通过SAI统一了交换芯片的管理 xff0c 为不同厂家的芯片提供了统一的编程接口 虽然交换芯片提供了系统的最关键的报文处理功能 xff0c 但是作为一个需要在实
  • 2021-03-03 SONiC系统管理 23 SONiC与ONIE

    SONiC系统管理 23 SONiC与ONIE 在开发解耦的白盒交换机设备中 xff0c 在硬件开源的基础上 xff0c 控制软件除SONiC以外也有其它NOS的选择 xff0c 如Cumulus Linux Open Network Li
  • 2021-03-20 SONiC 系统管理 28 静态路由配置

    2021 03 20 SONiC 系统管理 28 静态路由配置 SONiC系统支持通过多种方式配置静态路由 xff0c 包括CLI接口 xff0c 基于RESTCONF YANG方式或者gNMI接口的方式 SONiC静态路由支持IPv4和I
  • 2021-04-26 SONiC: 转发和管理平面接口SAI模型

    2021 04 26 SONiC 转发和管理平面接口SAI模型 SAI模型中转发平面和管理平面接口 转发平面和管理平面之间的接口是控制报文从转发平面传递到控制平面CPU处理的接口 对于各种类型的交换机而言 xff0c 大量不同种类的控制报文
  • 阅读qt贪吃蛇代码、学习

    学qt只有两天而已 xff0c 感觉qt真的很好入门 比mfc容易的很多 学习qt短短时间 xff0c 感觉自己可以仿照别人的代码来写些自己的桌面东西了 不过 xff0c 没有驱动 xff0c 只是兴趣的学习下 可能到此为止了 主要收获 x
  • 2021-05-18 SONiC 系统Loopback地址和管理地址配置

    SONiC 系统管理 37 系统Loopback地址和管理地址配置 SONiC系统可以通过CLI和Config DB来配置Loopback地址 CLI的配置命令和Linux系统配置网口的命令相同 admin 64 switch span c
  • 2021-05-22 SONiC 系统配置命令

    2021 05 20 SONiC 系统管理 39 SONiC系统配置命令 config help This command lists all the possible configuration commands at the top l
  • 2021-05-27 SONiC 系统配置显示命令

    2021 05 27 SONiC 系统管理 40 SONiC系统配置显示命令 show help This command displays the full list of show commands available in the s
  • 2021-06-07 SONiC 系统基于优先级的流控PFC配置命令

    2021 06 07 SONiC 系统管理 42 SONiC 系统基于优先级的流控PFC配置命令 IEEE 802 1Qbb定义的基于优先级的流控Asymmetric Priority Flow Control功能可以在端口上为每个不同的优
  • 2021-06-25 SONiC 系统BGP配置命令

    2021 06 25 SONiC 系统BGP配置命令 SONiC系统BGP配置 SONiC系统所默认包含的BGP模块在201811版的SONiC之前是开源的Quagga软件 xff0c 之后改成了更流行的FRR FRR中的Show命令是以
  • 2021年8月14日 七夕节的相遇 SONiC+P4实现

    2021年8月14日 七夕节的相遇 SONiC 43 P4实现 ONF启动了PINS项目 xff0c P4 integrated network stack
  • 2021-08-20 SONiC中的FRR和Zebra

    2021 08 20 SONiC中的FRR和Zebra SONiC中采用FRR和Zebra处理路由协议 以前写过SONiC系统所默认包含的BGP模块在201811版的SONiC之前是开源的Quagga软件 xff0c 之后改成了更流行的FR
  • 2021-08-29 SONiC中基于策略的哈希配置

    SONiC中基于策略的哈希配置 SONiC可以支持对不同类型的报文采取不同的Hash算法 对于多通道 多链路连接的情况 xff0c 如LAG和ECMP的接口上 xff0c 交换机和路由器采用Hash算法对报文中指定的字段进行Hash计算 x
  • 2021-09-19 当SONiC遇到P4之二

    当SONiC遇到P4之二 P4描述SAI 在当SONiC遇到P4中介绍了用P4来实现SAI Model的方式 xff0c 这种方式利用了P4数据平面编程的功能实现了SAI模型 xff0c 将P4和SONiC这两个分别位于网络数据平面和控制平