On Nov 28, 2013, at 12:39 PM, Sayed Qaiser Ali Shah <11msitqs...@seecs.edu.pk> 
wrote:

> Hello Murphy First of all Thank you so much for your help. I did what I 
> wanted to achieve. I used following code. but the problem is after sending 
> some packets (I am using Ping) then ping operation stops. When I checked 
> dictionary I didn't find all the records which were present in dictionary 
> before receiving Flow removed message.

Maybe you could explain a bit more what the problem you're having is.

>  def _handle_FlowRemoved (self, event):
>       if not event.idleTimeout: return # Only care about idle timeouts
>       print "entry for %s -> %s removed" % (event.ofp.match.dl_src, 
> event.ofp.match.dl_dst)
>       for a in self.macaddrtable:
>       # macaddrtable dictionary contains source mac, destination mac, 
> nw_proto and dl_type
>       if 
> (event.ofp.match.dl_src,event.ofp.match.dl_dst,ipproto_to_str(event.ofp.match.nw_proto),ethtype_to_str(event.ofp.match.dl_type))
>  ==self.macaddrtable[a]:
>         #Replace entry which is deleted from switch and when message received 
> then the same entry is removed from macaddrtable dictionary.
>         self.macaddrtable[a]=''
>       # sorting records in macaddrtable dictionary and move empty records at 
> the end.
>       for a in self.macaddrtable:
>         if self.macaddrtable[a]=='':
>            for b in self.macaddrtable:
>              if b>a and self.macaddrtable[b]!='':
>                 self.macaddrtable[a]=self.macaddrtable[b]
>                 self.macaddrtable[b]=''
>                 print a, "is replaced by",b
>                 break

It's not clear to me what you're trying to do here or why.  Aren't the keys and 
values tied together?  What does it mean to sort a dictionary?  Is there a 
reason to set an entry to an empty string instead of just delete it?

> On Thu, Nov 28, 2013 at 12:48 AM, Murphy McCauley <murphy.mccau...@gmail.com> 
> wrote:
> It’s not too surprising that the code doesn’t work.  Among other things, I 
> think it’s from Ryu and not POX.
> 
> I mentioned this before, but with some additional detail, you need to do the 
> following three things:
> 
> 1. Write a handler for flow removed messages.  It might be a method in which 
> case it’ll have a "self" parameter, or vary in other ways, but it might look 
> something more or less like:
> 
> def _handle_FlowRemoved (event):
>   if not event.idleTimeout: return # Only care about idle timeouts
>   print "entry for %s -> %s removed" % (event.match.dl_src, 
> event.match.dl_dst)
> 
> 
> 2. Listen to the FlowRemoved event.  There are several ways to do this; the 
> best one may depend on other aspects of your code.  You could listen to the 
> event for all switches (core.openflow), or from a specific connection.  But 
> it might look something like:
> 
> core.openflow.addListenerByName("FlowRemoved", _handle_FlowRemoved)
> 
> 
> 3. When you create a table entry, set the flag so that the switch sends a 
> flow removed message.  This might look something like:
> 
> fm = of.ofp_flow_mod()
> …
> fm.flags = of.OFPFF_SEND_FLOW_REM
> …
> connection.send(fm)
> 
> 
> Some recommended reading from the manual:
> 
> The Event System (introduction)
> Handling Events
> OpenFlow in POX (introduction)
> OpenFlow Events
> 
> 
> Hope that helps.
> 
> -- Murphy
> 
> On Nov 27, 2013, at 11:07 AM, Sayed Qaiser Ali Shah 
> <11msitqs...@seecs.edu.pk> wrote:
> 
> > 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 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