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