Hello all, I have an SDN application that I have written using Pox, that I am now trying to rewrite for Ryu, due to the OpenFlow 1.3 support. My Pox application receives packets from the Pox controller’s network card (not connected to the SDN data plane), and using the information in these packets to make changes to the SDN data plane. To do this in Pox, I wrote a separate Pox application to receive the packets which ran in a different thread (to stop blocking), that then triggered events to allow the main Pox application to receive the packet’s data.
Network as follows: [Packet sender with actionable information] ↓ [Ethernet 1] ↓ [Ryu Machine] ↓ [Ethernet 2] ↓ [Data plane] To do this in Pox the packet receiving application was as follows: # -*- coding: utf-8 -*- # Copyright 2019 Matthew Robinson, STRI, University of Hertfordshire. # """ A POX component that receives routing information from Matlab. This calls an event that the main POX application can listen to. Threading is used to stop blocking while listening to the UDP socket. """ from pox.core import core from pox.lib.revent import * import socket import threading log = core.getLogger() class ReceiveEvent (Event): """ Receive event. This is the event that we can trigger for our main application to act on. """ def __init__(self, multicast_path): self.multicast_path = multicast_path # We are just putting the path data into event.multicast_path. class RX (EventMixin): """ The component that is launched by the launch function. EventMixin means it can trigger events. """ _core_name = "RX" # The name of this module. _eventMixin_events = set([ # Telling POX that that ReceiveEvent is an Event function. ReceiveEvent, ]) def __init__ (self, port, ip): # The IP and port for our Matlab connection. self.port = port self.ip = ip self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # The UDP socket to receive from. self.sock.bind((self.ip, self.port)) self.listen = threading.Thread(target=self._check_rx) # Starting a Thread so the socket can be self.listen.start() # checked continuously in parallel to POX. def _check_rx(self): # This is the Thread that is started. while True: # Continuously check if data is available data, addr = self.sock.recvfrom(1024) # from the UDP port. self.raiseEventNoErrors(ReceiveEvent, data) # If it is available, raise the event function above. def launch (ip = '192.168.56.1', port = 10000): # This function is called by POX to start the ip = ip # component. port = port # Register the component with POX. core.registerNew(RX, port = port, ip = ip) This approach do not work in Ryu however. Can anyone offer me some advice in how to receive data from an outside source to a Ryu application? Is it possible that Ryu does not accept creating a python socket within it’s applications? Or is it possible that Ryu does not allow threads to be started? Thanks for your time, Regards, Matthew This email has been scanned by BullGuard antivirus protection. For more info visit www.bullguard.com<http://www.bullguard.com/tracking.aspx?affiliate=bullguard&buyaffiliate=smtp&url=/>
_______________________________________________ Ryu-devel mailing list Ryu-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/ryu-devel