Common code for bridges used by OVS agent
class OVSAgentBridge(ofswitch.OpenFlowSwitchMixin, br_cookie.OVSBridgeCookieMixin, ovs_lib.OVSBridge)
neutron/plugins/ml2/drivers/openvswitch/agent/openflow/native/ovs_bridge.py
_cached_dpid = None
获取该 bridge 上 datapath 的信息(dp, dp.ofproto, dp.ofproto_parser
)。
为该 bridge 设定 controller
设定流表 从 in_port
进入的流量采取丢弃操作
neutron/plugins/ml2/drivers/openvswitch/agent/openflow/native/ofswitch.py
这个类完成了对 RYU 调用(流表的操作)的封装
openflow 中的 instruction 和 action 的区别:
def __init__(self, *args, **kwargs):
self._app = kwargs.pop('ryu_app')
super(OpenFlowSwitchMixin, self).__init__(*args, **kwargs)
调用 ofctl_api.get_datapath
构造一个 OFPMatch
的对象
发送消息到交换机
调用 ofctl_api.send_msg
def delete_flows(self, table_id=None, strict=False, priority=0, cookie=0, cookie_mask=0, match=None, **match_kwargs)
删除流表
- 调用
_match
构造OFPMatch
对象 - 构造
OFPFlowMod
消息对象 - 调用
_send_msg
发送消息
获取所有流表
- 调用
_get_dp
获取 datapath - 构造
OFPFlowStatsRequest
的消息实例 - 调用
_send_msg
发送消息,获取返回值
改变流表的动作。
调用 install_instructions
设置转发将符合该流表的流量转发到 dest_table_id
流表
将符合该流表的流量转发到下一个流表
设置符合条件(match
) 的动作为 output
设置符合条件(match
) 的动作为 normal
设置符合条件(match
) 的动作为 drop
设定对符合该流表的流量采取什么动作
Cookie:被 Remote Controller 用来筛选 Flow Statistics、Flow Modification 或者 Flow Deletion 行为的指示值
- 这个类提供了对 ovs flow cookie 的处理。
- 将多有使用过的 cookie 放在
_default_cookie
变量中 - 新的 cookie 一定是未使用过的(也就是未放在
_default_cookie
变量中),请求成功后会也会放入_default_cookie
中
neutron/plugins/ml2/drivers/openvswitch/agent/openflow/native/br_cookie.py
class OVSBridgeCookieMixin(object):
'''Mixin to provide cookie retention functionality
to the OVSAgentBridge
'''
def __init__(self, *args, **kwargs):
super(OVSBridgeCookieMixin, self).__init__(*args, **kwargs)
self._reserved_cookies = set()
属性方法,返回当前已经使用过的 cookie 值
请求产生一个新的 cookie 值
手动设置一个 cookie 值
neutron/agent/common/ovs_lib.py
请参考文章 neutron/agent/NeutronAgent之OVS_LIB