I wrote the following simple code to see how RYU works. Based on the code,
I can see the list of switches. However, the links between switches
(wireless) are empty.





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 ether_types
from ryu.topology import event
from ryu.topology.api import get_all_switch, get_all_link, get_switch,
get_link
from ryu.lib import dpid as dpid_lib
from ryu.controller import dpset
from ryu.lib.packet import packet
from ryu.lib.packet import ethernet
from ryu.lib.packet import arp
from ryu.lib.packet import ipv4
from ryu.lib.packet import icmp
import copy
from ryu.topology.api import get_switch, get_link
from ryu.app.wsgi import ControllerBase
from ryu.topology import event, switches
from collections import defaultdict

#switches
switches = []
#mymac[srcmac]->(switch, port)
mymac={}
#adjacency map [sw1][sw2]->port from sw1 to sw2
adjacency=defaultdict(lambda:defaultdict(lambda:None))

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 = {}
        self.topology_api_app = self
        self.datapath_list=[]


    @set_ev_cls(ofp_event.EventOFPSwitchFeatures, CONFIG_DISPATCHER)
    def switch_features_handler(self, ev):
        self.logger.info("RYU received EventOFPSwitchFeatures")
        #ev.msg: the instance of openflow message class corresponding to
the event
        datapath = ev.msg.datapath #the instance of datapath
        ofproto = datapath.ofproto
        parser = datapath.ofproto_parser

        match = parser.OFPMatch() #match all packets
        #OFPActionOutput:out_port to the controller
        actions = [parser.OFPActionOutput(ofproto.OFPP_CONTROLLER,
                                          ofproto.OFPCML_NO_BUFFER)]


        inst = [parser.OFPInstructionActions(ofproto.OFPIT_APPLY_ACTIONS,
                                             actions)]

        mod = parser.OFPFlowMod(datapath=datapath, priority=0,
                                match=match, instructions=inst)
        datapath.send_msg(mod)

    #    self.add_flow(datapath, 0, match, actions)
        #table-miss flow entry has the lowest (0)priority and this entry
matches all packets


    @set_ev_cls(ofp_event.EventOFPPacketIn, MAIN_DISPATCHER)
    def _packet_in_handler(self, ev):
        msg = ev.msg
        datapath = msg.datapath
        ofproto = datapath.ofproto
        parser = datapath.ofproto_parser
       # get the received port number
        in_port = msg.match['in_port']
    #    print in_port

        pkt = packet.Packet(msg.data)
        eth = pkt.get_protocols(ethernet.ethernet)[0]

        if eth.ethertype == ether_types.ETH_TYPE_LLDP:
            # ignore lldp packet
            return
        dst = eth.dst
        src = eth.src
    #    print eth.ethertype
        dpid = datapath.id
        self.mac_to_port.setdefault(dpid, {})
     #   print self.mac_to_port
        self.logger.info("packet in %s %s %s %s", dpid, src, dst, in_port)


        # learn a mac address to avoid FLOOD next time.
        self.mac_to_port[dpid][src] = in_port
     #   print self.mac_to_port

       #if the destination mac address is already learned, decide
       #which port to output the packet, otherwise FLOOD

        if dst in self.mac_to_port[dpid]:
            out_port = self.mac_to_port[dpid][dst]
        else:
            out_port = ofproto.OFPP_FLOOD

        actions = [parser.OFPActionOutput(out_port)]



    @set_ev_cls(event.EventSwitchEnter)
    def get_topology_data(self, ev):
        global switches
        switch_list = get_switch(self.topology_api_app, None)
        switches=[switch.dp.id for switch in switch_list]
        self.datapath_list=[switch.dp for switch in switch_list]
        #print "self.datapath_list=", self.datapath_list
        print "switches=", switches

        links_list = get_link(self.topology_api_app, None)
        print links_list

mylinks=[(link.src.dpid,link.dst.dpid,link.src.port_no,link.dst.port_no)
for link in links_list]
        for s1,s2,port1,port2 in mylinks:
          adjacency[s1][s2]=port1
          adjacency[s2][s1]=port2
          print s1,s2,port1,port2


On Sun, Mar 4, 2018 at 9:40 PM, Iwase Yusuke <iwase.yusu...@gmail.com>
wrote:

> Hi,
>
> When (or in which handler) do you call "get_link()" API?
> Early point of starting up? For example, in your app's "__init__()" or
> "switch_features_handler()", topology service could not yet discover links.
> To discover all links, it will take some seconds and you need to wait for
> it.
>
> For another approach, how about using "EventLinkAdd" or "EventLinkDelete"
> to
> catch new links?
> https://github.com/osrg/ryu/blob/8a48b62c90745e8112bb3f7277e
> 8ac46dabb3e4e/ryu/topology/event.py#L104-L111
>
> Thanks,
> Iwase
>
>
> On 2018年03月05日 10:24, Myra Sh wrote:
>
>> Thank you for your reply.
>>
>> I added the same code. However, I only can see the list of switches and
>> the list of links is empty (Links between switches are wireless.)
>>
>> I used the following lines to see links.
>>
>>          links_list = get_link(self.topology_api_app, None)
>>          print links_list
>>
>> Do you have any suggestion to fix the problem?
>>
>> Thank you
>>
>> On Thu, Mar 1, 2018 at 9:06 PM, Iwase Yusuke <iwase.yusu...@gmail.com
>> <mailto:iwase.yusu...@gmail.com>> wrote:
>>
>>     Hi,
>>
>>     You can enables the LLDP topology discovery feature, provided by
>> "ryu.topology"
>>     module, to discover switches (and hosts) on your topology.
>>     https://github.com/osrg/ryu/blob/master/ryu/topology/api.py
>>     <https://github.com/osrg/ryu/blob/master/ryu/topology/api.py>
>>     https://github.com/osrg/ryu/blob/master/ryu/topology/event.py
>>     <https://github.com/osrg/ryu/blob/master/ryu/topology/event.py>
>>
>>     =================
>>     ...(snip)...
>>     from ryu.topology import api as topology_api
>>     from ryu.topology import event as topology_event
>>
>>
>>     class MyApp(app_manager.RyuApp):
>>
>>          def my_handler(self, ...):
>>              ...(snip)...
>>              switches = topology_api.get_all_switch(self)
>>              ...(snip)...
>>
>>          @set_ev_cls(topology_event.EventSwitchEnter)
>>          def _switch_enter_handler(self, ev):
>>     self.logger.info <http://self.logger.info>("switch connected: %s",
>> ev.switch)
>>
>>              ...(snip)...
>>     =================
>>
>>     Please note to enable Ryu's topology discovery service, please specify
>>     "--observe-links" option to "ryu-manager".
>>
>>     $ ryu-manager --help
>>        ...(snip)...
>>        --observe-links       observe link discovery events.
>>        ...(snip)...
>>
>>
>>     Thanks,
>>     Iwase
>>
>>
>>     On 2018年03月02日 05:13, Myra Sh wrote:
>>
>>
>>         Hello,
>>
>>         I am new to Ryu controller. I have a wireless network with two
>>         openvswitch(running on wireless nodes) both of them connected to
>> Ryu.
>>
>>         Could you guide me how to enable topology discovery for this
>>         wireless network in Ryu?
>>
>>         Using other SDN controllers, after connecting Openvswitches to the
>>         controller, LLDP messages are exchanged between nodes in the
>> network. Do
>>         I need to activate LLDP messages manually in Ryu?
>>
>>         Thank you
>>
>>
>>         ------------------------------------------------------------
>> ------------------
>>         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 <mailto:Ryu-devel@lists.source
>> forge.net>
>>         https://lists.sourceforge.net/lists/listinfo/ryu-devel
>>         <https://lists.sourceforge.net/lists/listinfo/ryu-devel>
>>
>>
>>
>>
>> ------------------------------------------------------------
>> ------------------
>> 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
>>
>>
------------------------------------------------------------------------------
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

Reply via email to