Changeset 1035
- Timestamp:
- 01/02/10 19:32:28 (14 years ago)
- Location:
- branches/monitor-improvement
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/monitor-improvement/Distribution/doc/man/oscam.conf.5
r1020 r1035 342 342 .RE 343 343 .PP 344 \fBdemux\fP = \fBdevice\fP 345 .RS 3n 346 path to demux device, default:none 347 348 example: demux = /dev/dvb/adapter0/demux0 349 .RE 350 .PP 351 \fBca\fP = \fBdevice\fP 352 .RS 3n 353 path to CA device, default:none 354 355 example: ca = /dev/dvb/adapter0/ca0 344 \fBau\fP = \fB0\fP|\fB1\fP 345 .RS 3n 346 1 = enable AU, default:0 356 347 .RE 357 348 .PP -
branches/monitor-improvement/Distribution/doc/txt/oscam.conf.txt
r1020 r1035 246 246 user name for DVB API client, default:anonymous 247 247 248 demux = device 249 path to demux device, default:none 250 251 example: demux = /dev/dvb/adapter0/demux0 252 253 ca = device 254 path to CA device, default:none 255 256 example: ca = /dev/dvb/adapter0/ca0 248 au = 0|1 249 1 = enable AU, default:0 257 250 258 251 socket = filename -
branches/monitor-improvement/globals.h
r1024 r1035 578 578 int dvbapi_au; 579 579 char dvbapi_usr[64]; 580 char dvbapi_demux[128];581 char dvbapi_ca[128];582 580 char dvbapi_socket[128]; 583 581 #endif -
branches/monitor-improvement/module-dvbapi.c
r1020 r1035 36 36 #include <linux/dvb/dmx.h> 37 37 38 #define CADEV "/dev/dvb/adapter0/ca 1"39 #define DMXDEV "/dev/dvb/adapter0/demux 0"38 #define CADEV "/dev/dvb/adapter0/ca%d" 39 #define DMXDEV "/dev/dvb/adapter0/demux%d" 40 40 #define CAMDSOCKET "/tmp/camd.socket" 41 41 42 42 #define BUFSIZE 1024 43 43 #define MAX_CAID 50 44 45 typedef struct ca_descriptor_s 46 { 47 unsigned char descriptor_tag : 8; 48 unsigned char descriptor_length : 8; 49 unsigned short ca_system_id : 16; 50 unsigned char reserved : 3; 51 unsigned short ca_pid : 13; 52 unsigned char * private_data_byte; 53 } __attribute__ ((packed)) ca_descriptor; 54 55 typedef struct ca_pmt_program_info_s 56 { 57 unsigned char ca_pmt_cmd_id : 8; 58 ca_descriptor * descriptor; 59 } __attribute__ ((packed)) ca_pmt_program_info; 60 61 typedef struct ca_pmt_es_info_s 62 { 63 unsigned char stream_type : 8; 64 unsigned char reserved : 3; 65 unsigned short elementary_pid : 13; 66 unsigned char reserved2 : 4; 67 unsigned short es_info_length : 12; 68 ca_pmt_program_info * program_info; 69 } __attribute__ ((packed)) ca_pmt_es_info; 70 71 typedef struct ca_pmt_s 72 { 73 unsigned char ca_pmt_list_management : 8; 74 unsigned short program_number : 16; 75 unsigned char reserved1 : 2; 76 unsigned char version_number : 5; 77 unsigned char current_next_indicator : 1; 78 unsigned char reserved2 : 4; 79 unsigned short program_info_length : 12; 80 ca_pmt_program_info * program_info; 81 ca_pmt_es_info * es_info; 82 } __attribute__ ((packed)) ca_pmt; 83 84 static int camfd = -1; 85 static int dmxfd_ecm = -1; 86 static int dmxfd_emm = -1; 44 #define MAX_DEMUX 3 45 46 87 47 static int listenfd = -1; 88 48 89 // if set descrabling90 unsigned short global_capid=0;91 unsigned short global_caid=0;92 unsigned short global_emmpid=0;93 94 unsigned short global_caid_list[MAX_CAID];95 96 unsigned short prg_nr=0;97 98 unsigned char buffer_cache_dmx[12];99 unsigned char buffer_cache_capmt[12];100 101 unsigned char lastcw0[8], lastcw1[8];102 49 103 50 typedef struct ECMPIDS … … 107 54 } ECMPIDSTYPE; 108 55 109 ECMPIDSTYPE ECMpids[20]; 110 int ECMpidcount=0; 111 112 unsigned short dvbapi_get_single_ecm(int caid, int pid, unsigned char filt, unsigned char mask) 56 typedef struct demux_s 57 { 58 int demux_ecm_fd; 59 int demux_emm_fd; 60 int cadev_index; 61 int ca_fd; 62 unsigned short int program_number; 63 short emm_pid; 64 int ECMpidcount; 65 ECMPIDSTYPE ECMpids[20]; 66 int ca_system_id; 67 int ca_pid; 68 unsigned char buffer_cache_dmx[12]; 69 unsigned char lastcw0[8]; 70 unsigned char lastcw1[8]; 71 } DEMUXTYPE; 72 73 typedef struct demux_search_s 74 { 75 int type; 76 int index; 77 } demux_search; 78 79 DEMUXTYPE demux[MAX_DEMUX]; 80 81 82 int dvbapi_open_demux(int index_demux) 83 { 84 int dmx_fd; 85 char device_path[256]; 86 87 sprintf(device_path, DMXDEV, index_demux); 88 89 if ((dmx_fd = open(device_path, O_RDWR)) < 0) 90 cs_log("error opening demux %s", device_path); 91 92 cs_debug("DEMUX open: %s", device_path); 93 return dmx_fd; 94 } 95 96 97 int dvbapi_open_ca(int index_demux) 98 { 99 int ca_fd,i; 100 char device_path[256]; 101 102 sprintf(device_path, CADEV, demux[index_demux].cadev_index); 103 104 if ((ca_fd = open(device_path, O_RDWR)) < 0) { 105 cs_log("error opening ca %s", device_path); 106 return 0; 107 } 108 109 demux[index_demux].ca_fd=ca_fd; 110 111 cs_debug("CA open: %s", device_path); 112 return ca_fd; 113 } 114 115 unsigned short dvbapi_get_single_ecm(int demux_index, int caid, int pid, unsigned char filt, unsigned char mask) 113 116 { 114 117 unsigned char buf[BUFSIZE]; … … 118 121 119 122 memset(&sFP, 0, sizeof(sFP)); 120 121 123 memset(buf,0,BUFSIZE); 122 124 123 124 125 125 sFP.pid = pid; 126 sFP.timeout = 1000;126 sFP.timeout = 2000; 127 127 sFP.flags = DMX_ONESHOT | DMX_CHECK_CRC | DMX_IMMEDIATE_START; 128 sFP.filter.filter[0] = filt;128 sFP.filter.filter[0] = filt; 129 129 sFP.filter.mask[0] = mask; 130 130 131 if ((dmx_fd = open(DMXDEV, O_RDWR)) < 0) 132 return 0; 131 cs_debug("dvbapi: filter for 1 ECM"); 132 133 dmx_fd = dvbapi_open_demux(demux_index); 133 134 134 135 if (ioctl(dmx_fd, DMX_SET_FILTER, &sFP) < 0) … … 136 137 137 138 len=read(dmx_fd, buf, BUFSIZE); 139 cs_debug("Read %d bytes from demux", len); 138 140 139 141 close(dmx_fd); 140 142 141 ECM_REQUEST *er; 142 143 if (!(er=get_ecmtask())) 144 return 0; 145 146 er->srvid = prg_nr; 147 er->caid = caid; 148 er->pid=pid; 149 //er->prid = provid; //FIXME 150 151 er->l=len; 152 memcpy(er->ecm, buf, er->l); 153 154 get_cw(er); 155 143 if (len > 0) { 144 ECM_REQUEST *er; 145 146 if (!(er=get_ecmtask())) 147 return 0; 148 149 er->srvid = demux[demux_index].program_number; 150 er->caid = caid; 151 er->pid = pid; 152 //er->prid = 0x3411; 153 154 er->l=len; 155 memcpy(er->ecm, buf, er->l); 156 157 get_cw(er); 158 } 156 159 return 0; 157 160 } 158 161 159 unsigned short dvbapi_parse_cat( unsigned short ca_system_id)162 unsigned short dvbapi_parse_cat(int demux_index) 160 163 { 161 164 unsigned char buf[BUFSIZE]; 162 165 unsigned short i, emmpid; 163 166 int dmx_fd, len; 167 168 unsigned short ca_system_id=demux[demux_index].ca_system_id; 164 169 165 170 struct dmx_sct_filter_params sFP; … … 174 179 sFP.pid = 0x0001; 175 180 sFP.timeout = 3000; //3secs 176 177 if ((dmx_fd = open(DMXDEV, O_RDWR)) < 0)178 return 0;181 182 183 dmx_fd = dvbapi_open_demux(demux_index); 179 184 180 185 if (ioctl(dmx_fd, DMX_SET_FILTER, &sFP) < 0) … … 183 188 len=read(dmx_fd, buf, BUFSIZE); 184 189 190 191 cs_debug("Read %d bytes from demux", len); 192 185 193 close(dmx_fd); 194 195 if (len<=0) 196 return 0; 186 197 187 198 for (i = 8; i < (((buf[1] & 0x0F) << 8) | buf[2]) - 1; i += buf[i + 1] + 2) … … 197 208 } 198 209 199 int dvbapi_stop_filter(void) 200 { 201 //cs_log("Stopping filtering..."); 202 203 if (ioctl(dmxfd_ecm,DMX_STOP)<0) 204 return 0; 205 206 if (ioctl(dmxfd_emm,DMX_STOP)<0) 207 return 0; 208 209 return 1; 210 } 211 212 unsigned short dvbapi_parse_ecm(unsigned char *buf, int len) 210 unsigned short dvbapi_parse_ecm(int demux_index, unsigned char *buf, int len) 213 211 { 214 212 unsigned short provid; … … 217 215 cs_debug("Read %d bytes\tTable-id: %02x\tCA section length: %d\tProvider ID: %04x", len, buf[0], len ,provid); 218 216 219 //calen=((buf[1]<<8)+buf[2])&0x0fff;220 221 /*222 provid=b2i(2, buf+3);223 224 i=(buf[4]==0xD2) ? buf[5] + 2 : 0; // skip d2 nano225 if ((buf[5+i]==3) && ((buf[4+i]==0x90) || (buf[4+i]==0x40)))226 provid=(b2i(3, buf+6+i) & 0xFFFFF0);227 228 //cs_log("PROVIDER: %04x", provid);229 */230 231 217 if (len>0) { 232 218 ECM_REQUEST *er; … … 235 221 return 0; 236 222 237 er->srvid = prg_nr;238 er->caid = global_caid;239 //er->prid = provid; //FIXME223 er->srvid = demux[demux_index].program_number; 224 er->caid = demux[demux_index].ca_system_id; 225 //er->prid = 0x3411; 240 226 241 227 er->l=len; … … 248 234 } 249 235 250 int dvbapi_set_filter(int fd, int pid, unsigned char filt, unsigned char mask)236 int dvbapi_set_filter(int demux_index, int type, int pid, unsigned char filt, unsigned char mask) 251 237 { 252 238 struct dmx_sct_filter_params sFP; … … 258 244 sFP.timeout = 3000; //wait max 3 seconds for ECM message, should be repeated every 500ms 259 245 sFP.flags = DMX_CHECK_CRC | DMX_IMMEDIATE_START; 260 sFP.filter.filter[0] = filt;246 sFP.filter.filter[0] = filt; 261 247 sFP.filter.mask[0] = mask; 262 248 263 if (ioctl(fd, DMX_SET_FILTER, &sFP) < 0) 249 int dmx_fd = dvbapi_open_demux(demux_index); 250 251 if (ioctl(dmx_fd, DMX_SET_FILTER, &sFP) < 0) 264 252 { 265 253 perror(" Status"); … … 267 255 } 268 256 257 if (type==0) 258 demux[demux_index].demux_ecm_fd=dmx_fd; 259 260 if (type==1) 261 demux[demux_index].demux_emm_fd=dmx_fd; 262 269 263 return 1; 270 264 } 271 265 272 void dvbapi_stop_descramble() 273 { 274 dvbapi_stop_filter(); 266 void dvbapi_stop_descramble(int demux_index) 267 { 275 268 276 269 /* … … 285 278 */ 286 279 287 global_capid=0; 288 global_caid=0; 289 global_emmpid=0; 290 } 291 292 void dvbapi_start_descramble(int caid, int capid) { 293 294 cs_log("Softcam: Start descrambling CAID: %04x", caid); 295 296 if (!dvbapi_set_filter(dmxfd_ecm,capid,0x80,0xF0)) //filter on ECM pid and 0x80 or 0x81 (mask 0xF0) 280 cs_log("dvbapi: Stop descrambling CAID: %04x", demux[demux_index].ca_system_id); 281 282 demux[demux_index].ca_system_id=0; 283 demux[demux_index].ca_pid=0; 284 demux[demux_index].emm_pid=0; 285 286 287 if (demux[demux_index].demux_ecm_fd>0) { 288 ioctl(demux[demux_index].demux_ecm_fd,DMX_STOP); 289 close(demux[demux_index].demux_ecm_fd); 290 cs_debug("closing ecm dmx device"); 291 demux[demux_index].demux_ecm_fd=0; 292 } 293 294 if (demux[demux_index].demux_emm_fd>0) { 295 ioctl(demux[demux_index].demux_emm_fd,DMX_STOP); 296 close(demux[demux_index].demux_emm_fd); 297 cs_debug("closing emm dmx device"); 298 demux[demux_index].demux_emm_fd=0; 299 } 300 301 if (demux[demux_index].ca_fd>0) { 302 close(demux[demux_index].ca_fd); 303 cs_debug("closing ca device"); 304 demux[demux_index].ca_fd=0; 305 } 306 307 return; 308 } 309 310 void dvbapi_start_descramble(int demux_index, int caid, int capid) { 311 312 cs_log("dvbapi: Start descrambling CAID: %04x", caid); 313 314 demux[demux_index].ca_pid=capid; 315 demux[demux_index].ca_system_id=caid; 316 317 if (!dvbapi_set_filter(demux_index,0,capid,0x80,0xF0)) //filter on ECM pid and 0x80 or 0x81 (mask 0xF0) 297 318 cs_log("Error ECM filtering"); 298 299 global_capid=capid;300 global_caid=caid;301 319 302 320 /* … … 306 324 if (cfg->dvbapi_au==1) { 307 325 short emmpid; 308 emmpid=dvbapi_parse_cat( caid);326 emmpid=dvbapi_parse_cat(demux_index); 309 327 310 328 cs_log("EMMPid: %04x", emmpid); 311 dvbapi_set_filter(dmxfd_emm,emmpid,0x80,0xF0); 312 global_emmpid=emmpid; 313 } 329 demux[demux_index].emm_pid=emmpid; 330 dvbapi_set_filter(demux_index,1,emmpid,0x80,0xF0); 331 } 332 333 int camfd=dvbapi_open_ca(demux_index); 334 if (camfd<=0) { 335 dvbapi_stop_descramble(demux_index); 336 return; 337 } 338 339 demux[demux_index].ca_fd=camfd; 314 340 315 341 ca_pid_t ca_pid; … … 318 344 ca_pid.index = 0; 319 345 if (ioctl(camfd, CA_SET_PID, &ca_pid)==-1) 320 cs_log(" Softcam: Error SET_PID");346 cs_log("dvbapi: Error SET_PID"); 321 347 } 322 348 323 349 // from tuxbox camd 324 int dvbapi_parse_capmt(unsigned char *buffer, const unsigned int length) 325 350 int dvbapi_parse_capmt(unsigned char *buffer, unsigned int length) 326 351 { 327 352 unsigned short i, j; 328 ca_pmt *pmt; 329 int n; 330 331 cs_dump(buffer, length, "capmt:"); 332 pmt = (ca_pmt *) malloc(sizeof(ca_pmt)); 333 334 pmt->ca_pmt_list_management = buffer[0]; 335 pmt->program_number = (buffer[1] << 8) | buffer[2]; 336 prg_nr=pmt->program_number; 337 338 pmt->program_info_length = ((buffer[4] & 0x0F) << 8) | buffer[5]; 339 340 cs_log("program number: %04x", pmt->program_number); 341 cs_debug("program_info_length: %d", pmt->program_info_length); 342 343 switch (pmt->ca_pmt_list_management) 353 int n, added, ca_mask, demux_index; 354 355 int ca_pmt_list_management = buffer[0]; 356 unsigned short int program_number = (buffer[1] << 8) | buffer[2]; 357 int program_info_length = ((buffer[4] & 0x0F) << 8) | buffer[5]; 358 359 switch (ca_pmt_list_management) 344 360 { 345 361 case 0x01: … … 354 370 } 355 371 356 ECMpidcount=0; 372 if (buffer[17]==0x82) { 373 ca_mask = buffer[19]; 374 demux_index = buffer[20]; 375 } 376 377 if (demux[demux_index].program_number==((buffer[1] << 8) | buffer[2])) 378 return 0; 379 380 cs_dump(buffer, length, "capmt:"); 381 cs_log("dvbapi: new program number: %04x", program_number); 382 //cs_debug("program_info_length: %d", program_info_length); 383 384 demux[demux_index].program_number=((buffer[1] << 8) | buffer[2]); 385 demux[demux_index].ECMpidcount=0; 386 387 demux[demux_index].cadev_index=ca_mask; 357 388 358 389 //CA_PIDS fr alle Streams 359 if (pmt->program_info_length != 0) 360 { 361 pmt->program_info = (ca_pmt_program_info *) malloc(sizeof(ca_pmt_program_info)); 362 pmt->program_info->ca_pmt_cmd_id = buffer[6]; 363 //cs_debug("ca_pmt_id: %04x", pmt->program_info->ca_pmt_cmd_id); 364 pmt->program_info->descriptor = (ca_descriptor *) malloc(sizeof(ca_descriptor)); 365 366 for (i = 0; i < pmt->program_info_length - 1; i += pmt->program_info->descriptor->descriptor_length + 2) 390 if (program_info_length != 0) 391 { 392 int ca_pmt_cmd_id = buffer[6]; 393 //cs_debug("ca_pmt_id: %02x", ca_pmt_cmd_id); 394 int descriptor_length=0; 395 for (i = 0; i < program_info_length - 1; i += descriptor_length + 2) 367 396 { 368 pmt->program_info->descriptor->descriptor_length = buffer[i + 8];369 pmt->program_info->descriptor->ca_system_id = (buffer[i + 9] << 8) | buffer[i + 10];370 pmt->program_info->descriptor->ca_pid = ((buffer[i + 11] & 0x1F) << 8)| buffer[i + 12];371 372 cs_debug("typ: %02x ca_system_id: %04x\t ca_pid: %04x\tca_descriptor_length %d", buffer[i + 7], pmt->program_info->descriptor->ca_system_id, pmt->program_info->descriptor->ca_pid,pmt->program_info->descriptor->descriptor_length);397 descriptor_length = buffer[i + 8]; 398 int ca_system_id = (buffer[i + 9] << 8) | buffer[i + 10]; 399 int ca_pid = ((buffer[i + 11] & 0x1F) << 8)| buffer[i + 12]; 400 401 cs_debug("typ: %02x ca_system_id: %04x\t ca_pid: %04x\tca_descriptor_length %d", buffer[i + 7], ca_system_id, ca_pid, descriptor_length); 373 402 374 403 if (buffer[i + 7] == 0x09) { 375 ECMpids[ECMpidcount].CA_PID=pmt->es_info->program_info->descriptor->ca_pid; //add the PID376 ECMpids[ECMpidcount].CA_System_ID=pmt->es_info->program_info->descriptor->ca_system_id; //add the system id377 ECMpidcount++;404 demux[demux_index].ECMpids[demux[demux_index].ECMpidcount].CA_PID=ca_pid; 405 demux[demux_index].ECMpids[demux[demux_index].ECMpidcount].CA_System_ID=ca_system_id; 406 demux[demux_index].ECMpidcount++; 378 407 } 379 } 380 381 free(pmt->program_info->descriptor); 382 free(pmt->program_info); 408 409 if (buffer[i + 7] == 0x82) { 410 ca_mask = buffer[i + 9]; 411 demux_index = buffer[i + 10]; 412 demux[demux_index].cadev_index=ca_mask; 413 } 414 } 383 415 } 384 416 385 417 386 418 //CA_PIDs fr einzelne Streams 387 // 388 pmt->es_info = (ca_pmt_es_info *) malloc(sizeof(ca_pmt_es_info)); 389 390 for (i = pmt->program_info_length + 6; i < length; i += pmt->es_info->es_info_length + 5) 391 { 392 393 pmt->es_info->stream_type = buffer[i]; 394 pmt->es_info->elementary_pid = ((buffer[i + 1] & 0x1F) << 8) | buffer[i + 2]; 395 pmt->es_info->es_info_length = ((buffer[i + 3] & 0x0F) << 8) | buffer[i + 4]; 396 397 cs_debug("stream_type: %02x\telementary_pid: %04x\tes_info_length: %04x", pmt->es_info->stream_type, pmt->es_info->elementary_pid, pmt->es_info->es_info_length); 398 399 if (pmt->es_info->es_info_length != 0) 419 unsigned short es_info_length=0; 420 for (i = program_info_length + 6; i < length; i += es_info_length + 5) 421 { 422 int stream_type = buffer[i]; 423 int elementary_pid = ((buffer[i + 1] & 0x1F) << 8) | buffer[i + 2]; 424 es_info_length = ((buffer[i + 3] & 0x0F) << 8) | buffer[i + 4]; 425 426 cs_debug("stream_type: %02x\telementary_pid: %04x\tes_info_length: %04x", stream_type, elementary_pid, es_info_length); 427 428 if (es_info_length != 0) 400 429 { 401 pmt->es_info->program_info = (ca_pmt_program_info *) malloc(sizeof(ca_pmt_program_info)); 402 403 pmt->es_info->program_info->ca_pmt_cmd_id = buffer[i + 5]; 404 pmt->es_info->program_info->descriptor = (ca_descriptor *)malloc(sizeof(ca_descriptor)); 405 406 for (j = 0; j < pmt->es_info->es_info_length - 1; j += pmt->es_info->program_info->descriptor->descriptor_length + 2) 430 int ca_pmt_cmd_id = buffer[i + 5]; 431 int descriptor_length=0; 432 for (j = 0; j < es_info_length - 1; j += descriptor_length + 2) 407 433 { 408 pmt->es_info->program_info->descriptor->descriptor_length = buffer[i + j + 7];409 pmt->es_info->program_info->descriptor->ca_system_id = (buffer[i + j + 8] << 8) | buffer[i + j + 9];410 pmt->es_info->program_info->descriptor->ca_pid = ((buffer[i + j + 10] & 0x1F) << 8) | buffer[i + j + 11];411 412 cs_debug("typ: %02x\tca_system_id: %04x\t ca_pid: %04x", buffer[i + j + 6], pmt->es_info->program_info->descriptor->ca_system_id, pmt->es_info->program_info->descriptor->ca_pid);434 descriptor_length = buffer[i + j + 7]; 435 int descriptor_ca_system_id = (buffer[i + j + 8] << 8) | buffer[i + j + 9]; 436 int descriptor_ca_pid = ((buffer[i + j + 10] & 0x1F) << 8) | buffer[i + j + 11]; 437 438 cs_debug("typ: %02x\tca_system_id: %04x\t ca_pid: %04x", buffer[i + j + 6], descriptor_ca_system_id, descriptor_ca_pid); 413 439 414 440 if (buffer[i + j + 6] == 0x09) { 415 ECMpids[ECMpidcount].CA_PID=pmt->program_info->descriptor->ca_pid; //add the PID 416 ECMpids[ECMpidcount].CA_System_ID=pmt->program_info->descriptor->ca_system_id; //add the system id 417 ECMpidcount++; 441 added=0; 442 for (n=0;n<demux[demux_index].ECMpidcount;n++) { 443 if (demux[demux_index].ECMpids[n].CA_System_ID==descriptor_ca_system_id) 444 added=1; 445 } 446 if (added==0) { 447 demux[demux_index].ECMpids[demux[demux_index].ECMpidcount].CA_PID=descriptor_ca_pid; 448 demux[demux_index].ECMpids[demux[demux_index].ECMpidcount].CA_System_ID=descriptor_ca_system_id; 449 demux[demux_index].ECMpidcount++; 450 } 418 451 } 419 452 } 420 421 free(pmt->es_info->program_info->descriptor); 422 free(pmt->es_info->program_info); 423 } 424 } 425 426 free(pmt->es_info); 427 free(pmt); 428 429 dvbapi_stop_descramble(); 430 431 cs_log("Softcam: Found %d ECMpids in PMT", ECMpidcount); 432 433 for (n=0; n<ECMpidcount; n++) { 434 435 cs_debug("CA_System_ID: %04x CA_PID: %04x", ECMpids[n].CA_System_ID, ECMpids[n].CA_PID); 436 437 if (global_caid!=0) continue; 438 439 dvbapi_get_single_ecm(ECMpids[n].CA_System_ID,ECMpids[n].CA_PID,0x80,0xF0); 453 } 454 } 455 456 dvbapi_stop_descramble(demux_index); 457 458 cs_log("dvbapi: Found %d ECMpids in PMT", demux[demux_index].ECMpidcount); 459 460 for (n=0; n<demux[demux_index].ECMpidcount; n++) { 461 462 cs_debug("dvbapi: trying CA_System_ID: %04x CA_PID: %04x", demux[demux_index].ECMpids[n].CA_System_ID, demux[demux_index].ECMpids[n].CA_PID); 463 464 if (demux[demux_index].ca_system_id!=0) 465 continue; 466 467 dvbapi_get_single_ecm(demux_index, demux[demux_index].ECMpids[n].CA_System_ID,demux[demux_index].ECMpids[n].CA_PID,0x80,0xF0); 440 468 sleep(3); 441 469 } … … 447 475 { 448 476 int i; 449 unsigned int val ;450 unsigned int size; 477 unsigned int val, size; 478 451 479 //cs_dump(buffer, len, "handlesockmsg:"); 452 480 … … 490 518 } else 491 519 { 492 cs_log(" client: handlesockmsg() unknown command");520 cs_log("dvbapi: handlesockmsg() unknown command"); 493 521 cs_dump(buffer, len, "unknown command:"); 494 522 } … … 528 556 //cs_log("check zap"); 529 557 530 531 532 558 connfd = accept(listenfd, (struct sockaddr *)&servaddr, (socklen_t *)&clilen); 533 559 … … 544 570 // if message begins with an apdu_tag and is longer than three bytes 545 571 if ((buffer[0] == 0x9F) && ((buffer[1] >> 7) == 0x01) && ((buffer[2] >> 7) == 0x00)) { 546 if (memcmp(buffer, buffer_cache_capmt, 8) != 0) { 547 memcpy(buffer_cache_capmt, buffer, 8); 548 dvbapi_handlesockmsg(buffer, len); 572 dvbapi_handlesockmsg(buffer, len); 573 } 574 575 close(connfd); 576 577 } 578 return 0; 579 } 580 581 582 demux_search dvbapi_find_dmx_by_fd(int fd) 583 { 584 int i; 585 demux_search s1; 586 for (i=0;i<MAX_DEMUX;i++) { 587 if (demux[i].demux_ecm_fd==fd) { 588 s1.type=0; 589 s1.index=i; 590 return s1; 591 } 592 if (demux[i].demux_emm_fd==fd) { 593 s1.type=1; 594 s1.index=i; 595 return s1; 596 } 597 } 598 599 return s1; 600 } 601 602 int dvbapi_get_index_by_prgnr(unsigned short int prognr) 603 { 604 int i; 605 for (i=0;i<MAX_DEMUX;i++) 606 if (demux[i].program_number==prognr) 607 return i; 608 609 return -1; 610 } 611 612 void *thread_check_demux(void *arg) { 613 614 struct pollfd pfd2[MAX_DEMUX*2]; 615 int rc,len,i,pfdcount; 616 unsigned char buffer[BUFSIZE]; 617 demux_search s1; 618 619 while(1) 620 { 621 622 pfdcount=0; 623 for (i=0;i<MAX_DEMUX;i++) { 624 if (demux[i].demux_ecm_fd>0) { 625 pfd2[pfdcount].fd = demux[i].demux_ecm_fd; 626 pfd2[pfdcount].events = (POLLIN | POLLPRI); 627 pfdcount++; 549 628 } 550 } 551 552 close(connfd); 553 554 } 555 return 0; 556 } 557 558 void *thread_check_dmx(void *arg) { 559 560 struct pollfd pfd2[2]; 561 int rc,len,i; 562 unsigned char buffer[BUFSIZE]; 563 564 pfd2[0].fd = dmxfd_ecm; 565 pfd2[0].events = (POLLIN | POLLPRI); 566 pfd2[1].fd = dmxfd_emm; 567 pfd2[1].events = (POLLIN | POLLPRI); 568 569 while(1) 570 { 571 572 rc=poll(pfd2, 2, -1); 573 574 if (global_capid == 0) { 575 dvbapi_stop_filter(); 576 break; 577 } 578 579 for (i = 0; i < 2; i++) { 629 if (demux[i].demux_emm_fd>0) { 630 pfd2[pfdcount].fd = demux[i].demux_emm_fd; 631 pfd2[pfdcount].events = (POLLIN | POLLPRI); 632 pfdcount++; 633 } 634 635 } 636 637 rc=poll(pfd2, pfdcount, 1000); 638 639 for (i = 0; i < pfdcount; i++) { 580 640 if (pfd2[i].revents & (POLLIN | POLLPRI)) { 581 if (pfd2[i].fd == dmxfd_ecm) { 582 if ((len = read(dmxfd_ecm, buffer, BUFSIZE)) <= 0) 641 s1=dvbapi_find_dmx_by_fd(pfd2[i].fd); 642 if (s1.type==0) { 643 //ECM 644 if ((len = read(pfd2[i].fd, buffer, BUFSIZE)) <= 0) 583 645 break; 584 646 … … 588 650 if (buffer[0] == 0x80 | buffer[0] == 0x81) 589 651 { 590 if (memcmp(buffer, buffer_cache_dmx, 12) != 0) {591 memcpy( buffer_cache_dmx, buffer, 12);592 if (!dvbapi_parse_ecm( buffer,len)) { cs_log("Error while parsing ECM"); }652 if (memcmp(buffer, demux[s1.index].buffer_cache_dmx, 12) != 0) { 653 memcpy(demux[s1.index].buffer_cache_dmx, buffer, 12); 654 if (!dvbapi_parse_ecm(s1.index,buffer,len)) { cs_log("Error while parsing ECM"); } 593 655 } 594 656 } 595 657 596 658 } 597 598 if (pfd2[i].fd == dmxfd_emm) {599 if ((len = read( dmxfd_emm, buffer, BUFSIZE)) <= 0)659 if (s1.type==1) { 660 //EMM 661 if ((len = read(pfd2[i].fd, buffer, BUFSIZE)) <= 0) 600 662 break; 601 663 … … 609 671 if( (buffer[0]==0x83) && (buffer[7]==0x10) ) emmtype = 1; // S 610 672 if( (buffer[0]==0x83) && (buffer[7]==0x00) ) emmtype = 2; // G 611 612 613 673 */ 674 614 675 cs_log("EMM Type: 0x%02x", buffer[0]); 615 676 … … 619 680 memset(&epg, 0, sizeof(epg)); 620 681 621 epg.caid[0] = (uchar)( global_caid>>8);622 epg.caid[1] = (uchar)( global_caid);682 epg.caid[0] = (uchar)(demux[s1.index].ca_system_id>>8); 683 epg.caid[1] = (uchar)(demux[s1.index].ca_system_id); 623 684 if (reader[client[cs_idx].au].caid[0]!=b2i(2,epg.caid)) cs_log("caid %04x", b2i(2,epg.caid)); 624 685 //memcpy(epg.provid, prov, 4); … … 631 692 632 693 } 694 633 695 } 634 696 } … … 637 699 return 0; 638 700 } 701 639 702 640 703 int dvbapi_main_local() … … 644 707 pthread_t p1, p2; 645 708 646 647 if (cfg->dvbapi_demux[0]==0)648 strncpy(cfg->dvbapi_demux, DMXDEV, sizeof(cfg->dvbapi_demux)-1);649 650 if (cfg->dvbapi_ca[0]==0)651 strncpy(cfg->dvbapi_ca, CADEV, sizeof(cfg->dvbapi_ca)-1);652 653 709 if (cfg->dvbapi_socket[0]==0) 654 710 strncpy(cfg->dvbapi_socket, CAMDSOCKET, sizeof(cfg->dvbapi_socket)-1); … … 658 714 } 659 715 660 for (i=0;i<20;i++) //clean ECMpids array 661 { 662 ECMpids[i].CA_PID = 0; 663 ECMpids[i].CA_System_ID = 0; 664 } 665 666 667 if ((dmxfd_ecm = open(cfg->dvbapi_demux, O_RDWR)) < 0) { 668 cs_log("Could not open dmx device"); 669 return 1; 670 } 671 672 if ((dmxfd_emm = open(cfg->dvbapi_demux, O_RDWR)) < 0) { 673 cs_log("Could not open dmx device"); 674 return 1; 675 } 676 677 if ((camfd = open(cfg->dvbapi_ca, O_RDWR)) < 0) { 678 cs_log("Could not open ca device"); 679 return 1; 716 717 for (i=0;i<MAX_DEMUX;i++) { 718 719 demux[i].program_number=0; 720 demux[i].demux_ecm_fd=0; 721 demux[i].demux_emm_fd=0; 722 demux[i].ca_system_id=0; 723 demux[i].ca_pid=0; 724 demux[i].emm_pid=0; 725 demux[i].cadev_index=-1; 726 demux[i].ca_fd=0; 727 memset(demux[i].buffer_cache_dmx,0 ,12); 728 729 for (i=0;i<20;i++) //clean ECMpids array 730 { 731 demux[i].ECMpids[i].CA_PID = 0; 732 demux[i].ECMpids[i].CA_System_ID = 0; 733 } 734 680 735 } 681 736 … … 685 740 pfd2[0].events = (POLLIN | POLLPRI); 686 741 687 memset(buffer_cache_capmt,0 ,12);688 memset(buffer_cache_dmx,0 ,12);689 690 742 pthread_create (&p1, NULL, thread_check_zap, NULL); 691 pthread_create (&p2, NULL, thread_check_dmx, NULL); 692 693 pfd=dmxfd_ecm; 743 pthread_create (&p2, NULL, thread_check_demux, NULL); 744 694 745 695 746 while (1) { … … 712 763 } 713 764 714 static void dvbapi_send_dcw(ECM_REQUEST *er) { 765 766 void dvbapi_send_dcw(ECM_REQUEST *er) { 715 767 unsigned char cw_0[8], cw_1[8]; 716 768 … … 721 773 memset(&ca_descr,0,sizeof(ca_descr)); 722 774 723 724 if (er->rc==0 && global_caid==0) 725 { 726 dvbapi_start_descramble(er->caid, er->pid); 727 } 728 729 if (memcmp(cw_0,lastcw0,8)) 775 //this is not working when both tuner on one channel 776 int demux_index=dvbapi_get_index_by_prgnr(er->srvid); 777 if (demux_index>=0) { 778 if (er->rc==0 && demux[demux_index].ca_system_id==0) 779 dvbapi_start_descramble(demux_index, er->caid, er->pid); 780 } else { 781 cs_log("error cant find demux index"); 782 } 783 784 if (memcmp(cw_0,demux[demux_index].lastcw0,8)) 730 785 { 731 786 ca_descr.index = 0; 732 787 ca_descr.parity = 0; 733 memcpy( lastcw0,cw_0,8);788 memcpy(demux[demux_index].lastcw0,cw_0,8); 734 789 memcpy(ca_descr.cw,cw_0,8); 735 if (ioctl( camfd,CA_SET_DESCR,&ca_descr) < 0) perror("CA_SET_DESCR");736 } 737 738 if (memcmp(cw_1, lastcw1,8))790 if (ioctl(demux[demux_index].ca_fd, CA_SET_DESCR, &ca_descr) < 0) perror("CA_SET_DESCR"); 791 } 792 793 if (memcmp(cw_1,demux[demux_index].lastcw1,8)) 739 794 { 740 795 ca_descr.index = 0; 741 796 ca_descr.parity = 1; 742 memcpy( lastcw1,cw_1,8);797 memcpy(demux[demux_index].lastcw1,cw_1,8); 743 798 memcpy(ca_descr.cw,cw_1,8); 744 if (ioctl( camfd,CA_SET_DESCR,&ca_descr) < 0) perror("CA_SET_DESCR");799 if (ioctl(demux[demux_index].ca_fd, CA_SET_DESCR, &ca_descr) < 0) perror("CA_SET_DESCR"); 745 800 } 746 801 … … 751 806 752 807 if (cfg->dvbapi_enabled != 1) { 753 cs_log(" clientdisabled");808 cs_log("dvbapi disabled"); 754 809 return; 755 810 } 756 811 757 cs_log("clientloaded fd=%d", idx);812 //cs_log("dvbapi loaded fd=%d", idx); 758 813 759 814 switch(cs_fork(0, idx)) … … 780 835 dvbapi_main_local(); 781 836 782 cs_log("Module clienterror");837 cs_log("Module dvbapi error"); 783 838 cs_exit(0); 784 839 -
branches/monitor-improvement/oscam-config.c
r1024 r1035 546 546 #else 547 547 if (!strcmp(token, "enabled")) { cfg->dvbapi_enabled=atoi(value); return; } 548 if (!strcmp(token, "au")) { cfg->dvbapi_au=atoi(value); return; } 549 if (!strcmp(token, "demux")) { strncpy(cfg->dvbapi_demux, value, sizeof(cfg->dvbapi_demux)-1); return; } 550 if (!strcmp(token, "ca")) { strncpy(cfg->dvbapi_ca, value, sizeof(cfg->dvbapi_ca)-1); return; } 548 if (!strcmp(token, "au")) { cfg->dvbapi_au=atoi(value); return; } 551 549 if (!strcmp(token, "socket")) { strncpy(cfg->dvbapi_socket, value, sizeof(cfg->dvbapi_socket)-1); return; } 552 550 if (!strcmp(token, "user")) { strncpy(cfg->dvbapi_usr, value, sizeof(cfg->dvbapi_usr)-1); return; }
Note:
See TracChangeset
for help on using the changeset viewer.