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)

Reply via email to