commit-gnuradio
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Commit-gnuradio] r8564 - in usrp2/trunk/host-ng: apps lib


From: jcorgan
Subject: [Commit-gnuradio] r8564 - in usrp2/trunk/host-ng: apps lib
Date: Sat, 7 Jun 2008 17:46:51 -0600 (MDT)

Author: jcorgan
Date: 2008-06-07 17:46:50 -0600 (Sat, 07 Jun 2008)
New Revision: 8564

Modified:
   usrp2/trunk/host-ng/apps/test_eth.cc
   usrp2/trunk/host-ng/lib/eth_buffer.cc
   usrp2/trunk/host-ng/lib/eth_buffer.h
Log:
work-in-progress

Modified: usrp2/trunk/host-ng/apps/test_eth.cc
===================================================================
--- usrp2/trunk/host-ng/apps/test_eth.cc        2008-06-07 22:41:09 UTC (rev 
8563)
+++ usrp2/trunk/host-ng/apps/test_eth.cc        2008-06-07 23:46:50 UTC (rev 
8564)
@@ -31,7 +31,7 @@
   if (rt != RT_OK)
     std::cerr << "Failed to enable realtime scheduling" << std::endl;
 
-  usrp2::eth_buffer buf(16e6);
+  usrp2::eth_buffer buf;
   bool ok = buf.open("eth0", 0xBEEF);
 
   return ok ? 0 : 1;

Modified: usrp2/trunk/host-ng/lib/eth_buffer.cc
===================================================================
--- usrp2/trunk/host-ng/lib/eth_buffer.cc       2008-06-07 22:41:09 UTC (rev 
8563)
+++ usrp2/trunk/host-ng/lib/eth_buffer.cc       2008-06-07 23:46:50 UTC (rev 
8564)
@@ -25,9 +25,12 @@
 
 #include "eth_buffer.h"
 #include "ethernet.h"
-#include <linux/if_packet.h> // FIXME autoconf
+#include <linux/if_packet.h>
+#include <sys/socket.h>
+#include <sys/mman.h>
 #include <iostream>
 #include <cmath>
+#include <errno.h>
 
 #define ETH_BUFFER_DEBUG      1 // define to 0 or 1
 
@@ -43,7 +46,7 @@
   }
   
   eth_buffer::eth_buffer(size_t rx_bufsize)
-    : d_fd(0),
+    : d_fd(0), d_buf(0),
       d_ethernet(new ethernet())
   {
     if (ETH_BUFFER_DEBUG)
@@ -54,7 +57,6 @@
     else
        d_buflen = std::min((size_t)MAX_MEM_SIZE, rx_bufsize);
        
-    d_fd = d_ethernet->fd();
     memset(d_mac, 0, sizeof(d_mac));
   }
 
@@ -63,6 +65,9 @@
     if (ETH_BUFFER_DEBUG)
       std::cerr << "eth_buffer: destructor" << std::endl;
       
+    if (!d_using_tpring && d_buf)
+       free(d_buf);
+       
     d_ethernet->close();
   }
   
@@ -78,6 +83,9 @@
       return false;
     }
 
+    d_fd = d_ethernet->fd();
+    memcpy(d_mac, d_ethernet->mac(), sizeof(d_mac));
+    
     struct tpacket_req req;
     size_t page_size = getpagesize();
 
@@ -110,6 +118,30 @@
                << " buflen=" << d_buflen
                << std::endl;
 
+    // Try to get kernel shared memory buffer    
+    if (setsockopt(d_fd, SOL_PACKET, PACKET_RX_RING, (void *)&req, 
sizeof(req))) {
+      perror("eth_buffer: setsockopt");
+      d_using_tpring = false;
+      if (!(d_buf = (uint8_t *)malloc(d_buflen))) {
+        std::cerr << "eth_buffer: failed to allocate packet memory" << 
std::endl;
+       return false;
+      }
+      
+      if (ETH_BUFFER_DEBUG)
+        std::cerr << "eth_buffer: using malloc'd memory for buffer" << 
std::endl;
+    }
+    else {
+      d_using_tpring = true;
+      d_buf = (uint8_t *)mmap(0, d_buflen, PROT_READ|PROT_WRITE, MAP_SHARED, 
d_fd, 0);
+      if (!d_buf) {
+        perror("eth_buffer: mmap");
+       return false;
+      }
+
+      if (ETH_BUFFER_DEBUG)
+        std::cerr << "eth_buffer: using kernel shared mem for buffer" << 
std::endl;
+    }
+
     return true;
   }
 

Modified: usrp2/trunk/host-ng/lib/eth_buffer.h
===================================================================
--- usrp2/trunk/host-ng/lib/eth_buffer.h        2008-06-07 22:41:09 UTC (rev 
8563)
+++ usrp2/trunk/host-ng/lib/eth_buffer.h        2008-06-07 23:46:50 UTC (rev 
8564)
@@ -40,10 +40,12 @@
    */
   class eth_buffer : boost::noncopyable {
     
-    int                d_fd;           // socket file descriptor
-    uint8_t    d_mac[6];       // our mac address
-    size_t      d_buflen;       // length of our buffer
-
+    int                d_fd;                   // socket file descriptor
+    uint8_t    d_mac[6];               // our mac address
+    bool        d_using_tpring;         // using kernel mapped packet ring
+    size_t      d_buflen;               // length of our buffer
+    uint8_t    *d_buf;                  // packet ring
+    
     std::auto_ptr<ethernet> d_ethernet; // our underlying interface
 
   public:





reply via email to

[Prev in Thread] Current Thread [Next in Thread]