流規則組成:每條流規則由一系列字段組成,分為基本字段、條件字段和動作字段三部分
一:基本字段
基本字段包括生效時間duration_sec、所屬表項table_id、優先級priority、處理的數據包數n_packets,空閑超時時間idle_timeout等,空閑超時時間idle_timeout以秒為單位,超過設置的空閑超時時間后該流規則將被自動刪除,空閑超時時間設置為0表示該流規則永不過期,idle_timeout將不包含於ovs-ofctl dump-flows brname的輸出中。
cookie=value 流表標識字段:
cookie字段有兩種書寫方式:cookie=value和cookie=value/mask。mask中對應位為1時cookie中值相應的位須嚴格匹配,為0時cookie中值對應的位通配,當mask為-1時,必須嚴格匹配cookie值。
duration=value:
流表生效時間,標識流表從下發到現在所持續的時間
table=tableid:
流表所屬表項,標識流表所屬的表,默認為0
priority=priority:
標識流表的優先級,范圍為0-65535,值越大,優先級越高
n_packets:
標識流表匹配包數
n_bytes:
標識流表匹配字節數
idle_timeout=sec:
流表空閑超時時間,流表會在空閑時間達到給定的時間時被刪除。設置為0(默認值)時,流表不會因空閑時間被刪除。
hard_timeout=sec:
流表可存在的時間。設置此值后,流表會在到達給定時間后被刪除。
idle_age=sec:
流表空閑時間
hard_age=sec:
流表存在時間。此字段與duration字段的區別在當流表被修改后,會重新設置hard_timer但是不會重置duration
二:條件字段
條件字段包括輸入端口號in_port、源目的mac地址dl_src/dl_dst、源目的ip地址nw_src/nw_dst、數據包類型dl_type、網絡層協議類型nw_proto等,可以為這些字段的任意組合,但在網絡分層結構中底層的字段未給出確定值時上層的字段不允許給確定值,即一條流規則中允許底層協議字段指定為確定值,高層協議字段指定為通配符(不指定即為匹配任何值),而不允許高層協議字段指定為確定值,而底層協議字段卻為通配符(不指定即為匹配任何值),否則,ovs-vswitchd 中的流規則將全部丟失,網絡無法連接。
in_port=port
標識匹配接收數據包的端口號
dl_vlan_pcp=priority
匹配IEEE 802.1q優先碼點(PCP)優先級,該優先級指定為0到7之間的值,包括0和7。更高的值表示更高的幀優先級。
dl_type=ethertype
匹配以太網協議類型ethertype,該類型指定為0到65535之間的整數
匹配數據包的二層協議類型,IP數據包為0x0800,IPv6數據包為0x86dd,ARP數據包為0x0806
dl_src=xx:xx:xx:xx:xx:xx
dl_dst=xx:xx:xx:xx:xx:xx
匹配指定的鏈路層源或者目的MAC地址
dl_src=xx:xx:xx:xx:xx:xx/xx:xx:xx:xx:xx:xx
dl_dst=xx:xx:xx:xx:xx:xx/xx:xx:xx:xx:xx:xx
匹配指定的鏈路層MAC地址,MAC地址格式為ADDR/MASK,當MASK值為01:00:00:00:00:00時,僅匹配多播位。當dl_dst=01:00:00:00:00:00/01:00:00:00:00:00時,匹配所有的組播報文和廣播報文。dl_dst=00:00:00:00:00:00/01:00:00:00:00:00匹配所有的單播報文。
nw_src=ip[/mask]
nw_dst=ip[/mask]
當dl_type=0x0800或指定ip時,匹配數據包的源、目的IP地址 當dl_type=0x0806或指定arp時,匹配ARP數據包的ar_spa或者ar_tpa字段
dl_vlan=vlan
匹配802.1Q類型(即vlan)數據包
vlan_tci=tci[/mask]
匹配修改后的VLAN TCI TCI。如果省略掩碼,則tci就是要匹配的VLAN tci;如果指定了掩碼,那么掩碼中的1位表示tci中的對應位必須完全匹配,0位的通配符表示該位。
nw_proto=proto
匹配數據包協議類型。當dl_type=0x0800時,匹配IP協議族的協議,例如tcp,udp,icmp等
當指定ip或dl_type=0x0800時,匹配ip協議類型proto, proto指定為0到255之間的十進制數(例如1匹配ICMP包或6匹配TCP包)。
當指定ipv6或dl_type=0x86dd時,匹配ipv6報頭類型proto,它被指定為0到255之間的十進制數(例如58匹配ICMPv6包或6匹配TCP)。
當指定arp或dl_type=0x0806時,匹配arp操作碼的較低8位。
當指定rarp或dl_type=0x8035時,匹配ARP操作碼的較低8位。
nw_tos=tos
匹配IP Tos/DSCP或者IPv6的tos字段,值為0-255
nw_ecn=ecn
匹配IP ToS或IPv6流量類字段中的ecn位,該字段指定為0到3之間的十進制數(包括3)。
nw_ttl=ttl
匹配IP TTL或IPv6跳限值TTL, TTL指定為0到255之間的小數,包括在內。
tp_src=port
tp_dst=port
若指定了udp或者tcp協議,則匹配udp/tcp的端口號
icmp_type=type
icmp_code=code
若指定了icmp或者icmpv6協議,則匹配對應的icmp 類型或者code字段
table=number
如果指定,則限制流操作和流轉儲命令僅應用於給定數字在0到254之間的表。
ip_frag=frag_type:
當dl_type指定為IP或者IPv6,frag_type指定匹配的IP分片包或者非分片包的匹配 frag_type支持的值為:
no: 僅匹配非分片報文
yes:匹配所有分片報文
first:僅匹配offset為0的分片報文
later:僅匹配offset非0的分片報文
not_later:匹配非分片報文和offset為0的分片報文
arp_sha=xx:xx:xx:xx:xx:xx
arp_tha=xx:xx:xx:xx:xx:xx
當設置dl_type為ARP或者RARP,則arp_sha和arp_tha匹配數據包的源、目的MAC地址
tun_id=tunnel-id[/mask]
匹配隧道標識符--隧道id。只有通過帶有密鑰的隧道到達的數據包(例如帶有RFC 2890密鑰擴展名和非零密鑰值的GRE)才具有非零的隧道ID。
三:動作字段
動作字段包括正常轉發normal、定向到某交換機端口output:port、丟棄drop、更改源目的mac地址mod_dl_src/mod_dl_dst等,一條流規則可有多個動作,動作執行按指定的先后順序依次完成。
output:port
將數據包從port接口發送
output:src[start..end]
將包輸出到從src讀取的OpenFlow端口號,該src是NXM字段所包含數據。例如:output:NXM_NX_REG0[16..31],表示輸出端口號是從NXM_NX_REG0寄存器的16-31為中讀取的數據
enqueue:port:queue
將數據包入隊到指定端口的指定隊列里
normal
將數據包按照設備上的正常L2/L3層處理方式進行處理
flood
將數據包發送到交換機上除接收接口和禁止flood的接口外的所有接口
all
將數據包發送到除接收接口外的所有接口
controller(key=value…)
將數據包作為PACKET IN消息發送到OpenFlow控制器。
支持的鍵值對:
max_len=nbytes:限制發送到控制器的數據包長度字節數,默認情況是發送整個數據包;
reason=reason:在PACKET IN消息中指明發送消息的原因,支持的reason為action(default),no_match和invalid_ttl;
id=controller-id:指明控制器ID
in_port
將數據包從接收的接口發送出去
drop
丟棄數據包
mod_vlan_vid:vlan_vid
修改數據包的vlan id
mod_vlan_pcp:vlan_pcp
vlan_pcp 修改數據包的vlan priority
strip_vlan
如果數據包中存在vlan tag,則剝離vlan tag
push_vlan:ethertype
為數據包添加新的vlan tag
push_mpls:ethertype
如果包還沒有包含任何MPLS標簽,則將包的Ethertype更改為Ethertype,它必須是MPLS單播Ethertype 0x8847或MPLS多播Ethertype 0x8848,然后推送一個初始標簽堆棧條目。
pop_mpls:ethertype
去掉最外層的MPLS標簽堆棧條目
mod_dl_src:mac
設置數據包的源MAC地址
mod_dl_dst:mac
設置數據包的目的MAC地址
mod_nw_src:ip
設置數據包的源IP地址
mod_nw_dst:ip
設置數據包的目的IP地址
mod_tp_src:port
設置TCP或者UDP的源端口
mod_tp_dst:port
設置TCP或UDP的目的端口
mod_nw_tos:tos
將IPv4 ToS/DSCP字段設置為ToS,該字段必須是0到255之間的4的倍數。
resubmit([port],[table])
第一個參數:使用端口替換in_port字段(如果指定了端口),重第二個參數:重新指定流表,搜索這個OpenFlow流表(或表指定其編號的表)
set_tunnel:id
set_tunnel64:id
如果輸出到將包封裝在隧道中並支持標識符(如GRE)的端口,則將標識符設置為id。
set_queue:queue
設置輸出包時應用於排隊的隊列。
pop_queue
將隊列恢復到應用任何set_queue操作之前的值。
dec_ttl
dec_ttl[(id1,id2)]
減少IPv4包或跳限制的IPv6包的TTL。
set_mpls_ttl:ttl
設置包的外部MPLS標簽堆棧條目的TTL。ttl應該在0到255之間(包括255)。
dec_mpls_ttl
外部MPLS標簽棧的TTL遞減
move:src[start..end]−>dst[start..end]
將指定的位從字段src復制到字段dst。src和dst必須是nicira−ext.h中定義的NXM字段名,例如NXM_OF_UDP_SRC 或者 NXM_NX_REG0.
例如:
move:NXM_NX_REG0 [0 . . 5]−> NXM_NX_REG1 [26 . .31]將寄存器0中編號為0到5(含5)的6位拷貝到寄存器26到31(含31)中; move:NXM_NX_REG0 [0 . .15]−>NXM_OF_VLAN_TCI[]將寄存器0中最不重要的16位復制到VLAN TCI字段中。
load:value−>dst[start..end]
寫值value到dst指定位置(從start位到end位),例如:load:55−>NXM_NX_REG2[0..5] 就是將55寫入NAX_NX_REG2[0..5],數據存放位數為6位,110111
push:src[start..end]
從開始到結束的比特包括在內,均存放在棧頂的字段中。 例如:push:NXM_NX_REG2 [0 . .5]將存儲在寄存器2中從0到5(含5位)中的值推送到內部堆棧。
pop:dst[start..end]
從堆棧頂部彈出,從彈出的值中檢索包含開始到結束的位,並將它們存儲到dst中相應的位。 例如:pop:NXM_NX_REG2 [0 . .5]從堆棧頂部彈出值。設置寄存器2從0到5,將棧頂數據存放到該寄存器0-5。
set_field:value−>dst
將文字值寫入dst字段,該字段應指定為用於匹配的名稱。 例如: set_field:fe80:0123:4567:890a:a6ba:dbff:fefe:59fa−>ipv6_src
learn(argument[,argument]…)
此操作在OpenFlow表中添加或修改一個流,類似於ovs−ofctl−strict mod−flow。參數指定流的匹配字段、操作和其他屬性,如下所示: idle_timeout=seconds hard_timeout=seconds priority=value 這些鍵值對的含義與通常的ovs - ofctl流語法中的含義相同 fin_idle_timeout=seconds fin_hard_timeout=seconds 將帶有指定參數的fin_timeout操作添加到新流。 table=number 應該插入新流的表。指定一個0到254之間的小數。如果表未指定,則默認為表1 field=value field[start..end]=src[start..end] field[start..end] 向新流添加匹配條件 load:value−>dst[start..end] load:src[start..end]−>dst[start..end] 向新流添加加載操作。 output:field[start..end] 將輸出操作添加到新流的操作中,該操作將輸出到從字段[start..]獲取的OpenFlow端口。end],它必須是上面描述的NXM字段