aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--host/include/uhd/rfnoc/chdr_types.hpp3
-rw-r--r--tools/dissectors/epan/rfnoc/packet-rfnoc.cpp294
2 files changed, 208 insertions, 89 deletions
diff --git a/host/include/uhd/rfnoc/chdr_types.hpp b/host/include/uhd/rfnoc/chdr_types.hpp
index 7b64bc9a0..e6c5e3912 100644
--- a/host/include/uhd/rfnoc/chdr_types.hpp
+++ b/host/include/uhd/rfnoc/chdr_types.hpp
@@ -708,6 +708,9 @@ public:
mgmt_op_t(const mgmt_op_t& rhs) = default;
//! Get the ops pending for this transaction
+ // Note that ops_pending is not used by UHD, since it can infer this value
+ // from the ops vector in mgmt_hop_t. It is needed only by the CHDR
+ // dissector.
inline uint8_t get_ops_pending() const
{
return _ops_pending;
diff --git a/tools/dissectors/epan/rfnoc/packet-rfnoc.cpp b/tools/dissectors/epan/rfnoc/packet-rfnoc.cpp
index 8c5e4d8cd..90d4adef0 100644
--- a/tools/dissectors/epan/rfnoc/packet-rfnoc.cpp
+++ b/tools/dissectors/epan/rfnoc/packet-rfnoc.cpp
@@ -58,17 +58,19 @@ static int hf_rfnoc_hdr_seqnum = -1;
static int hf_rfnoc_hdr_len = -1;
static int hf_rfnoc_hdr_dst_epid = -1;
static int hf_rfnoc_timestamp = -1;
+static int hf_rfnoc_metadata = -1;
+static int hf_rfnoc_payload = -1;
static int hf_rfnoc_src_epid = -1;
static int hf_rfnoc_ctrl = -1;
static int hf_rfnoc_ctrl_dst_port = -1;
static int hf_rfnoc_ctrl_src_port = -1;
static int hf_rfnoc_ctrl_num_data = -1;
static int hf_rfnoc_ctrl_seqnum = -1;
+static int hf_rfnoc_ctrl_has_time = -1;
static int hf_rfnoc_ctrl_is_ack = -1;
static int hf_rfnoc_ctrl_address = -1;
-static int hf_rfnoc_ctrl_data0 = -1;
-static int hf_rfnoc_ctrl_data = -1; // TODO: Figure out what to do here
static int hf_rfnoc_ctrl_byte_enable = -1;
+static int hf_rfnoc_ctrl_data = -1;
static int hf_rfnoc_ctrl_opcode = -1;
static int hf_rfnoc_ctrl_status = -1;
static int hf_rfnoc_strs = -1;
@@ -90,15 +92,26 @@ static int hf_rfnoc_mgmt_chdr_w = -1;
static int hf_rfnoc_mgmt_num_hops = -1;
static int hf_rfnoc_mgmt_hop = -1;
static int hf_rfnoc_mgmt_op = -1;
+static int hf_rfnoc_mgmt_op_ops_pending = -1;
static int hf_rfnoc_mgmt_op_code = -1;
static int hf_rfnoc_mgmt_op_dest = -1;
static int hf_rfnoc_mgmt_op_device_id = -1;
static int hf_rfnoc_mgmt_op_node_type = -1;
static int hf_rfnoc_mgmt_op_node_inst = -1;
+static int hf_rfnoc_mgmt_op_ext_info = -1;
static int hf_rfnoc_mgmt_op_cfg_address = -1;
static int hf_rfnoc_mgmt_op_cfg_data = -1;
static const value_string RFNOC_PACKET_TYPES[] = {
+ { uhd::rfnoc::chdr::packet_type_t::PKT_TYPE_MGMT, "Management (0)" },
+ { uhd::rfnoc::chdr::packet_type_t::PKT_TYPE_STRS, "Stream Status (1)" },
+ { uhd::rfnoc::chdr::packet_type_t::PKT_TYPE_STRC, "Stream Command (2)" },
+ { uhd::rfnoc::chdr::packet_type_t::PKT_TYPE_CTRL, "Control (4)" },
+ { uhd::rfnoc::chdr::packet_type_t::PKT_TYPE_DATA_NO_TS, "Data (6)" },
+ { uhd::rfnoc::chdr::packet_type_t::PKT_TYPE_DATA_WITH_TS, "Data with Timestamp (7)" },
+};
+
+static const value_string RFNOC_PACKET_TYPES_SHORT[] = {
{ uhd::rfnoc::chdr::packet_type_t::PKT_TYPE_MGMT, "Management" },
{ uhd::rfnoc::chdr::packet_type_t::PKT_TYPE_STRS, "Stream Status" },
{ uhd::rfnoc::chdr::packet_type_t::PKT_TYPE_STRC, "Stream Command" },
@@ -107,64 +120,56 @@ static const value_string RFNOC_PACKET_TYPES[] = {
{ uhd::rfnoc::chdr::packet_type_t::PKT_TYPE_DATA_WITH_TS, "Data with Timestamp" },
};
-static const value_string RFNOC_PACKET_TYPES_SHORT[] = {
- { uhd::rfnoc::chdr::packet_type_t::PKT_TYPE_MGMT, "mgmt" },
- { uhd::rfnoc::chdr::packet_type_t::PKT_TYPE_STRS, "strs" },
- { uhd::rfnoc::chdr::packet_type_t::PKT_TYPE_STRC, "strc" },
- { uhd::rfnoc::chdr::packet_type_t::PKT_TYPE_CTRL, "ctrl" },
- { uhd::rfnoc::chdr::packet_type_t::PKT_TYPE_DATA_NO_TS, "data" },
- { uhd::rfnoc::chdr::packet_type_t::PKT_TYPE_DATA_WITH_TS, "data" },
-};
-
static const value_string RFNOC_CTRL_STATUS[] = {
- { uhd::rfnoc::chdr::ctrl_status_t::CMD_OKAY, "OK" },
- { uhd::rfnoc::chdr::ctrl_status_t::CMD_CMDERR, "CMDERR" },
- { uhd::rfnoc::chdr::ctrl_status_t::CMD_TSERR, "TSERR" },
- { uhd::rfnoc::chdr::ctrl_status_t::CMD_WARNING, "WARNING" },
+ { uhd::rfnoc::chdr::ctrl_status_t::CMD_OKAY, "OK (0)" },
+ { uhd::rfnoc::chdr::ctrl_status_t::CMD_CMDERR, "CMDERR (1)" },
+ { uhd::rfnoc::chdr::ctrl_status_t::CMD_TSERR, "TSERR (2)" },
+ { uhd::rfnoc::chdr::ctrl_status_t::CMD_WARNING, "WARNING (3)" },
};
static const value_string RFNOC_CTRL_OPCODES[] = {
- { uhd::rfnoc::chdr::ctrl_opcode_t::OP_SLEEP, "sleep" },
- { uhd::rfnoc::chdr::ctrl_opcode_t::OP_WRITE, "write" },
- { uhd::rfnoc::chdr::ctrl_opcode_t::OP_READ, "read" },
- { uhd::rfnoc::chdr::ctrl_opcode_t::OP_READ_WRITE, "r/w" },
- { uhd::rfnoc::chdr::ctrl_opcode_t::OP_BLOCK_WRITE, "block write" },
- { uhd::rfnoc::chdr::ctrl_opcode_t::OP_BLOCK_READ, "block read" },
- { uhd::rfnoc::chdr::ctrl_opcode_t::OP_POLL, "poll" },
- { uhd::rfnoc::chdr::ctrl_opcode_t::OP_USER1, "user1" },
- { uhd::rfnoc::chdr::ctrl_opcode_t::OP_USER2, "user2" },
- { uhd::rfnoc::chdr::ctrl_opcode_t::OP_USER3, "user3" },
- { uhd::rfnoc::chdr::ctrl_opcode_t::OP_USER4, "user4" },
- { uhd::rfnoc::chdr::ctrl_opcode_t::OP_USER5, "user5" },
- { uhd::rfnoc::chdr::ctrl_opcode_t::OP_USER6, "user6" },
+ { uhd::rfnoc::chdr::ctrl_opcode_t::OP_SLEEP, "Sleep (0)" },
+ { uhd::rfnoc::chdr::ctrl_opcode_t::OP_WRITE, "Write (1)" },
+ { uhd::rfnoc::chdr::ctrl_opcode_t::OP_READ, "Read (2)" },
+ { uhd::rfnoc::chdr::ctrl_opcode_t::OP_READ_WRITE, "Read then Write (3)" },
+ { uhd::rfnoc::chdr::ctrl_opcode_t::OP_BLOCK_WRITE, "Block Write (4)" },
+ { uhd::rfnoc::chdr::ctrl_opcode_t::OP_BLOCK_READ, "Block Read (5)" },
+ { uhd::rfnoc::chdr::ctrl_opcode_t::OP_POLL, "Poll (6)" },
+ { uhd::rfnoc::chdr::ctrl_opcode_t::OP_USER1, "User Defined (0xA)" },
+ { uhd::rfnoc::chdr::ctrl_opcode_t::OP_USER2, "User Defined (0xB)" },
+ { uhd::rfnoc::chdr::ctrl_opcode_t::OP_USER3, "User Defined (0xC)" },
+ { uhd::rfnoc::chdr::ctrl_opcode_t::OP_USER4, "User Defined (0xD)" },
+ { uhd::rfnoc::chdr::ctrl_opcode_t::OP_USER5, "User Defined (0xE)" },
+ { uhd::rfnoc::chdr::ctrl_opcode_t::OP_USER6, "User Defined (0xF)" },
};
static const value_string RFNOC_STRS_STATUS[] = {
- { uhd::rfnoc::chdr::strs_status_t::STRS_OKAY, "OK" },
- { uhd::rfnoc::chdr::strs_status_t::STRS_CMDERR, "CMDERR" },
- { uhd::rfnoc::chdr::strs_status_t::STRS_SEQERR, "SEQERR" },
- { uhd::rfnoc::chdr::strs_status_t::STRS_DATAERR, "DATAERR" },
- { uhd::rfnoc::chdr::strs_status_t::STRS_RTERR, "RTERR" },
+ { uhd::rfnoc::chdr::strs_status_t::STRS_OKAY, "Okay (0)" },
+ { uhd::rfnoc::chdr::strs_status_t::STRS_CMDERR, "Command Error (1)" },
+ { uhd::rfnoc::chdr::strs_status_t::STRS_SEQERR, "Sequence Error (2)" },
+ { uhd::rfnoc::chdr::strs_status_t::STRS_DATAERR, "Data Error (3)" },
+ { uhd::rfnoc::chdr::strs_status_t::STRS_RTERR, "Routing Error (4)" },
};
static const value_string RFNOC_STRC_OPCODES[] = {
- { uhd::rfnoc::chdr::strc_op_code_t::STRC_INIT, "init" },
- { uhd::rfnoc::chdr::strc_op_code_t::STRC_PING, "ping" },
- { uhd::rfnoc::chdr::strc_op_code_t::STRC_RESYNC, "resync" },
+ { uhd::rfnoc::chdr::strc_op_code_t::STRC_INIT, "Initialize Stream (0)" },
+ { uhd::rfnoc::chdr::strc_op_code_t::STRC_PING, "Ping (1)" },
+ { uhd::rfnoc::chdr::strc_op_code_t::STRC_RESYNC, "Resynchronize Flow Control (2)" },
};
static const value_string RFNOC_MGMT_OPCODES[] = {
- { uhd::rfnoc::chdr::mgmt_op_t::op_code_t::MGMT_OP_NOP, "nop" },
- { uhd::rfnoc::chdr::mgmt_op_t::op_code_t::MGMT_OP_ADVERTISE, "advertise" },
- { uhd::rfnoc::chdr::mgmt_op_t::op_code_t::MGMT_OP_SEL_DEST, "select_dest" },
- { uhd::rfnoc::chdr::mgmt_op_t::op_code_t::MGMT_OP_RETURN, "return_to_sender" },
- { uhd::rfnoc::chdr::mgmt_op_t::op_code_t::MGMT_OP_INFO_REQ, "node_info_req" },
- { uhd::rfnoc::chdr::mgmt_op_t::op_code_t::MGMT_OP_INFO_RESP, "node_info_resp" },
- { uhd::rfnoc::chdr::mgmt_op_t::op_code_t::MGMT_OP_CFG_WR_REQ, "cfg_wr_req" },
- { uhd::rfnoc::chdr::mgmt_op_t::op_code_t::MGMT_OP_CFG_RD_REQ, "cfg_rd_req" },
- { uhd::rfnoc::chdr::mgmt_op_t::op_code_t::MGMT_OP_CFG_RD_RESP, "cfg_rd_resp" },
+ { uhd::rfnoc::chdr::mgmt_op_t::op_code_t::MGMT_OP_NOP, "No-op (0)" },
+ { uhd::rfnoc::chdr::mgmt_op_t::op_code_t::MGMT_OP_ADVERTISE, "Advertise (1)" },
+ { uhd::rfnoc::chdr::mgmt_op_t::op_code_t::MGMT_OP_SEL_DEST, "Select Destination (2)" },
+ { uhd::rfnoc::chdr::mgmt_op_t::op_code_t::MGMT_OP_RETURN, "Return to Sender (3)" },
+ { uhd::rfnoc::chdr::mgmt_op_t::op_code_t::MGMT_OP_INFO_REQ, "Node Info Request (4)" },
+ { uhd::rfnoc::chdr::mgmt_op_t::op_code_t::MGMT_OP_INFO_RESP, "Node Info Response (5)" },
+ { uhd::rfnoc::chdr::mgmt_op_t::op_code_t::MGMT_OP_CFG_WR_REQ, "Config Write (6)" },
+ { uhd::rfnoc::chdr::mgmt_op_t::op_code_t::MGMT_OP_CFG_RD_REQ, "Config Read Request (7)" },
+ { uhd::rfnoc::chdr::mgmt_op_t::op_code_t::MGMT_OP_CFG_RD_RESP, "Config Read Response (8)" },
};
+
/* the heuristic dissector is called on every packet with payload.
* The warning printed for this should only be printed once.
*/
@@ -241,11 +246,11 @@ static int dissect_rfnoc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, vo
if (len >= 4) {
rfnoc_tree = proto_item_add_subtree(item, ett_rfnoc);
- proto_item_append_text(item, ", Packet type: %s, Dst EPID: %d",
- val_to_str(chdr_hdr.get_pkt_type(), RFNOC_PACKET_TYPES, "Unknown (0x%x)"), chdr_hdr.get_dst_epid()
+ proto_item_append_text(item, ", Packet type: %s, Dst EPID: 0x%02x",
+ val_to_str(chdr_hdr.get_pkt_type(), RFNOC_PACKET_TYPES_SHORT, "Unknown (0x%x)"), chdr_hdr.get_dst_epid()
);
col_add_fstr(pinfo->cinfo, COL_INFO, "%s dst_epid=%d",
- val_to_str(chdr_hdr.get_pkt_type(), RFNOC_PACKET_TYPES_SHORT, "Unknown (0x%x)"), chdr_hdr.get_dst_epid()
+ val_to_str(chdr_hdr.get_pkt_type(), RFNOC_PACKET_TYPES, "Unknown (0x%x)"), chdr_hdr.get_dst_epid()
);
/* Header info. First, a top-level header tree item: */
@@ -254,27 +259,42 @@ static int dissect_rfnoc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, vo
/* Let us query hdr.type */
proto_tree_add_string(
header_tree, hf_rfnoc_hdr_pkttype, tvb, offset+6, 1,
- val_to_str(chdr_hdr.get_pkt_type(), RFNOC_PACKET_TYPES_SHORT, "invalid")
+ val_to_str(chdr_hdr.get_pkt_type(), RFNOC_PACKET_TYPES, "invalid")
);
/* Add Dst EPID */
- proto_item_append_text(header_item, ", Dst EPID: %02x", chdr_hdr.get_dst_epid());
+ proto_item_append_text(header_item, ", Dst EPID: 0x%02x", chdr_hdr.get_dst_epid());
proto_tree_add_uint(header_tree, hf_rfnoc_hdr_dst_epid, tvb, offset, 2, chdr_hdr.get_dst_epid());
/* Add length */
proto_tree_add_uint(header_tree, hf_rfnoc_hdr_len, tvb, offset+2, 2, chdr_hdr.get_length());
/* Add sequence number */
proto_tree_add_uint(header_tree, hf_rfnoc_hdr_seqnum, tvb, offset+4, 2, chdr_hdr.get_seq_num());
+ /* Add eov */
+ proto_tree_add_boolean(header_tree, hf_rfnoc_hdr_eob, tvb, offset + 7, 1, chdr_hdr.get_eob());
+ /* Add eob */
+ proto_tree_add_boolean(header_tree, hf_rfnoc_hdr_eov, tvb, offset + 7, 1, chdr_hdr.get_eov());
+ /* Add vc */
+ proto_tree_add_uint(header_tree, hf_rfnoc_hdr_vc, tvb, offset + 7, 1, chdr_hdr.get_vc());
- if (chdr_hdr.get_num_mdata()) {
- /* Can't decode packets with metadata */
- return len;
- }
-
- /* TODO: Update offsets if there is a timestamp. Also update lengths */
/* Add subtree based on packet type */
uhd::rfnoc::chdr::packet_type_t pkttype = chdr_hdr.get_pkt_type();
- offset += chdr_w_bytes;
try {
+ /* Adjust offset to point to first CHDR word after header and timestamp */
+ if (pkttype == uhd::rfnoc::chdr::packet_type_t::PKT_TYPE_DATA_WITH_TS && chdr_w_bytes == 8) {
+ /* Header and timestamp are in separate CHDR words */
+ offset += 2*chdr_w_bytes;
+ } else {
+ /* Header and timestamp in a single CHDR word, or there's no timestamp */
+ offset += chdr_w_bytes;
+ }
+
+ /* Add metadata */
+ if (chdr_hdr.get_num_mdata()) {
+ size_t mdata_size = chdr_hdr.get_num_mdata() * chdr_w_bytes;
+ proto_tree_add_item(rfnoc_tree, hf_rfnoc_metadata, tvb, offset, mdata_size, endianness);
+ offset += mdata_size;
+ }
+
if (pkttype == uhd::rfnoc::chdr::packet_type_t::PKT_TYPE_CTRL) {
ctrl_item = proto_tree_add_item(rfnoc_tree, hf_rfnoc_ctrl, tvb, offset, chdr_len-chdr_w_bytes, endianness);
ctrl_tree = proto_item_add_subtree(ctrl_item, ett_rfnoc_ctrl);
@@ -294,12 +314,13 @@ static int dissect_rfnoc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, vo
proto_tree_add_boolean(ctrl_tree, hf_rfnoc_ctrl_is_ack, tvb, offset+3, 1, payload.is_ack);
/* Add sequence number */
proto_tree_add_uint(ctrl_tree, hf_rfnoc_ctrl_seqnum, tvb, offset+3, 1, payload.seq_num);
- if (payload.timestamp) {
+ /* Add timestamp */
+ if (payload.has_timestamp()) {
proto_tree_add_uint64(ctrl_tree, hf_rfnoc_timestamp, tvb, offset+8, 8, *payload.timestamp);
offset += 8;
+ } else {
+ proto_tree_add_boolean(ctrl_tree, hf_rfnoc_ctrl_has_time, tvb, offset+3, 1, payload.has_timestamp());
}
- /* Add data0 */
- proto_tree_add_uint(ctrl_tree, hf_rfnoc_ctrl_data0, tvb, offset+12, 4, payload.data_vtr[0]);
/* Add op code */
proto_tree_add_string(
ctrl_tree, hf_rfnoc_ctrl_opcode, tvb, offset+11, 1,
@@ -307,11 +328,17 @@ static int dissect_rfnoc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, vo
);
/* Add address */
proto_tree_add_uint(ctrl_tree, hf_rfnoc_ctrl_address, tvb, offset+8, 3, payload.address);
+ /* Add byte enable */
+ proto_tree_add_uint(ctrl_tree, hf_rfnoc_ctrl_byte_enable, tvb, offset+10, 1, payload.byte_enable);
/* Add status */
proto_tree_add_string(
ctrl_tree, hf_rfnoc_ctrl_status, tvb, offset+11, 1,
val_to_str(payload.status, RFNOC_CTRL_STATUS, "reserved")
);
+ /* Add data */
+ for (int i=0; i < payload.data_vtr.size(); i++) {
+ proto_tree_add_uint(ctrl_tree, hf_rfnoc_ctrl_data, tvb, offset+12+i*4, 4, payload.data_vtr[i]);
+ }
}
if (pkttype == uhd::rfnoc::chdr::packet_type_t::PKT_TYPE_STRS) {
@@ -370,14 +397,18 @@ static int dissect_rfnoc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, vo
auto hop = payload.get_hop(hop_id);
size_t num_ops = hop.get_num_ops();
hop_item = proto_tree_add_item(mgmt_tree, hf_rfnoc_mgmt_hop, tvb, offset, num_ops*chdr_w_bytes, endianness);
+ proto_item_append_text(hop_item, " %ld", hop_id);
hop_tree = proto_item_add_subtree(hop_item, ett_rfnoc_mgmt_hop);
for (size_t op_id = 0; op_id < num_ops; op_id++) {
auto op = hop.get_op(op_id);
+ auto ops_pending = op.get_ops_pending();
auto opcode = op.get_op_code();
mgmt_op_item = proto_tree_add_item(hop_tree, hf_rfnoc_mgmt_op, tvb, offset, chdr_w_bytes, endianness);
+ proto_item_append_text(mgmt_op_item, " %ld", op_id);
mgmt_op_tree = proto_item_add_subtree(mgmt_op_item, ett_rfnoc_mgmt_hop_op);
- /* Add op code */
+ /* Add ops pending and op code */
+ proto_tree_add_uint(mgmt_op_tree, hf_rfnoc_mgmt_op_ops_pending, tvb, offset+0, 1, ops_pending);
proto_tree_add_string(
mgmt_op_tree, hf_rfnoc_mgmt_op_code, tvb, offset+1, 1,
val_to_str(opcode, RFNOC_MGMT_OPCODES, "invalid")
@@ -391,46 +422,95 @@ static int dissect_rfnoc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, vo
} else if (opcode == uhd::rfnoc::chdr::mgmt_op_t::op_code_t::MGMT_OP_INFO_RESP) {
auto opdata = uhd::rfnoc::chdr::mgmt_op_t::node_info_payload(
op.get_op_payload());
- proto_tree_add_uint(mgmt_op_tree, hf_rfnoc_mgmt_op_device_id, tvb, offset+2, 6, opdata.device_id);
- proto_tree_add_uint(mgmt_op_tree, hf_rfnoc_mgmt_op_node_type, tvb, offset+2, 6, opdata.node_type);
- proto_tree_add_uint(mgmt_op_tree, hf_rfnoc_mgmt_op_node_inst, tvb, offset+2, 6, opdata.node_inst);
+ proto_tree_add_uint(mgmt_op_tree, hf_rfnoc_mgmt_op_device_id, tvb, offset+2, 2, opdata.device_id);
+ proto_tree_add_uint(mgmt_op_tree, hf_rfnoc_mgmt_op_node_inst, tvb, offset+4, 2, opdata.node_inst);
+ /* Add node type and extended info */
+ auto ei = opdata.ext_info;
+ switch (opdata.node_type) {
+ case 1:
+ /* Crossbar */
+ proto_tree_add_string_format_value(
+ mgmt_op_tree, hf_rfnoc_mgmt_op_node_type, tvb, offset+4, 1,
+ "", "Crossbar (1)"
+ );
+ proto_tree_add_string_format_value(
+ mgmt_op_tree, hf_rfnoc_mgmt_op_ext_info, tvb, offset+5, 3,
+ "", "NPORTS=%d, NPORTS_MGMT=%d, EXT_RTCFG_PORT=%d (0x%05X)",
+ ei & 0xFF, (ei >> 8) & 0xFF, (ei >> 16) & 1, ei
+ );
+ break;
+ case 2:
+ /* Stream Endpoint */
+ proto_tree_add_string_format_value(
+ mgmt_op_tree, hf_rfnoc_mgmt_op_node_type, tvb, offset+4, 1,
+ "", "Stream Endpoint (2)"
+ );
+ proto_tree_add_string_format_value(
+ mgmt_op_tree, hf_rfnoc_mgmt_op_ext_info, tvb, offset+5, 3,
+ "", "AXIS_CTRL_EN=%d, AXIS_DATA_EN=%d, NUM_DATA_I=%d NUM_DATA_O=%d, REPORT_STREAM_ERRS=%d (0x%05X)",
+ ei & 1, (ei >> 1) & 1, (ei >> 2) & 0x3F,
+ (ei >> 8) & 0x3F, (ei >> 14) & 1, ei
+ );
+ break;
+ case 3:
+ /* Transport Adapter */
+ proto_tree_add_string_format_value(
+ mgmt_op_tree, hf_rfnoc_mgmt_op_node_type, tvb, offset+4, 1,
+ "", "Transport Adapter (3)"
+ );
+ proto_tree_add_string_format_value(
+ mgmt_op_tree, hf_rfnoc_mgmt_op_ext_info, tvb, offset+5, 3,
+ "", "NODE_SUBTYPE=%d (0x%05X)", ei & 0xFF, ei
+ );
+ break;
+ default:
+ /* Invalid */
+ proto_tree_add_string_format_value(
+ mgmt_op_tree, hf_rfnoc_mgmt_op_node_type, tvb, offset+4, 1,
+ "", "Invalid (%d)", opdata.node_type
+ );
+ proto_tree_add_string_format_value(
+ mgmt_op_tree, hf_rfnoc_mgmt_op_ext_info, tvb, offset+5, 3,
+ "", "0x%05X", ei
+ );
+ break;
+ }
} else if (opcode == uhd::rfnoc::chdr::mgmt_op_t::op_code_t::MGMT_OP_CFG_WR_REQ) {
auto opdata = uhd::rfnoc::chdr::mgmt_op_t::cfg_payload(
op.get_op_payload());
- proto_tree_add_uint(mgmt_op_tree, hf_rfnoc_mgmt_op_cfg_address, tvb, offset+2, 6, opdata.addr);
- proto_tree_add_uint(mgmt_op_tree, hf_rfnoc_mgmt_op_cfg_data, tvb, offset+2, 6, opdata.data);
+ proto_tree_add_uint(mgmt_op_tree, hf_rfnoc_mgmt_op_cfg_address, tvb, offset+2, 2, opdata.addr);
+ proto_tree_add_uint(mgmt_op_tree, hf_rfnoc_mgmt_op_cfg_data, tvb, offset+4, 4, opdata.data);
} else if (opcode == uhd::rfnoc::chdr::mgmt_op_t::op_code_t::MGMT_OP_CFG_RD_REQ) {
auto opdata = uhd::rfnoc::chdr::mgmt_op_t::cfg_payload(
op.get_op_payload());
- proto_tree_add_uint(mgmt_op_tree, hf_rfnoc_mgmt_op_cfg_address, tvb, offset+2, 6, opdata.addr);
+ proto_tree_add_uint(mgmt_op_tree, hf_rfnoc_mgmt_op_cfg_address, tvb, offset+2, 2, opdata.addr);
} else if (opcode == uhd::rfnoc::chdr::mgmt_op_t::op_code_t::MGMT_OP_CFG_RD_RESP) {
auto opdata = uhd::rfnoc::chdr::mgmt_op_t::cfg_payload(
op.get_op_payload());
- proto_tree_add_uint(mgmt_op_tree, hf_rfnoc_mgmt_op_cfg_address, tvb, offset+2, 6, opdata.addr);
- proto_tree_add_uint(mgmt_op_tree, hf_rfnoc_mgmt_op_cfg_data, tvb, offset+2, 6, opdata.data);
+ proto_tree_add_uint(mgmt_op_tree, hf_rfnoc_mgmt_op_cfg_address, tvb, offset+2, 2, opdata.addr);
+ proto_tree_add_uint(mgmt_op_tree, hf_rfnoc_mgmt_op_cfg_data, tvb, offset+4, 4, opdata.data);
}
offset += chdr_w_bytes;
}
}
}
- if (pkttype == uhd::rfnoc::chdr::packet_type_t::PKT_TYPE_DATA_NO_TS
- || pkttype == uhd::rfnoc::chdr::packet_type_t::PKT_TYPE_DATA_WITH_TS) {
- is_eob = chdr_hdr.get_eob();
- is_eov = chdr_hdr.get_eov();
- proto_tree_add_boolean(
- rfnoc_tree, hf_rfnoc_hdr_eob, tvb, offset + 7, 1, is_eob);
- proto_tree_add_boolean(
- rfnoc_tree, hf_rfnoc_hdr_eov, tvb, offset + 7, 1, is_eov);
+
+ if (pkttype == uhd::rfnoc::chdr::packet_type_t::PKT_TYPE_DATA_NO_TS) {
+ auto pkt = pkt_factory.make_generic();
+ pkt->refresh(tvb_get_ptr(tvb, 0, chdr_len));
+ /* Add payload */
+ proto_tree_add_item(rfnoc_tree, hf_rfnoc_payload, tvb, offset, pkt->get_payload_size(), endianness);
}
+
if (pkttype == uhd::rfnoc::chdr::packet_type_t::PKT_TYPE_DATA_WITH_TS) {
- size_t timestamp_offset = offset+8;
- if (chdr_w_bytes > 8) {
- // The timestamp is in the same block as the header or CHDR widths above 64 bits
- timestamp_offset =- chdr_w_bytes;
- }
+ /* Timestamp is always immediately after the 64-bit header */
+ const size_t timestamp_offset = 8;
auto pkt = pkt_factory.make_generic();
pkt->refresh(tvb_get_ptr(tvb, 0, chdr_len));
+ /* Add timestamp */
proto_tree_add_uint64(rfnoc_tree, hf_rfnoc_timestamp, tvb, timestamp_offset, 8, *(pkt->get_timestamp()));
+ /* Add payload */
+ proto_tree_add_item(rfnoc_tree, hf_rfnoc_payload, tvb, offset, pkt->get_payload_size(), endianness);
}
} catch (uhd::assertion_error& e) {
std::cout << "Cannot dissect. Try using a different RFNoC width." << std::endl;
@@ -505,8 +585,20 @@ void proto_register_rfnoc(void)
NULL, 0x00,
NULL, HFILL }
},
+ { &hf_rfnoc_metadata,
+ { "Metadata", "rfnoc.metadata",
+ FT_NONE, BASE_NONE,
+ NULL, 0x00,
+ NULL, HFILL }
+ },
+ { &hf_rfnoc_payload,
+ { "Payload", "rfnoc.payload",
+ FT_NONE, BASE_NONE,
+ NULL, 0x00,
+ NULL, HFILL }
+ },
{ &hf_rfnoc_ctrl,
- { "CTRL Payload", "rfnoc.ctrl",
+ { "Control Payload", "rfnoc.ctrl",
FT_NONE, BASE_NONE,
NULL, 0x00,
NULL, HFILL }
@@ -529,8 +621,8 @@ void proto_register_rfnoc(void)
NULL, 0x00,
NULL, HFILL }
},
- { &hf_rfnoc_ctrl_data0,
- { "Data0", "rfnoc.ctrl.data0",
+ { &hf_rfnoc_ctrl_data,
+ { "Data", "rfnoc.ctrl.data",
FT_UINT32, BASE_HEX,
NULL, 0x00,
NULL, HFILL }
@@ -541,6 +633,12 @@ void proto_register_rfnoc(void)
NULL, 0x00,
NULL, HFILL }
},
+ { &hf_rfnoc_ctrl_has_time,
+ { "Has Time", "rfnoc.ctrl.has_time",
+ FT_BOOLEAN, BASE_NONE,
+ NULL, 0x0,
+ NULL, HFILL }
+ },
{ &hf_rfnoc_ctrl_is_ack,
{ "Is ACK", "rfnoc.ctrl.is_ack",
FT_BOOLEAN, BASE_NONE,
@@ -559,6 +657,12 @@ void proto_register_rfnoc(void)
NULL, 0x00,
NULL, HFILL }
},
+ { &hf_rfnoc_ctrl_byte_enable,
+ { "Address", "rfnoc.ctrl.byte_enable",
+ FT_UINT8, BASE_HEX,
+ NULL, 0x00,
+ NULL, HFILL }
+ },
{ &hf_rfnoc_ctrl_opcode,
{ "Op Code", "rfnoc.ctrl.opcode",
FT_STRINGZ, BASE_NONE,
@@ -572,7 +676,7 @@ void proto_register_rfnoc(void)
NULL, HFILL }
},
{ &hf_rfnoc_strs,
- { "Stream Status", "rfnoc.strs",
+ { "Stream Status Payload", "rfnoc.strs",
FT_NONE, BASE_NONE,
NULL, 0x00,
NULL, HFILL }
@@ -608,7 +712,7 @@ void proto_register_rfnoc(void)
NULL, HFILL }
},
{ &hf_rfnoc_strc,
- { "Stream Command", "rfnoc.strc",
+ { "Stream Command Payload", "rfnoc.strc",
FT_NONE, BASE_NONE,
NULL, 0x00,
NULL, HFILL }
@@ -632,7 +736,7 @@ void proto_register_rfnoc(void)
NULL, HFILL }
},
{ &hf_rfnoc_mgmt,
- { "Mgmt Xact", "rfnoc.mgmt",
+ { "Management Payload", "rfnoc.mgmt",
FT_NONE, BASE_NONE,
NULL, 0x00,
NULL, HFILL }
@@ -667,6 +771,12 @@ void proto_register_rfnoc(void)
NULL, 0x00,
NULL, HFILL }
},
+ { &hf_rfnoc_mgmt_op_ops_pending,
+ { "Ops Pending", "rfnoc.mgmt.op.ops_pending",
+ FT_UINT8, BASE_DEC,
+ NULL, 0x00,
+ NULL, HFILL }
+ },
{ &hf_rfnoc_mgmt_op_code,
{ "Opcode", "rfnoc.mgmt.op.op_code",
FT_STRINGZ, BASE_NONE,
@@ -687,7 +797,7 @@ void proto_register_rfnoc(void)
},
{ &hf_rfnoc_mgmt_op_node_type,
{ "Node Type", "rfnoc.mgmt.op.node_type",
- FT_UINT8, BASE_DEC,
+ FT_STRINGZ, BASE_NONE,
NULL, 0x00,
NULL, HFILL }
},
@@ -697,6 +807,12 @@ void proto_register_rfnoc(void)
NULL, 0x00,
NULL, HFILL }
},
+ { &hf_rfnoc_mgmt_op_ext_info,
+ { "Extended Info", "rfnoc.mgmt.op.ext_info",
+ FT_STRINGZ, BASE_NONE,
+ NULL, 0x00,
+ NULL, HFILL }
+ },
{ &hf_rfnoc_mgmt_op_cfg_address,
{ "Address", "rfnoc.mgmt.op.cfg_address",
FT_UINT16, BASE_HEX,