commit-gnuradio
[Top][All Lists]
Advanced

[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();



reply via email to

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