我正在运行一个Ryu控制器和一个带有2个主机和1个开关的Mininet实例,如下所示 .
H1 ---小号--- H2
Ryu控制器中的代码
from ryu.base import app_manager
from ryu.controller import ofp_event
from ryu.controller.handler import CONFIG_DISPATCHER, MAIN_DISPATCHER
from ryu.controller.handler import set_ev_cls
from ryu.ofproto import ofproto_v1_3
from ryu.lib.packet import packet
from ryu.lib.packet import ethernet
from ryu.lib.packet import ether_types
class SimpleSwitch13(app_manager.RyuApp):
OFP_VERSIONS = [ofproto_v1_3.OFP_VERSION]
def __init__(self, *args, **kwargs):
super(SimpleSwitch13, self).__init__(*args, **kwargs)
self.mac_to_port = {}
@set_ev_cls(ofp_event.EventOFPSwitchFeatures, CONFIG_DISPATCHER)
def switch_features_handler(self, ev):
datapath = ev.msg.datapath
ofproto = datapath.ofproto
parser = datapath.ofproto_parser
基本上 the switch flow table is empty . 在这种情况下,当我从我的mininet控制台运行 h1 ping h2
并记录数据包交换时,这就是我从主机h1到wireshark的内容 .
mininet实例中没有路由器 . 我如何从发起ping的同一主机收到ICMP主机目标无法到达消息?
2 回答
您发布的应用代码是 not complete .
对于完整的simple_switch_13.py,您可以从osrg github获取它 .
看一下,就像这样:
这个simple_switch_13.py应用程序只处理第2层转发,这是你的情况 .
如您所见,在 Build 连接后,
switch_features_handler
将侦听此事件并在交换机上添加send all flow to controller
流 . (table-miss
flow)对于正常状态,当控制器收到PACKET_IN时,它将检查dst_MAC是否在
mac_to_port
中 . 如果是,则输出到端口,同时插入流(其匹配字段为inport和dst_MAC); else(不在数组中),通过分配outport=FLOOD
将操作设置为FLOOD .在第2层交换中就是这种情况 .
对于第3层交换中的ICMP消息处理,您需要读取
rest_router.py
代码,这要复杂得多 .您的ICMP主机目标无法访问,因为h2永远不会回答ARP请求 .
由于h1没有ARP回复,因此ICMP错误消息来自其自己的IP堆栈 .