Thanks Murphy, I was able to get all the required information from .flow parameter mentioned by you.
I am trying to accomplish below mentioned statement, would like your or other developers inputs on the approach chosen. I am prioritizing the flows between end hosts on the basis of port numbers. Say i allocate port 80,8080,100 etc as high priority ports and rest as low priority. By default, i set the flow timeout to 5 secs. Initially i let all the flows to start i.e. data is allowed on all the ports. I create a list of dictionary which contains information about src_ip, dst_ip, src_port, dst_port, timestamp, packetcount. When the program starts, i set the packet count to 0, then when flow expires i find the dictionary value meeting the ip/port information and update value of packet number and timestamp. This means i have value of packets sent in last 5 seconds for that flow. That is the reason i needed to obtain this information when the flow expired. I am writing a logic (basic one) that once the flow expires i will get the packet again in the NOX controller. I will check if this packet is in the list of high priority ports, if yes then flow is renewed without further processing. If the port is not a high priority, then i will compare the packet value of this port with all the high priority ports' packet value. if i find this to be higher than any of them, then i will not renew the flow for that packet. Next time again the packet comes for that low priority port, if the current and the timestamp stored value exceeds 1 sec then i renew it else i dont renew the flow. I kept the value of 1 sec because if i increase this value TCP times out and breaks the connection. This might not be the best approach and it has few problems. First, the packet comparison is having 5 second time lag. *I was looking for something like dpctl's tcpdump in python where i can fetch the latest packet count for comparison*.Second, If one host is connected to say port 80 and 300, then I cannot do any bandwidth splitting based on port numbers. I can only do so if one host is connected to two different hosts on different ports. Is there a workaround for that? Third, I am using the concept of not renewing flow for one second for low priority ports. Is there a better approach for doing so? Thanks, Kavitesh Singh Graduate Student North Carolina State University, Raleigh,NC-USA On Fri, Nov 26, 2010 at 6:42 AM, Murphy McCauley <jam...@nau.edu> wrote: > Responses inline. > > On Nov 25, 2010, at 9:29 PM, K Singh wrote: > > > I was adding flow removed event in the pyswitch.py file. > > > > def install(self): > > inst.register_for_packet_in(packet_in_callback) > > inst.register_for_datapath_leave(datapath_leave_callback) > > inst.register_for_datapath_join(datapath_join_callback) > > inst.post_callback(1, timer_callback) > > inst.register_for_flow_removed(flow_removed_callback) > > > > Then creating a callback function as below. > > > > def flow_removed_callback(dpid, duration_sec, duration_nsec, > idle_timeout, packet_count, byte_count, cookie): > > print "---flow removed---" > > return CONTINUE > > > > The parameter for flow removed event have been obtained from > ~/noxcore/src/include > > Tangential, but is this pulled from the noxcore_old repository? That's > quite old now... > > > where the parameters are defined as > > Flow_removed_event(datapathid datapath_id_, > > uint32_t duration_sec_, uint32_t duration_nsec_, > > uint16_t idle_timeout_, > > uint64_t packet_count_, uint64_t byte_count_, > > uint64_t cookie_) > > > > when i run this code i get this error message: > > TypeError: flow_removed_callback() takes exactly 7 arguments (1 given) > > > > > > if I change the code in pyswitch.py for the flow removed callback > function like below > > > > def flow_removed_callback(packet_count): > > print "---flow removed---",packet_count > > return CONTINUE > > > > the function executes but I see this printed on the terminal > > ---flow removed---<nox.coreapps.pyrt.pycomponent.pyevent; proxy of <Swig > Object of type 'pyevent *' at 0xb5118128> > > which is not a correct value i think. > > The event handler gets called with a single argument: a Flow_removed_event > object (actually a Pythonized version of one, but whatever). This object has > a number of fields: datapath_id, duration_sec, duration_nsec, byte_count, > etc. So what you want is something like: > def flow_removed_callback (e): > print "---flow removed---", e.packet_count > return CONTINUE > > > How can i obtain the values of the listed arguments when a flow > expires/removed. Also when a flow is created in switch, is there some > identification number attached to flows? How would I know which flow expired > when flow_removed event is triggered as I cannot see any flow identification > number. This would be essential if I would be dealing with multiple flow. > > So the Flow_removed_event has a .flow field which describes the flow (the > match parameters). Is that good enough? > > Each flow does have an opaque "cookie" associated with it. The controller > can specify this when it sets up the flow (you could just use a counter for > it if you wanted a unique "identification number"), and the same cookie > shows up in the flow removed event, which would let you associate it with > something specific. > > Unfortunately, while the cookie is on the flow removed event, I don't think > the functionality to SET it has been exposed to Python at this point, though > it shouldn't be too hard to add in (or you could use pyopenflow to build a > message with the cookie from scratch). I'm curious whether you really need > it, though. What do you want to use it for? > > > > > > > -- > > Regards, > > Kavitesh Singh. > > > -- Murphy -- Regards, K Singh.
_______________________________________________ nox-dev mailing list nox-dev@noxrepo.org http://noxrepo.org/mailman/listinfo/nox-dev_noxrepo.org