From owner-freebsd-net@FreeBSD.ORG Fri Apr 26 06:23:35 2013 Return-Path: Delivered-To: freebsd-net@freebsd.org Received: from mx1.freebsd.org (mx1.FreeBSD.org [8.8.178.115]) by hub.freebsd.org (Postfix) with ESMTP id B47B7598 for ; Fri, 26 Apr 2013 06:23:35 +0000 (UTC) (envelope-from sodynet1@gmail.com) Received: from mail-pb0-x236.google.com (mail-pb0-x236.google.com [IPv6:2607:f8b0:400e:c01::236]) by mx1.freebsd.org (Postfix) with ESMTP id 8EEC51FF6 for ; Fri, 26 Apr 2013 06:23:35 +0000 (UTC) Received: by mail-pb0-f54.google.com with SMTP id jt11so1042140pbb.27 for ; Thu, 25 Apr 2013 23:23:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=68bmtdoU/RknTvJ6iGJweyHG2GYsEbFVq6X1zZ++TSM=; b=nyc4za9ut0eGniOkFG5vB1uVvLiA5+AfDI3/6I9IQ0iCurnHO9fz8mrQNBjf/HSAXo srY94urxafEi5IxMI2cBk115HSHGAHHdV5Nu8141+C4acORC9SG8REElCpF5wViVSnEa vjaHSJ5+VTQSLPsYo979osLl8wyYP+iF+C6nYkudKbWwsf/Y7cSm3Lnb7VKlIyJquxly egDIRT67Xvaud1tm/b5dzEp8hB0wnGXhaRNsKZxqSLb/Qg0S7vrgpNsoZoECtjRtopL1 fV0Q/b6fd6UALNTPmtR3MUAiJoW5FP/AuSMi4jlAXYMi9sKHh+5o17VpLKyLf2Gun9kP AgGw== MIME-Version: 1.0 X-Received: by 10.66.161.33 with SMTP id xp1mr29517398pab.36.1366957415281; Thu, 25 Apr 2013 23:23:35 -0700 (PDT) Received: by 10.70.100.132 with HTTP; Thu, 25 Apr 2013 23:23:35 -0700 (PDT) In-Reply-To: References: Date: Fri, 26 Apr 2013 09:23:35 +0300 Message-ID: Subject: Re: using netmap From: Sami Halabi To: Eitan Adler Content-Type: text/plain; charset=ISO-8859-1 X-Content-Filtered-By: Mailman/MimeDel 2.1.14 Cc: "freebsd-net@freebsd.org" , Luigi Rizzo , Andreas Nilsson X-BeenThere: freebsd-net@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: Networking and TCP/IP with FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 26 Apr 2013 06:23:35 -0000 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 #include /* signal */ #include #include #include /* PRI* macros */ #include /* strcmp */ #include /* open */ #include /* close */ #include /* getifaddrs */ #include /* PROT_* */ #include /* ioctl */ #include #include /* sockaddr.. */ #include /* ntohs */ #include #include /* sysctl */ #include /* timersub */ #include #include /* ifreq */ #include #include #include #include #include #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 // XXX do we need it ? #endif /* !NO_PCAP */ #endif // XXX hack #include /* pthread_* */ #include /* le64toh */ #include #include /* pthread w/ affinity */ #include /* cpu_set */ #include /* LLADDR */ =================================================== Thanks in advance, Sami On Fri, Apr 26, 2013 at 6:43 AM, Eitan Adler wrote: > [ please bottom post or reply inline ] > > On 25 April 2013 17:48, Sami Halabi 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