1.instructions
首先来看一下instructions再openflow协议中的位置,如上图所示的一张流表项,instructions是一条流表项的组成部分。
每一个Flow Entry里都包含有一系列的Instructions,这些Instructions会在与该Flow Entry成功匹配的数据包上执行,进而导致数据包头信息的修改、Action Set的更新或者改变Pipeline Processing的处理行为。
Instructions大致有下列几种类型,交换机不一定要全部支持:
1)Meter meter_id:将数据包直接转发给指定的Meter处理。
2)Apply-Actions action(s):立即对数据包执行指定的action(s),而不是将这些action(s)更新到Actions Set中。这些action(s)可能会修改数据包的信息,它们以Action List的形式组织。
3)Clear-Actions:立即清除Actions Set中的所有action(s)。
4)Write-Actions action(s):将指定的action(s)合并到当前的Actions Set中;如果给定类型的action当前已经存在于Actions Set中,那么会覆写,否则直接加入。
5)Write-Metadata metadata/mask:将指定的metadata值写到当前的Metadata值域中。
6)Goto-Table next-table-id:指定了在Pipeline Processing中的下一张Flow Table。这里的table-id必须大于当前的Flow Table id,并且Pipeline的最后一张Flow Table中不能含有这个指令;如果仅有一张Flow Table的OpenFlow Switch也不能支持该指令。
每一个Flow Entry里每种类型(如上列表)的Instruction最多只能有一个,并且这些Instructins必须得按照上述列表的顺序来依次执行。往往在实际上,唯一的限制就是 Meter 指令必须在 Apply-Actions 指令前执行,Clear-Actions 指令必须在 Write-Actions 指令前执行,Goto-Table 必须放在最后执行。
一个OpenFlow Swtich必须拒绝它不能支持的Instructions的Flow Entry,并且发出一个unsupported flow error给Remote Controller。Flow Tables可能会不支持每一个match,每一个instruction或者每一个action。
在ryu中,关于协议的部分写在\ryu\ofproto文件夹中,现在ryu已经支持到openflow1.5版本,我这里介绍的只是1.3版本,ofproto_v1_3_parser.py这个文件。
关于Instructions,ryu定义了两个类,分别是OFPInstructionActions类和FPInstructionMeter类,关于这两个类的说明如下
class OFPInstructionActions(OFPInstruction):
"""
Actions instruction
This instruction writes/applies/clears the actions.
================ ======================================================
Attribute Description
================ ======================================================
type One of following values.
| OFPIT_WRITE_ACTIONS
| OFPIT_APPLY_ACTIONS
| OFPIT_CLEAR_ACTIONS
actions list of OpenFlow action class
================ ======================================================
``type`` attribute corresponds to ``type_`` parameter of __init__.
"""
class OFPInstructionMeter(OFPInstruction):
"""
Meter instruction
This instruction applies the meter.
================ ======================================================
Attribute Description
================ ======================================================
meter_id Meter instance
================ =========================