summaryrefslogtreecommitdiff
path: root/ci.c
diff options
context:
space:
mode:
Diffstat (limited to 'ci.c')
-rw-r--r--ci.c68
1 files changed, 37 insertions, 31 deletions
diff --git a/ci.c b/ci.c
index 7d001a4f..2951273a 100644
--- a/ci.c
+++ b/ci.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: ci.c 4.28 2020/06/16 14:33:32 kls Exp $
+ * $Id: ci.c 4.29 2020/06/27 10:05:56 kls Exp $
*/
#include "ci.h"
@@ -230,38 +230,44 @@ void cCaPidReceiver::Receive(const uchar *Data, int Length)
}
}
if (p) {
- DelEmmPids();
- for (int i = 0; i < length - 4; i++) { // -4 = checksum
- if (p[i] == 0x09) {
- int CaId = int(p[i + 2] << 8) | p[i + 3];
- int EmmPid = Peek13(p + i + 4);
- AddEmmPid(EmmPid);
- if (MtdCamSlot)
- MtdMapPid(const_cast<uchar *>(p + i + 4), MtdCamSlot->MtdMapper());
- switch (CaId >> 8) {
- case 0x01: for (int j = i + 7; j < p[i + 1] + 2; j += 4) {
- EmmPid = Peek13(p + j);
- AddEmmPid(EmmPid);
- if (MtdCamSlot)
- MtdMapPid(const_cast<uchar *>(p + j), MtdCamSlot->MtdMapper());
- }
- break;
- }
- i += p[i + 1] + 2 - 1; // -1 to compensate for the loop increment
+ if (!SI::CRC32::crc32((const char *)p - 8, length + 8, 0xFFFFFFFF)) { // <TableIdCAT,....,crc32>
+ DelEmmPids();
+ for (int i = 0; i < length - 4; i++) { // -4 = checksum
+ if (p[i] == 0x09) {
+ int CaId = int(p[i + 2] << 8) | p[i + 3];
+ int EmmPid = Peek13(p + i + 4);
+ AddEmmPid(EmmPid);
+ if (MtdCamSlot)
+ MtdMapPid(const_cast<uchar *>(p + i + 4), MtdCamSlot->MtdMapper());
+ switch (CaId >> 8) {
+ case 0x01: for (int j = i + 7; j < p[i + 1] + 2; j += 4) {
+ EmmPid = Peek13(p + j);
+ AddEmmPid(EmmPid);
+ if (MtdCamSlot)
+ MtdMapPid(const_cast<uchar *>(p + j), MtdCamSlot->MtdMapper());
+ }
+ break;
+ }
+ i += p[i + 1] + 2 - 1; // -1 to compensate for the loop increment
+ }
}
- }
- if (MtdCamSlot) {
- if (!bufp && length) {
- // update crc32 - but only single packet CAT is handled for now:
- uint32_t crc = SI::CRC32::crc32((const char *)p - 8, length + 8 - 4, 0xFFFFFFFF); // <TableIdCAT....>[crc32]
- uchar *c = const_cast<uchar *>(p + length - 4);
- *c++ = crc >> 24;
- *c++ = crc >> 16;
- *c++ = crc >> 8;
- *c++ = crc;
+ if (MtdCamSlot) {
+ if (!bufp && length) {
+ // update crc32 - but only single packet CAT is handled for now:
+ uint32_t crc = SI::CRC32::crc32((const char *)p - 8, length + 8 - 4, 0xFFFFFFFF); // <TableIdCAT....>[crc32]
+ uchar *c = const_cast<uchar *>(p + length - 4);
+ *c++ = crc >> 24;
+ *c++ = crc >> 16;
+ *c++ = crc >> 8;
+ *c++ = crc;
+ }
+ memcpy(mtdCatBuffer, Data, TS_SIZE);
+ MtdCamSlot->PutCat(mtdCatBuffer, TS_SIZE);
}
- memcpy(mtdCatBuffer, Data, TS_SIZE);
- MtdCamSlot->PutCat(mtdCatBuffer, TS_SIZE);
+ }
+ else {
+ esyslog("ERROR: wrong checksum in CAT");
+ catVersion = -1;
}
p = NULL;
bufp = NULL;