Changeset 1013
- Timestamp:
- 12/31/09 11:27:37 (13 years ago)
- Location:
- trunk
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/globals.h
r1000 r1013 568 568 unsigned long locals[CS_MAXLOCALS]; 569 569 //struct s_irdeto_quess *itab[0xff]; 570 #ifdef HAVE_DVBAPI 570 571 int dvbapi_enabled; 571 572 int dvbapi_au; … … 574 575 char dvbapi_ca[128]; 575 576 char dvbapi_socket[128]; 577 #endif 576 578 #ifdef CS_ANTICASC 577 579 char ac_enabled; … … 842 844 extern void module_gbox(struct s_module *); 843 845 extern void module_cccam(struct s_module *); 846 #ifdef HAVE_DVBAPI 844 847 extern void module_dvbapi(struct s_module *); 848 #endif 845 849 extern struct timeval *chk_pending(struct timeb tp_ctimeout); 846 850 #endif // CS_GLOBALS -
trunk/module-dvbapi.c
r1001 r1013 17 17 */ 18 18 19 #ifdef HAVE_DVBAPI 20 19 21 #include <errno.h> 20 22 #include <fcntl.h> … … 31 33 #include "globals.h" 32 34 33 #ifdef OS_LINUX34 35 35 #include <linux/dvb/ca.h> 36 36 #include <linux/dvb/dmx.h> 37 37 38 #define CADEV 38 #define CADEV "/dev/dvb/adapter0/ca1" 39 39 #define DMXDEV "/dev/dvb/adapter0/demux0" 40 #define CAMDSOCKET 40 #define CAMDSOCKET "/tmp/camd.socket" 41 41 42 42 #define BUFSIZE 1024 … … 46 46 { 47 47 unsigned char descriptor_tag : 8; 48 unsigned char descriptor_length 49 unsigned short ca_system_id 48 unsigned char descriptor_length : 8; 49 unsigned short ca_system_id : 16; 50 50 unsigned char reserved : 3; 51 51 unsigned short ca_pid : 13; … … 55 55 typedef struct ca_pmt_program_info_s 56 56 { 57 unsigned char ca_pmt_cmd_id 57 unsigned char ca_pmt_cmd_id : 8; 58 58 ca_descriptor * descriptor; 59 59 } __attribute__ ((packed)) ca_pmt_program_info; … … 61 61 typedef struct ca_pmt_es_info_s 62 62 { 63 unsigned char stream_type 63 unsigned char stream_type : 8; 64 64 unsigned char reserved : 3; 65 65 unsigned short elementary_pid : 13; 66 unsigned char reserved2 66 unsigned char reserved2 : 4; 67 67 unsigned short es_info_length : 12; 68 68 ca_pmt_program_info * program_info; … … 73 73 unsigned char ca_pmt_list_management : 8; 74 74 unsigned short program_number : 16; 75 unsigned char reserved1 75 unsigned char reserved1 : 2; 76 76 unsigned char version_number : 5; 77 77 unsigned char current_next_indicator : 1; 78 unsigned char reserved2 78 unsigned char reserved2 : 4; 79 79 unsigned short program_info_length : 12; 80 80 ca_pmt_program_info * program_info; … … 82 82 } __attribute__ ((packed)) ca_pmt; 83 83 84 85 84 static int camfd = -1; 86 85 static int dmxfd_ecm = -1; … … 88 87 static int listenfd = -1; 89 88 90 91 89 // if set descrabling 92 90 unsigned short global_capid=0; … … 112 110 int ECMpidcount=0; 113 111 114 115 112 unsigned short dvbapi_get_single_ecm(int caid, int pid, unsigned char filt, unsigned char mask) 116 113 { … … 126 123 127 124 128 sFP.pid= pid;129 sFP.timeout= 1000;130 sFP.flags= DMX_ONESHOT | DMX_CHECK_CRC | DMX_IMMEDIATE_START;131 sFP.filter.filter[0]= filt;132 sFP.filter.mask[0]= mask;125 sFP.pid = pid; 126 sFP.timeout = 1000; 127 sFP.flags = DMX_ONESHOT | DMX_CHECK_CRC | DMX_IMMEDIATE_START; 128 sFP.filter.filter[0] = filt; 129 sFP.filter.mask[0] = mask; 133 130 134 131 if ((dmx_fd = open(DMXDEV, O_RDWR)) < 0) 135 132 return 0; 136 133 137 134 if (ioctl(dmx_fd, DMX_SET_FILTER, &sFP) < 0) 138 135 return 0; 139 136 140 137 len=read(dmx_fd, buf, BUFSIZE); 141 138 142 139 close(dmx_fd); 143 140 … … 159 156 return 0; 160 157 } 161 162 158 163 159 unsigned short dvbapi_parse_cat(unsigned short ca_system_id) … … 181 177 if ((dmx_fd = open(DMXDEV, O_RDWR)) < 0) 182 178 return 0; 183 179 184 180 if (ioctl(dmx_fd, DMX_SET_FILTER, &sFP) < 0) 185 181 return 0; 186 182 187 183 len=read(dmx_fd, buf, BUFSIZE); 188 184 189 185 close(dmx_fd); 190 186 … … 201 197 } 202 198 203 204 205 199 int dvbapi_stop_filter(void) 206 200 { 207 201 //cs_log("Stopping filtering..."); 208 202 209 210 return 0; 211 212 213 return 0; 214 203 if (ioctl(dmxfd_ecm,DMX_STOP)<0) 204 return 0; 205 206 if (ioctl(dmxfd_emm,DMX_STOP)<0) 207 return 0; 208 215 209 return 1; 216 210 } 217 211 218 219 212 unsigned short dvbapi_parse_ecm(unsigned char *buf, int len) 220 213 { 221 214 unsigned short provid; 222 215 223 provid=(buf[3]<<8)|buf[4]; 216 provid=(buf[3]<<8)|buf[4]; 224 217 cs_debug("Read %d bytes\tTable-id: %02x\tCA section length: %d\tProvider ID: %04x", len, buf[0], len ,provid); 225 218 226 219 //calen=((buf[1]<<8)+buf[2])&0x0fff; 227 220 228 221 /* 229 222 provid=b2i(2, buf+3); 230 223 231 224 i=(buf[4]==0xD2) ? buf[5] + 2 : 0; // skip d2 nano 232 225 if ((buf[5+i]==3) && ((buf[4+i]==0x90) || (buf[4+i]==0x40))) … … 255 248 } 256 249 257 258 250 int dvbapi_set_filter(int fd, int pid, unsigned char filt, unsigned char mask) 259 251 { … … 263 255 memset(&sFP,0,sizeof(sFP)); 264 256 265 sFP.pid= pid;266 sFP.timeout= 3000; //wait max 3 seconds for ECM message, should be repeated every 500ms267 sFP.flags= DMX_CHECK_CRC | DMX_IMMEDIATE_START;268 sFP.filter.filter[0]= filt;269 sFP.filter.mask[0]= mask;270 271 if (ioctl(fd, DMX_SET_FILTER, &sFP) < 0) 272 273 274 275 257 sFP.pid = pid; 258 sFP.timeout = 3000; //wait max 3 seconds for ECM message, should be repeated every 500ms 259 sFP.flags = DMX_CHECK_CRC | DMX_IMMEDIATE_START; 260 sFP.filter.filter[0] = filt; 261 sFP.filter.mask[0] = mask; 262 263 if (ioctl(fd, DMX_SET_FILTER, &sFP) < 0) 264 { 265 perror(" Status"); 266 return 0; 267 } 276 268 277 269 return 1; 278 270 } 279 271 280 281 282 void dvbapi_stop_descramble() { 283 272 void dvbapi_stop_descramble() 273 { 284 274 dvbapi_stop_filter(); 285 275 … … 300 290 } 301 291 302 303 292 void dvbapi_start_descramble(int caid, int capid) { 304 293 305 294 cs_log("Softcam: Start descrambling CAID: %04x", caid); 306 295 307 if (!dvbapi_set_filter(dmxfd_ecm,capid,0x80,0xF0)) 308 cs_log("Error ECM filtering"); 296 if (!dvbapi_set_filter(dmxfd_ecm,capid,0x80,0xF0)) //filter on ECM pid and 0x80 or 0x81 (mask 0xF0) 297 cs_log("Error ECM filtering"); 309 298 310 299 global_capid=capid; … … 328 317 ca_pid.pid = capid; 329 318 ca_pid.index = 0; 330 if (ioctl(camfd, CA_SET_PID, &ca_pid)==-1) 319 if (ioctl(camfd, CA_SET_PID, &ca_pid)==-1) 331 320 cs_log("Softcam: Error SET_PID"); 332 321 } 333 322 334 323 // from tuxbox camd 335 int dvbapi_parse_capmt(const unsigned char *buffer, const unsigned int length) 324 int dvbapi_parse_capmt(unsigned char *buffer, const unsigned int length) 325 336 326 { 337 327 unsigned short i, j; 338 ca_pmt * 328 ca_pmt *pmt; 339 329 int n; 340 330 341 //cs_dump(buffer,length,"capmt:");331 cs_dump(buffer, length, "capmt:"); 342 332 pmt = (ca_pmt *) malloc(sizeof(ca_pmt)); 343 333 … … 366 356 ECMpidcount=0; 367 357 368 //CA_PIDS f ür alle Streams358 //CA_PIDS fr alle Streams 369 359 if (pmt->program_info_length != 0) 370 360 { … … 381 371 382 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); 383 373 384 374 if (buffer[i + 7] == 0x09) { 385 375 ECMpids[ECMpidcount].CA_PID=pmt->program_info->descriptor->ca_pid; //add the PID … … 394 384 395 385 396 //CA_PIDs f ür einzelne Streams386 //CA_PIDs fr einzelne Streams 397 387 // 398 388 pmt->es_info = (ca_pmt_es_info *) malloc(sizeof(ca_pmt_es_info)); … … 438 428 439 429 dvbapi_stop_descramble(); 440 430 441 431 cs_log("Softcam: Found %d ECMpids in PMT", ECMpidcount); 442 432 … … 461 451 //cs_dump(buffer, len, "handlesockmsg:"); 462 452 463 if (buffer[0] != 0x9F) { 453 if (buffer[0] != 0x9F) { 464 454 cs_log("handlesockmsg() unknown socket command: %02x", buffer[0]); 465 455 return; … … 478 468 val = (val << 8) | buffer[i + 1 + 3]; 479 469 size++; 480 } else 470 } else 481 471 { 482 472 val = buffer[3] & 0x7F; 483 473 size = 1; 484 474 } 485 475 486 476 if (buffer[2] == 0x30) // ca_info_enq 487 477 cs_debug("ca_info!!"); … … 502 492 cs_log("client: handlesockmsg() unknown command"); 503 493 cs_dump(buffer, len, "unknown command:"); 504 } 505 } 506 507 494 } 495 } 508 496 509 497 static int dvbapi_init_listenfd() { 510 498 511 499 int clilen; 512 500 struct sockaddr_un servaddr; … … 519 507 if ((unlink(cfg->dvbapi_socket) < 0) && (errno != ENOENT)) 520 508 return 0; 521 if ((listenfd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) 522 return 0; 523 if (bind(listenfd, (struct sockaddr *) &servaddr, clilen) < 0) 509 if ((listenfd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) 510 return 0; 511 if (bind(listenfd, (struct sockaddr *) &servaddr, clilen) < 0) 524 512 return 0; 525 513 if (listen(listenfd, 5) < 0) … … 528 516 return 1; 529 517 } 530 531 532 533 518 534 519 void *thread_check_zap(void *arg) { … … 543 528 //cs_log("check zap"); 544 529 545 530 546 531 547 532 connfd = accept(listenfd, (struct sockaddr *)&servaddr, (socklen_t *)&clilen); 548 533 549 if (connfd <= 0) //socket not available 534 if (connfd <= 0) //socket not available 550 535 break; 551 536 552 537 len = read(connfd, buffer, sizeof(buffer)); 553 538 … … 559 544 // if message begins with an apdu_tag and is longer than three bytes 560 545 if ((buffer[0] == 0x9F) && ((buffer[1] >> 7) == 0x01) && ((buffer[2] >> 7) == 0x00)) { 561 if (memcmp(buffer, buffer_cache_capmt, 8) != 0) { 546 if (memcmp(buffer, buffer_cache_capmt, 8) != 0) { 562 547 memcpy(buffer_cache_capmt, buffer, 8); 563 548 dvbapi_handlesockmsg(buffer, len); 564 } 549 } 565 550 } 566 551 567 close(connfd); 552 close(connfd); 568 553 569 554 } … … 571 556 } 572 557 573 574 558 void *thread_check_dmx(void *arg) { 575 559 576 560 struct pollfd pfd2[2]; 577 561 int rc,len,i; … … 591 575 dvbapi_stop_filter(); 592 576 break; 593 } 577 } 594 578 595 579 for (i = 0; i < 2; i++) { … … 598 582 if ((len = read(dmxfd_ecm, buffer, BUFSIZE)) <= 0) 599 583 break; 600 584 601 585 if (len != (((buffer[1] & 0xf) << 8) | buffer[2]) + 3) //invaild CAT length 602 break; 603 586 break; 587 604 588 if (buffer[0] == 0x80 | buffer[0] == 0x81) 605 589 { 606 590 if (memcmp(buffer, buffer_cache_dmx, 12) != 0) { 607 591 memcpy(buffer_cache_dmx, buffer, 12); 608 if (!dvbapi_parse_ecm(buffer,len)) { cs_log("Error while parsing ECM"); } 592 if (!dvbapi_parse_ecm(buffer,len)) { cs_log("Error while parsing ECM"); } 609 593 } 610 594 } … … 613 597 614 598 if (pfd2[i].fd == dmxfd_emm) { 615 if ((len = read(dmxfd_emm, buffer, BUFSIZE)) <= 0) 599 if ((len = read(dmxfd_emm, buffer, BUFSIZE)) <= 0) 616 600 break; 617 601 618 602 if (len != (((buffer[1] & 0xf) << 8) | buffer[2]) + 3) //invaild CAT length 619 break; 603 break; 620 604 621 605 /* … … 626 610 if( (buffer[0]==0x83) && (buffer[7]==0x00) ) emmtype = 2; // G 627 611 628 612 629 613 */ 630 614 cs_log("EMM Type: 0x%02x", buffer[0]); … … 642 626 epg.l=len; 643 627 memcpy(epg.emm, buffer, epg.l); 644 memcpy(epg.hexserial, reader[client[cs_idx].au].hexserial, 8); 628 memcpy(epg.hexserial, reader[client[cs_idx].au].hexserial, 8); 645 629 646 630 do_emm(&epg); … … 648 632 } 649 633 } 650 } 634 } 651 635 652 636 } 653 637 return 0; 654 638 } 655 656 639 657 640 int dvbapi_main_local() … … 675 658 } 676 659 677 for (i=0;i<20;i++) 678 { 679 ECMpids[i].CA_PID = 0; 680 ECMpids[i].CA_System_ID 660 for (i=0;i<20;i++) //clean ECMpids array 661 { 662 ECMpids[i].CA_PID = 0; 663 ECMpids[i].CA_System_ID = 0; 681 664 } 682 665 … … 711 694 712 695 while (1) { 713 if (master_pid!=getppid()) { 696 if (master_pid!=getppid()) { 714 697 cs_log("master died"); 715 698 cs_exit(0); … … 724 707 chk_dcw(fd_m2c); 725 708 } 726 709 727 710 } 728 711 return 0; 729 712 } 730 731 732 713 733 714 static void dvbapi_send_dcw(ECM_REQUEST *er) { … … 749 730 { 750 731 ca_descr.index = 0; 751 732 ca_descr.parity = 0; 752 733 memcpy(lastcw0,cw_0,8); 753 memcpy(ca_descr.cw,cw_0,8); 734 memcpy(ca_descr.cw,cw_0,8); 754 735 if (ioctl(camfd,CA_SET_DESCR,&ca_descr) < 0) perror("CA_SET_DESCR"); 755 736 } 756 737 757 738 if (memcmp(cw_1,lastcw1,8)) 758 { 739 { 759 740 ca_descr.index = 0; 760 741 ca_descr.parity = 1; 761 742 memcpy(lastcw1,cw_1,8); 762 743 memcpy(ca_descr.cw,cw_1,8); … … 766 747 } 767 748 768 769 770 749 static void dvbapi_handler(int idx) { 771 static struct s_auth *account=0; 772 750 static struct s_auth *account=0; 751 773 752 if (cfg->dvbapi_enabled != 1) { 774 753 cs_log("client disabled"); … … 788 767 789 768 int ok=0; 790 769 791 770 if( !account ) 792 771 { … … 804 783 cs_exit(0); 805 784 806 return; 785 return; 807 786 808 787 } … … 822 801 } 823 802 824 #else // non OS_LINUX825 803 void module_dvbapi(struct s_module *ph) {} 826 804 827 #endif // OS_LINUX 828 805 #endif // HAVE_DVBAPI -
trunk/oscam-config.c
r1000 r1013 522 522 static void chk_t_dvbapi(char *token, char *value) 523 523 { 524 #ifndef HAVE_DVBAPI 525 fprintf(stderr, "Warning: OSCam compiled without DVBAPI Support\n"); 526 #else 524 527 if (!strcmp(token, "enabled")) { cfg->dvbapi_enabled=atoi(value); return; } 525 if (!strcmp(token, "au")) 528 if (!strcmp(token, "au")) { cfg->dvbapi_au=atoi(value); return; } 526 529 if (!strcmp(token, "demux")) { strncpy(cfg->dvbapi_demux, value, sizeof(cfg->dvbapi_demux)-1); return; } 527 if (!strcmp(token, "ca")) 530 if (!strcmp(token, "ca")) { strncpy(cfg->dvbapi_ca, value, sizeof(cfg->dvbapi_ca)-1); return; } 528 531 if (!strcmp(token, "socket")) { strncpy(cfg->dvbapi_socket, value, sizeof(cfg->dvbapi_socket)-1); return; } 529 532 if (!strcmp(token, "user")) { strncpy(cfg->dvbapi_usr, value, sizeof(cfg->dvbapi_usr)-1); return; } 530 533 531 534 if (token[0] != '#') 532 fprintf(stderr, "Warning: keyword '%s' in softcam section not recognized\n",token); 535 fprintf(stderr, "Warning: keyword '%s' in dvbapi section not recognized\n",token); 536 #endif 533 537 } 534 538 -
trunk/oscam.c
r1000 r1013 2174 2174 module_radegast, 2175 2175 module_oscam_ser, 2176 #ifdef HAVE_DVBAPI 2176 2177 module_dvbapi, 2178 #endif 2177 2179 0 2178 2180 };
Note:
See TracChangeset
for help on using the changeset viewer.