From: leslie Date: Thu, 1 Oct 2009 04:47:42 +0000 (+0800) Subject: tune auto decryption delay X-Git-Tag: upstream/620~154 X-Git-Url: http://www.vanbest.org/gitweb/?a=commitdiff_plain;h=4ade42e1f8a7d9dc1b1a2b3e9df4534630b228b4;p=sasc-ng.git tune auto decryption delay --- diff --git a/cam.c b/cam.c index 7c8b3e4..76850c1 100644 --- a/cam.c +++ b/cam.c @@ -2703,6 +2703,7 @@ private: int cardindex; // bool GetKeyStruct(int idx); + void ResetState(void); public: cDeCSA(int CardIndex); ~cDeCSA(); @@ -2720,10 +2721,7 @@ cDeCSA::cDeCSA(int CardIndex) PRINTF(L_CORE_CSA,"%d: clustersize=%d rangesize=%d",cardindex,cs,cs*2+5); range=MALLOC(unsigned char *,(cs*2+5)); memset(keys,0,sizeof(keys)); - memset(even_odd,0,sizeof(even_odd)); - memset(flags,0,sizeof(flags)); - memset(pidmap,0,sizeof(pidmap)); - lastData=0; + ResetState(); } cDeCSA::~cDeCSA() @@ -2733,8 +2731,17 @@ cDeCSA::~cDeCSA() free(range); } +void cDeCSA::ResetState(void) +{ + memset(even_odd,0,sizeof(even_odd)); + memset(flags,0,sizeof(flags)); + memset(pidmap,0,sizeof(pidmap)); + lastData=0; +} + void cDeCSA::SetActive(bool on) { + if(on && !active) ResetState(); active=on; PRINTF(L_CORE_CSA,"%d: set active %s",cardindex,active?"on":"off"); } @@ -2752,21 +2759,21 @@ bool cDeCSA::SetDescr(ca_descr_t *ca_descr, bool initial) if(idxparity==(even_odd[idx]&0x40)>>6) { if(flags[idx] & (ca_descr->parity?FL_ODD_GOOD:FL_EVEN_GOOD)) { - PRINTF(L_CORE_CSA,"%d.%d: %s key in use",cardindex,idx,ca_descr->parity?"odd":"even"); + PRINTF(L_CORE_CSA,"%d.%d: %s key in use (%d ms)",cardindex,idx,ca_descr->parity?"odd":"even",MAX_REL_WAIT); if(wait.TimedWait(mutex,MAX_REL_WAIT)) PRINTF(L_CORE_CSA,"%d.%d: successfully waited for release",cardindex,idx); else PRINTF(L_CORE_CSA,"%d.%d: timed out. setting anyways",cardindex,idx); } else PRINTF(L_CORE_CSA,"%d.%d: late key set...",cardindex,idx); } - PRINTF(L_CORE_CSA,"%d.%d: %s key set",cardindex,idx,ca_descr->parity?"odd":"even"); + LDUMP(L_CORE_CSA,ca_descr->cw,8,"%d.%d: %4s key set",cardindex,idx,ca_descr->parity?"odd":"even"); if(ca_descr->parity==0) { set_even_control_word(keys[idx],ca_descr->cw); - flags[idx]|=FL_EVEN_GOOD|FL_ACTIVITY; + if(!CheckNull(ca_descr->cw,8)) flags[idx]|=FL_EVEN_GOOD|FL_ACTIVITY; wait.Broadcast(); } else { set_odd_control_word(keys[idx],ca_descr->cw); - flags[idx]|=FL_ODD_GOOD|FL_ACTIVITY; + if(!CheckNull(ca_descr->cw,8)) flags[idx]|=FL_ODD_GOOD|FL_ACTIVITY; wait.Broadcast(); } } @@ -2816,7 +2823,7 @@ bool cDeCSA::Decrypt(unsigned char *data, int len, bool force) if(!(flags[idx]&FL_EVEN_GOOD)) doWait=true; } if(doWait) { - PRINTF(L_CORE_CSA,"%d.%d: %s key not ready",cardindex,idx,(ev_od&0x40)?"odd":"even"); + PRINTF(L_CORE_CSA,"%d.%d: %s key not ready (%d ms)",cardindex,idx,(ev_od&0x40)?"odd":"even",MAX_KEY_WAIT); if(flags[idx]&FL_ACTIVITY) { flags[idx]&=~FL_ACTIVITY; if(wait.TimedWait(mutex,MAX_KEY_WAIT)) PRINTF(L_CORE_CSA,"%d.%d: successfully waited for key",cardindex,idx); diff --git a/system.c b/system.c index 11d8f7c..847b1d2 100644 --- a/system.c +++ b/system.c @@ -101,6 +101,7 @@ cSystem::cSystem(const char *Name, int Pri) currentKeyStr[0]=0; doLog=true; cardNum=-1; logecm=0; check=new struct EcmCheck; memset(check,0,sizeof(struct EcmCheck)); + memset(cw,0,sizeof(cw)); // default config maxEcmTry=2; // try to get a key X times from the same ECM pid (default) hasLogger=false;