@@ -75,6 +75,13 @@ void AltroDecoder::readChannels()
7575 uint16_t payloadsize = (channelheader >> 16 ) & 0x3FF ;
7676 bool badchannel = (channelheader >> 29 ) & 0x1 ;
7777
78+ // check hardware address for consistency
79+ if (!checkChannelHWAddress (hwaddress)) {
80+ // Inconsistent HW address information, channel header corrupted, payload must be skipped
81+ mMinorDecodingErrors .emplace_back (MinorAltroDecodingError::ErrorType_t::CHANNEL_ORDER, channelheader, currentword);
82+ continue ;
83+ }
84+
7885 int currentfec = 10 * Channel::getBranchIndexFromHwAddress (hwaddress) + Channel::getFecIndexFromHwAddress (hwaddress);
7986 // std::cout << "Branch: " << Channel::getBranchIndexFromHwAddress(hwaddress) << ", FEC " << Channel::getFecIndexFromHwAddress(hwaddress) << " -> " << currentfec << " (channel " << Channel::getChannelIndexFromHwAddress(hwaddress) << " )" << std::endl;
8087 if (currentfec < lastFEC) {
@@ -160,6 +167,23 @@ void AltroDecoder::readChannels()
160167 mChannelsInitialized = true ;
161168}
162169
170+ bool AltroDecoder::checkChannelHWAddress (int hwaddress)
171+ {
172+ unsigned int branch = Channel::getBranchIndexFromHwAddress (hwaddress),
173+ fec = Channel::getFecIndexFromHwAddress (hwaddress),
174+ altro = Channel::getAltroIndexFromHwAddress (hwaddress);
175+ if (branch > 1 ) {
176+ return false ;
177+ }
178+ if (fec > 9 ) {
179+ return false ;
180+ }
181+ if (!(altro == 0 || altro == 2 || altro == 3 || altro == 4 )) {
182+ return false ;
183+ }
184+ return true ;
185+ }
186+
163187const RCUTrailer& AltroDecoder::getRCUTrailer () const
164188{
165189 if (!mRCUTrailer .isInitialized ()) {
@@ -354,18 +378,21 @@ int MinorAltroDecodingError::errorTypeToInt(MinorAltroErrType errortype)
354378 case MinorAltroErrType::CHANNEL_ORDER:
355379 errorNumber = 2 ;
356380 break ;
357- case MinorAltroErrType::BUNCH_HEADER_NULL :
381+ case MinorAltroErrType::CHANNEL_HEADER :
358382 errorNumber = 3 ;
359383 break ;
360- case MinorAltroErrType::BUNCH_LENGTH_EXCEED :
384+ case MinorAltroErrType::BUNCH_HEADER_NULL :
361385 errorNumber = 4 ;
362386 break ;
363- case MinorAltroErrType::BUNCH_LENGTH_ALLOW_EXCEED :
387+ case MinorAltroErrType::BUNCH_LENGTH_EXCEED :
364388 errorNumber = 5 ;
365389 break ;
366- case MinorAltroErrType::BUNCH_STARTTIME :
390+ case MinorAltroErrType::BUNCH_LENGTH_ALLOW_EXCEED :
367391 errorNumber = 6 ;
368392 break ;
393+ case MinorAltroErrType::BUNCH_STARTTIME:
394+ errorNumber = 7 ;
395+ break ;
369396 };
370397
371398 return errorNumber;
@@ -387,15 +414,18 @@ MinorAltroErrType MinorAltroDecodingError::intToErrorType(int errornumber)
387414 errorType = MinorAltroErrType::CHANNEL_ORDER;
388415 break ;
389416 case 3 :
390- errorType = MinorAltroErrType::BUNCH_HEADER_NULL ;
417+ errorType = MinorAltroErrType::CHANNEL_HEADER ;
391418 break ;
392419 case 4 :
393- errorType = MinorAltroErrType::BUNCH_LENGTH_EXCEED ;
420+ errorType = MinorAltroErrType::BUNCH_HEADER_NULL ;
394421 break ;
395422 case 5 :
396- errorType = MinorAltroErrType::BUNCH_LENGTH_ALLOW_EXCEED ;
423+ errorType = MinorAltroErrType::BUNCH_LENGTH_EXCEED ;
397424 break ;
398425 case 6 :
426+ errorType = MinorAltroErrType::BUNCH_LENGTH_ALLOW_EXCEED;
427+ break ;
428+ case 7 :
399429 errorType = MinorAltroErrType::BUNCH_STARTTIME;
400430 break ;
401431 default :
@@ -414,6 +444,8 @@ const char* MinorAltroDecodingError::getErrorTypeName(ErrorType_t errortype)
414444 return " ChannelPayloadExceed" ;
415445 case MinorAltroErrType::CHANNEL_ORDER:
416446 return " ChannelOrderError" ;
447+ case MinorAltroErrType::CHANNEL_HEADER:
448+ return " ChannelHeader" ;
417449 case MinorAltroErrType::BUNCH_HEADER_NULL:
418450 return " BunchHeaderNull" ;
419451 case MinorAltroErrType::BUNCH_LENGTH_EXCEED:
@@ -435,6 +467,8 @@ const char* MinorAltroDecodingError::getErrorTypeTitle(ErrorType_t errortype)
435467 return " Channel exceed" ;
436468 case MinorAltroErrType::CHANNEL_ORDER:
437469 return " FEC order" ;
470+ case MinorAltroErrType::CHANNEL_HEADER:
471+ return " Channel header invalid" ;
438472 case MinorAltroErrType::BUNCH_HEADER_NULL:
439473 return " Bunch header null" ;
440474 case MinorAltroErrType::BUNCH_LENGTH_EXCEED:
@@ -456,6 +490,8 @@ const char* MinorAltroDecodingError::getErrorTypeDescription(ErrorType_t errorty
456490 return " Trying to access out-of-bound payload!" ;
457491 case MinorAltroErrType::CHANNEL_ORDER:
458492 return " Invalid FEC order" ;
493+ case MinorAltroErrType::CHANNEL_HEADER:
494+ return " Invalid channel header" ;
459495 case MinorAltroErrType::BUNCH_HEADER_NULL:
460496 return " Bunch header 0 or not configured!" ;
461497 case MinorAltroErrType::BUNCH_LENGTH_EXCEED:
0 commit comments