USRP Hardware Driver and Device Manual Version: 4.11.0.0-0-unknown
UHD and USRP Manual
Loading...
Searching...
No Matches
chdr_packet.ipp
Go to the documentation of this file.
1//
2// Copyright 2020 Ettus Research, a National Instruments Brand
3//
4// SPDX-License-Identifier: GPL-3.0-or-later
5//
6
7#pragma once
8
9#include <uhd/exception.hpp>
10#include <uhd/types/endianness.hpp>
11
13namespace uhd { namespace utils { namespace chdr {
14
15template <typename payload_t>
18 payload_t payload,
19 std::optional<uint64_t> timestamp,
20 std::vector<uint64_t> metadata)
21 : chdr_packet(chdr_w, header, std::vector<uint8_t>(), timestamp, std::move(metadata))
22{
23 set_payload(payload);
24}
25
26template <typename OutputIterator>
28 OutputIterator first, OutputIterator last, uhd::endianness_t endianness) const
29{
30 void* start = static_cast<void*>(&*first);
31 void* end = static_cast<void*>(&*last);
32 serialize_ptr(endianness, start, end);
33}
34
35template <typename InputIterator>
37 InputIterator first,
38 InputIterator last,
39 uhd::endianness_t endianness)
40{
41 void* start = static_cast<void*>(&*first);
42 void* end = static_cast<void*>(&*last);
43 return deserialize_ptr(chdr_w, endianness, start, end);
44}
45
46// Generic get_payload for 64-bit-serialized payload types: strs_payload,
47// strc_payload, and mgmt_payload.
48template <typename payload_t>
49payload_t chdr_packet::get_payload(uhd::endianness_t endianness) const
50{
51 payload_t payload;
52 UHD_ASSERT_THROW(this->_payload.size() % sizeof(uint64_t) == 0);
53 const size_t buff_size_words = this->_payload.size() / sizeof(uint64_t);
54 auto conv_byte_order = [endianness](uint64_t x) -> uint64_t {
55 return (endianness == uhd::ENDIANNESS_BIG) ? uhd::htonx<uint64_t>(x)
57 };
58 payload.deserialize(reinterpret_cast<const uint64_t*>(this->_payload.data()),
59 buff_size_words,
60 conv_byte_order);
61 return payload;
62}
63
64// Generic set_payload for 64-bit-serialized payload types: strs_payload,
65// strc_payload, and mgmt_payload.
66template <typename payload_t>
67void chdr_packet::set_payload(payload_t payload, uhd::endianness_t endianness)
68{
70 const size_t payload_len_bytes = payload.get_length();
71 this->_payload.resize(payload_len_bytes, 0);
72 auto conv_byte_order = [endianness](uint64_t x) -> uint64_t {
73 return (endianness == uhd::ENDIANNESS_BIG) ? uhd::htonx<uint64_t>(x)
75 };
76 payload.serialize(reinterpret_cast<uint64_t*>(this->_payload.data()),
77 this->_payload.size(),
78 conv_byte_order);
79 set_header_lengths();
80}
81
82// get_payload specialization for 32-bit ctrl_payload words.
83template <>
85 uhd::endianness_t endianness) const
86{
88 UHD_ASSERT_THROW(this->_payload.size() % sizeof(uint32_t) == 0);
89 const size_t buff_size_words = this->_payload.size() / sizeof(uint32_t);
90 auto conv_byte_order = [endianness](uint32_t x) -> uint32_t {
91 return (endianness == uhd::ENDIANNESS_BIG) ? uhd::htonx<uint32_t>(x)
93 };
94 payload.deserialize(reinterpret_cast<const uint32_t*>(this->_payload.data()),
95 buff_size_words,
96 conv_byte_order);
97 return payload;
98}
99
100// get_payload specialization for 32-bit ctrl_payload words.
101template <>
103 chdr_rfnoc::ctrl_payload payload, uhd::endianness_t endianness)
104{
106 // ctrl_payload::serialize() returns exactly get_length() bytes with no
107 // padding, so allocate precisely that amount.
108 const size_t payload_len_bytes = payload.get_length();
109 this->_payload.resize(payload_len_bytes, 0);
110 auto conv_byte_order = [endianness](uint32_t x) -> uint32_t {
111 return (endianness == uhd::ENDIANNESS_BIG) ? uhd::htonx<uint32_t>(x)
113 };
114 payload.serialize(reinterpret_cast<uint32_t*>(this->_payload.data()),
115 this->_payload.size(),
116 conv_byte_order);
117 set_header_lengths();
118}
119
120template <typename payload_t>
121std::string chdr_packet::to_string_with_payload(uhd::endianness_t endianness) const
122{
123 payload_t payload = this->get_payload<payload_t>(endianness);
124 return to_string() + payload.to_string();
125}
126
127template <>
129 uhd::endianness_t endianness) const
130{
132 this->get_payload<chdr_rfnoc::mgmt_payload>(endianness);
133 return to_string() + payload.to_string() + payload.hops_to_string();
134}
135
136}}} // namespace uhd::utils::chdr
Definition chdr_types.hpp:37
Definition chdr_types.hpp:257
size_t get_length() const
Get the serialized size of this payload in bytes.
size_t serialize(uint32_t *buff, size_t max_size_bytes, const std::function< uint32_t(uint32_t)> &conv_byte_order) const
Serialize the payload to a uint32_t buffer.
void deserialize(const uint32_t *buff, size_t buff_size, const std::function< uint32_t(uint32_t)> &conv_byte_order)
Deserialize the payload from a uint32_t buffer.
A class that represents a complete multi-hop management transaction.
Definition chdr_types.hpp:897
std::string hops_to_string() const
Return a string representaiton of the hops contained by this object.
std::string to_string() const
Return a string representation of this object.
static chdr_packet deserialize(uhd::rfnoc::chdr_w_t chdr_w, InputIterator first, InputIterator last, endianness_t endianness=uhd::ENDIANNESS_LITTLE)
std::string to_string_with_payload(uhd::endianness_t endianness=uhd::ENDIANNESS_LITTLE) const
Return a string representation of this object and deserialize its payload.
Definition chdr_packet.ipp:121
void set_payload(payload_t payload, uhd::endianness_t endianness=uhd::ENDIANNESS_LITTLE)
Definition chdr_packet.ipp:67
chdr_packet(uhd::rfnoc::chdr_w_t chdr_w, uhd::rfnoc::chdr::chdr_header header, payload_t payload, std::optional< uint64_t > timestamp={}, std::vector< uint64_t > metadata={})
Definition chdr_packet.ipp:16
std::string to_string() const
Return a string representation of this object.
payload_t get_payload(uhd::endianness_t endianness=uhd::ENDIANNESS_LITTLE) const
Definition chdr_packet.ipp:49
void serialize(OutputIterator first, OutputIterator last, endianness_t endianness=uhd::ENDIANNESS_LITTLE) const
#define UHD_ASSERT_THROW(code)
Definition exception.hpp:321
STL namespace.
Definition chdr_types.hpp:21
constexpr packet_type_t payload_to_packet_type()
Conversion from payload_t to pkt_type.
chdr_w_t
Type that indicates the CHDR Width in bits.
Definition rfnoc_types.hpp:19
Definition chdr_packet.hpp:19
Definition chdr_packet.hpp:19
Definition build_info.hpp:12
T htowx(T)
host to worknet: short, long, or long-long.
Definition byteswap.ipp:141
T htonx(T)
host to network: short, long, or long-long
Definition byteswap.ipp:121