From 8533132e46f6ba2a0997cc9074b66ed7f2c5fe72 Mon Sep 17 00:00:00 2001 From: leslie Date: Sun, 24 May 2009 21:16:01 +0800 Subject: [PATCH] cardclient-cccam: cleanup / extend logging --- systems/cardclient/cccam.c | 117 +++++++++++++++++++------------------ 1 file changed, 61 insertions(+), 56 deletions(-) diff --git a/systems/cardclient/cccam.c b/systems/cardclient/cccam.c index 81bebe9..133ba7c 100644 --- a/systems/cardclient/cccam.c +++ b/systems/cardclient/cccam.c @@ -93,6 +93,7 @@ bool cCCcamCard::Connect(void) memset(&serv_addr_un,0,sizeof(serv_addr_un)); serv_addr_un.sun_family=AF_LOCAL; snprintf(serv_addr_un.sun_path,sizeof(serv_addr_un.sun_path),path,cardnum); + PRINTF(L_CC_CCCAM,"%d: using camd socket '%s'",cardnum,serv_addr_un.sun_path); if(connect(ccam_fd,(const sockaddr*)&serv_addr_un,sizeof(serv_addr_un))!=0) { PRINTF(L_CC_CCCAM,"%d: connect failed: %s",cardnum,strerror(errno)); Disconnect(); @@ -222,80 +223,82 @@ bool cCardClientCCcam::ProcessECM(const cEcmInfo *ecm, const unsigned char *data cMutexLock lock(this); if((!so.Connected() && !Login()) || !CanHandle(ecm->caId)) return false; - static const unsigned char pmt[] = { - 0x9f,0x80,0x32,0x82,0xFF,0xFF, - 0x01, + cCCcamCard *c=&card[cardnum]; + int timeout=700; + if(ecm->ecm_pid!=c->Pid() || !c->Connected()) { // channel change + static const unsigned char pmt[] = { + 0x9f,0x80,0x32,0x82,0xFF,0xFF, + 0x01, #define PRG_POS 7 - 0xFF,0xFF, // prg-nr + 0xFF,0xFF, // prg-nr #define VERS_POS 9 - 0xFF, // version + 0xFF, // version #define LEN_POS 10 - 0xFF,0xFF, // prg-info-len - 0x01, // ca pmt command + 0xFF,0xFF, // prg-info-len + 0x01, // ca pmt command #define PRIV_POS 13 - 0x81,0x08,0x00,0x00,0xFF,0x00,0xFF,0xFF,0xFF,0xFF, // private descr + 0x81,0x08,0x00,0x00,0xFF,0x00,0xFF,0xFF,0xFF,0xFF, // private descr #define DMX_POS 23 - 0x82,0x02,0xFF,0xFF, // demuxer stuff + 0x82,0x02,0xFF,0xFF, // demuxer stuff #define PID_POS 27 - 0x84,0x02,0xFF,0xFF // pmt pid - }; - unsigned char capmt[2048]; - memcpy(capmt,pmt,sizeof(pmt)); - int wp=sizeof(pmt); - int len=wp-LEN_POS-2; - capmt[PRG_POS]=ecm->prgId>>8; - capmt[PRG_POS+1]=ecm->prgId&0xff; - capmt[VERS_POS]=pmtversion; - pmtversion=(pmtversion+1)&0x1f; - capmt[PRIV_POS+4]=cardnum; - capmt[PRIV_POS+6]=ecm->transponder>>8; - capmt[PRIV_POS+7]=ecm->transponder&0xFF; - capmt[PRIV_POS+8]=ecm->provId>>8; - capmt[PRIV_POS+9]=ecm->provId&0xFF; - capmt[DMX_POS+2]=1<ecm_pid>>8; - capmt[PID_POS+3]=ecm->ecm_pid&0xFF; - bool streamflag=1; + 0x84,0x02,0xFF,0xFF // pmt pid + }; + unsigned char capmt[2048]; + memcpy(capmt,pmt,sizeof(pmt)); + int wp=sizeof(pmt); + int len=wp-LEN_POS-2; + capmt[PRG_POS]=ecm->prgId>>8; + capmt[PRG_POS+1]=ecm->prgId&0xff; + capmt[VERS_POS]=pmtversion; + pmtversion=(pmtversion+1)&0x1f; + capmt[PRIV_POS+4]=cardnum; + capmt[PRIV_POS+6]=ecm->transponder>>8; + capmt[PRIV_POS+7]=ecm->transponder&0xFF; + capmt[PRIV_POS+8]=ecm->provId>>8; + capmt[PRIV_POS+9]=ecm->provId&0xFF; + capmt[DMX_POS+2]=1<ecm_pid>>8; + capmt[PID_POS+3]=ecm->ecm_pid&0xFF; + bool streamflag=1; #if APIVERSNUM >= 10500 - int casys[2]; + int casys[2]; #else - unsigned short casys[2]; + unsigned short casys[2]; #endif - casys[0]=ecm->caId; - casys[1]=0; - int n=GetCaDescriptors(ecm->source,ecm->transponder,ecm->prgId,casys,sizeof(capmt)-wp,&capmt[wp],streamflag); - if(n<=0) { - PRINTF(L_CC_CCCAM,"no CA descriptor for caid %04x sid %d prov %04x",ecm->caId,ecm->prgId,ecm->provId); - return false; - } - len+=n; wp+=n; - capmt[wp++]=0x01; - capmt[wp++]=0x0f; - capmt[wp++]=cardnum; // cccam uses this one as PID to program ca0 - capmt[wp++]=0x00; //es_length - capmt[wp++]=0x06; //es ca_pmt_cmd_id - capmt[LEN_POS]=((len&0xf00)>>8); - capmt[LEN_POS+1]=(len&0xff); - capmt[4]=(wp-6)>>8; - capmt[5]=(wp-6)&0xff; + casys[0]=ecm->caId; + casys[1]=0; + int n=GetCaDescriptors(ecm->source,ecm->transponder,ecm->prgId,casys,sizeof(capmt)-wp,&capmt[wp],streamflag); + if(n<=0) { + PRINTF(L_CC_CCCAM,"%d: no CA descriptor for caid %04x sid %d prov %04x",cardnum,ecm->caId,ecm->prgId,ecm->provId); + return false; + } + len+=n; wp+=n; + capmt[wp++]=0x01; + capmt[wp++]=0x0f; + capmt[wp++]=cardnum; // cccam uses this one as PID to program ca0 + capmt[wp++]=0x00; //es_length + capmt[wp++]=0x06; //es ca_pmt_cmd_id + capmt[LEN_POS]=((len&0xf00)>>8); + capmt[LEN_POS+1]=(len&0xff); + capmt[4]=(wp-6)>>8; + capmt[5]=(wp-6)&0xff; - cCCcamCard *c=&card[cardnum]; - int timeout=700; - if(ecm->ecm_pid!=c->Pid() || !c->Connected()) { // channel change - PRINTF(L_CC_CCCAM,"sending capmts "); + HEXDUMP(L_CC_CCCAM,capmt,wp,"%d: sending capmts for pid %04x",cardnum,ecm->ecm_pid); c->NewCaPmt(ecm->ecm_pid,capmt,wp); timeout=3000; } if(!c->GetCw(cw,timeout)) { + PRINTF(L_CC_CCCAM,"%d: getting CW timedout, re-writing CAPMT",cardnum); // somethings up, so we will send capmt again. c->WriteCaPmt(); if(!c->GetCw(cw,1000)) { - PRINTF(L_CC_CCCAM,"%d: FAILED ECM !",cardnum); + PRINTF(L_CC_CCCAM,"%d: getting CW timedout again, failed ECM",cardnum); c->Disconnect(); failedcw++; if(failedcw>=10) { // CCcam is having problems lets mark it for a restart.... + PRINTF(L_CC_CCCAM,"%d: marked CCcam for restart",cardnum); FILE *f=fopen("/tmp/killCCcam","w+"); fclose(f); failedcw=0; @@ -303,7 +306,7 @@ bool cCardClientCCcam::ProcessECM(const cEcmInfo *ecm, const unsigned char *data return false; } } - PRINTF(L_CC_CCCAM,"%d: GOT CW !",cardnum); + PRINTF(L_CC_CCCAM,"%d: got a CW",cardnum); failedcw=0; return true; } @@ -312,10 +315,12 @@ void cCardClientCCcam::Action(void) { unsigned char cw[18]; while(Running()) { - if(so.Read(cw,sizeof(cw))==sizeof(cw)) { - LDUMP(L_CC_CCCAM,cw+2,16,"got: %02x%02x",cw[0],cw[1]); + int r=so.Read(cw,sizeof(cw)); + if(r==sizeof(cw)) { + LDUMP(L_CC_CCCAM,cw+2,16,"got: %02x%02x ",cw[0],cw[1]); if(cw[1]==0x0f && cw[0]<4) card[cw[0]].NewCw(cw+2); } + else PRINTF(L_CC_CCCAM,"unexpected read length r=%d",r); } } -- 2.39.5