using netmap

Sami Halabi sodynet1 at gmail.com
Fri Apr 26 06:23:35 UTC 2013


Hi Eitan,
Thank your for your response.
the ioctl is the example was in Luigi netmap page... maybe Luigi can help
here???????

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


More information about the freebsd-net mailing list