using netmap

Luigi Rizzo rizzo at iet.unipi.it
Fri Apr 26 08:23:09 UTC 2013


On Fri, Apr 26, 2013 at 09:23:35AM +0300, Sami Halabi wrote:
> Hi Eitan,
> Thank your for your response.
> the ioctl is the example was in Luigi netmap page... maybe Luigi can help
> here???????

the thing i suggest is take the pkt-gen source from the FreeBSD tree

	tools/tools/netmap/

and start modifying that one. The samples on my web page are
2 years old, and probably wrong in various ways even then.
They were meant to be something to put on a slide, so a lot of
details were missing. pkt-gen.c, on the other hand, is supposed
to build and be usable.

As others pointed out, the snippets of code you posted have a lot
of very basic programming errors which suggest that the problems
you are seeing are not related to netmap.

Of course we may be wrong, but the odds are against you,
so it is better to start from something known-working.

Try to build your code with "cc -O2 -Wall -Werror" so the
compiler will find at least the most egregious bugs
and abort the compilation until you fix them.

	cheers
	luigi

> can you say why the print's are wrong?
> 
> 
> i fetched wrking headers from other tools without too much checking, maybe
> some
> are irrelevant but for my tests i didn't worry about it yet,  so here is it:
> ===================================================
> #include <errno.h>
> #include <signal.h>     /* signal */
> #include <stdlib.h>
> #include <stdio.h>
> #include <inttypes.h>   /* PRI* macros */
> #include <string.h>     /* strcmp */
> #include <fcntl.h>      /* open */
> #include <unistd.h>     /* close */
> #include <ifaddrs.h>    /* getifaddrs */
> 
> #include <sys/mman.h>   /* PROT_* */
> #include <sys/ioctl.h>  /* ioctl */
> #include <sys/poll.h>
> #include <sys/socket.h> /* sockaddr.. */
> #include <arpa/inet.h>  /* ntohs */
> #include <sys/param.h>
> #include <sys/sysctl.h> /* sysctl */
> #include <sys/time.h>   /* timersub */
> 
> #include <net/ethernet.h>
> #include <net/if.h>     /* ifreq */
> 
> #include <netinet/in.h>
> #include <netinet/ip.h>
> #include <netinet/udp.h>
> 
> #include <net/netmap.h>
> #include <net/netmap_user.h>
> 
> #ifndef MY_PCAP         /* use the system's pcap if available */
> 
> #ifdef NO_PCAP
> #define PCAP_ERRBUF_SIZE        512
> typedef void pcap_t;
> struct pcap_pkthdr;
> #define pcap_inject(a,b,c)      ((void)a, (void)b, (void)c, -1)
> #define pcap_dispatch(a, b, c, d)       (void)c
> #define pcap_open_live(a, b, c, d, e)   ((void)e, NULL)
> #else /* !NO_PCAP */
> #include <pcap/pcap.h> // XXX do we need it ?
> #endif /* !NO_PCAP */
> 
> #endif // XXX hack
> 
> #include <pthread.h>    /* pthread_* */
> #include <sys/endian.h> /* le64toh */
> #include <machine/param.h>
> 
> #include <pthread_np.h> /* pthread w/ affinity */
> #include <sys/cpuset.h> /* cpu_set */
> #include <net/if_dl.h>  /* LLADDR */
> ===================================================
> 
> 
> Thanks in advance,
> Sami
> 
> 
> On Fri, Apr 26, 2013 at 6:43 AM, Eitan Adler <lists at eitanadler.com> wrote:
> 
> > [ 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
> >
> 
> 
> 
> -- 
> Sami Halabi
> Information Systems Engineer
> NMS Projects Expert
> FreeBSD SysAdmin Expert
> _______________________________________________
> freebsd-net at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-net
> To unsubscribe, send any mail to "freebsd-net-unsubscribe at freebsd.org"


More information about the freebsd-net mailing list