Changeset 1998


Ignore:
Timestamp:
04/07/10 16:41:30 (12 years ago)
Author:
_network
Message:

dvbapi: start demux emm filter as soon as reader sets hexserial

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/module-camd35.c

    r1989 r1998  
    494494        reader[ridx].nprov = 0; //reset if number changes on reader change
    495495        reader[ridx].nprov = buf[47];
    496         reader[ridx].aucaid = b2i(2, buf+20);
     496        reader[ridx].caid[0] = b2i(2, buf+20);
    497497
    498498        int i;
     
    522522                cs_hexdump(0, reader[ridx].hexserial, 8),
    523523                reader[ridx].card_system,
    524                 reader[ridx].aucaid);
     524                reader[ridx].caid[0]);
    525525    }
    526526
  • trunk/module-dvbapi.c

    r1997 r1998  
    4848    unsigned char buffer_cache_dmx[CS_ECMSTORESIZE];
    4949    unsigned char lastcw[2][8];
     50    int emm_filter;
     51    struct s_reader *rdr;
     52   
    5053} DEMUXTYPE;
    5154#define DMX_FILTER_SIZE 16
     
    290293    int g;
    291294
    292     /* set cardsystem to 0. This prevents us for emm flood to server
    293      * until carsystem is set new from CMD05
    294      */
    295     if (reader[client[cs_idx].au].typ == R_CAMD35)
    296         reader[client[cs_idx].au].card_system = 0;
    297 
    298295    for (g=0;g<MAX_FILTER;g++) {
    299296        if (demux[demux_index].demux_fd[g].fd>0 && demux[demux_index].demux_fd[g].type==type) {
     
    338335}
    339336
    340 void dvbapi_start_emm_filter(int demux_index, int emmtype, int type) {
     337void dvbapi_start_emm_filter(int demux_index) {
    341338    int dmx_fd, i, n=-1;
    342     uchar filter[32];
    343     uchar *reader_filter;
     339    uchar *filter,nullserial[8];
     340
    344341    char *typtext[]={"UNKNOWN", "UNIQUE", "SHARED", "GLOBAL"};
    345342
     
    349346    ushort pid  = demux[demux_index].ECMpids[demux[demux_index].pidindex].EMM_PID;
    350347
    351     int found=0;
    352     for (i=0;i<CS_MAXREADER;i++) {
    353 
    354         if(!reader[i].aucaid)
    355             reader[i].aucaid = reader[i].caid[0];
    356 
    357         if (reader[i].aucaid == caid) {
    358             client[cs_idx].au=i;
    359             found=1;
    360             break;
    361         }
    362     }
    363 
    364     if (!found) {
    365         cs_log("emm dmx filter - no AU reader found");
    366     } else {
    367         reader_filter = get_emm_filter(&reader[client[cs_idx].au], emmtype);
    368         memcpy(filter, reader_filter, 32);
    369         cs_log("emm dmx filter %s \t set to: %s",typtext[emmtype], cs_hexdump(0, filter, 32));
    370    
    371    
     348    if (pid==0 || demux[demux_index].emm_filter==1 || !demux[demux_index].rdr)
     349        return;
     350
     351    memset(nullserial,0,8);
     352
     353    if (!memcmp(demux[demux_index].rdr->hexserial, nullserial, 8)) {
     354        //cs_debug("dvbapi: hexserial not set %s", cs_hexdump(1, demux[demux_index].rdr->hexserial, 8));
     355        return;
     356    }
     357
     358    if (demux[demux_index].rdr->card_system==0)
     359        demux[demux_index].rdr->card_system=get_cardsystem(caid);
     360
     361    int j;
     362    for (j=1;j<4;j++) {
     363        int emmtype=j;
     364        n=-1;
     365        filter = get_emm_filter(demux[demux_index].rdr, emmtype);
     366
    372367        for (i=0;i<MAX_FILTER;i++) {
    373368            if (demux[demux_index].demux_fd[i].fd<=0) {
     
    376371            }
    377372        }
    378    
     373
    379374        if (n==-1) {
    380375            cs_log("dvbapi: no free filter");
     
    383378   
    384379        dmx_fd=dvbapi_open_device(demux_index, 0);
    385    
     380
    386381        demux[demux_index].demux_fd[n].fd=dmx_fd;
    387382        demux[demux_index].demux_fd[n].CA_System_ID=caid;
    388383        demux[demux_index].demux_fd[n].PID=pid;
    389         demux[demux_index].demux_fd[n].type=type;
    390    
    391         cs_ddump(filter, 32, "demux filter:");
     384        demux[demux_index].demux_fd[n].type=TYPE_EMM;
     385
     386        cs_log("dvbapi: starting emm filter %s",typtext[emmtype]);
     387        cs_dump(filter, 32, "demux filter:");
    392388        dvbapi_set_filter(dmx_fd, selected_api, pid, filter, filter+16, 0);
    393389    }
     390    demux[demux_index].emm_filter=1;
    394391}
    395392
     
    618615    demux[demux_id].cadev_index=demux_index2;
    619616    demux[demux_id].socket_fd=connfd;
     617    demux[demux_id].emm_filter=0;
     618    demux[demux_id].rdr=NULL;
    620619
    621620    for (i=0;i<8;i++) {
     
    848847        demux[i].demux_index=-1;
    849848        demux[i].socket_fd=0;
     849        demux[i].emm_filter=0;
     850        demux[i].rdr=NULL;
    850851        memset(demux[i].buffer_cache_dmx, 0, CS_ECMSTORESIZE);
    851852        for (rc=0;rc<MAX_FILTER;rc++) demux[i].demux_fd[rc].fd=0;
     
    991992                            if (memcmp(md5buf, demux[demux_index].buffer_cache_dmx, CS_ECMSTORESIZE) != 0) {
    992993                                memcpy(demux[demux_index].buffer_cache_dmx, md5buf, CS_ECMSTORESIZE);
    993                                
     994
     995                                if (cfg->dvbapi_au==1)
     996                                    dvbapi_start_emm_filter(demux_index);
     997
    994998                                unsigned long provid=0;
    995999                                int pid = dvbapi_check_array(cfg->dvbapi_prioritytab.caid, CS_MAXCAIDTAB, demux[demux_index].demux_fd[n].CA_System_ID);
     
    10111015                                memcpy(er->ecm, mbuf, er->l);
    10121016                                get_cw(er);
    1013                             }
     1017                            }   
    10141018                        }
    10151019                        if (demux[demux_index].demux_fd[n].type==TYPE_EMM) {
     
    10221026                               
    10231027                                dvbapi_stop_filter(demux_index, TYPE_EMM);
    1024                                 if (cfg->dvbapi_au==0)
    1025                                     continue;
    1026                                
    1027                                 dvbapi_start_emm_filter(demux_index, SHARED, TYPE_EMM);
    1028                                 dvbapi_start_emm_filter(demux_index, GLOBAL, TYPE_EMM);
    1029                                 dvbapi_start_emm_filter(demux_index, UNIQUE, TYPE_EMM);
    10301028                                continue;
    10311029                            }
     
    10481046    for (i=0;i<MAX_DEMUX;i++) {
    10491047        if (demux[i].program_number==er->srvid) {
     1048            demux[i].rdr=&reader[er->reader[0]];
     1049
    10501050            if (er->rc<=3 && demux[i].pidindex==-1 && er->caid!=0) {
    10511051                dvbapi_start_descrambling(i, er->caid, er->pid);
  • trunk/module-newcamd.c

    r1951 r1998  
    780780            mbuf[4] = (uchar)(pufilt->caid>>8);
    781781            mbuf[5] = (uchar)(pufilt->caid);
     782
     783    //FIXME: this may break emm from non-oscam servers
     784    if (au != -1) {
     785        memcpy(mbuf+6, reader[au].hexserial, 8);
     786#if 0
    782787            mbuf[6] = 0x00;
    783788            mbuf[7] = 0x00;
     
    816821                    mbuf[13] = reader[au].hexserial[5];
    817822                    }
     823#endif
    818824                }
    819825            else
     
    853859                */
    854860                }
    855 
    856861            mbuf[14] = pufilt->nprids;
    857862            for( j=0; j<pufilt->nprids; j++)
  • trunk/reader-common.c

    r1990 r1998  
    449449        case SC_NAGRA:
    450450            return nagra2_get_emm_filter(rdr, type);
    451             break;
    452451        case SC_IRDETO:
    453452            return irdeto_get_emm_filter(rdr, type);
    454             break;
    455453        case SC_CRYPTOWORKS:
    456454            return cryptoworks_get_emm_filter(rdr, type);
    457             break;
    458455        case SC_VIACCESS:
    459456
     
    461458        case SC_CONAX:
    462459            return conax_get_emm_filter(rdr, type);
    463             break;
    464460        case SC_SECA:
    465461
Note: See TracChangeset for help on using the changeset viewer.