Thanks Murphy McCauley I will try this. :) On Sun, Apr 14, 2013 at 4:28 AM, Murphy McCauley <[email protected]>wrote:
> Queue configuration is external to OpenFlow, so it seems to me that you > can't expect the controller to magically know which queues to use for what > on which switches. > > The first thing that seems reasonable to me is to set the DPIDs for the > switches to known values when configuring them -- at the same time as you > set up the queues. > > If you don't want to do that, but can identify the different switches > based on their model or whatever, you could theoretically look at their > features responses and figure out which DPID goes with which switch, but > this just seems like a complicated way of doing the above. > > You could also try sending an ofp_queue_get_config_request or > ofp_queue_stats_request to each switch after it connects to try to figure > out how many/which queues it has. This seems like a questionable approach > to me in general, but maybe it's what you need. > > -- Murphy > > On Apr 13, 2013, at 4:12 PM, Sayed Qaiser Ali Shah Shah wrote: > > Thanks for your reply. Is there anyway that dpid is taken automatically > not to be entered manually?? > > On Sun, Apr 14, 2013 at 4:00 AM, Murphy McCauley < > [email protected]> wrote: > >> The event object also has a .dpid attribute which you can use to >> distinguish between switches -- each switch has a different DPID. >> >> So you'll want to do something along the lines of... >> >> if event.dpid == <DPID of switch 1>: >> if packet.find('tcp'): >> action = of.ofp_action_enqueue(port = port, queue_id = 3) >> ... >> elif event.dpid == <DPID of switch 2>: >> if packet.find('tcp'): >> action = of.ofp_action_enqueue(port = port, queue_id = 2) # different >> queue on this switch >> ... >> else: >> # This switch doesn't have any queues -- just use output >> action = of.ofp_action_output(port = port) >> ... >> msg.actions.append(action) >> >> >> Hope that helps. >> >> -- Murphy >> >> On Apr 13, 2013, at 3:19 PM, Sayed Qaiser Ali Shah Shah wrote: >> >> First of all I created two queues i.e. queue-0 and queue-1 on PORT Eth-1 >> of OVS. I use the code below on cotroller >> if packet.find('tcp'): >> queue=1 >> elif packet.find('arp'): >> queue=0 >> else: >> queue=1 >> 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_enqueue(port = port, queue_id = >> queue)) >> msg.data = event.ofp # 6a >> self.connection.send(msg) >> When I use the mininet command "iperf h1 h2" it worked fine and showed >> less bandwidth because I allocated less bandwidth to queues. But when I >> iperf host-2 and host-3 "iperf h2 h3" as the traffic doesn't pass via eth-1 >> the bandwidth was expected to be high which is by default, but it showed >> much less bandwidth than "iperf h1 h2". This is because as when traffic was >> checked and matched it assigns 1 to queue i.e. queue=1 and as there is not >> such queue available on port h2 or h3 it showed wrong result. How to make >> it work correctly i.e. if queues are not created on an interface then >> queues should not be checked and should not be assigned to traffic. >> >> On Fri, Apr 5, 2013 at 1:42 PM, Sayed Qaiser Ali Shah Shah < >> [email protected]> wrote: >> >>> Thanks a lot. In fact I want the same thing which you mentioned and I >>> was after this since last one month. I am using OVS switch. I will try >>> this. This is of great help for me. >>> >>> >>> On Fri, Apr 5, 2013 at 1:18 PM, Murphy McCauley < >>> [email protected]> wrote: >>> >>>> Yes, you can do this if what you want can be accomplished using the >>>> queue types available in your switch. If that condition is true, then >>>> there are several ways to do it with different tradeoffs. I'd suggest that >>>> you start off by modifying the l2_learning component to assign each new >>>> flow to the appropriate queue based on your criteria (e.g., protocol >>>> number). To do this you: >>>> >>>> 1) Configure queues on your switch. How you do this is switch-specific >>>> and not part of OpenFlow. There's an article on how to configure some >>>> queues in Open vSwitch here (or read the OVS documentation for more): >>>> http://openvswitch.org/support/config-cookbooks/qos-rate-limiting/ >>>> >>>> If you're not using OVS, you'll have to consult your switch's >>>> documentation. >>>> >>>> When you set up the queues, each of them will have an integer ID. You >>>> can use the OpenFlow enqueue action to direct traffic to these queues. >>>> >>>> 2) Modify l2_learning's flow installation. Starting around line 169 in >>>> l2_learning.py, it creates new flow entries with an ofp_action_output >>>> action. You'd change this in two ways. First, you'd decide which queue >>>> you wanted by inspecting the packet. This is available in the .parsed >>>> attribute of the PacketIn event object, as I mentioned earlier. For >>>> example, an easy way to determine if the packet is ipv4 is just "if >>>> event.parsed.find('ipv4'): ...". Once you determine which queue to assign >>>> to, use the ofp_action_enqueue action instead of ofp_action_output. >>>> Altogether, this makes the modified code look something like this: >>>> >>>> log.debug("installing flow for %s.%i -> %s.%i" % >>>> (packet.src, event.port, packet.dst, port)) >>>> >>>> if packet.find('tcp'): >>>> queue = 1 # TCP goes to queue 1 >>>> elif packet.find('ipv4'): >>>> queue = 2 # IP that isn't TCP goes to queue 2 >>>> else: >>>> queue = 3 # All other traffic goes to queue 3 >>>> >>>> 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_enqueue(port = port, queue_id = queue)) >>>> msg.data = event.ofp # 6a >>>> self.connection.send(msg) >>>> >>>> >>>> Hope that helps. >>>> >>>> -- Murphy >>>> >>>> On Apr 5, 2013, at 12:58 AM, Sayed Qaiser Ali Shah Shah wrote: >>>> >>>> I think you mean that I want to achieve from this. I want to get IP >>>> protocol number from packet and then on the basis of that protocol number I >>>> want to assign bandwidth to flows/hosts on the basis of their needs. Like >>>> the protocol number which needs high bandwidth should be allocated high >>>> bandwidth or the one which needs less bandwidth should be allocated less >>>> bandwidth so, that bandwidth doesn't waste. I am doing this for end user >>>> satisfaction. This is related to QoS. >>>> Am I on Right direction? Can I do this? >>>> >>>> On Fri, Apr 5, 2013 at 5:36 AM, Murphy McCauley < >>>> [email protected]> wrote: >>>> >>>>> On Apr 4, 2013, at 4:08 PM, Sayed Qaiser Ali Shah Shah wrote: >>>>> >>>>> The link which you provide was very helpful and I found match class in >>>>> that and I use this code >>>>> >>>>> import pox.openflow.libopenflow_01 as of # POX convention >>>>> import pox.lib.packet as pkt # POX convention >>>>> my_match = of.ofp_match(dl_type = pkt.ethernet.IP_TYPE, nw_proto = >>>>> pkt.ipv4.TCP_PROTOCOL, >>>>> tp_dst = 80) >>>>> >>>>> Which will create match to web servers but I don't know how this will >>>>> work. Will it work automatically i.e. it will forward packets to server >>>>> automatically when any packet having nw_proto=TCP_Protocol and tp_dst=80. >>>>> If it does not forward the packet automatically then how it works? >>>>> >>>>> >>>>> You still haven't really explained what it is that you're trying to >>>>> do. What is your high-level goal? Are you trying to install flow table >>>>> entries? Do you want packets from particular flows sent to the >>>>> controller? >>>>> Are you trying to block certain connections? >>>>> >>>>> If you're trying to install flow entries on the switch, you need to >>>>> send an ofp_flow_mod (as per the OpenFlow spec). This contains a match >>>>> object and then contains actions to tell the switch what to do with it >>>>> (send it out of a port, send it to the controller, etc.). See the section >>>>> of the manual wiki on ofp_flow_mod, as well as the examples in the >>>>> forwarding directory of POX (for example, l2_learning). >>>>> >>>>> -- Murphy >>>>> >>>> >>>> >>>> >>>> -- >>>> *Regards >>>> >>>> Sayed Qaiser Ali Shah >>>> MSIT-12 >>>> NUST (SEECS)* >>>> >>>> >>>> >>> >>> >>> -- >>> *Regards >>> >>> Sayed Qaiser Ali Shah >>> MSIT-12 >>> NUST (SEECS)* >>> >> >> >> >> -- >> *Regards >> >> Sayed Qaiser Ali Shah >> MSIT-12 >> NUST (SEECS)* >> >> >> > > > -- > *Regards > > Sayed Qaiser Ali Shah > MSIT-12 > NUST (SEECS)* > > > -- *Regards Sayed Qaiser Ali Shah MSIT-12 NUST (SEECS)*
