本文主要重点讨论OpenFlow Switch规范的指令集,它们深刻影响着数据包在Switch中的处理行为,下面开始从以下几个部分谈起。

1、Instructions

  每一个Flow Entry里都包含有一系列的Instructions,这些Instructions会在与该Flow Entry成功匹配的数据包上执行,进而导致数据包头信息的修改、Action Set的更新或者改变Pipeline Processing的处理行为。Instructions大致有下列几种类型,OpenFlow Switch不需要支持所有的类型,但是加黑的类型必须得支持:

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。

2、Action Set

  Action Set是与每个数据包相关联的,初始时是一个空集合;一个Flow Entry可以通过Write-Actions或者Clear-Actions指令来修改Action Set,这个Action Set会在不同的Flow Table之间进行传递,当一个Flow Entry的Instructions里不包含Goto-Table指令时,那么整个Pipeline Processing就会在此Flow Entry停止,然后开始执行与该数据包关联的Action Set里所有的action(s)。

  同样地,一个Action Set里每种类型的action最多只有一个,action类型大致如下所示:

1)copy TTL inwards:在数据包上执行copy TTL inwards操作。

2)pop:pop出数据包里所有的tag。

3)push-MPLS:push MPLS tag到数据包里。

4)push-PBB:push PBB tag到数据包里。

5)push-VLAN:push VLAN tag到数据包里。

6)copy TTL outwards:在数据包上执行copy TTL outwards操作。

7)decrement TTL:降低数据包的TTL。

8)set:在数据包上执行set-fields操作。

9)qos:执行与qos相关的操作,比如set_queue。

10)group:转到指定的Group Table里继续执行其Action Bucket里的action(s)。

11)output:如果没有group action指定,那么将数据包转发到指定的port里。

  Apply-Actions指令会触发立即执行Action Set里的action(s),并且这些action(s)必须按照上述列表的顺序来依次执行,而不管这些action(s)加入到Action Set的顺序,另外output action一定要是最后执行的;如果一个Action Set里同时存在output action和group action,那么此时group action将优先被执行,而output action将会被忽略,反之,如果一个Action Set里都不存在output action和group action,那么该数据包将会被丢弃。如果OpenFlow Switch支持的情况下,Group Action Bucket是可以递归执行的,即Action Bucket是可以继续指定另一个Group。

3、Action List

   Apply-Actions指令和packet-out消息都包含有一个Action List,这些Action List里的action(s)会依照上文列表的顺序依次执行,并且执行的结果会立即累积地反映到数据包信息里,比如Action List里有两个push-VLAN的action,那么这两个VLAN tag都会被加入到数据包头里。如果Action List里包含有output action,那么基于当前状态的数据包会被克隆一份,进而该克隆体被转发到指定的port里;如果Action List里包含有group action,那么同样地基于当前状态的数据包会被克隆一份,进而该克隆体被转发到指定的Group里。

  当数据包的Apply-Actions指令执行完成后,Pipeline会继续在修改过的数据包上继续执行后续的处理,而Action Set不会因为Action List的执行被修改。

4、Actions

  OpenFlow Switch并不需要支持所有的Action类型,但是下面加黑的类型必须得支持:

1)Output:该action指将一个数据包转发到指定的OpenFlow Ports。

2)Set-Queue:该action指为一个数据包设置一个queue id。当一个数据包通过output action转发到某个port时,该queue id 决定了该数据包被放在哪个queue用来调度转发,此方式可以用来实现QoS支持。

3)Drop:没有显示的action来表示丢弃数据包,作为替代方案,如果一个数据包的Action Set里没有output action,那么将此数据包将会被丢弃。

4)Group:将数据包转发到指定的Group继续处理。

5)Push-Tag / Pop-Tag:Switch应该有能力支持下列的push-tag/pop-tag的操作:

6)Set-Fields:不同的set-fields action以其不同的field type来唯一标识,通过它可以修改数据包头的某些值域信息,比如VLAN tag的修改等。

7)Change-TTL:该action可以修改数据包头的IPv4 TTL,IPv6 Hop Limit 或者 MPLS TTL等信息,具体如下:

OpenFlow Switch学习笔记(六)——Instructions和Actions的更多相关文章

  1. OpenFlow Switch学习笔记(四)——Matching

    这次我们着重详述来自于网络中的数据包在OpenFlow Switch中与Flow Entries的具体匹配过程,以及当出现Table Miss时的处理方式,下面就将从这两方面说起. 1.Matchin ...

  2. OpenFlow Switch学习笔记(一)——基础概念

    OpenFlow Switch v1.4.0规范是在2013年10月14号发布,规范涵盖了OpenFlow Switch各个组件的功能定义.Controller与Switch之间的通信协议Open F ...

  3. OpenFlow Switch学习笔记(五)——Group Table、Meter Table及Counters

    本文主要详述OpenFlow Switch的另外两个主要组件——Group Table和Meter Table,它们在整个OpenFlow Swtich Processing中也起到了重要作用. 1. ...

  4. OpenFlow Switch学习笔记(三)——Flow Tables

    这次我们主要讨论下OpenFlow Switch的核心组件之一——Flow Tables,以了解其内部的 matching 以及 action handling 机制.下文将会分为几个部分来逐步详述O ...

  5. OpenFlow Switch学习笔记(二)——OpenFlow Ports

    OpenFlow Ports是OpenFlow Switch与剩余网络之间传递Packet的网络接口.OpenFlow Switches之间通过OpenFlow Ports彼此相互逻辑连接.一个Ope ...

  6. OpenFlow Switch学习笔记(七)——Matching Fields

    Matching Fields in_port=port Matches OpenFlow port port dl_vlan=vlan Matches IEEE 802.1q Virtual LAN ...

  7. Go语言学习笔记六: 循环语句

    Go语言学习笔记六: 循环语句 今天学了一个格式化代码的命令:gofmt -w chapter6.go for循环 for循环有3种形式: for init; condition; increment ...

  8. java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

    java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...

  9. Learning ROS for Robotics Programming Second Edition学习笔记(六) indigo xtion pro live

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

随机推荐

  1. [转]C#中的Monitor类

    object obj=new object(); Monitor在锁对象obj上会维持两个线程队列R和W以及一个引用T : (1) T是对当前获得了obj锁的线程的引用(设此线程为CurrThread ...

  2. The APR based Apache Tomcat Native library 异常解决办法

    tomat在linux服务器上启动报The APR based Apache Tomcat Native library which allows optimal performance in pro ...

  3. Eclipse导出可执行Jar文件(包含第三方Jar包)

    1. 首先,右键你的Java工程,选择Export,在Java文件夹下选择Runnable JAR file,如下图所示: 2. 选择Runnable JAR file后,会弹出如下所示的对话框,选择 ...

  4. AjaxUpload.3.5.js之ASP.NET 文件上传

    一.引入js文件 <script type="text/javascript" src="/Scripts/JQuery.min.js"></ ...

  5. java 面向对象编程-- 第十三章 反射、类加载与垃圾回收

    1.狭义JavaBean规范 Javabean必须包含一个无参数的public构造方法,方便通过反射的方式产生对象. 属性必须都是私有的. Javabean必须包含符合命名规范的get和set方法,以 ...

  6. sdut 2609 A-Number and B-Number

    http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2609 数位DP 以前没怎么做过,自己憋了半天, ...

  7. [开发笔记]-多线程异步操作如何访问HttpContext?

    如何获取文件绝对路径? 在定时器回调或者Cache的移除通知中,有时确实需要访问文件,然而对于开发人员来说, 他们并不知道网站会被部署在哪个目录下,因此不可能写出绝对路径, 他们只知道相对于网站根目录 ...

  8. [开发笔记]-Visual Studio 2012中为创建的类添加注释的模板

    为类文件添加注释,可以让我们在写代码时能够方便的查看这个类文件是为了实现哪些功能而写的. 一:修改类文件模板 找到类模版的位置:C:\Program Files (x86)\Microsoft Vis ...

  9. 入門必學NO.1 Android 初學特訓班(第四版) 目錄

    第 01 章 敲開 Android 的開發大門工欲善其事,必先利其器,要學習 Android 應用程式,先取得功能強大的開發工具,就可讓學習事半功倍. 1.1 Android 是啥米?1.2 建構 A ...

  10. data属性

    本框架内置组件以及部分插件可以通过data属性来初始化并使用,通常通过data-toggle来调用API(toggle是触发器的意思,例如我们创建一个navtab标签可以通过为a的data-toggl ...