OVS字段操作:ingress Port Field

metadata fields,OXM类与NXM类

Posted by chochi on June 8, 2018

1 OXM Class and NXM Class

  这里要先说明一下OXM类与NXM类的区别。OXM(OpenFlow Extensible Match),NXM(Nicira Extensible Match),两个最本质的区别就是定义者不同,OXM是OpenFlow协议官方所定义的,NXM是OpenVSwitch定义的,因为OpenVSwitch是由名为Nirira团队所开发的,所以以N冠名。

  OXM的字段是协议中的,已经标准化,NXM的字段是可能被标准化的,两个类的字段有重合。

  如 Tunnel ID Field,就同时拥有OXM和NXM字段,OXM_OF_RUNNEL_ID(38) ,NXM_NX_TUN_ID(16)。

2 METADATA FIELDS

小翔哥做出一个很好的解释,详情请看实验室聊天记录。 2

2.1 ingress Port Field 字段说明

1

  入端口字段,表示数据包由哪个端口进入。注意该端口的Access表示是可读写的。入端口一般对数据包处理的影响很小,很少做写操作,该具体示例本文之后说明。先说明三个端口:OFPP_LOCAL,OFPP_CONTROLLER,zero port。

  1. OFPP_LOCAL (0xfffe or 65534)

  "local" 是一个与所创建的OVS交换机同名的本地端口,用于交换机与本地的TCP/IP栈之间的链接,若要给交换机配置IP,即配置在该local端口。OVS在官方文档中提到一个未来工作方向,就是openflow协议中的框架是不需要local端口的,但ovs目前的架构是需要的,所以会针对本地端口进行改进。

  1. OFPP_CONTROLLER (0xfffd or 65533)

 一些数据包是由内部产生的,如packet_in,packet_out消息,故使用该端口。

  1. 0 (zero port)

  0是非法端口,但也可以为我们所用,比如要清空入端口,或者取消将数据包转发至入端口的操作时,即可以把入端口写为0。

2.1 实验命令说明

  • 写操作: load or set_field
  • 转发到表操作:resubmit or goto_table
  • 压入弹出栈操作:push,pop
  • 暂时保存字段值操作(OVS2.7 or later):clone(load:value->[],)
actions=push:NXM_OF_IN_PORT[],load:0−>NXM_OF_IN_PORT[],output:1,pop:NXM_OF_IN_PORT[]

  该操作先将NXM_OF_IN_PORT的值压如栈内寄存,然后使用写操作将NXM_OF_IN_PORT的值置为0,随后将数据包转发至1端口,转发动作完成后,再从栈中弹出先前寄存的入端口值,将其复原。

actions=clone(load:0−>NXM_OF_IN_PORT[],output:1)

  和以上操作含义相同,只支持OVS2.7以及之后的版本。

2.1 实验过程

  假设实验环境中已经存在某条重要且不能修改的流表项,该流表项的部分动作为。

    actions=output:1,2,3,in_port

  再!假设实验环境中突然出现大量恶意流量,匹配到该条流表项。这样导致了大量的数据又被送回了in_port端口,不是我们预期的结构。此时可做修改in_port字段操作。


该实验只是单纯的尝试一下这些命令,没有特定的环境~~随便玩玩~实验开始

  1. 使用ovs-sandbox,创建虚拟化环境,然后创建如图所示的网桥。 3

  2. 然后将入端口值压入栈,入端口写为0,再将数据包传到表1。在使用trace发一条模拟六,看匹配的过程,和值的改写结果。 4

  3. 在表1中弹出入端口值,查看值的改写结果。 image


  恩,就是这么一个简单无聊的小实验! 因为太多忘记截图了 T T 实验就阉割成这样了

  然后又懒的搭环境,很多操作被限制了 T T