memset(&serv_addr_un,0,sizeof(serv_addr_un));\r
serv_addr_un.sun_family=AF_LOCAL;\r
snprintf(serv_addr_un.sun_path,sizeof(serv_addr_un.sun_path),path,cardnum);\r
+ PRINTF(L_CC_CCCAM,"%d: using camd socket '%s'",cardnum,serv_addr_un.sun_path);\r
if(connect(ccam_fd,(const sockaddr*)&serv_addr_un,sizeof(serv_addr_un))!=0) {\r
PRINTF(L_CC_CCCAM,"%d: connect failed: %s",cardnum,strerror(errno));\r
Disconnect();\r
cMutexLock lock(this);\r
if((!so.Connected() && !Login()) || !CanHandle(ecm->caId)) return false;\r
\r
- static const unsigned char pmt[] = {\r
- 0x9f,0x80,0x32,0x82,0xFF,0xFF,\r
- 0x01,\r
+ cCCcamCard *c=&card[cardnum];\r
+ int timeout=700;\r
+ if(ecm->ecm_pid!=c->Pid() || !c->Connected()) { // channel change\r
+ static const unsigned char pmt[] = {\r
+ 0x9f,0x80,0x32,0x82,0xFF,0xFF,\r
+ 0x01,\r
#define PRG_POS 7\r
- 0xFF,0xFF, // prg-nr\r
+ 0xFF,0xFF, // prg-nr\r
#define VERS_POS 9\r
- 0xFF, // version\r
+ 0xFF, // version\r
#define LEN_POS 10\r
- 0xFF,0xFF, // prg-info-len\r
- 0x01, // ca pmt command\r
+ 0xFF,0xFF, // prg-info-len\r
+ 0x01, // ca pmt command\r
#define PRIV_POS 13\r
- 0x81,0x08,0x00,0x00,0xFF,0x00,0xFF,0xFF,0xFF,0xFF, // private descr\r
+ 0x81,0x08,0x00,0x00,0xFF,0x00,0xFF,0xFF,0xFF,0xFF, // private descr\r
#define DMX_POS 23\r
- 0x82,0x02,0xFF,0xFF, // demuxer stuff\r
+ 0x82,0x02,0xFF,0xFF, // demuxer stuff\r
#define PID_POS 27\r
- 0x84,0x02,0xFF,0xFF // pmt pid\r
- };\r
- unsigned char capmt[2048];\r
- memcpy(capmt,pmt,sizeof(pmt));\r
- int wp=sizeof(pmt);\r
- int len=wp-LEN_POS-2;\r
- capmt[PRG_POS]=ecm->prgId>>8;\r
- capmt[PRG_POS+1]=ecm->prgId&0xff;\r
- capmt[VERS_POS]=pmtversion;\r
- pmtversion=(pmtversion+1)&0x1f;\r
- capmt[PRIV_POS+4]=cardnum;\r
- capmt[PRIV_POS+6]=ecm->transponder>>8;\r
- capmt[PRIV_POS+7]=ecm->transponder&0xFF;\r
- capmt[PRIV_POS+8]=ecm->provId>>8;\r
- capmt[PRIV_POS+9]=ecm->provId&0xFF;\r
- capmt[DMX_POS+2]=1<<cardnum ;\r
- capmt[DMX_POS+3]=cardnum ;\r
- capmt[PID_POS+2]=ecm->ecm_pid>>8;\r
- capmt[PID_POS+3]=ecm->ecm_pid&0xFF;\r
- bool streamflag=1;\r
+ 0x84,0x02,0xFF,0xFF // pmt pid\r
+ };\r
+ unsigned char capmt[2048];\r
+ memcpy(capmt,pmt,sizeof(pmt));\r
+ int wp=sizeof(pmt);\r
+ int len=wp-LEN_POS-2;\r
+ capmt[PRG_POS]=ecm->prgId>>8;\r
+ capmt[PRG_POS+1]=ecm->prgId&0xff;\r
+ capmt[VERS_POS]=pmtversion;\r
+ pmtversion=(pmtversion+1)&0x1f;\r
+ capmt[PRIV_POS+4]=cardnum;\r
+ capmt[PRIV_POS+6]=ecm->transponder>>8;\r
+ capmt[PRIV_POS+7]=ecm->transponder&0xFF;\r
+ capmt[PRIV_POS+8]=ecm->provId>>8;\r
+ capmt[PRIV_POS+9]=ecm->provId&0xFF;\r
+ capmt[DMX_POS+2]=1<<cardnum ;\r
+ capmt[DMX_POS+3]=cardnum ;\r
+ capmt[PID_POS+2]=ecm->ecm_pid>>8;\r
+ capmt[PID_POS+3]=ecm->ecm_pid&0xFF;\r
+ bool streamflag=1;\r
#if APIVERSNUM >= 10500\r
- int casys[2];\r
+ int casys[2];\r
#else\r
- unsigned short casys[2];\r
+ unsigned short casys[2];\r
#endif\r
- casys[0]=ecm->caId;\r
- casys[1]=0;\r
- int n=GetCaDescriptors(ecm->source,ecm->transponder,ecm->prgId,casys,sizeof(capmt)-wp,&capmt[wp],streamflag);\r
- if(n<=0) {\r
- PRINTF(L_CC_CCCAM,"no CA descriptor for caid %04x sid %d prov %04x",ecm->caId,ecm->prgId,ecm->provId);\r
- return false;\r
- }\r
- len+=n; wp+=n;\r
- capmt[wp++]=0x01;\r
- capmt[wp++]=0x0f;\r
- capmt[wp++]=cardnum; // cccam uses this one as PID to program ca0\r
- capmt[wp++]=0x00; //es_length\r
- capmt[wp++]=0x06; //es ca_pmt_cmd_id\r
- capmt[LEN_POS]=((len&0xf00)>>8);\r
- capmt[LEN_POS+1]=(len&0xff);\r
- capmt[4]=(wp-6)>>8;\r
- capmt[5]=(wp-6)&0xff;\r
+ casys[0]=ecm->caId;\r
+ casys[1]=0;\r
+ int n=GetCaDescriptors(ecm->source,ecm->transponder,ecm->prgId,casys,sizeof(capmt)-wp,&capmt[wp],streamflag);\r
+ if(n<=0) {\r
+ PRINTF(L_CC_CCCAM,"%d: no CA descriptor for caid %04x sid %d prov %04x",cardnum,ecm->caId,ecm->prgId,ecm->provId);\r
+ return false;\r
+ }\r
+ len+=n; wp+=n;\r
+ capmt[wp++]=0x01;\r
+ capmt[wp++]=0x0f;\r
+ capmt[wp++]=cardnum; // cccam uses this one as PID to program ca0\r
+ capmt[wp++]=0x00; //es_length\r
+ capmt[wp++]=0x06; //es ca_pmt_cmd_id\r
+ capmt[LEN_POS]=((len&0xf00)>>8);\r
+ capmt[LEN_POS+1]=(len&0xff);\r
+ capmt[4]=(wp-6)>>8;\r
+ capmt[5]=(wp-6)&0xff;\r
\r
- cCCcamCard *c=&card[cardnum];\r
- int timeout=700;\r
- if(ecm->ecm_pid!=c->Pid() || !c->Connected()) { // channel change\r
- PRINTF(L_CC_CCCAM,"sending capmts ");\r
+ HEXDUMP(L_CC_CCCAM,capmt,wp,"%d: sending capmts for pid %04x",cardnum,ecm->ecm_pid);\r
c->NewCaPmt(ecm->ecm_pid,capmt,wp);\r
timeout=3000;\r
}\r
if(!c->GetCw(cw,timeout)) {\r
+ PRINTF(L_CC_CCCAM,"%d: getting CW timedout, re-writing CAPMT",cardnum);\r
// somethings up, so we will send capmt again.\r
c->WriteCaPmt();\r
if(!c->GetCw(cw,1000)) {\r
- PRINTF(L_CC_CCCAM,"%d: FAILED ECM !",cardnum);\r
+ PRINTF(L_CC_CCCAM,"%d: getting CW timedout again, failed ECM",cardnum);\r
c->Disconnect();\r
failedcw++;\r
if(failedcw>=10) {\r
// CCcam is having problems lets mark it for a restart....\r
+ PRINTF(L_CC_CCCAM,"%d: marked CCcam for restart",cardnum);\r
FILE *f=fopen("/tmp/killCCcam","w+");\r
fclose(f);\r
failedcw=0;\r
return false;\r
}\r
}\r
- PRINTF(L_CC_CCCAM,"%d: GOT CW !",cardnum);\r
+ PRINTF(L_CC_CCCAM,"%d: got a CW",cardnum);\r
failedcw=0;\r
return true;\r
}\r
{\r
unsigned char cw[18];\r
while(Running()) {\r
- if(so.Read(cw,sizeof(cw))==sizeof(cw)) {\r
- LDUMP(L_CC_CCCAM,cw+2,16,"got: %02x%02x",cw[0],cw[1]);\r
+ int r=so.Read(cw,sizeof(cw));\r
+ if(r==sizeof(cw)) {\r
+ LDUMP(L_CC_CCCAM,cw+2,16,"got: %02x%02x ",cw[0],cw[1]);\r
if(cw[1]==0x0f && cw[0]<4)\r
card[cw[0]].NewCw(cw+2);\r
}\r
+ else PRINTF(L_CC_CCCAM,"unexpected read length r=%d",r);\r
}\r
}\r