14 #define DSMCC_SYNC_BYTE 0x47
15 #define DSMCC_TRANSPORT_ERROR 0x80
16 #define DSMCC_START_INDICATOR 0x40
18 #define DSMCC_MESSAGE_DSI 0x1006
19 #define DSMCC_MESSAGE_DII 0x1002
20 #define DSMCC_MESSAGE_DDB 0x1003
22 #define DSMCC_SECTION_INDICATION 0x3B
23 #define DSMCC_SECTION_DATA 0x3C
24 #define DSMCC_SECTION_DESCR 0x3D
26 #define DSMCC_SECTION_OFFSET 0
27 #define DSMCC_MSGHDR_OFFSET 8
28 #define DSMCC_DATAHDR_OFFSET 8
29 #define DSMCC_DSI_OFFSET 20
30 #define DSMCC_DII_OFFSET 20
31 #define DSMCC_DDB_OFFSET 20
32 #define DSMCC_BIOP_OFFSET 24
34 static uint32_t
crc32(
const unsigned char *data,
int len);
43 { return car->m_id == carouselId; });
67 car->
m_id = carouselId;
71 std::vector<unsigned short>::iterator it;
72 for (it = car->
m_Tags.begin(); it != car->
m_Tags.end(); ++it)
74 if (*it == componentTag)
79 car->
m_Tags.push_back(componentTag);
80 LOG(VB_DSMCC, LOG_INFO, QString(
"[dsmcc] Adding tap for stream "
81 "tag %1 with carousel %2")
82 .
arg(componentTag).
arg(carouselId));
88 const unsigned char *data,
int length)
98 if (((header->
m_flags[0] & 0x80) == 0) || (header->
m_flags[0] & 0x40) != 0)
100 LOG(VB_DSMCC, LOG_WARNING,
"[dsmcc] Invalid section");
110 crc_offset = length - 4 - 1;
133 for (off = 0; off < 20; ++off)
135 if (data[off] != 0xff)
137 LOG(VB_DSMCC, LOG_WARNING, QString(
"[dsmcc] DSI invalid serverID"
138 " index %1: 0x%2").
arg(off).
arg(data[off],0,16));
144 if (data[off++] != 0 || data[off++] != 0)
146 LOG(VB_DSMCC, LOG_WARNING,
"[dsmcc] DSI non zero compatibilityDescriptorLen");
151 int data_len = (data[off] << 8) | data[off+1];
153 if (data_len + off > length)
155 LOG(VB_DSMCC, LOG_WARNING,
"[dsmcc] DSI ServiceGatewayInfo too big");
165 if (strcmp(gatewayProfile.
m_typeId,
"srg") != 0)
167 LOG(VB_DSMCC, LOG_WARNING, QString(
"[dsmcc] IOR unexpected type_id: '%1'")
171 if (ret + 4 > data_len)
173 LOG(VB_DSMCC, LOG_WARNING,
"[dsmcc] DSI IOP:IOR too big");
180 gatewayProfile.
AddTap(
this);
190 LOG(VB_DSMCC, LOG_DEBUG, QString(
"[dsmcc] DSI ServiceGateway"
191 " carousel %1 tag %2 module %3 key %4")
192 .
arg(carouselId).
arg(full->m_dsmConn.m_tap.m_assocTag)
196 car =
AddTap(full->m_dsmConn.m_tap.m_assocTag, carouselId);
200 LOG(VB_DSMCC, LOG_INFO, QString(
"[dsmcc] DSI ServiceGateway"
201 " carousel %1 module %2 key %3")
213 unsigned short downloadTapsCount = data[off];
215 if (downloadTapsCount)
217 LOG(VB_DSMCC, LOG_WARNING,
"[dsmcc] DSI unexpected downloadTap");
221 unsigned short serviceContextListCount = data[off];
223 if (serviceContextListCount)
225 LOG(VB_DSMCC, LOG_WARNING,
"[dsmcc] DSI unexpected serviceContextList");
229 unsigned short userInfoLength = (data[off] << 8) | data[off+1];
233 LOG(VB_DSMCC, LOG_WARNING,
"[dsmcc] DSI unexpected userInfo");
239 unsigned short streamTag)
250 LOG(VB_DSMCC, LOG_ERR, QString(
"[dsmcc] Section Info for "
251 "unknown carousel %1")
280 LOG(VB_DSMCC, LOG_DEBUG, QString(
"[dsmcc] Module %1 -> "
281 "Size = %2 Version = %3")
305 int length,
unsigned short streamTag)
313 unsigned char protocol = hdrData[0];
314 if (protocol != 0x11)
316 LOG(VB_DSMCC, LOG_WARNING, QString(
"[dsmcc] Server/Info invalid protocol %1")
321 unsigned char header_type = hdrData[1];
322 if (header_type != 0x03)
324 LOG(VB_DSMCC, LOG_WARNING, QString(
"[dsmcc] Server/Info invalid header type %1")
329 unsigned message_id = (hdrData[2] << 8) | hdrData[3];
337 unsigned message_len = (hdrData[10] << 8) | hdrData[11];
338 if (message_len > 4076)
340 LOG(VB_DSMCC, LOG_WARNING, QString(
"[dsmcc] Server/Info invalid length %1")
347 LOG(VB_DSMCC, LOG_DEBUG,
"[dsmcc] Server Gateway");
358 LOG(VB_DSMCC, LOG_WARNING,
359 QString(
"[dsmcc] Discarding DSI from tag %1") .
arg(streamTag));
365 LOG(VB_DSMCC, LOG_DEBUG,
"[dsmcc] Module Info");
370 LOG(VB_DSMCC, LOG_WARNING,
"[dsmcc] Unknown section");
385 unsigned char protocol = hdrData[0];
386 if (protocol != 0x11)
388 LOG(VB_DSMCC, LOG_WARNING, QString(
"[dsmcc] Data invalid protocol %1")
393 unsigned char header_type = hdrData[1];
394 if (header_type != 0x03)
396 LOG(VB_DSMCC, LOG_WARNING, QString(
"[dsmcc] Data invalid header type %1")
401 unsigned message_id = (hdrData[2] << 8) | hdrData[3];
404 LOG(VB_DSMCC, LOG_WARNING,
"[dsmcc] Data unknown section");
408 unsigned long download_id =
COMBINE32(hdrData, 4);
411 unsigned message_len = (hdrData[10] << 8) | hdrData[11];
416 ddb.
m_moduleId = (blockData[0] << 8) | blockData[1];
420 ddb.
m_len = message_len - 6;
422 LOG(VB_DSMCC, LOG_DEBUG,
423 QString(
"[dsmcc] Data Block ModID %1 Pos %2 Version %3")
431 LOG(VB_DSMCC, LOG_WARNING, QString(
"[dsmcc] Data Block ModID %1 Pos %2"
432 " unknown carousel %3")
447 int componentTag,
unsigned carouselId,
451 LOG(VB_DSMCC, LOG_DEBUG, QString(
"[dsmcc] Read block size %1 from tag %2 "
452 "carousel id %3 data broadcast Id %4")
453 .
arg(length).
arg(componentTag)
454 .
arg(carouselId).
arg(dataBroadcastId,0,16));
460 std::vector<unsigned short>::iterator it2;
461 for (it2 = car->m_Tags.begin(); it2 != car->m_Tags.end(); ++it2)
463 if (*it2 == componentTag)
472 if (!found && dataBroadcastId == 0x0106)
477 if (
AddTap(componentTag, carouselId))
479 LOG(VB_DSMCC, LOG_INFO, QString(
"[dsmcc] Initial stream tag %1").
arg(componentTag));
487 LOG(VB_DSMCC, LOG_INFO, QString(
"[dsmcc] Dropping block size %1 with tag %2"
488 ", carouselID %3, dataBroadcastID 0x%4")
489 .
arg(length).
arg(componentTag).
arg(carouselId)
490 .
arg(dataBroadcastId,0,16));
495 unsigned short section_len = ((data[1] & 0xF) << 8) | (data[2]);
497 if (section_len > length)
499 LOG(VB_DSMCC, LOG_WARNING,
"[dsmcc] section length > data length");
504 unsigned long crc32_decode =
crc32(data, section_len);
506 if (crc32_decode != 0)
508 LOG(VB_DSMCC, LOG_WARNING,
509 QString(
"[dsmcc] Dropping corrupt section (Got %1)")
517 LOG(VB_DSMCC, LOG_DEBUG,
"[dsmcc] Server/Info Section");
521 LOG(VB_DSMCC, LOG_DEBUG,
"[dsmcc] Data Section");
525 LOG(VB_DSMCC, LOG_DEBUG,
"[dsmcc] Descriptor Section");
529 LOG(VB_DSMCC, LOG_WARNING, QString(
"[dsmcc] Unknown Section %1")
538 LOG(VB_DSMCC, LOG_INFO,
"[dsmcc] Resetting carousel");
554 int res = (*it)->m_fileCache.GetDSMObject(objectPath, result);
565 static const std::array<const uint32_t,256>
crc_table
567 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b,
568 0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,
569 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, 0x4c11db70, 0x48d0c6c7,
570 0x4593e01e, 0x4152fda9, 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,
571 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3,
572 0x709f7b7a, 0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
573 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58, 0xbaea46ef,
574 0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,
575 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, 0xc7361b4c, 0xc3f706fb,
576 0xceb42022, 0xca753d95, 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,
577 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0,
578 0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,
579 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, 0x018aeb13, 0x054bf6a4,
580 0x0808d07d, 0x0cc9cdca, 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,
581 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08,
582 0x571d7dd1, 0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
583 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b, 0xbb60adfc,
584 0xb6238b25, 0xb2e29692, 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,
585 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, 0xe0b41de7, 0xe4750050,
586 0xe9362689, 0xedf73b3e, 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,
587 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34,
588 0xdc3abded, 0xd8fba05a, 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,
589 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, 0x4f040d56, 0x4bc510e1,
590 0x46863638, 0x42472b8f, 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,
591 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5,
592 0x3f9b762c, 0x3b5a6b9b, 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
593 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e, 0xf5ee4bb9,
594 0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,
595 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd,
596 0xcda1f604, 0xc960ebb3, 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,
597 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71,
598 0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,
599 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, 0x4e8ee645, 0x4a4ffbf2,
600 0x470cdd2b, 0x43cdc09c, 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,
601 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e,
602 0x18197087, 0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
603 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d, 0x2056cd3a,
604 0x2d15ebe3, 0x29d4f654, 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,
605 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, 0xe3a1cbc1, 0xe760d676,
606 0xea23f0af, 0xeee2ed18, 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,
607 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662,
608 0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,
609 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
612 static uint32_t
crc32(
const unsigned char *data,
int len)
614 uint32_t crc = 0xffffffff;
616 for (
int i = 0; i < len; i++)
617 crc = (crc << 8) ^
crc_table[((crc >> 24) ^ *data++) & 0xff];