ONOS+P4中的流表翻译机制-源码阅读
波~澜来更新了!!!波波近日对onos+p4中的流表翻译机制进行了深度探索,感觉颇有收获,特此前来分享一番。
话说自从开始学习P4后,波波就看了下图数次,也大致理解了ONOS中的流表到底是怎么下发到p4设备上的,但真正自己开发时,还是有很多盲区。
图中的介绍简练却抽象,波波也喜欢抽象的东西,能够在抽象维度思考和交流是一件很酷的事情。抽象的东西优雅而有魅力,原因在于其屏蔽了细节与差异,以一个高纬度的视角给人以呈现,因而具有很高的信息量。抽象带来的神秘感,让人魂牵梦萦为之着迷(:>,而高信息量带来的认知壁垒的后果就是,看不懂。波波如小燕子一般羡慕那些整天能够”四个字四个字说话“的人。
然而研发工作不是抽象派创作,波波需要从底层真真切切实实的感受到流表是怎么转换的,理解流程与细节,下面以onos/apps/p4-tutorial下的两个exercises为例一起来看看叭。
exercise1:fwd
从项目p4文件中可以看到,我们定义了三个table,t_l2_fwd,t_tunnel_ingress,t_tunnel_fwd,其中t_l2_fwd在文中有如下介绍:
The pipeline defines table called t_l2_fwd that provides basic L2 forwarding capabilities and actions to send packets to the controller. This table is needed to provide compatibility with existing ONOS applications such as Proxy-ARP, LLDP Link Discovery and Reactive Forwarding.
也就是说,fwd应用会向t_l2_fwd中下表,proxyarp和lldp也会往这里下表,proxyarp, hostprovider, lldpprovider这些应用都是ONOS控制一个简单网络所必须的基础应用,所以这个表是开发P4控制应用时不能忽略的。
我们先来看看要部署的这个pipeconf。PipeconfFactory类囊括了部署的流水线以及翻译机制等等,下面代码中通过链式调用返回了PiPipeconf,PiPipeconf建立时addBehaviour()函数中使用了文件中定义的其他类/接口,PortStatisticsDiscovery接口不是必须的,故我们先来看其他两个。
private PiPipeconf buildPipeconf() throws P4InfoParserException {
final PiPipelineModel pipelineModel = P4InfoParser.parse(P4INFO_URL);
return DefaultPiPipeconf.builder()
.withId(PIPECONF_ID)
.withPipelineModel(pipelineModel)
.addBehaviour(PiPipelineInterpreter.class, PipelineInterpreterImpl.class)
.addBehaviour(PortStatisticsDiscovery.class, PortStatisticsDiscoveryImpl.class)
// Since mytunnel.p4 defines only 1 table, we re-use the existing single-table pipeliner.
.addBehavi