using netmap
Sami Halabi
sodynet1 at gmail.com
Sun Apr 28 15:58:59 UTC 2013
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 at 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 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