Skip to content

Commit 35d9c0f

Browse files
committed
[MCH] improved error detection in raw decoder
- badly formatted SYNC words - SAMPA packet headers consistency - chip address and e-link index compatibility - num of 10-bit words multiple of 4 in cluster sum mode
1 parent 673f20c commit 35d9c0f

4 files changed

Lines changed: 71 additions & 18 deletions

File tree

Detectors/MUON/MCH/Raw/Decoder/include/MCHRawDecoder/ErrorCodes.h

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,17 @@ enum ErrorCodes {
2525
ErrorParity = 1, // 1
2626
ErrorHammingCorrectable = 1 << 1, // 2
2727
ErrorHammingUncorrectable = 1 << 2, // 4
28-
ErrorBadClusterSize = 1 << 3, // 8
29-
ErrorBadPacketType = 1 << 4, // 16
30-
ErrorBadHeartBeatPacket = 1 << 5, // 32
31-
ErrorBadIncompleteWord = 1 << 6, // 64
32-
ErrorTruncatedData = 1 << 7, // 128
33-
ErrorBadELinkID = 1 << 8, // 256
34-
ErrorBadLinkID = 1 << 9, // 512
35-
ErrorUnknownLinkID = 1 << 10, // 1024
36-
ErrorInvalidDigitTime = 1 << 11, // 2048
37-
ErrorNonRecoverableDecodingError = 1 << 12 // 4096
28+
ErrorBadSyncPacket = 1 << 3, // 8
29+
ErrorBadHeartBeatPacket = 1 << 4, // 16
30+
ErrorBadDataPacket = 1 << 5, // 32
31+
ErrorBadClusterSize = 1 << 6, // 64
32+
ErrorBadIncompleteWord = 1 << 7, // 128
33+
ErrorTruncatedData = 1 << 8, // 256
34+
ErrorBadELinkID = 1 << 9, // 512
35+
ErrorBadLinkID = 1 << 10, // 1024
36+
ErrorUnknownLinkID = 1 << 11, // 2048
37+
ErrorBadHBTime = 1 << 12, // 4096
38+
ErrorNonRecoverableDecodingError = 1 << 13 // 8192
3839
};
3940

4041
uint32_t getErrorCodesSize();

Detectors/MUON/MCH/Raw/Decoder/src/ErrorCodes.cxx

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ namespace raw
2020

2121
uint32_t getErrorCodesSize()
2222
{
23-
return 13;
23+
return 14;
2424
}
2525

2626
void append(const char* msg, std::string& to)
@@ -49,12 +49,15 @@ std::string errorCodeAsString(uint32_t ec)
4949
if (ec & ErrorBadClusterSize) {
5050
append("Cluster Size", msg);
5151
}
52-
if (ec & ErrorBadPacketType) {
53-
append("Bad Packet Type", msg);
52+
if (ec & ErrorBadSyncPacket) {
53+
append("Bad Sync Packet", msg);
5454
}
5555
if (ec & ErrorBadHeartBeatPacket) {
5656
append("Bad HB Packet", msg);
5757
}
58+
if (ec & ErrorBadDataPacket) {
59+
append("Bad Data Packet", msg);
60+
}
5861
if (ec & ErrorBadIncompleteWord) {
5962
append("Bad Incomplete Word", msg);
6063
}
@@ -70,8 +73,8 @@ std::string errorCodeAsString(uint32_t ec)
7073
if (ec & ErrorUnknownLinkID) {
7174
append("Unknown Link ID", msg);
7275
}
73-
if (ec & ErrorInvalidDigitTime) {
74-
append("Invalid Digit Time", msg);
76+
if (ec & ErrorBadHBTime) {
77+
append("Bad HB Time", msg);
7578
}
7679
if (ec & ErrorNonRecoverableDecodingError) {
7780
append("Non Recoverable", msg);

Detectors/MUON/MCH/Raw/Decoder/src/UserLogicElinkDecoder.cxx

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,42 @@ void UserLogicElinkDecoder<ChargeSumMode>::prepareAndSendCluster()
3838
mSamples.clear();
3939
}
4040

41+
template <>
42+
bool UserLogicElinkDecoder<SampleMode>::checkDataHeader()
43+
{
44+
int chipAddMin = mDsId.elinkIndexInGroup() * 2;
45+
int chipAddMax = chipAddMin + 1;
46+
47+
// the chip address from the SAMPA header must be consistent with
48+
// the e-Link index
49+
int chipAdd = mSampaHeader.chipAddress();
50+
if (chipAdd < chipAddMin || chipAdd > chipAddMax) {
51+
return false;
52+
}
53+
54+
return true;
55+
}
56+
57+
template <>
58+
bool UserLogicElinkDecoder<ChargeSumMode>::checkDataHeader()
59+
{
60+
int chipAddMin = mDsId.elinkIndexInGroup() * 2;
61+
int chipAddMax = chipAddMin + 1;
62+
63+
// the chip address from the SAMPA header must be consistent with
64+
// the e-Link index
65+
int chipAdd = mSampaHeader.chipAddress();
66+
if (chipAdd < chipAddMin || chipAdd > chipAddMax) {
67+
return false;
68+
}
69+
70+
// in cluster sum mode the number of 10-bit words must be a multiple of 4
71+
int nof10BitWords = mSampaHeader.nof10BitWords();
72+
if ((nof10BitWords % 4) != 0) {
73+
return false;
74+
}
75+
76+
return true;
77+
}
78+
4179
} // namespace o2::mch::raw

Detectors/MUON/MCH/Raw/Decoder/src/UserLogicElinkDecoder.h

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ class UserLogicElinkDecoder
7373
void completeHeader();
7474
void oneLess10BitWord();
7575
void prepareAndSendCluster();
76+
bool checkDataHeader();
7677
void sendCluster(const SampaCluster& sc) const;
7778
void sendHBPacket();
7879
void sendError(int8_t chip, uint32_t error) const;
@@ -185,7 +186,11 @@ bool UserLogicElinkDecoder<CHARGESUM>::append10(uint10_t data10)
185186
setHeaderPart(data10);
186187
if (isHeaderComplete()) {
187188
completeHeader();
188-
if (isSync(mSampaHeader.uint64())) {
189+
if (mSampaHeader.packetType() == SampaPacketType::Sync) {
190+
if (!isSync(mSampaHeader.uint64())) {
191+
mErrorMessage = "badly formatted Sync packet";
192+
sendError(static_cast<int8_t>(mSampaHeader.chipAddress()), static_cast<uint32_t>(ErrorBadSyncPacket));
193+
}
189194
reset();
190195
} else if (mSampaHeader.packetType() == SampaPacketType::HeartBeat) {
191196
if (mSampaHeader.isHeartbeat()) {
@@ -198,9 +203,15 @@ bool UserLogicElinkDecoder<CHARGESUM>::append10(uint10_t data10)
198203
reset();
199204
}
200205
} else {
201-
if (mSampaHeader.nof10BitWords() > 2) {
202-
transition(State::WaitingSize);
206+
if (checkDataHeader()) {
207+
if (mSampaHeader.nof10BitWords() > 2) {
208+
transition(State::WaitingSize);
209+
} else {
210+
reset();
211+
}
203212
} else {
213+
mErrorMessage = "badly formatted Data packet";
214+
sendError(static_cast<int8_t>(mSampaHeader.chipAddress()), static_cast<uint32_t>(ErrorBadDataPacket));
204215
reset();
205216
}
206217
}

0 commit comments

Comments
 (0)