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)*
