From 30d5c1a5cec1a5449976f07280d401940b321e41 Mon Sep 17 00:00:00 2001 From: Jonathan Hanks <jonathan.hanks@ligo.org> Date: Wed, 23 Sep 2020 14:12:23 -0700 Subject: [PATCH] Adding another diagnostic to the daqd, adding a checksum of the channel list and metadata. This adds {prefix}CHANNEL_LIST_CHECK_SUM as a 32bit crc of the channel list. --- src/daqd/channel.hh | 23 +++++++++++++++++++++++ src/daqd/daqd.cc | 10 ++++++++++ src/daqd/epics_pvs.hh | 1 + src/daqd/exServer.cc | 7 +++++++ 4 files changed, 41 insertions(+) diff --git a/src/daqd/channel.hh b/src/daqd/channel.hh index bf476aabd..e9488d4e3 100644 --- a/src/daqd/channel.hh +++ b/src/daqd/channel.hh @@ -129,4 +129,27 @@ public: } }; +template < typename HashObject > +void +hash_channel( HashObject& hash, const channel_t& channel ) +{ + hash.add( &( channel.chNum ), sizeof( channel.chNum ) ); + hash.add( &( channel.seq_num ), sizeof( channel.seq_num ) ); + size_t name_len = strnlen( channel.name, channel_t::channel_name_max_len ); + hash.add( channel.name, name_len ); + hash.add( &( channel.sample_rate ), sizeof( channel.sample_rate ) ); + hash.add( &( channel.active ), sizeof( channel.active ) ); + hash.add( &( channel.trend ), sizeof( channel.trend ) ); + hash.add( &( channel.group_num ), sizeof( channel.group_num ) ); + hash.add( &( channel.bps ), sizeof( channel.bps ) ); + hash.add( &( channel.dcu_id ), sizeof( channel.dcu_id ) ); + hash.add( &( channel.data_type ), sizeof( channel.data_type ) ); + hash.add( &( channel.signal_gain ), sizeof( channel.signal_gain ) ); + hash.add( &( channel.signal_slope ), sizeof( channel.signal_slope ) ); + hash.add( &( channel.signal_offset ), sizeof( channel.signal_offset ) ); + size_t unit_len = + strnlen( channel.signal_units, channel_t::engr_unit_max_len ); + hash.add( channel.signal_units, unit_len ); +} + #endif diff --git a/src/daqd/daqd.cc b/src/daqd/daqd.cc index 0d5126cfc..61e198bf7 100644 --- a/src/daqd/daqd.cc +++ b/src/daqd/daqd.cc @@ -63,6 +63,7 @@ using namespace std; #include <string.h> #include "epics_pvs.hh" +#include "checksum_crc32.hh" /// Helper function to deal with the archive channels. int @@ -510,6 +511,7 @@ daqd_c::update_configuration_number( const char* source_address ) check_sum.Update( &( cur->chNum ), sizeof( cur->chNum ) ); check_sum.Update( &( cur->seq_num ), sizeof( cur->seq_num ) ); size_t name_len = strnlen( cur->name, channel_t::channel_name_max_len ); + static_assert( sizeof( name_len ) == 8, "not 4 bytes" ); check_sum.Update( cur->name, sizeof( name_len ) ); check_sum.Update( &( cur->sample_rate ), sizeof( cur->sample_rate ) ); check_sum.Update( &( cur->active ), sizeof( cur->active ) ); @@ -1537,6 +1539,14 @@ daqd_c::start_main( int pmain_buffer_size, ostream* yyout ) /* Epics display: memory buffer look back */ PV::set_pv( PV::PV_LOOKBACK_RAM, main_buffer_size ); + checksum_crc32 csum; + const channel_t* cur = channels; + const channel_t* end = cur + num_channels; + std::for_each( cur, end, [&csum]( const channel_t& channel ) { + hash_channel( csum, channel ); + } ); + PV::set_pv( PV::PV_CHANNEL_LIST_CHECK_SUM, csum.result( ) ); + return 0; } diff --git a/src/daqd/epics_pvs.hh b/src/daqd/epics_pvs.hh index 82ad739f4..0544c69d6 100644 --- a/src/daqd/epics_pvs.hh +++ b/src/daqd/epics_pvs.hh @@ -40,6 +40,7 @@ namespace PV PV_SECOND_FRAME_SIZE, PV_MINUTE_FRAME_SIZE, PV_RETRANSMIT_TOTAL, + PV_CHANNEL_LIST_CHECK_SUM, // DCU counts PV_PRDCR_UNIQUE_DCU_REPORTED_PER_S, PV_PRDCR_TOTAL_DCU_REPORTED_PER_S, diff --git a/src/daqd/exServer.cc b/src/daqd/exServer.cc index 911b11d25..b53b26f91 100644 --- a/src/daqd/exServer.cc +++ b/src/daqd/exServer.cc @@ -227,6 +227,13 @@ pvInfo exServer::pvList[] = { excasIoSync, 1, pvValue + PV::PV_RETRANSMIT_TOTAL ), + pvInfo( 1, + "CHANNEL_LIST_CHECK_SUM", + 0xffffffff, + 0, + excasIoSync, + 1, + pvValue + PV::PV_CHANNEL_LIST_CHECK_SUM ), pvInfo( 1, "PRDCR_UNIQUE_DCU_REPORTED_PER_S", 0xffffffff, -- GitLab