ovs-ofctl 官方文档学习笔记

本文是基于OVS官方文档的学习笔记
http://openvswitch.org/support/dist-docs/ovs-ofctl.8.txt

查看基本信息和流表

查看bridge信息

ovs-ofctl show br0


Dump flow table

Dump br0所使用的flow table:

ovs-ofctl dump-tables br0  

Dump flow

Dump br0的所有flow:
ovs-ofctl dump-flows br0

Dump br0上匹配xx的flow:
ovs-ofctl dump-flows br0 xx


流表相关命令

添加 flow
`ovs-ofctl add-flow br0 in_port=3,actions=xx`

修改 flow
`ovs-ofctl mod-flows br0 xx`

删除 flow
`# 删除br0上的所有flow
ovs-ofctl del-flows br0`

` 删除br0上匹配xx的所有flow
ovs-ofctl del-flows br0 xx`

流表的语法和格式

ovs-ofctl的Flow语法由一系列field=value形式的键值对组成,用英文逗号和空格隔开。

在描述Flow时,必须要遵循 TCP/IP 协议栈。比如说,在flow中使用了L3(网络层)的字段时,必须也要指明L2(数据链路层)所用的协议。使用了L4(传输层)的字段时,必须也要指明L2和L3所用的协议。

in_port

匹配从OpenFlow port id 进入的数据包。
in_port=

dl_vlan

匹配IEEE 802.1Q VLAN tag为 的数据包。 的值应该在[0-4095]这个区间。
为0xffff表示匹配没有VLAN tag的包:
dl_vlan=

dl_vlan_pcp

匹配IEEE 802.1Q Priority Code Point(PCP, 优先级代码点)为的数据包,改值取值区间为[0-7]。数字越大,表示优先级越高。可以用于QoS。

dl_src 和 dl_dst

例如:dl_dst=01:00:00:00:00:00/01:00:00:00:00:00
匹配源和目的MAC地址。其中”/”后面的为掩码。
比如说,如果掩码是:

 - 01:00:00:00:00:00 只匹配组播MAC (第一个字节LSB1MAC地址为MAC组播地址)
 - fe:ff:ff:ff:ff:ff 匹配其他所有MAC,除了组播MAC
 - ff:ff:ff:ff:ff:ff 完全匹配掩码前的MAC,和省掉掩码的效果一样
 - 00:00:00:00:00:00 完全通配,相当于(dl_dst=*)

dl_type

匹配L2(**D**ata **L**ink ,数据链路层) header中的协议类型,该字段描述L3的类型。有效值区间[0, 65535],可以是十进制数或者是以”0x”开头的十六进制数。比如:

dl_type=0x0800 匹配IP数据包
dl_type=0x0806 匹配ARP数据包
dl_type=0x8035 匹配RARP数据包

需要说明的是 dltype=0x0800 可以用关键字 ip 代替。 而 dltype=0x0806 可以用关键字 arp 代替。dl_type=0x8035 可以用关键字 rarp 代替。

nw_src 和 nw_dst

当使用了 dl_type=0x0800 或者关键字 ip 或 tcp 时,nw_src 和 nw_dst分配匹配IP头中的源IP地址和目的IP地址。其中netmask可以是255.255.255.0这样的(dotted quad)形式,也可以是数字 /24 这样的(CIDR)形式

当使用了 dl_type=0x0806 或者关键字 arp 时,nw_src 匹配 ARP 头中的 arspa(Sender Protocol Address)字段。nw_dst 匹配ARP头中的 artpa(Target Protocol Address)字段

当使用了 dl_type=0x8035 或者关键字 rarp 时,nw_src匹配 RARP 头中的 arspa(Sender Protocol Address)字段。nw_dst匹配RARP头中的 artpa(Target Protocol Address)字段

当 dl_type 使用了通配符或者除了0x0800, 0x0806, 0x8035以外的值,则nw_src, nw_dst的值会被忽略

tp_src 和tp_dst

传输层协议如TCP/UDP协议的源端口号、目的端口号

nwproto 和 ipproto

要和 dl_type 字段配合使用。

当dl_type=0x0800或使用了关键字ip时,匹配IP头中的proto字段,取值区间[0, 255],比如为1时可以匹配ICMP数据包,为6时匹配TCP数据包。
当dl_type=0x86dd或使用了关键字ipv6是,匹配IPv6头中的proto字段,取值区间[0, 255],比如为58时匹配ICMPv6数据包,为6时匹配TCP数据包
当dl_type=0x0806或者使用了关键字arp时,匹配ARP opcode的低8位,ARP opcode大于255时,与等于0效果一样
当dl_type=0x8035或者使用了关键字rarp时,匹配ARP opcode的低8位, ARP opcode大于255时,与等于0效果一样
当dl_type使用了通配符或这除了0x0800, 0x0806, 0x8035以外的值,则nw_proto的值会被忽略

nw_tos

匹配IP ToS字段或IPv6的traffic class字段取值为的数据包。取值区间[0, 255],需要注意的是最低2位会被忽略。当dl_type使用除0x800(IP)和0x86dd(IPv6)以外的数值时,该字段被忽略。

nw_ttl

匹配IP和IPv6的TTL字段为的数据包。取值区间[0, 255]。当dl_type使用除0x800(IP)和0x86dd(IPv6)以为的数值时,该字段被忽略。

icmp_type 和 icmp_code

icmp_type=
icmp_code=

当 dl_type 和 nw_proto 确定数据包为 ICMP 或 ICMPv6 时,匹配 ICMP type 和 code。取值区间都为[0, 255]。如果 dl_type 和 mw_proto 使用了其他值时,该字段忽略。

协议关键字

协议关键字相当于alias,对应关系如下:

ip     =  dl_type=0x0800  
ipv6   =  dl_type=0x86dd  
icmp   =  dl_type=0x0800,nw_proto=1  
icmp6  =  dl_type=0x86dd,nw_proto=58  
tcp    =  dl_type=0x0800,nw_proto=6  
tcp6   =  dl_type=0x86dd,nw_proto=6  
udp    =  dl_type=0x0800,nw_proto=17  
udp6   =  dl_type=0x86dd,nw_proto=17  
sctp   =  dl_type=0x0800,nw_proto=132  
sctp6  =  dl_type=0x86dd,nw_proto=132  
arp    =  dl_type=0x0806  
rarp   =  dl_type=0x8035  
mpls   =  dl_type=0x8847  
mplsm  =  dl_type=0x8848  

cookie=
cookie=
cookie 字段可以用于以下命令 :add-flows和 mod-flows

actions

ovs-ofctl的 add-flow 以及 mod-flows 命令都需要 actions 字段,描述对匹配的数据包执行的动作

在上述的三条命令中,actions字段是flow的一部分,actions字段中可以有多个 action,它们之间用逗号隔开,一个flow的完整语法如下:

=,[=]...,actions=[,...]  

可使用的action非常多。如下:

output

output:
将数据包输出到OpenFlow port

group

group:
将数据包输出到OpenFlow group

normal

按照设备的常规L2/L3处理流程来处理数据包。这通常是OVS默认flow中的action。要注意的是,并不是所有的OpenFlow switch都支持这个action。

flood

将数据包输出到所有物理端口,除了该数据包的输入口以及不可被flooding的端口。

all

将数据包输出到所有物理端口,除了该数据包的输入口。

local

将数据包输出到local port(与bridge同名的端口)

in_port

in_port
将数据包输出到其输入口

controller

controller(=…)
将数据包以”packet in”消息的形式发送到OpenFlow控制器。其中=键值对可以是:

max_len= 只将数据包的个字节发送到控制器。默认发送这个数据包。
reson= 指明”pakcet in”消息中的reason字段。默认reason为action,还可以是no_match, invalid_ttl。
id= 指明控制器id,16位整数。表示要发送给那个控制器。默认使用的id是0.
controller
controller[:nbytes]
分别是controller()和controller(max_len=)的简略写法。

enqueue

enqueue(,)
将数据包放到端口的队列中。其中必须是OpenFlow端口号或关键字(如”LOCAL”)。不同交换机支持的队列数不同,有些OpenFlow实现根本不支持队列。

drop

drop
丢掉该数据包。

vlan

mod_vlan_vid:  
修改数据包的VLAN id为。如果数据包没有VLAN tag则添加VLAN id为的VLAN tag。如果数据包VLAN id已经为,则将其VLAN 优先级priority设为0.

mod_vlan_pcp:  
修改数据包的VLAN 优先级priority为。如果数据包没有VLAN tag则添加VLAN priority为的VLAN tag。合法值区间为[0, 7],数字越大优先级越高。如果数据包VLAN priority已经为,则将其VLAN id设为0.

strip_vlan

如果数据包有VLAN tag,则剥去VLAN tag
mod_dl_src:<mac>  
mod_dl_dst:<mac>  
设置数据包的源或目的MAC地址

network header mod

mod_nw_src:<ip>  
mod_nw_dst:<ip>  
设置数据包的源或目的IP地址
mod_nw_tos:  
设置IPv4头ToS/DSCP或IPv6头traffic class fieldDSCP比特位设置成,数值必须是4的倍数,且在[0, 255]区间。这个action并不会修改ToS中的低2位(2 LSB)
mod_nw_ecn:  
设置IPv4ToSIPv6头traffic class fieldECN比特位为<ecn>,数值区间为[0, 3]。这个action并不会修改高6位(6 MSB)。

需要OpenFLow 1.1以上。
mod_nw_ttl:<ttl>  
修改IPv4 TTL或IPv6 hop limit为,取值区间为[0, 255]。
需要OpenFlow 1.1以上。

这里写代码片transport header mod

mod_tp_src:
mod_tp_dst:
将数据包的TCP/UDP/SCTP源或目的端口设置成


VLAN相关配置实例:

添加VLAN tag
ovs-ofctl add-flow br0 in_port=1,actions=mod_vlan_vid:10,output:2
剥去VLAN tag
ovs-ofctl add-flow br0 in_port=2,dl_vlan=100,actions=strip_vlan,output:1  
使用cookie
添加一条 flow
ovs-ofctl add-flow br0 cookie=0xf,tcp,tcp_dst=22,actions=mod_nw_tos:128,normal
删除这条 flow
ovs-ofctl del-flows br0 cookie=0xf/-1,tcp,tcp_dst=22  

或使用这条命令删除:
ovs-ofctl del-flows br0 cookie=0xf/-1
trace 一条 flow
ovs-appctl ofproto/trace br0 tcp,tcp_dst=22  

你可能感兴趣的:(OpenvSwitch)