[Top][All Lists]
[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:
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Commit-gnuradio] r8564 - in usrp2/trunk/host-ng: apps lib,
jcorgan <=