I used code below for flow removed handling. I got it from internet def flow_removed_handler(self, ev): msg = ev.msg print msg dp = msg.datapath ofp = dp.ofproto if msg.reason == ofp.OFPRR_IDLE_TIMEOUT: reason = 'IDLE TIMEOUT' elif msg.reason == ofp.OFPRR_HARD_TIMEOUT: reason = 'HARD TIMEOUT' elif msg.reason == ofp.OFPRR_DELETE: reason = 'DELETE' else: reason = 'unknown' self.logger.info('OFPFlowRemoved received: ' 'match=%s cookie=%d priority=%d reason=%s ' 'duration_sec=%d duration_nsec=%d ' 'idle_timeout=%d packet_count=%d byte_count=%d', msg.match, msg.cookie, msg.priority, reason, msg.duration_sec, msg.duration_nsec, msg.idle_timeout, msg.packet_count, msg.byte_count)
The code I used didn't work. How to make the code functional. I know it is not listening to flow removed message. How to make it enable so that it can listen flow removed message. On Wed, Nov 27, 2013 at 4:45 PM, Sayed Qaiser Ali Shah < 11msitqs...@seecs.edu.pk> wrote: > Yup dear thank you so much. I will try this. > :) > > > On Wed, Nov 27, 2013 at 4:49 AM, Murphy McCauley < > murphy.mccau...@gmail.com> wrote: > >> On Nov 26, 2013, at 12:26 PM, Sayed Qaiser Ali Shah < >> 11msitqs...@seecs.edu.pk> wrote: >> >> > Dear Murphy I tried a lot but I am unable to use the flag properly. >> Kindly help me out in the scenario. I want to remove all entries from >> dictionary defined after idle_time_out. The pseudocode is as below. >> > msg.idle_timeout = 10 >> > if msg.idle_timeout== True: >> > self.macaddrtable=' ' >> >> This isn't the right logic. You tell the switch you want a flow to >> expire if it has timed out. Only the switch knows when this has happened. >> If you want to find out at the controller, you need to switch to tell you. >> >> So when you install the flow entry with an idle_timeout, set the >> flow-mod's .flag attribute to OFPFF_SEND_FLOW_REM. >> >> Additionally, set a handler for the OpenFlow componet's FlowRemoved event. >> >> When the FlowRemoved handler is executed, it's because a flow has been >> removed. >> >> See the POX manual for more info on the FlowRemoved event and setting >> event handlers. >> >> As a last note, you probably want to do self.macaddrtable.clear() or >> something rather than assigning it to be an empty string? >> >> Hope that gets you started. >> >> -- Murphy >> >> > Kindly help me out because I am unable to do this. >> > >> > >> > On Sun, Nov 24, 2013 at 2:50 AM, Murphy McCauley < >> murphy.mccau...@gmail.com> wrote: >> > Like the rest of OpenFlow, it's described in the OpenFlow specification: >> > http://archive.openflow.org/documents/openflow-spec-v1.0.0.pdf >> > >> > Also, if you google "OFPFF_SEND_FLOW_REM pox" you should get several >> examples of setting the flag. >> > >> > In the POX wiki manual, there is some description of the FlowRemoved >> event and of handling events in general. >> > >> > >> > -- Murphy >> > >> > On Nov 23, 2013, at 10:51 AM, Sayed Qaiser Ali Shah < >> 11msitqs...@seecs.edu.pk> wrote: >> > >> >> I tried to used OFPFF_SEND_FLOW_REM flag and also searched on net but >> didn't get any specific answer. Please tell me how to use this flag? or >> give me a link from which I can get help. >> >> Thanks >> >> >> >> >> >> On Sat, Nov 23, 2013 at 7:28 PM, Sayed Qaiser Ali Shah < >> 11msitqs...@seecs.edu.pk> wrote: >> >> I think so. I want to delete entry from dictionary defined on >> controller. Thanks. I will try this. >> >> >> >> >> >> On Sat, Nov 23, 2013 at 11:04 AM, Murphy McCauley < >> murphy.mccau...@gmail.com> wrote: >> >> >> >> On Nov 22, 2013, at 12:57 PM, Sayed Qaiser Ali Shah < >> 11msitqs...@seecs.edu.pk> wrote: >> >> >> >>> Hello Murphy McCauley, >> >>> >> >>> I solved the duplication problem now I want to refresh the dictionary >> I have defined after an idle_timeout. I want to set idle_timeout to 10. I >> tried this but didn't get what I wanted. >> >>> >> >>> msg.idle_timeout = 10 >> >>> if msg.idle_timeout== True: >> >>> self.macaddrtable=' ' >> >>> >> >>> This will destroy all entries in dictionary. Is there any other way >> so that only that entry whose idle_timeout has expired is removed and then >> rearrange remaining entries in dictionary. >> >>> Just as a reminder. macaddrtable is dictionary defined which contains >> source and destination mac addresses. When a packet arrives controller its >> entry is saved in the dictionary macaddrtable. >> >> >> >> If you set the OFPFF_SEND_FLOW_REM flag when installing the table >> entry, you'll get a FlowRemoved event when it expires. Maybe that's what >> you need? >> >> >> >> -- Murphy >> >> >> >>> On Fri, Nov 15, 2013 at 6:05 PM, Sayed Qaiser Ali Shah < >> 11msitqs...@seecs.edu.pk> wrote: >> >>> Ok thank you I will check it out. >> >>> >> >>> >> >>> On Fri, Nov 15, 2013 at 5:54 PM, Murphy McCauley < >> murphy.mccau...@gmail.com> wrote: >> >>> I'm just suggesting you work backwards to find the problem. Use >> Wireshark to monitor the traffic to help determine where the duplicates are >> coming from. If they're coming from a switch, I suggest you inspect the >> table on that switch to see which table entry the switch. Then analyze the >> OpenFlow traffic to that switch to find the OpenFlow messages which >> installed the problematic entries. Then analyze your controller code to >> see where you sent those problematic entries. >> >>> -- Murphy >> >>> >> >>> >> >>> On Nov 15, 2013, at 4:49 AM, Sayed Qaiser Ali Shah < >> 11msitqs...@seecs.edu.pk> wrote: >> >>> >> >>>> Thank you so much. Yes you are right about what you said but is >> there is any other way, so that I can do this. I can read individual >> entries statically but the problem is I want to get it dynamic. >> >>>> Like I can print individual entries by using: >> >>>> >> >>>> print self.macaddrtable[1] >> >>>> print self.macaddrtable[2] >> >>>> print self.macaddrtable[3] >> >>>> print self.macaddrtable[4] >> >>>> >> >>>> To get desired result dynamically I used loop. But you know what I >> got. :( >> >>>> >> >>>> >> >>>> On Fri, Nov 15, 2013 at 3:36 PM, Murphy McCauley < >> murphy.mccau...@gmail.com> wrote: >> >>>> >> >>>> On Nov 15, 2013, at 2:20 AM, Sayed Qaiser Ali Shah < >> 11msitqs...@seecs.edu.pk> wrote: >> >>>> >> >>>>> Hello Murphy actually I am working on Traffic Engineering. I am now >> learning that how to forward traffic when we have dictionary on controller. >> I want to forward some entries of dictionary via queue-1 and some entries >> via queue-2. For this I have created dictionary and it created successfully >> with you help. Those entries of dictionary contain Source Mac Address and >> Destination Mac address. I created 2 queues on Interface 1 of switch. I >> then Pinged host 2 from host 1 and host 1 from host 3. It inserted four >> entries in dictionary created on controller. Entries in Dictionary are >> >>>>> {1: (EthAddr('00:00:00:00:00:02'), EthAddr('00:00:00:00:00:01')), >> >>>>> 2: (EthAddr('00:00:00:00:00:01'), EthAddr('00:00:00:00:00:02')), >> >>>>> 3: (EthAddr('00:00:00:00:00:01'), EthAddr('00:00:00:00:00:03')), >> >>>>> 4: (EthAddr('00:00:00:00:00:03'), EthAddr('00:00:00:00:00:01')) } >> >>>>> Dear Murphy you asked earlier that you didn't get what I wanted to >> do. I think that I am just explaining it in easy way that I just want to >> forward two entries of dictionary via queue-1 and other 2 entries of >> dictionary via queue-2. I am just doing practice on different techniques of >> Traffic Engineering. I used the following code for forwarding traffic via >> queues: >> >>>>> >> >>>>> if self.macaddrtable=='': //When we have no entry in >> macaddrtable dictionary >> >>>>> queue=1 >> >>>>> msg.actions.append(of.ofp_action_enqueue(port = port, >> queue_id = queue)) >> >>>>> else: >> >>>>> for a in self.macaddrtable: >> >>>>> if a<=2: >> >>>>> queue=1 >> >>>>> msg.actions.append(of.ofp_action_enqueue(port = port, >> queue_id = queue)) >> >>>>> elif a>2: >> >>>>> queue=2 >> >>>>> msg.actions.append(of.ofp_action_enqueue(port = port, >> queue_id = queue)) >> >>>>> >> >>>>> The code worked fine and forwarded traffic via desired queues but >> after about 10 seconds of pinging, duplicate packets were detected. I don't >> know why duplicate packets were detected. Can you please tell the reason? >> >>>> >> >>>> My best guesses are that you are somehow creating a flow entry with >> multiple actions or a loop, but it's hard to say. I'd suggest that you try >> to use Wireshark or a similar tool to figure out where the duplicates are >> coming from. You should see the duplicates at the port of the destination >> host and the egress port of the last switch. Work backwards from there. >> If you find the source of the duplications is a switch, examine the flow >> table of that switch and see if you can spot the reason. >> >>>> >> >>>> -- Murphy >> >>>> >> >>>>> On Tue, Nov 12, 2013 at 2:00 AM, Murphy McCauley < >> murphy.mccau...@gmail.com> wrote: >> >>>>> It's still hard for me to answer questions since I still don't know >> what you're really trying to accomplish here. >> >>>>> >> >>>>> If you want entries to time out on the switch, set timeouts when >> installing the table entry (sending the flow_mod). If you want >> notifications when flows are removed on the switch, that's also an option >> you can set when installing the entry; then listen to the FlowRemoved event >> to tell when it has actually happened. >> >>>>> >> >>>>> I'm not sure what you mean by "exact mac". Your code records the >> address the packets were sent to. If they were sent to the broadcast >> address, then... that's the destination. >> >>>>> >> >>>>> -- Murphy >> >>>>> >> >>>>> On Nov 11, 2013, at 9:42 AM, Sayed Qaiser Ali Shah < >> 11msitqs...@seecs.edu.pk> wrote: >> >>>>> >> >>>>>> Thank you so much Murphy for your help. I did it the way you >> explained. But how can I refresh entries in the table. i.e. how to set idle >> timeout and hard timeout for this so that the table can be refreshed or how >> the entries can be updated when a flow is removed from flow table on Switch. >> >>>>>> Another Problem is: >> >>>>>> The code is as below. >> >>>>>> >> >>>>>> if (packet.src,packet.dst) not in self.macaddrs and >> (packet.dst,packet.src) not in self.macaddrs: >> >>>>>> self.macaddrs.add((packet.src,packet.dst)) >> >>>>>> self.macaddrtable[f_id]=(packet.src,packet.dst) >> >>>>>> f_id=f_id+1 >> >>>>>> print "Mac Table is " >> >>>>>> print self.macaddrtable >> >>>>>> >> >>>>>> When I created a topology with 3 hosts the following result was >> shown >> >>>>>> >> >>>>>> Mac Table is >> >>>>>> {1: (EthAddr('00:00:00:00:00:01'), EthAddr('ff:ff:ff:ff:ff:ff')), >> 2: (EthAddr('00:00:00:00:00:02'), EthAddr('00:00:00:00:00:01')), 3: >> (EthAddr('00:00:00:00:00:03'), EthAddr('00:00:00:00:00:01')), 4: >> (EthAddr('00:00:00:00:00:02'), EthAddr('ff:ff:ff:ff:ff:ff')), 5: >> (EthAddr('00:00:00:00:00:03'), EthAddr('00:00:00:00:00:02'))} >> >>>>>> >> >>>>>> The result I expected is little bit different in terms of >> broadcast address. Like in 1 destination mac is ff:ff:ff:ff:ff:ff but I was >> expecting 00:00:00:00:00:02 and similar is the case with some other entries >> as well. >> >>>>>> Is there any way so that I can get desired exact mac, not >> broadcast? >> >>>>>> >> >>>>>> >> >>>>>> >> >>>>>> On Sun, Nov 10, 2013 at 5:00 AM, Murphy McCauley < >> murphy.mccau...@gmail.com> wrote: >> >>>>>> It sounds like you need to record them as a pair to get what you >> want, so ... put them in as a pair. >> >>>>>> >> >>>>>> It looks like I may have been responsible for the problem you were >> seeing -- a little typo inserted an errant right square bracket. Try: >> >>>>>> self.macaddrs.add((packet.src,packet.dst)) >> >>>>>> >> >>>>>> It's still not clear from context whether ordering matters to you >> (is A sending to B the same as B sending to A?). If it isn't, you might >> want to sort the two addresses or just check for both... >> >>>>>> >> >>>>>> if (packet.src,packet.dst) not in self.macaddrs and >> (packet.dst,packet.src) not in self.macaddrs: >> >>>>>> >> >>>>>> -- Murphy >> >>>>>> >> >>>>>> On Nov 9, 2013, at 3:32 PM, Sayed Qaiser Ali Shah < >> 11msitqs...@seecs.edu.pk> wrote: >> >>>>>> >> >>>>>>> Thank you so much Murphy. I tried it but got little problem in >> add function i.e. when I used >> >>>>>>> self.macaddrs.add((packet.src,packet.dst])) it generated error in >> this function then I tried >> >>>>>>> self.macaddrs.add(packet.src,packet.dst) >> >>>>>>> It also generated an error that add must have 1 argument where as >> 2 given. Then I tried >> >>>>>>> >> >>>>>>> if (packet.src,packet.dst) not in self.macaddrs: >> >>>>>>> self.macaddrs.add(packet.src) >> >>>>>>> self.macaddrs.add(packet.dst) >> >>>>>>> self.macaddrtable[f_id]=(packet.src,packet.dst) >> >>>>>>> f_id=f_id+1 >> >>>>>>> >> >>>>>>> It didn't generate an error and I didn't get any repeated result >> but there was some problem in the code I got results as below. >> >>>>>>> When I ping host1 from host 2 it added record in dictionary. Then >> I ping host 3 from h1 record was inserted again but the problem was, as >> record of host 1, host 2 and host 3 was saved in macaddrs and two records >> were there but when I pinged the hosts present in macaddrs i.e. 1, 2, 3 >> like I ping host 2 from h3 as record was not present in macaddrtable still >> record was not added to dictionary. It is because addresses are saving in >> macaddrs one by one individually i.e. first source and then destination >> address. When packet arrives controller it checks for source and >> destination address in macaddrs as when there are individual record of each >> host it then doesn't execute IF body because source and destination >> addresses are already there as individual address. What to do with this???? >> Kindly help. >> >>>>>>> >> >>>>>>> >> >>>>>>> On Sun, Nov 10, 2013 at 3:26 AM, Murphy McCauley < >> murphy.mccau...@gmail.com> wrote: >> >>>>>>> One possible answer is that you should keep a set of the ones >> you've added so far... >> >>>>>>> self.macaddrtable = {} >> >>>>>>> self.macaddrs = set() >> >>>>>>> >> >>>>>>> ... >> >>>>>>> >> >>>>>>> if (packet.src,packet.dst) not in self.macaddrs: >> >>>>>>> self.macaddrs.add((packet.src,packet.dst])) >> >>>>>>> self.macaddrtable[f_id]=(packet.src,packet.dst) >> >>>>>>> f_id=f_id+1 >> >>>>>>> >> >>>>>>> >> >>>>>>> There might be better things to be done, but it's impossible to >> say without knowing more (e.g., what you're trying to accomplish, what f_id >> is used for, etc.). >> >>>>>>> >> >>>>>>> -- Murphy >> >>>>>>> >> >>>>>>> On Nov 9, 2013, at 10:35 AM, Sayed Qaiser Ali Shah < >> 11msitqs...@seecs.edu.pk> wrote: >> >>>>>>> >> >>>>>>> > Hello everybody, >> >>>>>>> > >> >>>>>>> > I have defined dictionary in POX controller and I by the name >> addrtable and I am saving two things in this dictionary i.e. Source mac and >> destination mac. What I have done is >> >>>>>>> > >> >>>>>>> > self.macaddrtable = {} >> >>>>>>> > ... >> >>>>>>> > f_id=1 >> >>>>>>> > self.macaddrtable[f_id]={packet.src, packet.dst} >> >>>>>>> > print self.macaddrtable >> >>>>>>> > f_id=f_id+1 >> >>>>>>> > >> >>>>>>> > It is saving source mac and destination mac in the dictionary >> but the problem is when f_id increases it then save same source and >> destination mac again and again. >> >>>>>>> > What I want is to save mac address only if its not in >> dictionary. >> >>>>>>> >> >>>>>>> >> >>>>>>> >> >>>>>>> >> >>>>>>> -- >> >>>>>>> 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) >> >>> >> >>> >> >>> >> >>> -- >> >>> 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 ShahMSIT-12 NUST (SEECS)* > -- *RegardsSayed Qaiser Ali ShahMSIT-12NUST (SEECS)*