Hi all,
I want to use OSPF for routing in the ryu controller. To realize that aim,
I am trying to modify the ryu application "IcmpResponder.py" from Ryu-book.
It was done by serialize the protocol header: ethernet, ipv4 and ospf. The
modified app as in attachment.
Actually there was no error when I run the application. However I am not
sure whether the method for OSPF testing was already in the right way.
Could you please help me to figure out this situation?. Is it the right way
to serialize the ethernet, ipv4 and ospf protocol header?
My second question, how we can do a testing to make sure whether the OSPF
packet is already running. thank you.
regards,
Deni Lumbantoruan
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 ipv4
from ryu.lib.packet import ospf
class OspfResponder(app_manager.RyuApp):
OFP_VERSIONS = [ofproto_v1_3.OFP_VERSION]
def __init__(self,*args,**kwargs):
super(OspfResponder, self).__init__(*args,**kwargs)
self.hw_addr = '0a:e4:1c:d1:3e:44'
self.ip_addr = '10.0.0.50'
@set_ev_cls(ofp_event.EventOFPSwitchFeatures, CONFIG_DISPATCHER)
def _switch_features_handler(self, ev):
msg = ev.msg
print (msg)
datapath = msg.datapath
print (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=actions)]
mod = parser.OFPFlowMod(datapath=datapath,
priority=0,
match=parser.OFPMatch(),
instructions=inst)
datapath.send_msg(mod)
@set_ev_cls(ofp_event.EventOFPPacketIn, MAIN_DISPATCHER)
def _packet_in_handler(self, ev):
msg = ev.msg
datapath = msg.datapath
port = msg.match['in_port']
pkt = packet.Packet(data=msg.data)
self.logger.info("packet-in %s" % (pkt,))
pkt_ethernet = pkt.get_protocol(ethernet.ethernet)
#if not pkt_ethernet:
# return
#pkt_arp = pkt.get_protocol(arp.arp)
#if pkt_arp:
# self._handle_arp(datapath, port, pkt_ethernet, pkt_arp)
# return
pkt_ipv4 = pkt.get_protocol(ipv4.ipv4)
pkt_ospf = pkt.get_protocol(ospf.ospf)
if pkt_ospf:
self._handle_ospf(datapath, port, pkt_ethernet, pkt_ipv4, pkt_ospf)
return
"""add the ospf packet"""
def _handle_ospf(self, datapath, port, pkt_ethernet, pkt_ipv4, pkt_ospf):
if pkt_ospf.type != ospf.OSPF_MSG_LS_REQ:
return
pkt = packet.Packet()
pkt.add_protocol(ethernet.ethernet(ethertype=pkt_ethernet.ethertype,
dst=pkt_ethernet.src,
src=self.hw_addr))
pkt.add_protocol(ipv4.ipv4(dst=pkt_ipv4.src,
src=self.ip_addr,
proto=pkt_ipv4.proto))
pkt.add_protocol(ospf.OSPFMessage(type_=ospf.OSPF_MSG_LS_ACK, length = None, router_id = '0.0.0.0',
area_id = '0.0.0.0', au_type = 1, authentication = 0, checksum = None,
version = 2))
self._send_packet(datapath, port, pkt)
def _send_packet(self, datapath, port, pkt):
ofproto = datapath.ofproto
parser = datapath.ofproto_parser
pkt.serialize()
self.logger.info("packet-out %s" % (pkt,))
data = pkt.data
actions = [parser.OFPActionOutput(port=port)]
out = parser.OFPPacketOut(datapath=datapath,
buffer_id=ofproto.OFP_NO_BUFFER,
in_port=ofproto.OFPP_CONTROLLER,
actions=actions,
data=data)
datapath.send_msg(out)
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Ryu-devel mailing list
Ryu-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ryu-devel