共计 10822 个字符,预计需要花费 28 分钟才能阅读完成。
OpenvSwitch flow table 流表
OpenFlow(OF)被认为是第一个软件定义网络(SDN)规范之一。它最后在 SDN 环境中定义了通信协议,使 SDN 控制器可能与物理和虚构的交换机和路由器等网络设备的转发立体间接进行交互,从而更好地适应一直变动的业务需要。
如果把 OpenFlow 控制器比作“大脑”,OVS 流表就像是“大腿”一样承受来自“大脑”的指令,决定要向哪个方向后退。但 OVS 流表性能更加弱小,在没有 OpenFlow 控制器时,也能够自主工作,它自身也供一些命令让咱们能够间接治理流表。
操作命令
查看流表规定
# 查看 br-tun 上的全副流表规定
ovs-ofctl dump-flows br-tun
增加或批改流表规定
ovs-ofctl add−flow/add−flows/mod−flows“流表匹配条件,actions=[动作 1][, 动作 2…]”
如果你有过编程的教训,流表规定其实就是一个个简略的 if
语句,伪代码如下。
if (流表匹配条件){
动作 1,动作 2...
}
if (流表匹配条件){
动作 1,动作 2...
}
删除流表规定
# 删除 br-tun 上的全副流表规定
ovs-ofctl del-flows br-tun
# 删除 br-tun 上匹配 xx 的全副流表规定
ovs-ofctl del-flows br-tun xx
流表匹配条件
OVS 流表匹配条件较多,上面我将其分成四局部来阐明,别离是:
- OVS 匹配条件
- OSI 模型第二层【数据链路层】
- OSI 模型第三层【网络层】
- OSI 模型第四层【传输层】
OVS 匹配条件
in_port=port
流量进入的端口编号或者名称,示例 in_port=br-int
table=number
规定保留的流表编号,范畴是 0-254,默认值:0。
OSI 模型第二层【数据链路层】
dl
即是 data link
的缩写。
dl_type=ethertype
匹配以太网协定类型以太类型,以 10 到 65535 之间的整数(包含 0 和 65535)指定,以十进制或以 0x 前缀的十六进制数示意,示例如下。
dl_type=0x0800
匹配 IPv4 数据包,等同于dl_type=ip
。dl_type=0x086dd
匹配 IPv6 数据包,等同于dl_type=ipv6
。dl_type=0x0806
匹配 ARP 数据包,等同于dl_type=arp
。dl_type=0x8035
匹配 RARP 数据包,等同于dl_type=rarp
。
dl_vlan=vlan
数据包的 VLAN Tag 值,范畴是 0-4095,0xffff
代表不蕴含 VLAN Tag 的数据包
dl_vlan_pcp=priority
VLAN 优先级,取值区间为[0-7]。数字越大,示意优先级越高。
dl_src=xx:xx:xx:xx:xx:xx
dl_dst=xx:xx:xx:xx:xx:xx
源或目标的 MAC 地址
- 地址
01:00:00:00:00:00/01:00:00:00:00:00
代表播送 - 地址
00:00:00:00:00:00/01:00:00:00:00:00
代表单播 - 地址
fe:ff:ff:ff:ff:ff
匹配除多播位以外的所有位,基本上不会用到。 - 地址
ff:ff:ff:ff:ff:ff
齐全匹配(等同于省略子网掩码)。 - 地址
00:00:00:00:00:00
匹配全副位(等同于dl_dst=*
)。
OSI 模型第三层【网络层】
nw_src=ip[/netmask]
nw_dst=ip[/netmask]
如果 dl_type 为 0x0800(可能是通过简写模式,例如 ip 或 tcp),则匹配 IPv4 源(或指标)地址 ip,能够将其指定为 IP 地址或主机名(例如 192.168.1.1 或 www.example.com)。可选的网络掩码容许将匹配限度为 IPv4 地址前缀。网络掩码能够指定为点分四边形(例如 192.168.1.0/255.255.255.0)或 CIDR 块(例如 192.168.1.0/24)。Open vSwitch 1.8 和更高版本反对任意点状四元掩码;晚期版本仅反对 CIDR 掩码,即等效于某些 CIDR 块的虚线四边形。
- 当指定
dl_type
为0x0800
或者ip
时,匹配源或者指标的 IPv4 地址,能够将其指定为 IP 地址或主机名,例如192.168.1.1
或www.typesafe.cn
。同时也能够写作192.168.1.0/255.255.255.0
或者192.168.1.0/24
的模式。 - 当指定
dl_type
为0x0806
或arp
时,别离与 IPv4 和 Ethernet 的 ARP 数据包中的ar_spa
或ar_tpa
字段匹配。 - 当指定
dl_type
为0x8035
或rarp
时,别离与 IPv4 和 Ethernet 的 RARP 数据包中的ar_spa
或ar_tpa
字段匹配。 - 当指定
dl_type
为0x0800
、0x0806
或0x8035
之外的其余值时,将疏忽nw_src
和nw_dst
的值。
nw_proto=proto
ipproto=proto
- 如果指定
ip
或dl_type=0x0800
,则匹配 IP 协定类型 proto,该协定类型被指定为 0 到 255 之间的十进制数(包含 1 和 0,用于蕴含 ICMP 数据包或 6 以匹配 TCP 数据包)。 - 如果指定了
ipv6
或dl_type=0x86dd
,则匹配 IPv6 标头类型原型,该模式指定为 0 到 255 之间的十进制数字(例如,包含 58 以匹配 ICMPv6 数据包或 6 以匹配 TCP)。标头类型是设计文档中形容的终端标头。 - 当指定
arp
或dl_type=0x0806
时,与 ARP 操作码的低 8 位匹配。大于 255 的 ARP 操作码被视为 0。 - 指定
rarp
或dl_type=0x8035
时,与 ARP 操作码的低 8 位匹配。大于 255 的 ARP 操作码被视为 0。 - 当通配符 dl_type 或将其设置为
0x0800
、0x0806
、0x8035
或0x86dd
之外的其余值时,将疏忽 nw_proto 的值(请参见下面的流语法)。
nw_tos=tos
匹配 IP ToS / DSCP 或 IPv6 流量类别字段 tos,该字段 tos 指定为 0 到 255 之间的十进制数字(包含 0 和 255)。请留神,出于匹配目标,将疏忽两个较低的保留位。
当通配符 dl_type 或将其设置为 0x0800
或0x86dd
之外的其余值时,将疏忽 nw_tos 的值。
ip_dscp=dscp
匹配 IP ToS / DSCP 或 IPv6 流量类字段 dscp,该字段指定为介于 0 和 63 之间(含 0 和 63)的十进制数。
当通配符 dl_type 或将其设置为 0x0800
或0x86dd
之外的其余值时,将疏忽 ip_dscp 的值(请参见下面的流语法)。
nw_ecn=ecn
ip_ecn=ecn
匹配 IP ToS 或 IPv6 流量类别字段中的 ecn 位,该 ecn 位指定为 0 到 3(含 0 和 3)之间的十进制数。当通配符 dl_type 或将其设置为 0x0800
或0x86dd
之外的其余值时,将疏忽 nw_ecn 的值(请参见下面的流语法)。
nw_ttl=ttl
匹配 IP TTL 或 IPv6 跃点限度值 ttl,该值指定为 0 到 255 之间的十进制数字(包含 0 和 255)。
当通配符 dl_type 或将其设置为 0x0800
或0x86dd
之外的其余值时,将疏忽 nw_ttl 的值(请参见下面的流语法)。
OSI 模型第四层【传输层】
tcp_src=port
tcp_dst=port
udp_src=port
udp_dst=port
sctp_src=port
sctp_dst=port
匹配 TCP,UDP 或 SCTP 源端口或指标端口,端口号指定为 0 到 65535(含 0 和 65535)之间的十进制数。
当通配符 dl_type 和 nw_proto 或将其设置为不示意适当协定的值时,这些设置的值将被疏忽(请参见下面的流语法)。
tcp_src=port/mask
tcp_dst=port/mask
udp_src=port/mask
udp_dst=port/mask
sctp_src=port/mask
sctp_dst=port/mask
TCP(或 UDP 或 SCTP)源或指标端口上的按位匹配。端口和掩码是 16 位数字,以十进制或十六进制写为 0x。掩码中的每个 1 位要求端口中的相应位必须匹配。掩码中的每个 0 位都会导致疏忽相应的位。
传输端口上的按位匹配很少在隔离中有用,然而能够应用一组匹配项来缩小在一系列传输端口上进行匹配所需的流数。例如,假如指标是将 TCP 源端口 1000 匹配到 1999(含)。一种办法是插入 1000 个流,每个流在单个源端口上匹配。另一种办法是查看 1000 和 1999 的二进制示意模式,如下所示:
01111101000
11111001111
而后将其转换为一系列按位匹配,以实现雷同的后果:
01111101xxx
0111111xxxx
10xxxxxxxxx
110xxxxxxxx
1110xxxxxxx
11110xxxxxx
1111100xxxx
应用 ovs-ofctl 所需的语法编写时,这些内容如下:
tcp,tcp_src=0x03e8/0xfff8
tcp,tcp_src=0x03f0/0xfff0
tcp,tcp_src=0x0400/0xfe00
tcp,tcp_src=0x0600/0xff00
tcp,tcp_src=0x0700/0xff80
tcp,tcp_src=0x0780/0xffc0
tcp,tcp_src=0x07c0/0xfff0
仅 Open vSwitch 1.6 和更高版本反对传输端口上的按位匹配。
与上述齐全匹配模式一样,按位匹配模式仅在 dl_type 和 nw_proto 指定 TCP 或 UDP 或 SCTP 时实用。
tp_src=port
tp_dst=port
这些是 L4 端口匹配项已弃用的通用模式。在新代码中,请应用上述特定于 TCP,UDP 或 SCTP 的模式。
tcp_flags=flags/mask
tcp_flags=[+flag…][-flag…]
TCP 标记按位匹配。标记和掩码是 16 位数字,以十进制或以 0x 为前缀的十六进制示意。掩码中的每个 1 位要求标记中的相应位必须匹配。掩码中的每个 0 位都会导致疏忽相应的位。
或者,能够通过标记的符号名(在上面列出)来指定标记,每个标记名的后面都带有 +,示意必须设置的标记,或者 - 示意必须勾销设置的标记,且标记之间没有其余定界符。未提及的标记是通配符。例如,tcp,tcp_flags = + syn-ack 匹配不是 ACK 的 TCP SYN。TCP 协定以后定义 9 个标记位,并保留另外 3 个位(必须作为零发送),请参阅 RFC 793、3168 和 3540。这些标记位的编号从最低无效位开始:
- 0:fin 查找不再有来自发送方的数据。
- 1:syn 同步同步序列号。
- 2:rst 重置连贯。
- 3:psh 推送性能。
- 4:ack 确认字段无效。
- 5:urg 紧急指针字段无效。
- 6:ece ECN 回显。
- 7:cer 缩小拥塞窗口。
- 8:ns 现时总和
- 9-11:保留。
- 12-15:不解决,必须为零。
icmp_type=type
icmp_code=code
当 dl_type 和 nw_proto 指定 ICMP 或 ICMPv6 时,type 匹配 ICMP 类型,而代码匹配 ICMP 代码。每个参数都指定为介于 0 和 255 之间(含两端)的十进制数。
当 dl_type 和 nw_proto 采纳其余值时,这些设置的值将被疏忽(请参见下面的流语法)。
metadata=value[/mask]
在元数据字段中齐全匹配值或应用可选掩码匹配值。value 和 mask 是 64 位整数,默认状况下为十进制(应用 0x 前缀指定十六进制)。容许应用任意掩码值:掩码中的 1 位示意值中的对应位必须齐全匹配,而该位则应用 0 位通配符。在 Open vSwitch 1.8 中增加了对元数据的匹配。
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
vlan_tci=tci[/mask]
匹配批改后的 VLAN TCI tci。如果省略 mask,则 tci 是要匹配的确切 VLAN TCI;如果指定了 mask,则 mask 中的 1 位示意 tci 中的对应位必须齐全匹配,而 0 位通配符示意该位。tci 和 mask 均为 16 位值,默认状况下为十进制。应用 0x 前缀以十六进制指定它们。
对于没有 802.1Q 标头的数据包,vlan_tci 与之匹配的值为 0。否则,它是 802.1Q 标头中的 TCI 值,其中 CFI 位(值为 0x1000)被强制为 1。
- vlan_tci=0
仅匹配没有 802.1Q 标头的数据包。 - vlan_tci=0xf123
匹配 VLAN 0x123 中标记为优先级 7 的数据包。 - vlan_tci=0x1123/0x1fff
匹配标记有 VLAN 0x123(和任何优先级)的数据包。 - vlan_tci=0x5000/0xf000
匹配标记为优先级 2 的数据包(在任何 VLAN 中)。 - vlan_tci=0/0xfff
匹配没有 802.1Q 标头或带有 VLAN 0(和任何优先级)标记的数据包。 - vlan_tci=0x5000/0xe000
匹配没有 802.1Q 标头或带有优先级 2 标记的数据包(在任何 VLAN 中)。 - vlan_tci=0/0xefff
匹配没有 802.1Q 标头或带有 VLAN 0 和优先级 0 标记的数据包。
应用 dl_vlan 和 dl_vlan_pcp 也能够实现某些匹配可能性。
ip_frag=frag_type
当 dl_type 指定 IP 或 IPv6 时,frag_type 指定要匹配的 IP 片段或非片段类型。反对以下 frag_type 值:
- no
仅匹配非分段数据包。
- yes
匹配所有片段。
- first
仅匹配偏移量为 0 的片段。
- later
仅匹配非零偏移量的片段。
- not_later
匹配系统的非碎片数据包和碎片。
arp_spa=ip[/netmask]
arp_tpa=ip[/netmask]
当 dl_type 指定 ARP 或 RARP 时,arp_spa 和 arp_tpa 别离与源和指标 IPv4 地址匹配。能够将地址指定为 IP 地址或主机名(例如 192.168.1.1 或 www.example.com)。可选的网络掩码容许将匹配限度为 IPv4 地址前缀。网络掩码能够指定为点分四边形(例如 192.168.1.0/255.255.255.0)或 CIDR 块(例如 192.168.1.0/24)。
arp_sha=xx:xx:xx:xx:xx:xx
arp_tha=xx:xx:xx:xx:xx:xx
当 dl_type 指定 ARP 或 RARP 时,arp_sha 和 arp_tha 别离匹配源和指标硬件地址。地址指定为以冒号分隔的 6 对十六进制数字(例如 00:0A:E4:25:6B:B0)。
arp_sha=xx:xx:xx:xx:xx:xx/xx:xx:xx:xx:xx:xx
arp_tha=xx:xx:xx:xx:xx:xx/xx:xx:xx:xx:xx:xx
当 dl_type 指定 ARP 或 RARP 时,arp_sha 和 arp_tha 别离匹配源和指标硬件地址。地址指定为以冒号分隔的 6 对十六进制数字(例如 00:0A:E4:25:6B:B0),并在斜杠后加上通配符掩码。
arp_op=opcode
当 dl_type 指定 ARP 或 RARP 时,arp_op 与 ARP 操作码匹配。只能指定 1 到 255 之间的 ARP 操作码进行匹配。
ipv6_src=ipv6[/netmask]
ipv6_dst=ipv6[/netmask]
当 dl_type 为 0x86dd 时(可能通过简写模式,例如 ipv6 或 tcp6),匹配 IPv6 源(或指标)地址 ipv6,该地址能够按 RFC 2373 中的规定指定。首选格局为 x:x:x:x:x:x:x:x
,其中 x 是地址的八个 16 位块的十六进制值。:: 的单个实例可用于批示 16 位零的多个组。可选的网络掩码容许将匹配限度为 IPv6 地址前缀。网络掩码被指定为 IPv6 地址(例如2001:db8:3c4d:1::/ffff:ffff:ffff:ffff::
) 或 CIDR 块(例如2001:db8:3c4d:1::/64
)。关上 vSwitch 1.8 及更高版本,反对仲裁掩码;晚期版本仅反对 CIDR 掩码,即 CIDR 块和等同于 CIDR 块的 IPv6 地址。
ipv6_label=label
当 dl_type 为 0x86dd 时(可能通过简写模式,例如 ipv6 或 tcp6),匹配 IPv6 流标签 label。
tun_id=tunnel-id[/mask]
tunnel_id=tunnel-id[/mask]
匹配隧道标识符 tunnel-id。只有通过带有密钥的隧道达到的数据包(例如具备 RFC 2890 密钥扩展名和非零密钥值的 GRE)才会具备非零的隧道 ID。如果省略 mask,则 tunnel-id 是要匹配的确切隧道 ID;如果指定了 mask,则 mask 中的 1 位示意 tunnel-id 中的相应位必须齐全匹配,而 0 位通配符则将该位匹配。
tun_flags=flags
匹配标记,批示隧道封装的各个方面。以后,仅定义一个标记:
- oma
隧道协定批示这是一个 OAM 管制数据包。
能够在标记后面加上 + 或 - 来别离批示该标记应匹配为存在或不存在。另外,能够指定没有前缀的标记,并用 | 分隔。示意齐全匹配。
请留神,较新版本的 Open vSwitch 可能会引入具备不同含意的其余标记。因而,不倡议在此字段上应用齐全匹配,因为这些新标记的行为是未知的,应疏忽。
对于非隧道数据包,该值为 0。
此字段是在 Open vSwitch 2.5 中引入的。
tun_src=ip[/netmask]
tun_dst=ip[/netmask]
匹配隧道 IPv4 源(或指标)地址 ip。仅通过隧道达到的数据包将具备非零的隧道地址。该地址能够指定为 IP 地址或主机名(例如 192.168.1.1 或 www.example.com)。可选的网络掩码容许将匹配限度为被掩码的 IPv4 地址。子网掩码能够指定为点分四边形(例如 192.168.1.0/255.255.255.0)或 CIDR 块(例如 192.168.1.0/24)。
ipv6
等同于dl_type=0x86dd
tcp6
等同于dl_type=0x86dd,nw_proto=6
udp6
等同于dl_type=0x86dd,nw_proto=17
sctp6
等同于dl_type=0x86dd,nw_proto=132
icmp6
等同于dl_type=0x86dd,nw_proto=58
流表动作
满足匹配条件之后将会执行的动作。
output:port
将数据包输入到 OpenFlow 端口号 port。如果 port 是数据包的输出端口,则不输入数据包。
group:group_id
将数据包输入到 OpenFlow 组 group_id。仅 OpenFlow 1.1+ 反对组表。无关更多详细信息,请参见组语法。
normal
使数据包通过设施的惯例 L2 / L3 解决。(并非所有 OpenFlow 交换机都执行此操作。)
flood
在所有交换机物理端口上输入数据包,而不是在接管数据包的端口以及任何禁用洪泛的端口上进行输入(通常,这些端口是 IEEE 802.1D 生成树协定禁用的端口)。
all
在所有交换机物理端口上输入数据包,而不是在接管数据包的端口上。
local
在与本地网桥名称雷同的网络设备对应的 “ 本地端口 ” 上输入数据包。
in_port
在接管数据包的端口上输入数据包。
enqueue(port,queue)
将数据包放入端口 port 中的指定队列中,该队列必须是 OpenFlow 端口号或关键字(例如 LOCAL)。反对的队列数取决于交换机;具体取决于交换机。一些 OpenFlow 实现基本不反对排队。
drop
抛弃数据包,因而不会进行进一步的解决或转发。如果应用抛弃动作,则不能指定其余动作。
mod_vlan_vid:vlan_vid
批改报文的 VLAN ID。依据须要增加或批改 VLAN 标记以匹配指定的值。如果增加了 VLAN 标记,则应用零优先级(请参阅 mod_vlan_pcp 操作来设置此优先级)。
mod_vlan_pcp:vlan_pcp
批改报文的 VLAN 优先级。依据须要增加或批改 VLAN 标记以匹配指定的值。有效值介于 0(最低)和 7(最高)之间。如果增加了 VLAN 标记,则应用的 vid 为零(请参阅 mod_vlan_vid 操作进行设置)。
strip_vlan
从数据包中剥离 VLAN 标记(如果存在)。
push_vlan:ethertype
将新的 VLAN 标签推入数据包。以太网类型用作标签的以太网类型。仅应应用 ethertype 0x8100。(目前尚不反对标准容许的 0x88a8。)新标签应用优先级为零且标签为零。
mod_dl_src:mac
将源以太网地址设置为 mac。
mod_dl_dst:mac
将指标以太网地址设置为 mac。
mod_nw_src:ip
将 IPv4 源地址设置为 ip。
mod_nw_dst:ip
将 IPv4 指标地址设置为 ip。
mod_tp_src:port
将 TCP 或 UDP 或 SCTP 源端口设置为 port。
mod_tp_dst:port
将 TCP 或 UDP 或 SCTP 指标端口设置为 port。
mod_nw_tos:tos
将 IPv4 ToS / DSCP 或 IPv6 流量类字段中的 DSCP 位设置为 tos,该值必须为 0 到 255 之间的 4 的倍数。此操作不会批改 ToS 字段的两个最低无效位(ECN 位)。
mod_nw_ecn:ecn
将 IPv4 ToS 或 IPv6 流量类别字段中的 ECN 比特设置为 ecn,该值必须介于 0 和 3 之间(包含 0 和 3)。此操作不会批改该字段的六个最高无效位(DSCP 位)。
须要 OpenFlow 1.1 或更高版本。
mod_nw_ttl:ttl
将 IPv4 TTL 或 IPv6 跳数限度字段设置为 ttl,指定为 0 到 255 之间的十进制数(包含 0 和 255)。然而,没有很好地指定将 ttl 设置为零时的开关行为。
须要 OpenFlow 1.1 或更高版本。
resubmit:port
resubmit([port],[table])
从新搜寻此 OpenFlow 流表(或由表指定其编号的表),用 in_port 字段替换为端口(如果指定了 port),并执行找到的操作(如果有),以及此流条目中的任何其余操作。
set_tunnel:id
set_tunnel64:id
如果输入到将数据包封装在隧道中并反对标识符(例如 GRE)的端口,则将标识符设置为 id。如果应用 set_tunnel 模式,并且 id 能够包容 32 位,则此操作将应用 Open vSwitch 1.0 和更高版本反对的操作扩大。否则,如果 id 是 64 位值,则须要 Open vSwitch 1.1 或更高版本。
set_queue:queue
设置输入数据包时利用于排队的队列。反对的队列数取决于交换机;具体取决于交换机。一些 OpenFlow 实现基本不反对排队。
pop_queue
将队列复原为利用任何 set_queue 操作之前的值。
move:src[start..end]->dst[start..end]
将已命名的位从字段 src 复制到字段 dst。src 和 dst 必须是 nicira-ext.h 中定义的 NXM 字段名称,例如 NXM_OF_UDP_SRC 或 NXM_NX_REG0。每个开始和完结对(包含首尾对)必须指定雷同的位数,并且必须适宜其各自的字段。存在 [start..end] 的简写模式:应用 [bit] 指定单个位,或应用 [] 指定整个字段。
set_field:value[/mask]->dst
load:value−>dst[start..end]
将文字值加载到字段或字段的一部分中。对于 set_field,在字段 dst 的惯用语法中给出了值和可选掩码,示意为字段名。例如,set_field:00:11:22:33:44:55-> eth_src 将以太网源地址设置为 00:11:22:33:44:55。加载时,值必须是整数值(十进制或以 0x 结尾的十六进制前缀),而 dst 是该字段的 NXM 或 OXM 名称。例如,load:0x001122334455-> OXM_OF_ETH_DST []与后面的 set_field 示例具备雷同的成果。
出于历史起因,存在这两种模式。Open vSwitch 1.1 引入了 NXAST_REG_LOAD 作为 OpenFlow 1.0 的 Nicira 扩大,并应用 load 来表白它。起初,Open-Flow 1.2 引入了一个规范的 OFPAT_SET_FIELD 操作,该操作仅限于加载整个字段,因而 Open vSwitch 增加了具备此限度的表单 set_field。OpenFlow 1.5 将 OFPAT_SET_FIELD 扩大到了它成为 NXAST_REG_LOAD 的超集的境地。Open vSwitch 会依据所应用的 OpenFlow 版本转换两种语法:OpenFlow 1.0 和 1.1 中的 NXAST_REG_LOAD;在 OpenFlow 1.2、1.3 和 1.4 中,NXAST_REG_LOAD 用于加载或加载子字段,否则为 OFPAT_SET_FIELD;OpenFlow 1.5 及更高版本,OFPAT_SET_FIELD。
push:src[start..end]
在堆栈顶部的字段中,压入开始(包含完结)位。
示例:push:NXM_NX_REG2 [0..5]将存储在寄存器 2 位 0 到 5(含 0 和 5)中的值压入外部堆栈。
pop:dst[start..end]
从堆栈的顶部弹出,从弹出的值中检索蕴含开始到完结的位,并将它们存储在 dst 中的相应位中。
示例:pop:NXM_NX_REG2 [0..5]从堆栈顶部弹出该值。依据刚刚弹出的值的 0 至 5 位,将寄存器 2 的 0 至 5 位(包含 0 和 5)设置为 1。
multipath(fields,basis,algorithm,n_links,arg,dst[start..end])
应用 base 作为通用哈希参数对字段进行哈希解决,而后利用多路径链接抉择算法(带有参数 arg)从 0 到 n_links 减去 1 来抉择 n_links 输入链接之一,并将链接存储到 dst [start..end]中,它必须是如上所述的 NXM 字段。
其余的请参考官网操作手册