Re: can't iterate over context queue more than once

Frédéric Raynal <[email protected]> Sun, 7 Nov 2004 17:39:26 +0100
Newsgroups gmane.comp.security.libnet
Message-ID <[email protected]>
Hello,

First of all, you should probably think to use the ng API which is
naturally designed to support multiple packets. cq was added a
posteriori to do so with the 1.1 API.

I wrote a static function clear_cq_lock() but you are right, I forgot
to complete the job.

Somthing like that should be ok:
u_int32_t libnet_cq_end_loop() {

    if (! clear_cq_lock(CQ_LOCK_WRITE)) 
    { 
    	return (0); 
    } 
    l_cqd.current = l_cq;
    return (1); 
}

Sorry :(

	Fred


On Fri, Nov 05, 2004 at 11:21:39AM -0500, Irwin Tillman wrote:
> 
> 
> Platform: libnet 1.1.2.1 on Solaris 9
> 
> It seems that it's only possible to iterate over a context queue once.
> Trying to iterate over it again doesn't work, because the queue
> is still write-locked.
> 
> Is the intent of context queues to only allow you to iterate once,
> then destroy the queue?  Or is there a way to iterate again?
> 
> --
> 
> Details:
> 
> I build the context queue.  After this point I don't modify it.
> ...
> while (1) {
>    exit if signalled...
>    for (l = libnet_cq_head(); libnet_cq_last(); l = libnet_cq_next()) {
>       ...
>       libnet_write(l);
>       ...
>    }
>    sleep(60);
> }
> 
> libnet_cq_head() checks if the context queue is already write-locked, and if
> so, returns NULL.  If it is not write-locked, it write-locks the context queue,
> and returns the head.   
> 
> The first time through the for loop, all is well.  But at the conclusion of
> that loop, the context queue is still write-locked.  The next call to
> libnet_cq_head() returns NULL.
> 
> Should there be a way to say "I'm done iterating, please unlock the queue"?
> 
> Or have I missed the point of context queues; e.g. I'm only allowed to iterate once,
> then I'm expected to destroy the context queue and build a new one?
> 
>