First, in Python, multiple threads don't actually execute concurrently due to 
the Global Interpreter Lock, so you may not be gaining much through the 
multithreaded approach.

Second, connection objects in POX should always only be used from the 
cooperative thread.  So instead of writing actual threads, you could write 
recoco Tasks which do more or less the same thing (except they "yield 
Sleep(time_step)" rather than "time.sleep(time_step)").  There's been some 
discussion on writing tasks over the last couple days (in the "Timer function 
acts strange when called sequentially" thread), and there's a bit of an example 
in lib/recoco/examples.py too.

If you're trying to stress test, I'd suggest you run the dart branch of POX 
with the --unthreaded-sh option which is faster for this sort of thing.  It's 
possible POX/Python will be the bottleneck here anyway.  It's not designed for 
creating DoS attacks.  NOX would be a better choice if you're really trying to 
stress your switches and you have fast links.

-- Murphy

On Oct 30, 2013, at 3:29 PM, Victor Torres <[email protected]> wrote:

> Hello,
> 
> I'm currently trying to make a controller aplication in POX that, after a 
> switch connects, floods the switch with stats_requests. My idea is just to 
> make it so it looks like a "Denial of Service".
> 
> I'm currently trying to use python's thread library, like the below:
> 
> "
>         for i in range(number_threads):
>                thread.start_new_thread( stress_function, (connection, i+1, 
> request_rate/number_threads) )
> "
> 
> And every thread is trying to do something like the following, and this is 
> where I actually try to flood with stats_requests:
> 
> "
>     while(elapsed_time < test_duration):
>         time.sleep(time_step)
>         
> connection.send(of.ofp_stats_request(body=of.ofp_flow_stats_request()))
> "
> 
> The problem is that I get the following error when running with multiple 
> threads:
> 
> "
> Unhandled exception in thread started by <function stress_function at 
> 0x20ccc80>
> Traceback (most recent call last):
>   File "/root/pox/ext/dos_test.py", line 45, in stress_function
>     connection.send(of.ofp_stats_request(body=of.ofp_flow_stats_request()))
>   File "/root/pox/pox/openflow/of_01.py", line 687, in send
>     data = data.pack()
>   File "/root/pox/pox/openflow/libopenflow_01.py", line 2470, in pack
>     packed += ofp_header.pack(self)
>   File "/root/pox/pox/openflow/libopenflow_01.py", line 554, in pack
>     len(self), self.xid)
>   File "/root/pox/pox/openflow/libopenflow_01.py", line 537, in xid
>     self._xid = generate_xid()
> ValueError: generator already executing
> "
> 
> It seems that the concurrent stats_request callings is generating this 
> problem. Can anyone give me any advice on how to properly do this in an 
> effective way? I doesn't need to use POX itself, I just need to have control 
> over the request rate.
> 
> 
> Thanks in advance!
> 
> Victor T.

Reply via email to