diff options
Diffstat (limited to 'host/lib')
| -rw-r--r-- | host/lib/rfnoc/ctrlport_endpoint.cpp | 33 | ||||
| -rw-r--r-- | host/lib/rfnoc/register_iface_holder.cpp | 5 | 
2 files changed, 33 insertions, 5 deletions
| diff --git a/host/lib/rfnoc/ctrlport_endpoint.cpp b/host/lib/rfnoc/ctrlport_endpoint.cpp index 5c0deca1d..3374a707b 100644 --- a/host/lib/rfnoc/ctrlport_endpoint.cpp +++ b/host/lib/rfnoc/ctrlport_endpoint.cpp @@ -191,6 +191,12 @@ public:          }      } +    virtual void register_async_msg_validator(async_msg_validator_t callback_f) +    { +        std::unique_lock<std::mutex> lock(_mutex); +        _validate_async_msg = callback_f; +    } +      virtual void register_async_msg_handler(async_msg_callback_t callback_f)      {          std::unique_lock<std::mutex> lock(_mutex); @@ -274,12 +280,12 @@ public:                  UHD_LOG_ERROR(                      "CTRLEP", "Malformed async message request: Invalid num_data");              } else { -                try { -                    _handle_async_msg( -                        rx_ctrl.address, rx_ctrl.data_vtr, rx_ctrl.timestamp); +                if (!_validate_async_msg(rx_ctrl.address, rx_ctrl.data_vtr)) { +                    UHD_LOG_ERROR("CTRLEP", +                        "Malformed async message request: Async message was not " +                        "validated by block controller!"); +                } else {                      status = CMD_OKAY; -                } catch (...) { -                    UHD_LOG_ERROR("CTRLEP", "Async message handler threw an exception");                  }              }              try { @@ -298,6 +304,19 @@ public:              } catch (...) {                  UHD_LOG_ERROR("CTRLEP",                      "Encountered an error sending a response for an async message"); +                return; +            } +            if (status == CMD_OKAY) { +                try { +                    _handle_async_msg( +                        rx_ctrl.address, rx_ctrl.data_vtr, rx_ctrl.timestamp); +                } catch (const std::exception& ex) { +                    UHD_LOG_ERROR("CTRLEP", +                        "Caught exception during async message handling: " << ex.what()); +                } catch (...) { +                    UHD_LOG_ERROR("CTRLEP", +                        "Caught unknown exception during async message handling!"); +                }              }          }      } @@ -463,6 +482,10 @@ private:      //! The clock that drives the timing logic for the ctrlport endpoint      const clock_iface& _timebase_clk; +    //! The function to call to validate an async message (by default, all async +    // messages are considered valid) +    async_msg_validator_t _validate_async_msg = +        [](uint32_t, const std::vector<uint32_t>&) { return true; };      //! The function to call to handle an async message      async_msg_callback_t _handle_async_msg = async_msg_callback_t();      //! The current control sequence number of outgoing packets diff --git a/host/lib/rfnoc/register_iface_holder.cpp b/host/lib/rfnoc/register_iface_holder.cpp index ea5bf0149..d3a0e82e5 100644 --- a/host/lib/rfnoc/register_iface_holder.cpp +++ b/host/lib/rfnoc/register_iface_holder.cpp @@ -64,6 +64,11 @@ public:          UHD_LOG_ERROR("REGS", "Attempting to use invalidated register interface!");      } +    void register_async_msg_validator(async_msg_validator_t) +    { +        UHD_LOG_ERROR("REGS", "Attempting to use invalidated register interface!"); +    } +      void set_policy(const std::string&, const uhd::device_addr_t&)      {          UHD_LOG_ERROR("REGS", "Attempting to use invalidated register interface!"); | 
