本文是基于OVS官方文档的学习笔记
http://openvswitch.org/support/dist-docs/ovs-ofctl.8.txt
ovs-ofctl show br0
Dump br0所使用的flow table:
ovs-ofctl dump-tables br0
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所用的协议。
匹配从OpenFlow port id 进入的数据包。
in_port=
匹配IEEE 802.1Q VLAN tag为 的数据包。 的值应该在[0-4095]这个区间。
为0xffff表示匹配没有VLAN tag的包:
dl_vlan=
匹配IEEE 802.1Q Priority Code Point(PCP, 优先级代码点)为的数据包,改值取值区间为[0-7]。数字越大,表示优先级越高。可以用于QoS。
例如:dl_dst=01:00:00:00:00:00/01:00:00:00:00:00
匹配源和目的MAC地址。其中”/”后面的为掩码。
比如说,如果掩码是:
- 01:00:00:00:00:00 只匹配组播MAC (第一个字节LSB为1的MAC地址为MAC组播地址)
- fe:ff:ff:ff:ff:ff 匹配其他所有MAC,除了组播MAC
- ff:ff:ff:ff:ff:ff 完全匹配掩码前的MAC,和省掉掩码的效果一样
- 00:00:00:00:00:00 完全通配,相当于(dl_dst=*)
匹配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 代替。
当使用了 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的值会被忽略
传输层协议如TCP/UDP协议的源端口号、目的端口号
要和 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的值会被忽略
匹配IP ToS字段或IPv6的traffic class字段取值为的数据包。取值区间[0, 255],需要注意的是最低2位会被忽略。当dl_type使用除0x800(IP)和0x86dd(IPv6)以外的数值时,该字段被忽略。
匹配IP和IPv6的TTL字段为的数据包。取值区间[0, 255]。当dl_type使用除0x800(IP)和0x86dd(IPv6)以为的数值时,该字段被忽略。
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
ovs-ofctl的 add-flow 以及 mod-flows 命令都需要 actions 字段,描述对匹配的数据包执行的动作
在上述的三条命令中,actions字段是flow的一部分,actions字段中可以有多个 action,它们之间用逗号隔开,一个flow的完整语法如下:
=,[=]...,actions=[,...]
可使用的action非常多。如下:
output:
将数据包输出到OpenFlow port
group:
将数据包输出到OpenFlow group
按照设备的常规L2/L3处理流程来处理数据包。这通常是OVS默认flow中的action。要注意的是,并不是所有的OpenFlow switch都支持这个action。
将数据包输出到所有物理端口,除了该数据包的输入口以及不可被flooding的端口。
将数据包输出到所有物理端口,除了该数据包的输入口。
将数据包输出到local port(与bridge同名的端口)
in_port
将数据包输出到其输入口
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(,)
将数据包放到端口的队列中。其中必须是OpenFlow端口号或关键字(如”LOCAL”)。不同交换机支持的队列数不同,有些OpenFlow实现根本不支持队列。
drop
丢掉该数据包。
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.
如果数据包有VLAN tag,则剥去VLAN tag。
mod_dl_src:<mac>
mod_dl_dst:<mac>
设置数据包的源或目的MAC地址
mod_nw_src:<ip>
mod_nw_dst:<ip>
设置数据包的源或目的IP地址
mod_nw_tos:
设置IPv4头ToS/DSCP或IPv6头traffic class field中DSCP比特位设置成,数值必须是4的倍数,且在[0, 255]区间。这个action并不会修改ToS中的低2位(2 LSB)。
mod_nw_ecn:
设置IPv4头ToS或IPv6头traffic class field中ECN比特位为<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 modmod_tp_src:
mod_tp_dst:
将数据包的TCP/UDP/SCTP源或目的端口设置成
添加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