On Nov 11, 2013, at 10:04 PM, Muhammad Furqan Gagan <[email protected]> wrote:
> Yeah I check them .. > > they are using core discovery module to learn the topology.. > > And I am learning the topolopgy in a table via sending and receiving lldp > packets.. a switch send to its every port after connecting That's pretty much what the discovery component does. But my point was that they both compute and install shortest paths; you should be able to do it more or less the same way. Some specific comments inline. > On Nov 11, 2013, at 10:54 PM, Murphy McCauley <[email protected]> > wrote: > >> Have you taken a look at the l2_multi and topo_proactive components? Both >> of them compute and install shortest paths. >> >> -- Murphy >> >> On Nov 11, 2013, at 9:48 PM, Muhammad Furqan Gagan <[email protected]> >> wrote: >> >>> Hello … >>> >>> I am working on a controller which calculate shrtest path from a function i >>> have made and returns an array of switches in between source and >>> destination switches... When a packet is received i calculate their source >>> and dpids and calculate their shotest path. for example: for switch 1 and >>> switch 7 there is a shortest path [2,3,4,7] >>> Now i want to install flows for them >>> >>> >>> Currently I am doing this… It is sending the packet and installing flows >>> but I cant ping … I am new to POX so if you can explain it in bit easier >>> way !! Thanks >>> >>> >>> def _handle_PacketIn (self, event): >>> >>> def flood(): #floods the packet >>> >>> msg = of.ofp_packet_out() >>> msg.actions.append(of.ofp_action_output(port = of.OFPP_FLOOD)) >>> msg.data = packet_in.data >>> msg.in_port = in_port >>> self.connection.send(msg) >>> >>> >>> def drop():# drops the message >>> >>> if packet_in.buffer_id is not None: >>> >>> msg = of.ofp_packet_out() >>> msg.buffer_id = packet_in.buffer_id >>> >>> msg.in_port = in_port >>> self.connection.send(msg) >>> >>> >>> >>> packet = event.parsed >>> packet_in = event.ofp >>> in_port = event.port >>> #print in_port >>> dpid = event.dpid >>> >>> >>> >>> if packet.type == packet.LLDP_TYPE: >>> self.receive_topology_packet(dpid,in_port,packet) >>> >>> return >>> >>> >>> >>> self.host_table[packet.src] = in_port >>> >>> >>> if packet.dst.is_multicast: >>> flood() >>> return >>> >>> if packet.dst not in self.host_table: # check for unknown >>> destination >>> >>> flood() >>> return >>> >>> else: >>> >>> print "%s" %(packet.src) >>> print "%s" %(packet.dst) >>> p_s = str(packet.src) >>> p_d = str(packet.dst) >>> >>> dpid_src = dpid >>> print "src dpid",dpid_src >>> for s in range(len(switch)): >>> >>> >>> if p_d[-1:] == str(switch[s]): >>> dpid_dst = switch[s] >>> print "dest dpid",dpid_dst >>> >>> best_route = [] >>> best_route = spf.shortest_path(dpid_src,dpid_dst) >>> best_route.reverse() The reverse here looks strange to me. Does the path not come back with best_route[0] being the src and best_route[-1] being the dst? >>> print best_route >>> >>> print " known" >>> >>> >>> msg = of.ofp_flow_mod() I don't think this flow_mod is ever being sent. You set it up, but then overwrite it before sending. >>> >>> if not packet.type == packet.VLAN_TYPE: >>> print "attaching a vlan id" >>> msg.actions.append(of.ofp_action_vlan_vid(vlan_vid = >>> dpid_dst)) >>> >>> elif dpid_src == dpid_dst: >>> print "arived at destination striping vtag" >>> msg.actions.append(of.ofp_action_strip_vlan()) >>> >>> >>> >>> >>> if best_route: >>> if not best_route[0] == dpid_dst: >>> next_hop = best_route[0] >>> >>> >>> if not dpid_src== dpid_dst: >>> for p in topo[dpid_src]: >>> temp = topo[dpid_src][p] >>> if temp [0]== next_hop: # in >>> topo[dpid_src][p]: >>> print"yes" >>> print"p",p >>> #dp,op = topo[dpid][p] >>> op = p >>> print "outport",op >>> else: >>> print"we r at destination" >>> op = self.host_table[packet.dst] >>> print "op" >>> >>> >>> print"sending flow" >>> msg = of.ofp_flow_mod() # installing flow >>> msg.match = of.ofp_match.from_packet(packet, in_port) >>> msg.idle_timeout = 10 >>> msg.hard_timeout = 30 >>> >>> msg.actions.append(of.ofp_action_output(port = op)) >>> msg.data = packet_in >>> >>> self.connection.send(msg) >>> >>> msg = of.ofp_packet_out() >>> msg.actions.append(of.ofp_action_output(port = op)) >>> msg.data = packet_in.data >>> msg.in_port = in_port >>> self.connection.send(msg) >>> print "flow sent" You're sending two flow_mods here, but it looks to me like they probably overlap 100% of the time and the second one may never actually be hit. Also, you probably mean msg.match.in_port. -- Murphy
