[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Commit-gnuradio] [gnuradio] 03/148: Created a new thread for handling i
From: |
git |
Subject: |
[Commit-gnuradio] [gnuradio] 03/148: Created a new thread for handling incoming control packets. TX/RX app is working with separate data and control ethernet types. |
Date: |
Mon, 15 Aug 2016 00:47:19 +0000 (UTC) |
This is an automated email from the git hooks/post-receive script.
nwest pushed a commit to annotated tag old_usrp_devel_udp
in repository gnuradio.
commit a04bfd67856b35e8ed8e40b48748a2a7bfba4592
Author: Josh Blum <address@hidden>
Date: Fri Oct 30 14:22:52 2009 -0700
Created a new thread for handling incoming control packets.
TX/RX app is working with separate data and control ethernet types.
---
usrp2/firmware/apps/app_common_v2.c | 6 ++---
usrp2/firmware/apps/txrx.c | 2 +-
usrp2/firmware/include/usrp2_eth_packet.h | 2 ++
usrp2/host/lib/find.cc | 6 ++---
usrp2/host/lib/usrp2_impl.cc | 40 ++++++++++++++++++++++++++-----
usrp2/host/lib/usrp2_impl.h | 8 +++++++
6 files changed, 51 insertions(+), 13 deletions(-)
diff --git a/usrp2/firmware/apps/app_common_v2.c
b/usrp2/firmware/apps/app_common_v2.c
index dbb391e..f676ff2 100644
--- a/usrp2/firmware/apps/app_common_v2.c
+++ b/usrp2/firmware/apps/app_common_v2.c
@@ -71,7 +71,7 @@ set_reply_hdr(u2_eth_packet_t *reply_pkt, u2_eth_packet_t
const *cmd_pkt)
{
reply_pkt->ehdr.dst = cmd_pkt->ehdr.src;
reply_pkt->ehdr.src = *ethernet_mac_addr();
- reply_pkt->ehdr.ethertype = U2_ETHERTYPE+1;
+ reply_pkt->ehdr.ethertype = U2_CTRL_ETHERTYPE;
reply_pkt->thdr.flags = 0;
reply_pkt->thdr.fifo_status = 0; // written by protocol engine
reply_pkt->thdr.seqno = 0; // written by protocol engine
@@ -608,12 +608,12 @@ eth_pkt_inspector(dbsm_t *sm, int bufno)
// inspect rcvd frame and figure out what do do.
- if (pkt->ehdr.ethertype == U2_ETHERTYPE+1){
+ if (pkt->ehdr.ethertype == U2_CTRL_ETHERTYPE){
handle_control_chan_frame(pkt, byte_len);
return true;
}
- if (pkt->ehdr.ethertype != U2_ETHERTYPE)
+ if (pkt->ehdr.ethertype != U2_DATA_ETHERTYPE)
return true; // ignore, probably bogus PAUSE frame from MAC
int chan = u2p_chan(&pkt->fixed);
diff --git a/usrp2/firmware/apps/txrx.c b/usrp2/firmware/apps/txrx.c
index b2487ed..2d4aaf8 100644
--- a/usrp2/firmware/apps/txrx.c
+++ b/usrp2/firmware/apps/txrx.c
@@ -169,7 +169,7 @@ start_rx_streaming_cmd(const u2_mac_addr_t *host,
op_start_rx_streaming_t *p)
memset(&pkt, 0, sizeof(pkt));
pkt.ehdr.dst = *host;
pkt.ehdr.src = *ethernet_mac_addr();
- pkt.ehdr.ethertype = U2_ETHERTYPE;
+ pkt.ehdr.ethertype = U2_DATA_ETHERTYPE;
u2p_set_word0(&pkt.fixed, 0, 0);
// DSP RX will fill in timestamp
diff --git a/usrp2/firmware/include/usrp2_eth_packet.h
b/usrp2/firmware/include/usrp2_eth_packet.h
index 63d4b3a..89b2159 100644
--- a/usrp2/firmware/include/usrp2_eth_packet.h
+++ b/usrp2/firmware/include/usrp2_eth_packet.h
@@ -27,6 +27,8 @@
__U2_BEGIN_DECLS
#define U2_ETHERTYPE 0xBEEF // used in our frames
+#define U2_DATA_ETHERTYPE U2_ETHERTYPE
+#define U2_CTRL_ETHERTYPE U2_ETHERTYPE+1
#define MAC_CTRL_ETHERTYPE 0x8808 // used in PAUSE frames
/*
diff --git a/usrp2/host/lib/find.cc b/usrp2/host/lib/find.cc
index d1df47f..ddb7aa9 100644
--- a/usrp2/host/lib/find.cc
+++ b/usrp2/host/lib/find.cc
@@ -127,10 +127,10 @@ namespace usrp2 {
std::auto_ptr<ethernet> enet(new ethernet());
- if (!enet->open(ifc, htons(U2_ETHERTYPE)))
+ if (!enet->open(ifc, htons(U2_CTRL_ETHERTYPE)))
return result;
- std::auto_ptr<pktfilter>
pf(pktfilter::make_ethertype_inbound(U2_ETHERTYPE, enet->mac()));
+ std::auto_ptr<pktfilter>
pf(pktfilter::make_ethertype_inbound(U2_CTRL_ETHERTYPE, enet->mac()));
if (!enet->attach_pktfilter(pf.get()))
return result;
@@ -141,7 +141,7 @@ namespace usrp2 {
memset(pktbuf, 0, sizeof(pktbuf));
command *c = (command *)pktbuf;
- c->h.ehdr.ethertype = htons(U2_ETHERTYPE);
+ c->h.ehdr.ethertype = htons(U2_CTRL_ETHERTYPE);
c->h.ehdr.dst = broadcast_mac_addr;
memcpy(&c->h.ehdr.src, enet->mac(), 6);
c->h.thdr.flags = 0;
diff --git a/usrp2/host/lib/usrp2_impl.cc b/usrp2/host/lib/usrp2_impl.cc
index 3c199fd..2412d4a 100644
--- a/usrp2/host/lib/usrp2_impl.cc
+++ b/usrp2/host/lib/usrp2_impl.cc
@@ -151,20 +151,20 @@ namespace usrp2 {
d_rx_decim(0),
d_dont_enqueue(true)
{
- if (!d_eth_data->open(ifc, htons(U2_ETHERTYPE)))
+ if (!d_eth_data->open(ifc, htons(U2_DATA_ETHERTYPE)))
throw std::runtime_error("Unable to open/register USRP2 data protocol");
- if (!d_eth_ctrl->open(ifc, htons(U2_ETHERTYPE+1)))
+ if (!d_eth_ctrl->open(ifc, htons(U2_CTRL_ETHERTYPE)))
throw std::runtime_error("Unable to open/register USRP2 control
protocol");
d_addr = p->addr;
- // Create a packet filter for U2_ETHERTYPE packets sourced from target
USRP2
+ // Create a packet filter for U2_DATA_ETHERTYPE packets sourced from
target USRP2
u2_mac_addr_t usrp_mac;
parse_mac_addr(d_addr, &usrp_mac);
- d_pf_data = pktfilter::make_ethertype_inbound_target(U2_ETHERTYPE, (const
unsigned char*)&(usrp_mac.addr));
+ d_pf_data = pktfilter::make_ethertype_inbound_target(U2_DATA_ETHERTYPE,
(const unsigned char*)&(usrp_mac.addr));
if (!d_pf_data || !d_eth_data->attach_pktfilter(d_pf_data))
throw std::runtime_error("Unable to attach packet filter for data
packets.");
- d_pf_ctrl = pktfilter::make_ethertype_inbound_target(U2_ETHERTYPE+1,
(const unsigned char*)&(usrp_mac.addr));
+ d_pf_ctrl = pktfilter::make_ethertype_inbound_target(U2_CTRL_ETHERTYPE,
(const unsigned char*)&(usrp_mac.addr));
if (!d_pf_ctrl || !d_eth_ctrl->attach_pktfilter(d_pf_ctrl))
throw std::runtime_error("Unable to attach packet filter for control
packets.");
@@ -176,6 +176,8 @@ namespace usrp2 {
d_bg_thread = new usrp2_thread(this);
d_bg_thread->start();
+ start_ctrl();
+
// In case the USRP2 was left streaming RX
// FIXME: only one channel right now
stop_rx_streaming(0);
@@ -229,6 +231,7 @@ namespace usrp2 {
usrp2::impl::~impl()
{
stop_bg();
+ stop_ctrl();
d_bg_thread = 0; // thread class deletes itself
delete d_pf_data;
delete d_pf_ctrl;
@@ -288,7 +291,7 @@ namespace usrp2 {
usrp2::impl::init_etf_hdrs(u2_eth_packet_t *p, const std::string &dst,
int word0_flags, int chan, uint32_t timestamp)
{
- init_et_hdrs(p, dst, (chan == CONTROL_CHAN) ? U2_ETHERTYPE+1 :
U2_ETHERTYPE);
+ init_et_hdrs(p, dst, (chan == CONTROL_CHAN) ? U2_CTRL_ETHERTYPE :
U2_DATA_ETHERTYPE);
u2p_set_word0(&p->fixed, word0_flags, chan);
u2p_set_timestamp(&p->fixed, timestamp);
@@ -360,6 +363,31 @@ namespace usrp2 {
// ----------------------------------------------------------------
void
+ usrp2::impl::start_ctrl()
+ {
+ d_ctrl_tg.create_thread(boost::bind(&usrp2::impl::ctrl_loop, this));
+ }
+
+ void
+ usrp2::impl::stop_ctrl()
+ {
+ d_ctrl_running = false;
+ d_ctrl_tg.join_all();
+ }
+
+ void
+ usrp2::impl::ctrl_loop()
+ {
+ d_ctrl_running = true;
+ while (d_ctrl_running){
+ uint32_t buff[100];
+ int ctrl_recv_len = d_eth_ctrl->read_packet_dont_block(buff,
sizeof(buff));
+ if (ctrl_recv_len >= 0) handle_control_packet(buff, ctrl_recv_len);
+ boost::thread::sleep(boost::get_system_time() +
boost::posix_time::milliseconds(long(0.01*1e3))); //10ms timeout
+ }
+ }
+
+ void
usrp2::impl::stop_bg()
{
d_bg_running = false;
diff --git a/usrp2/host/lib/usrp2_impl.h b/usrp2/host/lib/usrp2_impl.h
index 040e17e..4ff256b 100644
--- a/usrp2/host/lib/usrp2_impl.h
+++ b/usrp2/host/lib/usrp2_impl.h
@@ -23,6 +23,7 @@
#include <usrp2/data_handler.h>
#include <usrp2_eth_packet.h>
#include <boost/scoped_ptr.hpp>
+#include <boost/thread.hpp>
#include "control.h"
#include "ring.h"
#include <string>
@@ -119,6 +120,13 @@ namespace usrp2 {
bool dboard_info();
bool reset_db();
+ //control thread stuff
+ boost::thread_group d_ctrl_tg;
+ volatile bool d_ctrl_running;
+ void start_ctrl();
+ void stop_ctrl();
+ void ctrl_loop();
+
public:
impl(const std::string &ifc, props *p, size_t rx_bufsize);
~impl();
- [Commit-gnuradio] [gnuradio] annotated tag old_usrp_devel_udp created (now 90cd6f5), git, 2016/08/14
- [Commit-gnuradio] [gnuradio] 01/148: Create separate raw Ethernet sockets and packet filters, git, 2016/08/14
- [Commit-gnuradio] [gnuradio] 03/148: Created a new thread for handling incoming control packets. TX/RX app is working with separate data and control ethernet types.,
git <=
- [Commit-gnuradio] [gnuradio] 10/148: Fix incorrect comparison, git, 2016/08/14
- [Commit-gnuradio] [gnuradio] 13/148: usrp2: remove install data hook for usrp2_socket_opener, git, 2016/08/14
- [Commit-gnuradio] [gnuradio] 04/148: Hosekeeping after control/data separation., git, 2016/08/14
- [Commit-gnuradio] [gnuradio] 05/148: Removed references to U2_ETHERTYPE and CONTROL_CHAN. Moved non-txrx-related apps in firmware broken by this., git, 2016/08/14
- [Commit-gnuradio] [gnuradio] 06/148: Common naming convention for control and data thread stuff., git, 2016/08/14
- [Commit-gnuradio] [gnuradio] 02/148: working a separate ctrl ethernet device into the code, git, 2016/08/14
- [Commit-gnuradio] [gnuradio] 07/148: using boost threads for control and data, git, 2016/08/14
- [Commit-gnuradio] [gnuradio] 09/148: Refactored timeout handling, git, 2016/08/14
- [Commit-gnuradio] [gnuradio] 17/148: Began work on eth data transport class. Switched send in transport to use iovecs. Pass mac addr into eth transports rather than re-parsing., git, 2016/08/14
- [Commit-gnuradio] [gnuradio] 14/148: Created transport abstraction. Implemented ethernet transport for control. Control transport works in usrp impl. Needs a lot of cleanup., git, 2016/08/14