I'm not using it with spanning tree component but installed the flows by
addrule from S1--->S2-->S3 but I am unable to manage the flow from
s3-->s4--->s1 ..I'm stuck in it and don't know the solution

Regards
Uzma Waheed
MSIT-14
SEECS ( NUST )

On Thu, Sep 11, 2014 at 10:44 AM, Murphy McCauley <murphy.mccau...@gmail.com
> wrote:

> It's possible, though the code you are basing this on is not ideal for it.
>
> The code below essentially turns each OpenFlow switch into its own
> learning switch.  Learning switches don't really understand the topology,
> so they don't have a lot of control over the paths that end up getting used.
>
> Since your topology has a loop, you are probably using this with POX's
> spanning_tree component.  This means that it's extremely likely that the
> paths you get will be paths along the spanning tree -- the links that are
> on the tree are the ones that unknown packets are flooded on, which are
> therefore the ones that the learning switches learn and use.  Since the
> spanning tree thinks in terms of symmetrical links, the paths you'll get
> will be symmetrical.
>
> Since you have a small topology and apparently have very specific ideas
> about what you want to accomplish, you might consider simply installing the
> forwarding rules you want by hand.
>
> -- Murphy
>
> On Sep 10, 2014, at 10:31 PM, Uzma Waheed <13msituwah...@seecs.edu.pk>
> wrote:
>
> Hi, everyone I made topology having 4 switches and two hosts are connected
> with each switch. Here is my code for pox . By adding firewall I can
> redirect traffic from s1,s2,s3 to ping h1 to h6. In topology links are as
> S1-->S2--->S3--->S4-->S1
> Is it possible I send ping request from S1-- >S2..>S3 nd get reply from
> S3-->S4--->S1 ?? Does anybody know
>
> Red showing description and yellow showing important parts of code
>
>
> from pox.lib.revent import *
>
> from pox.lib.util import dpidToStr
>
> from pox.lib.addresses import EthAddr
>
> from collections import namedtuple
>
> import os
>
>
> import csv
>
> from pox.core import core
>
> import pox.openflow.libopenflow_01 as of
>
> from pox.lib.util import dpid_to_str
>
> from pox.lib.util import str_to_bool
>
> import time
>
>
> log = core.getLogger()
>
>
> # We don't want to flood immediately when a switch connects.
>
> # Can be overriden on commandline.
>
> _flood_delay = 0
>
>
> class LearningSwitch (object):
>
>
>
>   In short, our algorithm looks like this:
>
>
>   For each packet from the switch:
>
>   1) Use source address and switch port to update address/port table
>
>
>
>   2) Port for destination address in our address/port table?
>
>      No:
>
>         2a) Flood the packet
>
>             DONE
>
>
>   3) Install flow table entry in the switch so that this
>
>      flow goes out the appopriate port
>
>      3a) Send the packet out appropriate port
>
>   """
>
>   def __init__ (self, connection, transparent):
>
>     # Switch we'll be adding L2 learning switch capabilities to
>
>     self.connection = connection
>
>     self.transparent = transparent
>
>
>     # Our table
>
>     self.macToPort = {}
>
>
>     # our firewall table
>
>     self.firewall = {}
>
>
>     #Add couple of rules
>
>
>
>     self.AddRule('00-00-00-00-00-01',EthAddr('00:00:00:00:00:06'))
>
>     self.AddRule('00-00-00-00-00-02',EthAddr('00:00:00:00:00:06'))
>
>     self.AddRule('00-00-00-00-00-03',EthAddr('00:00:00:00:00:06'))
>
>     self.AddRule('00-00-00-00-00-01',EthAddr('00:00:00:00:00:01'))
>
>     self.AddRule('00-00-00-00-00-02',EthAddr('00:00:00:00:00:01'))
>
>     self.AddRule('00-00-00-00-00-03',EthAddr('00:00:00:00:00:01'))
>
> This upper yellow box adds the rules. This is the code which allows above
> sources on dpids. So now traffic won't go from S4 if we ping h1 to h6
>
>   # We want to hear PacketIn messages, so we listen
>
>     connection.addListeners(self)
>
>
>     # We just use this to know when to log a helpful message
>
>     self.hold_down_expired = _flood_delay == 0
>
>
>
>   def AddRule(self,dpidstr ,src =0 ,value=True):
>
>
>       self.firewall[(dpidstr,src)] =value
>
>       log.debug("Adding Firewall rule in %s switch of source
> :%s",dpidstr,src)
>
>
>   def CheckRule(self,dpidstr,src):
>
>      try:
>
>        entry =self.firewall[(dpidstr,src)]
>
>
>        if(entry == True):
>
>          log.debug("Rule for source (%s) found in switch %s is:FORWARD
> ",src,dpidstr)
>
>        else:
>
>          log.debug("Rule fpr source (%s) found in switch  %s is
> :DROP",src,dpidstr)
>
>          return entry
>
>      except KeyError:
>
>        log.debug("Rule (%s) found in %s:DROP",src,dpidstr)
>
>        return False
>
>
>
>
>
>
>
>
>   def _handle_PacketIn (self, event):
>
>     """
>
>     Handle packet in messages from the switch to implement above algorithm.
>
>     """
>
>
>     packet = event.parsed
>
>
>     def flood (message = None):
>
>       """ Floods the packet """
>
>       msg = of.ofp_packet_out()
>
>       msg.actions.append(of.ofp_action_output(port = of.OFPP_FLOOD))
>
>       msg.data = event.ofp
>
>       msg.in_port = event.port
>
>       self.connection.send(msg)
>
>
>     def drop (duration = None):
>
>       """
>
>       Drops this packet and optionally installs a flow to continue
>
>       dropping similar ones for a while
>
>       """
>
>       if duration is not None:
>
>         if not isinstance(duration, tuple):
>
>           duration = (duration,duration)
>
>         msg = of.ofp_flow_mod()
>
>         msg.match = of.ofp_match.from_packet(packet)
>
>
>         msg.idle_timeout = duration[0]
>
>         msg.hard_timeout = duration[1]
>
>         msg.buffer_id = event.ofp.buffer_id
>
>         self.connection.send(msg)
>
>       elif event.ofp.buffer_id is not None:
>
>         msg = of.ofp_packet_out()
>
>         msg.buffer_id = event.ofp.buffer_id
>
>         msg.in_port = event.port
>
>         self.connection.send(msg)
>
>
>     self.macToPort[packet.src] = event.port # 1
>
> This line stores the port against mac for further destination.
>
>
> #additional code
>
>
>     dpidstr =dpid_to_str(event.connection.dpid)
>
>  #Check firewall rules
>
>     if self.CheckRule(dpidstr,packet.src) == False:
>
>         drop()
>
>         return
>
>
>
>
>
>     if packet.dst not in self.macToPort: # 2
>
>         flood("Port for %s unknown -- flooding" % (packet.dst,)) # 2a
>
>     else:
>
>         port = self.macToPort[packet.dst]
>
> It takes port from macToPort table against destination.
>
>
>
>         log.debug("installing flow for source %s on incoming port .%i ->
> destination is %s. on destination port%i" %
>
>                   (packet.src, event.port, packet.dst, port))
>
>         msg = of.ofp_flow_mod()
>
>         msg.match = of.ofp_match.from_packet(packet, event.port)
>
>         msg.idle_timeout = 10
>
>         msg.hard_timeout = 30
>
>         msg.actions.append(of.ofp_action_output(port = port))
>
>         msg.data = event.ofp # 3
>
>         self.connection.send(msg)
>
>
>
> class l2_learning (object):
>
>   """
>
>   Waits for OpenFlow switches to connect and makes them learning switches.
>
>   """
>
>   def __init__ (self, transparent):
>
>     core.openflow.addListeners(self)
>
>     self.transparent = transparent
>
>
>   def _handle_ConnectionUp (self, event):
>
>     log.debug("Connection %s" % (event.connection,))
>
>     LearningSwitch(event.connection, self.transparent)
>
>
>
> def launch (transparent=False, hold_down=_flood_delay):
>
>   """
>
>   Starts an L2 learning switch.
>
>   """
>
>   try:
>
>     global _flood_delay
>
>     _flood_delay = int(str(hold_down), 10)
>
>     assert _flood_delay >= 0
>
>   except:
>
>     raise RuntimeError("Expected hold-down to be a number")
>
>
>   core.registerNew(l2_learning, str_to_bool(transparent))
>
>
>
>
>
> Regards
> Uzma Waheed
> MSIT-14
> SEECS ( NUST )
>
>
>
> --
> Regards
> Uzma Waheed
> MSIT-14
> SEECS ( NUST )
>
>
>

Reply via email to