Re: netmap extra rings and buffers

2014-09-05 Thread Eggert, Lars
Thank you!

On 2014-9-4, at 17:48, Luigi Rizzo ri...@iet.unipi.it wrote:

 On Thu, Sep 04, 2014 at 11:58:28AM +, Eggert, Lars wrote:
 Hi Luigi,
 
 I'm allocating extra rings and/or extra buffers via the nr_arg1/nr_arg3 
 parameters for NIOCREGIF.
 
 Once I've done that, how do I actually access those rings and buffers?
 
 For extra rings, the documentation and example code don't really say 
 anything.
 
 For extra buffers, the documentation says nifp-ni_bufs_head will be the 
 index of the first buffer but doesn't really explain how I can find the 
 buffer given its index (since it's not in a ring, the NETMAP_BUF macro 
 doesn't seem to apply?) The part about buffers are linked to each other 
 using the first uint32_t as the index is also unclear to me.
 
 Do you have some more text or example code that shows how to use extra rings 
 and buffers?
 
 the ifield to request extra rings is only important when you want
 to make sure that the memory region for a VALE port has also
 space to host some pipes. Otherwise, for physical ports (which at
 the moment all share the same address space) there is not a real
 need to specify it.
 
 For the extra buffers, remember that NETMAP_BUF() can translate
 buffer indexes for any netmap buffer, even those not in a ring.
 All it does is grab the base address of the buffer pool from the
 ring, and add the buffer index times the buffer size.
 
 So you can navigate the pool of extra buffers as follows
 
uint32_t x = nifp-ni_bufs_head;   // index of first buf
 
void *p = NETMAP_BUF(any_ring, x); // address of the first buffer
 
x = *((uint32_t *)p);  // index of the next buffer
 
 cheers
 luigi



signature.asc
Description: Message signed with OpenPGP using GPGMail


netmap extra rings and buffers

2014-09-04 Thread Eggert, Lars
Hi Luigi,

I'm allocating extra rings and/or extra buffers via the nr_arg1/nr_arg3 
parameters for NIOCREGIF.

Once I've done that, how do I actually access those rings and buffers?

For extra rings, the documentation and example code don't really say anything.

For extra buffers, the documentation says nifp-ni_bufs_head will be the index 
of the first buffer but doesn't really explain how I can find the buffer given 
its index (since it's not in a ring, the NETMAP_BUF macro doesn't seem to 
apply?) The part about buffers are linked to each other using the first 
uint32_t as the index is also unclear to me.

Do you have some more text or example code that shows how to use extra rings 
and buffers?

Thanks,
Lars


signature.asc
Description: Message signed with OpenPGP using GPGMail


Re: netmap extra rings and buffers

2014-09-04 Thread Luigi Rizzo
On Thu, Sep 04, 2014 at 11:58:28AM +, Eggert, Lars wrote:
 Hi Luigi,
 
 I'm allocating extra rings and/or extra buffers via the nr_arg1/nr_arg3 
 parameters for NIOCREGIF.
 
 Once I've done that, how do I actually access those rings and buffers?
 
 For extra rings, the documentation and example code don't really say anything.
 
 For extra buffers, the documentation says nifp-ni_bufs_head will be the 
 index of the first buffer but doesn't really explain how I can find the 
 buffer given its index (since it's not in a ring, the NETMAP_BUF macro 
 doesn't seem to apply?) The part about buffers are linked to each other 
 using the first uint32_t as the index is also unclear to me.
 
 Do you have some more text or example code that shows how to use extra rings 
 and buffers?

the ifield to request extra rings is only important when you want
to make sure that the memory region for a VALE port has also
space to host some pipes. Otherwise, for physical ports (which at
the moment all share the same address space) there is not a real
need to specify it.

For the extra buffers, remember that NETMAP_BUF() can translate
buffer indexes for any netmap buffer, even those not in a ring.
All it does is grab the base address of the buffer pool from the
ring, and add the buffer index times the buffer size.

So you can navigate the pool of extra buffers as follows

uint32_t x = nifp-ni_bufs_head;// index of first buf

void *p = NETMAP_BUF(any_ring, x);  // address of the first buffer

x = *((uint32_t *)p);   // index of the next buffer

cheers
luigi
___
freebsd-net@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-net
To unsubscribe, send any mail to freebsd-net-unsubscr...@freebsd.org