本文主要重点讨论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. 蓝桥杯历届试题 地宫取宝 dp or 记忆化搜索

    问题描述 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口在左上角,出口在右下角. 小明被带到地宫的入口,国王要求他只能向右或向下行走. 走 ...

  2. java面向对象编程--第十一章 异常处理

    1.异常:描述出错信息的对象. 字节码校验时,如发生错误,则会抛出异常. 2.所有异常的父类是Exception,异常可以捕获,可以处理. 所有错误的父类是Error,错误可以捕获,但不能处理. Th ...

  3. 使用ContentProContentProvider共享生词本数据

    自定义ContentProvider需要在项目清单中注册: import android.content.ContentProvider;import android.content.ContentU ...

  4. Linux 服务器安全技巧

    毋庸置疑,对于系统管理员,提高服务器的安全性是最重要的事情之一.因此,也就有了许多针对这个话题而生的文章.博客和论坛帖子. 一台服务器由大量功能各异的部件组成,这一点使得很难根据每个人的需求去提供定制 ...

  5. ArrayAdapter适配器的用法,模拟QQ发消息界面。

    import java.util.ArrayList; import android.app.Activity; import android.content.Context; import andr ...

  6. C# SQLiteDataReader获得数据库指定字段的值

    获得数据库指定字段的值,赋给本地变量 (1)如下,获得userinfo数据表里的字段"userid"."orgid", string userid=" ...

  7. IT公司100题-5-查找最小的k个元素

    问题描述: 输入n 个整数,输出其中最小的k 个. 例如输入8, 7, 6, 5, 4, 3, 2, 1这8 个数字,则最小的3 个数字为3, 2, 1.   分析: 时间复杂度O(nlogn)方法: ...

  8. iOS知名第三方框架和流行APP们所用的第三方框架小结

    网易新闻AppleReachabilityASIHTTPRequestEGOTableViewPullRefreshGTMNSString+HTMLMGTemplateEngineMPOAuthReg ...

  9. CSS 的class属性居然可以并(有点像并,有点像与)操作

    <a href="javascript:;" class="btn btn-default doc-event-1">创建div容器</a&g ...

  10. SharePoint 2013 开发——CSOM概要

    博客地址:http://blog.csdn.net/FoxDave 本篇对客户端API做一个大致地了解. 看一下各个类别主要API之间的对应关系表. 假设我们对Server API已经有了足够地了 ...