1. 端口说明

OVS支持如下的标准OpenFlow端口名称(括号中是端口号):

  • in_port (65528 or 0xfff8; 0xfffffff8)
  • table (65529 or 0xfff9; 0xfffffff9)
  • normal (65530 or 0xfffa; 0xfffffffa)
  • flood (65531 or 0xfffb; 0xfffffffb)
  • all (65532 or 0xfffc; 0xfffffffc)
  • controller (65533 or 0xfffd; 0xfffffffd)
  • local (65534 or 0xfffe; 0xfffffffe)
  • any or none (65535 or 0xffff; 0xffffffff)
  • unset (not in OpenFlow 1.0; 0xfffffff7)

2. Actions

OVS按如下顺序执行各个actions,且action set中每种类型的action只会存在一个,后加入的会替换之前加入的action:

  1. strip_vlan
  2. pop_mpls
  3. decap
  4. encap
  5. push_mpls
  6. push_vlan
  7. dec_ttl
  8. dec_mpls_ttl
  9. dec_nsh_ttl
  10. 如下action按添加顺序执行:
    • load
    • move
    • mod_dl_dst
    • mod_dl_src
    • mod_nw_dst
    • mod_nw_src
    • mod_nw_tos
    • mod_nw_ecn
    • mod_nw_ttl
    • mod_tp_dst
    • mod_tp_src
    • mod_vlan_pcp
    • mod_vlan_vid
    • set_field
    • set_tunnel
    • set_tunnel64
  11. set_queue
  12. group, output, resubmit, ct_clear, 或 ct。如果这些actions中出现多个,则按上述顺序执行第一个出现的action,余下的忽略。

2.1 输出动作

port
output:port
output:field
output(port=port, max_len=nbytes)

将数据包发送到物理端口或控制器;输出端口可以从field中读取;如果指定了max_len,则在输出之前会将数据包截断,以确保数据包长度不会超过max_len。

port可以支持如下标准OpenFlow端口:

  • local: 将数据包转发到与网桥具有相同名称的网络设备;
  • in_port: 将数据包转发到输入端口;

如果不指定max_len,则还可以支持如下端口:

  • normal: 进行正常的L2/L3处理;
  • flood: 将数据转发到所有的物理端口,除了输入端口和flooding被禁用的端口;
  • all: 将数据转发到所有的物理端口,除了输入端口;
  • controller: 将数据包及其元数据发送到一个或多个封装在OpenFlow packet-in消息中的控制器;

如,

$ ovs-ofctl add-flow br0 in_port=2,actions=in_port
$ ovs-ofctl add-flow br0 actions=2,3,4,5,6,in_port
$ ovs-ofctl add-flow br0 "in_port=2,actions=load:0->in_port,2"

2.2 控制器动作

controller
controller:max_len
controller(key[=value], ...)

将数据包及其元数据发送到一个或多个封装在OpenFlow packet-in消息中的控制器;支持的选项如下:

  • max_len=max_len: 限制要在packet-in中发送的数据包的字节数,最大为65535(默认值);
  • reason=reason: 指明发送的原因,支持的值有 no_match, action(默认),  invalid_ttl,  action_set, group, packet_out.
  • id=controller_id: 指定要发送到哪些控制器;
  • userdata=hh...: 使用十六进制表示的用户数据,十六进制数之间可用点号分隔;
  • pause

    Causes the switch to freeze the packet’s trip through Open vSwitch flow tables and serializes that state into
    the packet-in message as a ``continuation,’’ an additional property in the NXT_PACKET_IN2 message. The con‐
    troller can later send the continuation back to the switch in an NXT_RESUME message, which will restart the
    packet’s traversal from the point where it was interrupted. This permits an OpenFlow controller to interpose
    on a packet midway through processing in Open vSwitch.

2.3 入队列动作

enqueue(port,queue)
enqueue:port:queue

将数据包排入指定端口的指定队列;queue必须是0~4294967294 (0xfffffffe)间的整数;

2.4 组动作

group:group

将数据包输出到指定的组;group必须是0~4294967040 (0xffffff00)间的整数;

2.5 封装、解封动作

strip_vlan
pop_vlan

如果有的话,则移除最外面的VLAN标签。

push_vlan:ethertype 

在最外面压入VLAN标签;ethertype可以为0x8100(802.1Q C-tag)或0x88a8(802.1ad S-tag)。

push_mpls:ethertype

在最外层压入MPLS标签堆栈条目(LSE),并将数据包的Ethertype修改为ethertype,其中ethertype需为B0x8847或0x8848.

如果数据包已经包含一个MPLS标签,则新压入的标签是已有标签的拷贝。

pop_mpls:ethertype

剥离最外层的MPLS标签堆栈条目(LSE),并将数据包的Ethertype修改为ethertype;如果包含多个MPLS标签,则ethertype需为B0x8847或0x8848.

encap(nsh([md_type=md_type], [tlv(class,type,value)]...))
encap(ethernet)

使用指定的头部封装数据包。

第一种方式使用NSH封装以太网帧;其中,md_type可以为1(默认)或2;当md_type=2时,必须指定TLVs,且class是16位的十六进制数,type是8位的十进制数,value是十六进制数。

第二种方式将一个裸L3数据包封装在一个以太网帧中;Ethertype被初始化位L3数据包的类型;以太网源和目的地址被初始化位0.

如,

encap(nsh(md_type=1))
encap(nsh(md_type=2,tlv(0x1000,10,0x12345678)))

decap

移除最外层的封装。

2.6 字段修改动作

set_field:value[/mask]->dst
load:value->dst

将一个字面量加载到指定的字段或字段的某部分中;dst位字段名称。

对于load动作,value需是一个整数。如,

set_field:00:11:22:33:44:55->eth_src
load:0x001122334455->eth_src set_field:01:00:00:00:00:00/01:00:00:00:00:00->eth_dst
load:1->eth_dst[40]

move:src->dst

拷贝src到dst;src和dst可以是一个字段或字段的某部分。如,

move:reg0[0..5]->reg1[26..31]
move:reg0[0..15]->vlan_tci

mod_dl_src:mac
mod_dl_dst:mac

修改以太网(数据链路层)源或目的地址为mac;mac需为xx:xx:xx:xx:xx:xx的形式。

mod_nw_src:ip
mod_nw_dst:ip

修改IPv4(网络层)源或目的地址为ip;ip需为w.x.y.z的形式。

mod_nw_tos:tos
mod_nw_ecn:ecn

mod_nw_tos设置IPv4 ToS/DSCP中的DSCP位或IPv6的traffic class字段为tos;tos必须是0~255之间的4的倍数。

mod_nw_ecn设置IPv4 ToS或IPv6 traffic class字段为ecn;ecn必须是0~3的整数。

mod_tp_src:port
mod_tp_dst:port

修改TCP/UDP/SCTP(传输层)的源或目的端口为port。

dec_ttl
dec_ttl(id1, [id2]...)

递减IPv4数据包的TTL或IPv6数据包的跳限制。

set_mpls_label:label
set_mpls_tc:tc
set_mpls_ttl:ttl

set_mpls_label修改外层的MPLS标签堆栈条目的标签;label需是20为的整数,支持十进制和十六进制。

set_mpls_tc修改外层MPLS标签堆栈条目的traffic class;tc需是0~7间的整数。

set_mpls_ttl修改外层MPLS标签堆栈条目的TTL;ttl需为0~255间的整数。

dec_mpls_ttl
dec_nsh_ttl

递减外层MPLS标签堆栈条目或NSH头部的TTL。

2.7 元数据动作

set_tunnel:id
set_tunnel64:id

设置VXLAN/Geneve数据包的tunnel ID;set_tunnel64用于支持宽度超过32位的id。

set_queue:queue
pop_queue

set_queue设置队列ID;其中queue位32位的整数。

pop_queue还原输出队列为数据包进入交换机时设置的默认值(通常为0)。

2.8 防火墙动作

ct([argument]...)
ct(commit[, argument]...)

argument可为如下值:

  zone=value  设置zone为一个16位的id(默认位0),以将连接隔离在不同的域中;value可以是字面量,也可以是某给字段或字段的某部分。

如果没有commit,则会通过connection tracker发送数据包;连接跟踪器会跟踪通过它的数据包的TCP连接状态;对于通过连接的每个数据包,它检查它是否满足TCP不变量,并使用ct_state元数据字段向以后的操作发送连接状态信号。

此时,ct会fork流水线:

  • 在一个分叉中,ct将数据包传递给连接跟踪器。之后,它将数据包重新注入OpenFlow流水线,并初始化连接跟踪字段。ct_state字段用连接状态初始化、ct_zone用zone参数初始化。
  • 在另一个分叉中,数据包的原始实例在ct_action之后继续独立处理。ct_state字段和其他连接跟踪元数据都被清除。

ct action还支持如下argument:

  table=table  设置数据包要重新注入到哪个流表;如果不设置则不重新注入;

  nat
  nat(type=addrs[:ports][,flag]...)

    设置NAT;type需为src(SNAT)或dst(DNAT);为新连接设置NAT只有在该连接之后使用ct(commit...)提交才会生效;

    addrs  IP地址或地址范围addr1-addr2;指定可使用的地址范围;

    ports  L4端口或端口范围port1-port2;指定可使用的端口范围;

    flag支持如下值:

      random: 随机选择一个端口;

      hash: 使用哈希算法选择端口;

      persistent: 应从给定范围中选择IP地址,以便在系统重新启动后可以提供相同的映射。

如果有commit,则连接跟踪器会将连接提交到连接跟踪模块。commit标志只能在没有commit的ct的第一个分支中使用。

如,

# allows new connections from port 1 to port 2, and only allows
# established connections to send traffic from port 2 to port 1
table=0,priority=1,action=drop
table=0,priority=10,arp,action=normal
table=0,priority=100,ip,ct_state=-trk,action=ct(table=1)
table=1,in_port=1,ip,ct_state=+trk+new,action=ct(commit),2
table=1,in_port=1,ip,ct_state=+trk+est,action=2
table=1,in_port=2,ip,ct_state=+trk+new,action=drop
table=1,in_port=2,ip,ct_state=+trk+est,action=1

ct_clear

清除连接跟踪状态,将ct_state, ct_zone, ct_mark, ct_label清零。

learn(argument...)

添加或修改flow;argument指定了匹配字段、actions和其他参数。

匹配字段(至少需指定一个)可以有如下形式:

  field=value  value为字面量;

  field=src   其中src是当前正在处理的数据包中的某个字段;

  field   上一种形式的简写方式;

actions(至少需指定一个)可以有如下形式:

  load:value->dst  将value加载到dst;

  load:src->dst  将src加载到dst,其中,src和dst可以是某个字段或字段的某部分;

  output:field  输出端口从field中读取;

  fin_idle_timeout=seconds  设置idle timeout;
  fin_hard_timeout=seconds  设置hard timeout;

以下参数则是可选的:

  idle_timeout=seconds
  hard_timeout=seconds
  priority=value
  cookie=value
  send_flow_rem
  table=table
  delete_learned  删除包含learn action的流也会删除由learn创建的流;
  limit=number  如果新流的表中具有相同cookie的流的数目超过了该数目,则该操作不会添加新流;默认(limit=0)没有限制。

  result_dst=field[bit]  如果学习失败(因为流的数量超过限制),则将field[bit]设置为0,否则设置为1。field[bit]必须是单个位。

fin_timeout(key=value...)

修改idle timeout或hard timeout或两者。支持如下key=value,

  idle_timeout=seconds
  hard_timeout=seconds

2.9 编程和控制流动作

resubmit:port
resubmit([port],[table][,ct])

在流表中搜索匹配的流并执行找到的动作(如果有的话),然后在当前流项中继续执行接下来的动作。支持以下参数:

  • port: 指定用于输入端口元数据字段的值,作为搜索的一部分,以代替流中当前的输入端口。
  • table: 指定要搜索的流表,默认为当前流表。
  • ct: 将数据包的5元组字段和对应的conntrack原始方向元组字段交换。

clone(action...)

执行每个嵌套的动作,事先保存大部分数据包和流水线状态,然后再恢复。

push:src
pop:dst

push将src压入堆栈,而pop则弹出栈顶元素至dst中;src和dst都是某个字段或字段的某部分。如,

push:reg2[0..5]
pop:reg2[0..5]

exit

退出,不再执行后续动作;如果exit处于group bucket中,则只是退出当前bucket而已。

multipath(fields, basis, algorithm, n_links, arg, dst)

使用basis作为哈希参数对fields进行哈希,然后使用参数arg应用多路径链路选择算法输出0~n_links-1之间的整数,并存储到dst中。

fields必须是如下字段:

  eth_src  以太网源地址。

  symmetric_l4  以太网源和目的地址、类型、VLAN ID、IPv4/IPv6源和目的地址、协议、TCP/SCTP端口号。

  symmetric_l3l4  IPv4/IPv6源和目的地址、协议、TCP/SCTP端口号。

  symmetric_l3l4+udp  IPv4/IPv6源和目的地址、协议、TCP/SCTP/UDP端口号。

  symmetric_l3  IPv4/IPv6源和目的地址。

  nw_src  网络层源地址。

  nw_dst  网络层目的地址。

algorithm必须是如下值之一:

  modulo_n    link = hash(flow) % n_links.

  hash_threshold  link = hash(flow) / (MAX_HASH / n_links).

  hrw (Highest Random Weight)

    for i in [0,n_links]:
      weights[i] = hash(flow, i)
    link = { i such that weights[i] >= weights[j] for all j != i }

  iter_hash (Iterative Hash)

    i = 0
    repeat:
      i = i + 1
      link = hash(flow, i) % arg
    while link > max_link

只有iter_hash需要使用arg参数。

参考资料

https://www.openvswitch.org/support/dist-docs/ovs-actions.7.txt

ovs-actions的更多相关文章

  1. ovs 删除流表 指定 actions 中字段

    例: ovs-ofctl del-flows br-int in_port=100,out_group=100 -O openflow13 ovs-ofctl del-flows br-int in_ ...

  2. Neutron 理解 (4): Neutron OVS OpenFlow 流表 和 L2 Population [Netruon OVS OpenFlow tables + L2 Population]

    学习 Neutron 系列文章: (1)Neutron 所实现的虚拟化网络 (2)Neutron OpenvSwitch + VLAN 虚拟网络 (3)Neutron OpenvSwitch + GR ...

  3. 探索 OpenStack 之(7):Neutron 深入探索之 Open vSwitch (OVS) + GRE 之 Neutron节点篇

    0. 测试环境 硬件环境:还是使用四节点OpenStack部署环境,参见 http://www.cnblogs.com/sammyliu/p/4190843.html OpenStack配置: ten ...

  4. 学习OpenStack之(6):Neutron 深入学习之 OVS + GRE 之 Compute node 篇

    0.环境 硬件环境见上一篇博客:学习OpenStack之(5):在Mac上部署Juno版本OpenStack 四节点环境 OpenStack网络配置:一个tenant, 2个虚机 Type drive ...

  5. Openstack Neutron OVS ARP Responder

    ARP – Why do we need it? In any environment, be it the physical data-center, your home, or a virtual ...

  6. OVS ARP Responder – Theory and Practice

    Prefix In the GRE tunnels post I’ve explained how overlay networks are used for connectivity and ten ...

  7. SDN环境搭建(mininet,OVS,ryu安装及命令)

    1.mininet安装与使用 1.1mininet安装 ubuntu 12.04/14.04/14.10      命令行  sudo apt-get install mininet 1.2 mini ...

  8. OVS操作总结

    转载:http://www.aboutyun.com/thread-11777-1-1.html Open vSwitch(下面简称为 OVS)是由 Nicira Networks 主导的,运行在虚拟 ...

  9. ubuntu 14.04设备OVS虚拟OpenFlow交换机配置汇总

    一.设备OVS sudo apt-get install openvswitch-controller openvswitch-switch openvswitch-datapath-source ( ...

  10. OvS: ovs-ofctl adding parameters analysis

    if using dpdk, then OvS' datapath folder is ignored. Only OvS' userspace code are in use. According ...

随机推荐

  1. 【Java】Java Win10环境搭建--JDK、Eclipse

    win10安装Java JDK环境及Eclipse安装使用(Hello world) win10环境下安装Java环境,对于小白来说简直是头疼,因为Java内部环境有着JDK和JRE两块,互相牵扯着很 ...

  2. Dotnet Core多版本API共存的优雅实现

    API升级,新旧版本的API共存,怎么管理呢?   一.前言 最近,单位APP做了升级,同步的,API也做了升级. 升级过程中,出现了一点问题:API升级后,旧API也需要保留,因为有旧的APP还在使 ...

  3. OSPF --- 不规则区域实验

    OSPF不规则区域实验: 一.知识点整理: OSPF中路由器的角色(看图): 骨干路由器:路由器所有接口属于area 0  -->R3 非骨干路由器:路由器所有接口属于非area 0  --&g ...

  4. Redis入门指导

    前言 本文提供全网最完整的Redis入门指导教程,下面我们从下载Redis安装包开始,一步一步的学习使用. 下载Redis 官网提供的Redis安装包是服务于Linux的,而我们需要在Window下使 ...

  5. ADO.NET 帮助类 参数传递 存储过程 分页

    SQLHelper public class SqlHelper { private readonly string _constr = ConfigurationManager.Connection ...

  6. 【程序包管理】篇章2:rpm程序包来源合法和完整性验正

    来源合法性验正: 数字签名   私钥签名完整性    哈希 注意: 1.如果是网站下载的程序包的话,没有公钥,就无法进行来源合法性验证,所以最好使用系统自带的rpm程序包或去可靠的网站下载程序包.[如 ...

  7. Selenium Web元素操作

    我们定位到Web页面元素之后,可以对元素进行一系列的操作,实现跟页面的交互.包括点击.文本输入.元素属性获取等.常用的方法列举如下: 方法 描述 click() 点击元素 send_keys(**va ...

  8. Azure Terraform(一)入门简介

    一,引言 众所周知,当企业将项目整体架构资源迁移到云上,云基础设施架构师就要根据现有项目搭建整体项目的基础设施资源的架构,然后我们的云运维工程师就要根据设计好基础设施的架构图来创建云上资源,但是在构筑 ...

  9. IntelliJ IDEA无法新建类解决办法

    IntelliJ IDEA无法新建类解决办法 灿夏 2018-07-14 08:50:05  4891  收藏 1 展开 原文地址 IntelliJ IDEA使用教程 (总目录篇) [原文地址](ht ...

  10. 万恶的NPE差点让我半个月工资没了

    引言 最近看到<阿里巴巴Java开发手册>(公众号回复[开发手册]免费获取)第11条规范写到: 防止 NPE ,是程序员的基本修养 NPE(Null Pointer Exception)一 ...