1

I am trying to perform topology discovery in ryu with networkx. Here are the functions for adding switch and adding links.

'''

# Handle the event generated when a new switch enters the network
@set_ev_cls(event.EventSwitchEnter)
def handler_switch_enter(self, ev):
   
    
    datapath = ev.switch.dp
    datapath.id = ev.switch.dp.id
    self.net.add_node(datapath)
    self.logger.info("Current Switches %s", datapath)
    print("No of Switches %s", self.net.number_of_nodes())
    self.Topology['Switches'][datapath.id] = datapath
    #self.Topology = {'Hosts':{},'Switches':{switch},'Links':{}}
    print(self.Topology)

# Handle the event generated when a new link is added between two nodes
@set_ev_cls(event.EventLinkAdd)
def link_add(self, ev):
   
    
    link = ev.link
    src_port = link.src.port_no
    dst_port = link.dst.port_no
    src_id = link.src.dpid
    dst_id = link.dst.dpid
    self.net.add_edge(link.src, link.dst)
    self.logger.info("Current Links %s", link)
    print("No of Links %s", self.net.number_of_edges())
    self.Topology['Links'][(src_id, dst_id)] = (src_port, dst_port)
    self.Topology['Links'][(dst_id, src_id)] = (dst_port, src_port)
    #self.Topology = {'Hosts':{},'Switches':{},'Links':{link}}
    print(self.Topology)

'''

Now I try to add host in packet in handler as follow:-

'''

@set_ev_cls(ofp_event.EventOFPPacketIn, MAIN_DISPATCHER)
def _packet_in_handler(self, ev):

    if ev.msg.msg_len < ev.msg.total_len:
        self.logger.debug("packet truncated: only %s of %s bytes",
                          ev.msg.msg_len, ev.msg.total_len)

    msg = ev.msg    # Extract the message from the event
    datapath = msg.datapath # Get the datapath at which the message arrived
    ofproto = datapath.ofproto # Get the OpenFlow protocol of the datapath
    parser = datapath.ofproto_parser # Get the parser for the OpenFlow protocol
    in_port = msg.match['in_port']  #The physical port at which the switch received this packet

    pkt = packet.Packet(msg.data)   # Extract the packet from the OpenFlow message
    eth = pkt.get_protocols(ethernet.ethernet)[0]  # Get the Ethernet header
    
    if eth.ethertype != ether_types.ETH_TYPE_ARP: # Only use ARP messages to handle forwarding. 
        return                                    # Ignore other incoming packets.

    arp_pkt = pkt.get_protocols(arp.arp)[0] # Get the ARP header
    src_ip, dst_ip = arp_pkt.src_ip, arp_pkt.dst_ip # source and destination IP of the ARP message
    
    if self.net.has_node(src_ip) != True:
        
        ipv4_addr = src_ip
        mac_addr = arp_pkt.src_mac 
        self.net.add_node(src_ip) 
        self.net.add_edge(src_ip,datapath) 
        self.Topology['Hosts'][ipv4_addr] = mac_addr
        print(self.Topology)
        self.net.nodes(data=True) 
    
    if dst_ip in self.net:
        path=nx.shortest_path(self.net,src_ip,dst_ip)
        #path=nx.shortest_path(self.net[src_ip,dst_ip])
        #next=path[path.index(dpid)+1]
        #out_port=self.net[dpid][next]['port']   
        self.install_entries_on_path(path)
        print(path)

'''

I was expecting topology to have 10 host (10.0.0.1 to 10.0.0.10) but I am getting following-

    {'Hosts': {'10.0.0.1': '00:00:00:00:01:01', '10.0.0.6': '00:00:00:00:06:06', '10.0.0.7':           '00:00:00:00:07:07', '10.0.0.2': '00:00:00:00:02:02', '10.0.0.3': '00:00:00:00:03:03', '10.0.0.4': '00:00:00:00:04:04', '10.0.0.5': '00:00:00:00:05:05', '10.0.0.8': '00:00:00:00:08:08', '10.0.0.9': '00:00:00:00:09:09', '10.0.0.10': '00:00:00:00:10:10', '0.0.0.0': 'fa:80:c3:70:e5:f6', '169.254.217.192': '86:9f:11:ba:97:4c', '169.254.238.251': 'c2:66:25:34:46:48', '169.254.224.57': 'c2:a0:b6:47:d1:4d', '169.254.81.159': '8e:fd:4f:3c:01:4a', '169.254.8.131': '1a:a0:39:02:a5:43', '169.254.139.242': '62:b3:42:0d:ac:43', '169.254.173.239': '4e:f7:44:68:a3:4f', '169.254.55.182': 'ca:ed:0f:ea:a3:00', '169.254.230.229': 'aa:fe:79:34:fa:ee', '169.254.196.192': 'fa:80:c3:70:e5:f6', '169.254.201.96': '46:1d:c3:ee:19:b6', '169.254.199.2': 'ee:86:84:76:7f:a3', '169.254.25.33': '36:8a:d3:d6:8e:63', '169.254.177.37': '3e:61:01:58:73:cf', '169.254.226.128': '6a:d3:9e:6d:42:76', '169.254.82.48': '4e:23:eb:1d:24:78', '169.254.176.112': '12:94:44:fb:e3:9b', '169.254.186.215': '42:d8:fa:fb:9a:36', '169.254.197.195': 'be:8b:64:36:4c:b3', '169.254.220.122': 'f2:fb:70:8a:c5:dd'}, 'Switches': {7: <ryu.controller.controller.Datapath object at 0x7f6e5dd71ee0>, 6: <ryu.controller.controller.Datapath object at 0x7f6e5dd7f3d0>, 1: <ryu.controller.controller.Datapath object at 0x7f6e5dd7f550>, 4: <ryu.controller.controller.Datapath object at 0x7f6e5dd7f700>, 3: <ryu.controller.controller.Datapath object at 0x7f6e61da3670>, 5: <ryu.controller.controller.Datapath object at 0x7f6e61ec3f10>, 2: <ryu.controller.controller.Datapath object at 0x7f6e5dd131c0>}, 'Links': {(4, 5): (3, 2), (5, 4): (2, 3), (2, 5): (3, 1), (5, 2): (1, 3), (7, 3): (1, 3), (3, 7): (3, 1), (3, 1): (1, 2), (1, 3): (2, 1), (2, 1): (1, 1), (1, 2): (1, 1), (3, 6): (2, 1), (6, 3): (1, 2), (2, 4): (2, 1), (4, 2): (1, 2)}}

How can I get rid off these extra entries?

Additionally can I get host identifier in the host dictionary (right now I am using IP of the host )?

Thank you very much.

CobaltRed
  • 37
  • 6

0 Answers0