summaryrefslogtreecommitdiff
path: root/ci.c
diff options
context:
space:
mode:
authorKlaus Schmidinger <vdr@tvdr.de>2019-05-05 18:35:15 +0200
committerKlaus Schmidinger <vdr@tvdr.de>2019-05-05 18:35:15 +0200
commit16f18cbce84b7160c96b33b618dd00ddd8791246 (patch)
tree4a0187695b0b4d612ff8167398652d8ecaf033b6 /ci.c
parent0f10c8824c780cdab960aa432297f8bb34dcf769 (diff)
downloadvdr-16f18cbce84b7160c96b33b618dd00ddd8791246.tar.gz
vdr-16f18cbce84b7160c96b33b618dd00ddd8791246.tar.bz2
Fixed updating the checksum in the CA table after mapping EMM PIDs for MTD
Diffstat (limited to 'ci.c')
-rw-r--r--ci.c22
1 files changed, 16 insertions, 6 deletions
diff --git a/ci.c b/ci.c
index a8b065c5..88194986 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.23 2019/03/19 14:58:06 kls Exp $
+ * $Id: ci.c 4.24 2019/05/05 14:15:56 kls Exp $
*/
#include "ci.h"
@@ -225,7 +225,7 @@ void cCaPidReceiver::Receive(const uchar *Data, int Length)
}
else {
esyslog("ERROR: buffer overflow in cCaPidReceiver::Receive()");
- bufp = 0;
+ bufp = NULL;
length = 0;
}
}
@@ -250,12 +250,22 @@ void cCaPidReceiver::Receive(const uchar *Data, int Length)
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;
+ }
+ memcpy(mtdCatBuffer, Data, TS_SIZE);
+ MtdCamSlot->PutCat(mtdCatBuffer, TS_SIZE);
+ }
p = NULL;
- bufp = 0;
+ bufp = NULL;
length = 0;
- memcpy(mtdCatBuffer, Data, TS_SIZE);
- if (MtdCamSlot)
- MtdCamSlot->PutCat(mtdCatBuffer, TS_SIZE);
}
}
}