From: Andreas Ă–man Date: Mon, 3 Jan 2011 22:55:57 +0000 (+0100) Subject: * DRECrypt update emm (testing on OSCAM) X-Git-Tag: 2.99~125 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=82d18a387243b858bd354d14e613c87b4b4f11b1;p=thirdparty%2Ftvheadend.git * DRECrypt update emm (testing on OSCAM) * fix for Long ECM for russian provider NTV+ (take from vdr-sc plugin systems/cardclient/newcamd.c) * correct identification cards Drecrypt --- diff --git a/src/cwc.c b/src/cwc.c index 689e0218d..b47563bd5 100644 --- a/src/cwc.c +++ b/src/cwc.c @@ -47,7 +47,7 @@ #define CWC_KEEPALIVE_INTERVAL 30 -#define CWS_NETMSGSIZE 256 +#define CWS_NETMSGSIZE 272 #define CWS_FIRSTCMDNO 0xe0 /** @@ -55,6 +55,7 @@ */ typedef enum { CARD_IRDETO, + CARD_DRE, CARD_CONAX, CARD_SECA, CARD_VIACCESS, @@ -271,6 +272,7 @@ static void cwc_service_destroy(th_descrambler_t *td); static void cwc_detecs_card_type(cwc_t *cwc); void cwc_emm_conax(cwc_t *cwc, uint8_t *data, int len); void cwc_emm_irdeto(cwc_t *cwc, uint8_t *data, int len); +void cwc_emm_dre(cwc_t *cwc, uint8_t *data, int len); void cwc_emm_seca(cwc_t *cwc, uint8_t *data, int len); void cwc_emm_viaccess(cwc_t *cwc, uint8_t *data, int len); @@ -667,6 +669,10 @@ cwc_detecs_card_type(cwc_t *cwc) cwc->cwc_card_type = CARD_SECA; tvhlog(LOG_INFO, "cwc", "%s: seca card", cwc->cwc_hostname); + case 0x4a: + cwc->cwc_card_type = CARD_DRE; + tvhlog(LOG_INFO, "cwc", "%s: dre card", + cwc->cwc_hostname); break; default: cwc->cwc_card_type = CARD_UNKNOWN; @@ -1175,6 +1181,9 @@ cwc_emm(uint8_t *data, int len) case CARD_VIACCESS: cwc_emm_viaccess(cwc, data, len); break; + case CARD_DRE: + cwc_emm_dre(cwc, data, len); + break; case CARD_UNKNOWN: break; } @@ -1544,6 +1553,34 @@ cwc_table_input(struct th_descrambler *td, struct service *t, } } +/** + * dre emm handler + */ +void +cwc_emm_dre(cwc_t *cwc, uint8_t *data, int len) +{ + int match = 0; + + if (data[0] == 0x87) { + if (memcmp(&data[3], &cwc->cwc_ua[4], 4) == 0) { + match = 1; + } + } + else if (data[0] == 0x86) { + int i; + for (i=0; i < cwc->cwc_num_providers; i++) { + if (memcmp(&data[40], &cwc->cwc_providers[i].sa[4], 4) == 0) { +/* if (memcmp(&data[3], &cwc->cwc_providers[i].sa[4], 1) == 0) { */ + match = 1; + break; + } + } + } + + if (match) + cwc_send_msg(cwc, data, len, 0, 1); +} + /** * diff --git a/src/psi.c b/src/psi.c index 35aab5c94..42231b7c8 100644 --- a/src/psi.c +++ b/src/psi.c @@ -849,7 +849,9 @@ static struct strtab caidnametab[] = { { "Mentor", 0x2500 }, { "EBU", 0x2600 }, { "GI", 0x4700 }, - { "Telemann", 0x4800 } + { "Telemann", 0x4800 }, + { "DRECrypt", 0x4ae0 }, + { "DRECrypt2", 0x4ae1 } }; const char *