using netmap

Eitan Adler lists at eitanadler.com
Fri Apr 26 03:43:35 UTC 2013


[ please bottom post or reply inline ]

On 25 April 2013 17:48, Sami Halabi <sodynet1 at gmail.com> wrote:
> Okay,
> i figured out the includes, now it runs and seg faults:

Don't forget to show the working headers ;)

> any ideas?
>
> here is the new code:
> int main() {
>
> struct netmap_if *nifp = NULL;
> struct nmreq req;
> int i, len, fd;
> char *buf, *mem, *txt;
>
> printf("Starting...\n");
> fd = open("/dev/netmap", 0);
> strcpy(req.nr_name, "em0"); // register the interface
> printf("em0 registered...\n");
> ioctl(fd, NIOCREGIF, &req); // offset of the structure

is req fully initialized?

I don't think this ioctl is correct.  Everything goes wrong after this
as a result.

> printf("sysctl passed\n");

Things will not always crash if you make a wrong call.  Try checking
return codes before printing something like this.

> mem = mmap(NULL, req.nr_memsize, PROT_READ|PROT_WRITE, 0, fd, 0);
> printf("mem mapped...\n");
>
> nifp = NETMAP_IF(mem, req.nr_offset);
> printf("nifp mapped...%u\n",(long)nifp);

this seems wrong:       ^^    ^^^^^^


> for (;;) {
>         struct pollfd x[1];
>         printf("rx ring def...\n");
>         struct netmap_ring *ring;
>         printf("rx ring start...\n");
>         ring =  NETMAP_RXRING(nifp, 0);
>         printf("rx ring polled...\n");
>
>         x[0].fd = fd;
>         x[0].events = POLLIN;
>         poll(x, 1, 1000);
>         for ( ; ring->avail > 0 ; ring->avail--) {
>                 i = ring->cur;
>                 printf("i=%d\n",&i);

I think this is wrong.

>                 buf = NETMAP_BUF(ring, i);
>                 printf("buff read...\n");
>                 //use_data(buf, ring->slot[i].len);
>                 txt = malloc(sizeof(char) * ring->slot[i].len +1);
>                 strncpy(txt,buf,ring->slot[i].len);
>                 txt[ring->slot[i].len]='\0';
>                 printf("len is: %d\n",&ring->slot[i].len);

Also this.

>                 ring->cur = NETMAP_RING_NEXT(ring, i);
>         }
> }
>
> return 0;
> }



-- 
Eitan Adler


More information about the freebsd-net mailing list