删除与特定 cookie 匹配的流 - OpenVSwitch 支持 OpenFlow 1.3.5 规范
Delete Flows matching specific cookie - OpenFlow 1.3.5 Spec support by OpenVSwitch
根据 OpenFlow 1.3.5 规范,第 44 页指定以下内容:
Modify and delete commands can also be filtered by cookie value, if the cookie_mask field contains
a value other than 0. This constraint is that the bits specified by the cookie_mask in both
the cookie field of the flow mod and a flow entry’s cookie value must be equal. In other words,
(flow entry.cookie&flow mod.cookie mask) == (flow mod.cookie&flow mod.cookie mask).
现在,使用基于 Ryu python 的控制器,我尝试通过指定流的 cookie 值来删除流,但该过程没有成功。
以下代码是我使用的测试示例。
from ryu.base.app_manager import RyuApp
from ryu.controller.dpset import EventDP
from ryu.controller.handler import MAIN_DISPATCHER
from ryu.controller.handler import set_ev_cls
from ryu.ofproto import ofproto_v1_3
from ryu.ofproto import ether, inet
class MPLS_Testing(RyuApp):
OFP_VERSIONS = [ofproto_v1_3.OFP_VERSION]
@set_ev_cls(EventDP, MAIN_DISPATCHER)
def switch_connect_event(self, ev):
ofp_parser = ev.dp.ofproto_parser
ofp = ev.dp.ofproto
datapath_obj = ev.dp
if ev.enter:
datapath_obj.send_msg( # Removes all flows registered in this switch.
ofp_parser.OFPFlowMod(
datapath=datapath_obj,
table_id=ofp.OFPTT_ALL,
command=ofp.OFPFC_DELETE,
out_port=ofp.OFPP_ANY,
out_group=ofp.OFPG_ANY,
)
)
add_label_flow = ofp_parser.OFPFlowMod(
datapath=datapath_obj,
cookie=1,
table_id=0,
command=ofp.OFPFC_ADD,
match=ofp_parser.OFPMatch(
in_port=1
),
instructions=[
ofp_parser.OFPInstructionActions(
ofp.OFPIT_APPLY_ACTIONS,
[
ofp_parser.OFPActionPushMpls(),
ofp_parser.OFPActionSetField(mpls_label=16),
]
),
ofp_parser.OFPInstructionGotoTable(table_id=1),
]
)
datapath_obj.send_msg(add_label_flow)
add_label_flow2 = ofp_parser.OFPFlowMod(
datapath=datapath_obj,
cookie=2,
table_id=1,
command=ofp.OFPFC_ADD,
match=ofp_parser.OFPMatch(
in_port=1
),
instructions=[
ofp_parser.OFPInstructionActions(
ofp.OFPIT_APPLY_ACTIONS,
[
ofp_parser.OFPActionPushMpls(),
ofp_parser.OFPActionSetField(mpls_label=12),
]
),
ofp_parser.OFPInstructionGotoTable(table_id=2),
]
)
datapath_obj.send_msg(add_label_flow2)
# Deletes flow with cookie equal to 2.
datapath_obj.send_msg(
ofp_parser.OFPFlowMod(
cookie=2,
cookie_mask=0xFFFFFFFFFFFFFFFF,
datapath=datapath_obj,
command=ofp.OFPFC_DELETE,
out_port=ofp.OFPP_ANY,
out_group=ofp.OFPG_ANY,
)
)
谁能告诉我 OpenVSwitch 2.9 在从表中删除流时是否支持 cookie 匹配? OpenFlow 1.3.5 规范明确指出,当 cookie_mask 不为零时,删除命令也可以使用 cookie 值过滤流。目前,我有点迷路了。
我已经弄清楚缺少什么了。
@pchaigno 感谢您的支持。
OFPFlowMod
中似乎缺少 table_id = OFPTT_ALL
信息。 Ryu 似乎在初始化对象时将该值默认为零。因此,当 OFPFlowMod
消息用作 OFPFC_DELETE
命令时,Ryu 默认添加 table_id = 0
匹配要求。
因此,当使用 Ryu 时,从 Switch 中删除 cookie
等于 2
的流的正确消息结构是:
ofp_parser.OFPFlowMod(
datapath=datapath_obj,
cookie=2,
cookie_mask=0xFFFFFFFFFFFFFFFF,
table_id=ofp.OFPTT_ALL,
command=ofp.OFPFC_DELETE,
out_port=ofp.OFPP_ANY,
out_group=ofp.OFPG_ANY
)
根据标准,out_port
需要等于OFPP_ANY
并且
out_group
字段需要等于OFPG_ANY
,否则两个字段都将被视为匹配要求。
table_id
字段似乎遵循几乎相同的逻辑,需要
table_id = OFPTT_ALL
匹配所有表。
我现在认为这个问题已经解决了。
根据 OpenFlow 1.3.5 规范,第 44 页指定以下内容:
Modify and delete commands can also be filtered by cookie value, if the cookie_mask field contains a value other than 0. This constraint is that the bits specified by the cookie_mask in both the cookie field of the flow mod and a flow entry’s cookie value must be equal. In other words, (flow entry.cookie&flow mod.cookie mask) == (flow mod.cookie&flow mod.cookie mask).
现在,使用基于 Ryu python 的控制器,我尝试通过指定流的 cookie 值来删除流,但该过程没有成功。
以下代码是我使用的测试示例。
from ryu.base.app_manager import RyuApp
from ryu.controller.dpset import EventDP
from ryu.controller.handler import MAIN_DISPATCHER
from ryu.controller.handler import set_ev_cls
from ryu.ofproto import ofproto_v1_3
from ryu.ofproto import ether, inet
class MPLS_Testing(RyuApp):
OFP_VERSIONS = [ofproto_v1_3.OFP_VERSION]
@set_ev_cls(EventDP, MAIN_DISPATCHER)
def switch_connect_event(self, ev):
ofp_parser = ev.dp.ofproto_parser
ofp = ev.dp.ofproto
datapath_obj = ev.dp
if ev.enter:
datapath_obj.send_msg( # Removes all flows registered in this switch.
ofp_parser.OFPFlowMod(
datapath=datapath_obj,
table_id=ofp.OFPTT_ALL,
command=ofp.OFPFC_DELETE,
out_port=ofp.OFPP_ANY,
out_group=ofp.OFPG_ANY,
)
)
add_label_flow = ofp_parser.OFPFlowMod(
datapath=datapath_obj,
cookie=1,
table_id=0,
command=ofp.OFPFC_ADD,
match=ofp_parser.OFPMatch(
in_port=1
),
instructions=[
ofp_parser.OFPInstructionActions(
ofp.OFPIT_APPLY_ACTIONS,
[
ofp_parser.OFPActionPushMpls(),
ofp_parser.OFPActionSetField(mpls_label=16),
]
),
ofp_parser.OFPInstructionGotoTable(table_id=1),
]
)
datapath_obj.send_msg(add_label_flow)
add_label_flow2 = ofp_parser.OFPFlowMod(
datapath=datapath_obj,
cookie=2,
table_id=1,
command=ofp.OFPFC_ADD,
match=ofp_parser.OFPMatch(
in_port=1
),
instructions=[
ofp_parser.OFPInstructionActions(
ofp.OFPIT_APPLY_ACTIONS,
[
ofp_parser.OFPActionPushMpls(),
ofp_parser.OFPActionSetField(mpls_label=12),
]
),
ofp_parser.OFPInstructionGotoTable(table_id=2),
]
)
datapath_obj.send_msg(add_label_flow2)
# Deletes flow with cookie equal to 2.
datapath_obj.send_msg(
ofp_parser.OFPFlowMod(
cookie=2,
cookie_mask=0xFFFFFFFFFFFFFFFF,
datapath=datapath_obj,
command=ofp.OFPFC_DELETE,
out_port=ofp.OFPP_ANY,
out_group=ofp.OFPG_ANY,
)
)
谁能告诉我 OpenVSwitch 2.9 在从表中删除流时是否支持 cookie 匹配? OpenFlow 1.3.5 规范明确指出,当 cookie_mask 不为零时,删除命令也可以使用 cookie 值过滤流。目前,我有点迷路了。
我已经弄清楚缺少什么了。
@pchaigno 感谢您的支持。
OFPFlowMod
中似乎缺少 table_id = OFPTT_ALL
信息。 Ryu 似乎在初始化对象时将该值默认为零。因此,当 OFPFlowMod
消息用作 OFPFC_DELETE
命令时,Ryu 默认添加 table_id = 0
匹配要求。
因此,当使用 Ryu 时,从 Switch 中删除 cookie
等于 2
的流的正确消息结构是:
ofp_parser.OFPFlowMod(
datapath=datapath_obj,
cookie=2,
cookie_mask=0xFFFFFFFFFFFFFFFF,
table_id=ofp.OFPTT_ALL,
command=ofp.OFPFC_DELETE,
out_port=ofp.OFPP_ANY,
out_group=ofp.OFPG_ANY
)
根据标准,out_port
需要等于OFPP_ANY
并且
out_group
字段需要等于OFPG_ANY
,否则两个字段都将被视为匹配要求。
table_id
字段似乎遵循几乎相同的逻辑,需要
table_id = OFPTT_ALL
匹配所有表。
我现在认为这个问题已经解决了。