Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 28 Apr 2013 18:58:58 +0300
From:      Sami Halabi <sodynet1@gmail.com>
To:        Luigi Rizzo <rizzo@iet.unipi.it>
Cc:        freebsd-net@freebsd.org, Andreas Nilsson <andrnils@gmail.com>, Eitan Adler <lists@eitanadler.com>
Subject:   Re: using netmap
Message-ID:  <CAEW%2BogYtPLKfh0SY7LUG6E8MCSZ24jYJ=GUdtSXKY%2BZUF3uU6g@mail.gmail.com>
In-Reply-To: <20130426082457.GA33737@onelab2.iet.unipi.it>
References:  <CAEW%2BogbOG1E8i88v%2B9ChJGHbstx6JQXMg82cEPqbbFvfDztM4A@mail.gmail.com> <CAPS9%2BSufmM7MM2wVs6hM8xipEess2PB3t-i39_S1XUo7aCosEA@mail.gmail.com> <CAEW%2BogZo7Se1CcGz%2BXwK5v80ns0vrUif=WTwNwTGxv2jVaY1=Q@mail.gmail.com> <CAF6rxg=dQ_-MNNwtMBT%2BR=jjo5SN350d6hVAM0hecPceod8F-Q@mail.gmail.com> <CAEW%2Boga-KRRtNmKOGQGwXhJLva1BQp%2BQ3WJ0TpXoEotRTapTag@mail.gmail.com> <20130426082457.GA33737@onelab2.iet.unipi.it>

next in thread | previous in thread | raw e-mail | index | archive | help
Thank you.
I've started using pkt-gen in virtualbox, 2 machines singlwe core-i7 3612QM
core, with em cards internal.
I see that the sender send about 950 kpps but the receiver is far less
(around 200kpps max).
Any suggestions why this?

Sami
On Apr 26, 2013 11:23 AM, "Luigi Rizzo" <rizzo@iet.unipi.it> wrote:

> 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@eitanadler.com>
> wrote:
> >
> > > [ please bottom post or reply inline ]
> > >
> > > On 25 April 2013 17:48, Sami Halabi <sodynet1@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@freebsd.org mailing list
> > http://lists.freebsd.org/mailman/listinfo/freebsd-net
> > To unsubscribe, send any mail to "freebsd-net-unsubscribe@freebsd.org"
>



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAEW%2BogYtPLKfh0SY7LUG6E8MCSZ24jYJ=GUdtSXKY%2BZUF3uU6g>