Changeset 8562
- Timestamp:
- 03/22/13 13:32:55 (11 years ago)
- Location:
- trunk
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/globals.h
r8561 r8562 756 756 int32_t (*get_emm_type)(struct emm_packet_t *, struct s_reader *); 757 757 void (*get_emm_filter)(struct s_reader * rdr, uchar *filter); 758 void (*get_tunemm_filter)(struct s_reader * rdr, uchar *filter); 758 759 uint16_t caids[2]; 759 760 }; -
trunk/module-dvbapi.c
r8500 r8562 20 20 #include "oscam-time.h" 21 21 22 // tunemm_caid_map 23 #define FROM_TO 0 24 #define TO_FROM 1 25 22 26 // These are declared in module-dvbapi-azbox.c 23 27 extern int32_t openxcas_provid; … … 482 486 cs_debug_mask(D_DVBAPI, "NET DEVICE open (port = %d) fd %d", PORT + adapter, socket_fd); 483 487 return socket_fd; 488 } 489 490 uint16_t tunemm_caid_map(uint8_t direct, uint16_t caid) 491 { 492 int32_t i; 493 struct s_client *cl = cur_client(); 494 TUNTAB *ttab; 495 ttab = &cl->ttab; 496 497 if (direct == FROM_TO) { 498 for (i = 0; i<ttab->n; i++) { 499 if (caid==ttab->bt_caidfrom[i]) 500 return ttab->bt_caidto[i]; 501 } 502 } else { 503 for (i = 0; i<ttab->n; i++) { 504 if (caid==ttab->bt_caidto[i]) 505 return ttab->bt_caidfrom[i]; 506 } 507 } 508 return caid; 484 509 } 485 510 … … 583 608 dmx_filter[1]=0; 584 609 610 uint16_t caid = rdr->caid; 611 585 612 struct s_cardsystem *cs; 586 613 if (!rdr->caid) … … 589 616 cs = get_cardsystem_by_caid(rdr->caid); 590 617 591 if (cs) 592 cs->get_emm_filter(rdr, dmx_filter); 593 else { 618 if (cs) { 619 if (rdr->caid != tunemm_caid_map(TO_FROM, rdr->caid) && 620 dvbapi_find_emmpid(demux_index, EMM_UNIQUE|EMM_SHARED|EMM_GLOBAL, rdr->caid, 0) < 0 && 621 dvbapi_find_emmpid(demux_index, EMM_UNIQUE|EMM_SHARED|EMM_GLOBAL, tunemm_caid_map(TO_FROM, rdr->caid), 0) > -1) 622 { 623 cs->get_tunemm_filter(rdr, dmx_filter); 624 caid = tunemm_caid_map(TO_FROM, rdr->caid); 625 cs_debug_mask(D_DVBAPI, "[EMM Filter] tunnel emm %04X -> %04X", caid, rdr->caid); 626 } else { 627 cs->get_emm_filter(rdr, dmx_filter); 628 } 629 } else { 594 630 cs_debug_mask(D_DVBAPI, "[EMM Filter] cardsystem for emm filter for %s not found", rdr->label); 595 631 continue; … … 629 665 } else { 630 666 if (rdr->auprovid) { 631 l = dvbapi_find_emmpid(demux_index, emmtype, rdr->caid, rdr->auprovid);667 l = dvbapi_find_emmpid(demux_index, emmtype, caid, rdr->auprovid); 632 668 if (l<0) 633 l = dvbapi_find_emmpid(demux_index, emmtype, rdr->caid, 0);669 l = dvbapi_find_emmpid(demux_index, emmtype, caid, 0); 634 670 } else { 635 l = dvbapi_find_emmpid(demux_index, emmtype, rdr->caid, 0);671 l = dvbapi_find_emmpid(demux_index, emmtype, caid, 0); 636 672 } 637 673 } … … 718 754 char typetext[40]; 719 755 cs_strncpy(typetext, ":", sizeof(typetext)); 720 756 uint16_t ncaid = tunemm_caid_map(FROM_TO, caid); 757 721 758 if (type & 0x01) strcat(typetext, "UNIQUE:"); 722 759 if (type & 0x02) strcat(typetext, "SHARED:"); … … 724 761 if (type & 0xF8) strcat(typetext, "UNKNOWN:"); 725 762 726 if (emm_reader_match(testrdr, caid, provid)){763 if (emm_reader_match(testrdr, ncaid, provid)) { 727 764 uint16_t i; 728 765 for (i = 0; i < demux[demux_id].EMMpidcount; i++) { … … 734 771 typetext, i); 735 772 return; 773 } else { 774 if (demux[demux_id].EMMpids[i].CAID == ncaid && ncaid != caid) { 775 cs_debug_mask(D_DVBAPI,"[SKIP EMMPID] CAID: %04X EMM_PID: %04X PROVID: %06X TYPE %s (caid %04X present)", 776 caid, emmpid, provid, typetext, ncaid); 777 return; 778 } 736 779 } 737 780 } … … 1058 1101 memcpy(epg.emm, buffer, epg.emmlen); 1059 1102 1103 if (caid != tunemm_caid_map(FROM_TO, caid)) { 1104 irdeto_header_rw(&epg); 1105 i2b_buf(2, tunemm_caid_map(FROM_TO, caid), epg.caid); 1106 } 1107 1060 1108 do_emm(dvbapi_client, &epg); 1061 1109 } -
trunk/oscam-emm.c
r8454 r8562 555 555 } 556 556 } 557 558 void irdeto_header_rw(EMM_PACKET *ep) 559 { 560 uchar bt_emm[258]; 561 char *typtext[] = { "unknown", "unique", "shared", "global" }; 562 563 memset(bt_emm, 0, sizeof(bt_emm)); 564 565 ep->type = UNKNOWN; 566 567 if (ep->emm[0] == 0x83 && ep->emm[5] == 0x10) { 568 if (ep->emm[7] == 0x00) 569 ep->type = UNIQUE; 570 else 571 ep->type = SHARED; 572 } else { 573 if (ep->emm[0] == 0x82) 574 ep->type = GLOBAL; 575 } 576 577 if (ep->type != UNKNOWN && ep->emmlen == 142) 578 cs_debug_mask(D_EMM, "[TUN_EMM] Type: %s - rewriting header", typtext[ep->type]); 579 else 580 return; 581 582 // BETACRYPT/IRDETO EMM HEADER: 583 static uint8_t headerD0[6] = { 0x82, 0x70, 0x89, 0xd0, 0x01, 0x00 }; //GLOBAL 584 static uint8_t headerD2[8] = { 0x82, 0x70, 0x8b, 0xd2, 0x00, 0x00, 0x01, 0x00 }; //SHARED 585 static uint8_t headerD3[9] = { 0x82, 0x70, 0x8c, 0xd3, 0x00, 0x00, 0x00, 0x01, 0x00 }; //UNIQUE 586 587 switch (ep->type) { 588 case UNIQUE: 589 memcpy(bt_emm, headerD3, sizeof(headerD3)); 590 memcpy(bt_emm+sizeof(headerD3), ep->emm+8,ep->emmlen-8 ); 591 bt_emm[4] = ep->emm[4]; 592 bt_emm[5] = ep->emm[3]; 593 bt_emm[6] = ep->emm[6]; 594 ep->emmlen=143; 595 break; 596 case SHARED: 597 memcpy(bt_emm, headerD2, sizeof(headerD2)); 598 memcpy(bt_emm+sizeof(headerD2), ep->emm+8,ep->emmlen-8 ); 599 bt_emm[4] = ep->emm[4]; 600 bt_emm[5] = ep->emm[3]; 601 ep->emmlen=142; 602 break; 603 case GLOBAL: 604 memcpy(bt_emm, headerD0, sizeof(headerD0)); 605 memcpy(bt_emm+sizeof(headerD0), ep->emm+8,ep->emmlen-8 ); 606 ep->emmlen=140; 607 break; 608 } 609 memcpy(ep->emm, bt_emm, sizeof(bt_emm)); 610 } -
trunk/oscam-emm.h
r8377 r8562 7 7 void do_emm_from_file(struct s_reader * reader); 8 8 void emm_sort_nanos(unsigned char *dest, const unsigned char *src, int32_t len); 9 void irdeto_header_rw(EMM_PACKET *ep); 9 10 10 11 #endif -
trunk/reader-irdeto.c
r8488 r8562 746 746 747 747 return; 748 } 749 750 static void irdeto_get_tunemm_filter(struct s_reader * rdr, uchar *filter) 751 { 752 int32_t idx = 2; 753 filter[0] = 0xFF; 754 filter[1] = 0; 755 756 filter[idx++] = EMM_GLOBAL; 757 filter[idx++] = 0; 758 filter[idx+0] = 0x82; 759 filter[idx+0+16] = 0xFF; 760 filter[1]++; 761 idx += 32; 762 763 filter[idx++] = EMM_SHARED; 764 filter[idx++] = 0; 765 filter[idx+0] = 0x83; 766 filter[idx+1] = rdr->hexserial[1]; 767 filter[idx+2] = rdr->hexserial[0]; 768 filter[idx+3] = 0x10; 769 filter[idx+4] = 0x00; 770 filter[idx+5] = 0x10; 771 memset(filter+idx+0+16, 0xFF, 6); 772 filter[1]++; 773 idx += 32; 774 775 filter[idx++] = EMM_UNIQUE; 776 filter[idx++] = 0; 777 filter[idx+0] = 0x83; 778 filter[idx+1] = rdr->hexserial[1]; 779 filter[idx+2] = rdr->hexserial[0]; 780 filter[idx+3] = 0x10; 781 filter[idx+4] = rdr->hexserial[2]; 782 filter[idx+5] = 0x00; 783 memset(filter+idx+0+16, 0xFF, 6); 784 filter[1]++; 748 785 } 749 786 … … 957 994 ph->get_emm_type=irdeto_get_emm_type; 958 995 ph->get_emm_filter=irdeto_get_emm_filter; 996 ph->get_tunemm_filter=irdeto_get_tunemm_filter; 959 997 ph->caids[0]=0x06; 960 998 ph->caids[1]=0x17;
Note:
See TracChangeset
for help on using the changeset viewer.