在SDN中最重要的就是控制器,控制器的代码决定了整个网络的特点,Ryu提供了很多协议的数据包代码,我们可以根据这些代码对网络中的数据包进行修改,达到我们想要的效果。
Ping是我们经常用到的一个命令,我们用它来检测网络连通性,如果收到了目标IP的应答消息,我们就认为Ping成功了。
据此我们可以编写一个程序,来实现主机不管ping什么地址,我们都可以给它应答。
下面先放代码:
import sys
sys.path.append("/home/manminglei/ryu")
from ryu.lib.packet import *
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
class IcmpResponder(app_manager.RyuApp):
OFP_VERSIONS = [ofproto_v1_3.OFP_VERSION]
def __init__(self, *args, **kwargs):
super(IcmpResponder, self).__init__(*args, **kwargs)
self.hw_addr = '66:66:66:66:66:66'
@set_ev_cls(ofp_event.EventOFPSwitchFeatures, CONFIG_DISPATCHER)
def _switch_features_handler(self, ev):
msg = ev.msg
datapath = msg.datapath
ofproto = datapath.ofproto
parser = datapath.ofproto_parser
actions = [parser.OFPActionOutput(port=ofproto.OFPP_CONTROLLER,max_len=ofproto.OFPCML_NO_BUFFER)]
inst = [parser.OFPInstructionActions(type_=ofproto.OFPIT_APPLY_ACTIONS,actions=action