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 <li...@eitanadler.com> wrote: > [ please bottom post or reply inline ] > > On 25 April 2013 17:48, Sami Halabi <sodyn...@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-unsubscr...@freebsd.org"