Changeset 1836


Ignore:
Timestamp:
Mar 15, 2010, 9:20:20 PM (10 years ago)
Author:
_network
Message:

modular: fix emm filter for dvbapi1

Location:
branches/modular
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/modular/module-dvbapi.c

    r1834 r1836  
    151151int selected_api=-1;
    152152
    153 int dvbapi_set_filter(int dmx_fd, int api, unsigned short pid, unsigned char filt, unsigned char mask, int timeout) {
     153extern uchar *nagra2_get_emm_filter(struct s_reader*, int);
     154
     155int dvbapi_set_filter(int dmx_fd, int api, unsigned short pid, unsigned char *filt, unsigned char *mask, int timeout) {
    154156    int ret=-1;
    155157
     
    167169            sFP2.timeout            = timeout;
    168170            sFP2.flags          = DMX_IMMEDIATE_START;
    169             sFP2.filter.filter[0]   = filt;
    170             sFP2.filter.mask[0]     = mask;
     171            memcpy(sFP2.filter.filter,filt,16);
     172            memcpy(sFP2.filter.mask,mask,16);
    171173            ret=ioctl(dmx_fd, DMX_SET_FILTER, &sFP2);
    172174
     
    181183            sFP1.timeout            = timeout;
    182184            sFP1.flags          = DMX_IMMEDIATE_START;
    183             sFP1.filter.filter[0]   = filt;
    184             sFP1.filter.mask[0]     = mask;
     185            memcpy(sFP1.filter.filter,filt,16);
     186            memcpy(sFP1.filter.mask,mask,16);
    185187            ret=ioctl(dmx_fd, DMX_SET_FILTER1, &sFP1);
    186188
     
    195197    return ret;
    196198}
    197 
    198 
    199 int dvbapi_set_emm_filter(int dmx_fd, int api, unsigned short pid, unsigned char *filt, unsigned char *mask, int timeout) {
    200     int ret=-1;
    201 
    202     cs_debug("dvbapi: set filter pid:%04x, value:%04x",pid, filt);
    203 
    204     switch(api)
    205     {
    206         case 0:
    207             api=api;
    208             struct dmx_sct_filter_params sFP2;
    209 
    210             memset(&sFP2,0,sizeof(sFP2));
    211 
    212             sFP2.pid            = pid;
    213             sFP2.timeout            = timeout;
    214             sFP2.flags          = DMX_IMMEDIATE_START;
    215             //sFP2.filter.filter[0] = filt;
    216             memcpy(sFP2.filter.filter,filt,16);
    217             //sFP2.filter.mask[0]       = mask;
    218             memcpy(sFP2.filter.mask,mask,16);
    219             ret=ioctl(dmx_fd, DMX_SET_FILTER, &sFP2);
    220 
    221             break;
    222         case 1:
    223             api=api;
    224             struct dmxSctFilterParams sFP1;
    225 
    226             memset(&sFP1,0,sizeof(sFP1));
    227 
    228             sFP1.pid            = pid;
    229             sFP1.timeout            = timeout;
    230             sFP1.flags          = DMX_IMMEDIATE_START;
    231             //sFP1.filter.filter[0] = filt;
    232             memcpy(sFP1.filter.filter,filt,16);
    233             //sFP1.filter.mask[0]       = mask;
    234             memcpy(sFP1.filter.filter,filt,16);
    235             ret=ioctl(dmx_fd, DMX_SET_FILTER1, &sFP1);
    236 
    237             break;
    238         default:
    239             break;
    240     }
    241 
    242     if (ret < 0)
    243         cs_debug("dvbapi: could not start demux filter (Errno: %d)", errno);
    244 
    245     return ret;
    246 }
    247 
    248199
    249200int dvbapi_check_array(unsigned short *array, int len, unsigned short match) {
     
    262213    int apinum=-1;
    263214    int dmx_fd=0;
     215    uchar filter[16], filtermask[16];
     216
     217    memset(filter,0,16);
     218    memset(filtermask,0,16);
     219    filter[0]=0x01;
     220    filtermask[0]=0xFF;
    264221
    265222    char device_path[128];
    266223
    267     for (i=0;i<BOX_COUNT;i++)
    268     {
     224    for (i=0;i<BOX_COUNT;i++) {
    269225        sprintf(device_path, devices[i].demux_device_path, 0);
    270226        if ((dmx_fd = open(device_path, O_RDWR)) > 0) {
     
    276232    if (dmx_fd < 0) return 0;
    277233
    278     int ret=0;
    279 
    280     for (i=0;i<num_apis;i++)
    281     {
    282         ret=dvbapi_set_filter(dmx_fd, i, 0x0001, 0x01, 0xFF, 1);
     234    int ret=-1;
     235
     236    for (i=0;i<num_apis;i++) {
     237        ret=dvbapi_set_filter(dmx_fd, i, 0x0001, filter, filtermask, 1);
    283238
    284239        if (ret >= 0)
     
    313268
    314269    if (len==-1 && errno!=75) //FIXME: read error 75, reason unknown (dbox2?)
    315         cs_log("dvbapi: read error %d", errno);
     270        cs_log("dvbapi: read error %d on fd %d", errno, dmx_fd);
    316271
    317272    if (debug==1)
     
    363318}
    364319
    365 void dvbapi_start_filter(int demux_index, ushort caid, unsigned short pid, ushort table, ushort mask, int type) {
     320void dvbapi_start_filter(int demux_index, ushort caid, unsigned short pid, uchar table, uchar mask, int type) {
    366321    int dmx_fd,i,n=-1;
     322    uchar filter[16], filtermask[16];
    367323
    368324    for (i=0;i<MAX_FILTER;i++) {
     
    385341    demux[demux_index].demux_fd[n].type=type;
    386342
    387     dvbapi_set_filter(dmx_fd, selected_api, pid, table, mask, 4000);
     343    memset(filter,0,16);
     344    memset(filtermask,0,16);
     345
     346    filter[0]=table;
     347    filtermask[0]=mask;
     348
     349    dvbapi_set_filter(dmx_fd, selected_api, pid, filter, filtermask, 4000);
    388350}
    389351
    390352void dvbapi_start_emm_filter(int demux_index, int emmtype, ushort caid, unsigned short pid, ushort table, ushort mask, int type) {
    391353    int dmx_fd,i,n=-1;
     354    uchar filter[32];
    392355
    393356    if (demux[demux_index].pidindex==-1) return;
     
    402365    }
    403366
    404     uchar *filter = nagra2_get_emm_filter(&reader[client[cs_idx].au], emmtype);
     367    switch(caid >> 8) {
     368        case 0x17:
     369        case 0x18: // NAGRA EMM
     370            i=0;
     371            uchar *filter1 = nagra2_get_emm_filter(&reader[client[cs_idx].au], emmtype);
     372            memcpy(filter,filter1,32);
     373            break;
     374        default:
     375            memset(filter,0,32);
     376            filter[0]=table;
     377            filter[0+16]=mask;
     378            break;
     379    }
    405380
    406381    for (i=0;i<MAX_FILTER;i++) {
     
    423398    demux[demux_index].demux_fd[n].type=type;
    424399
    425     cs_log("filter %d", emmtype);
    426     cs_dump(filter, 32, "filter:");
    427     dvbapi_set_emm_filter(dmx_fd, selected_api, pid, filter, filter+16, 4000);
     400    cs_dump(filter, 32, "demux filter:");
     401    dvbapi_set_filter(dmx_fd, selected_api, pid, filter, filter+16, 4000);
    428402}
    429403
     
    452426    int i;
    453427
    454     //if (demux[demux_id].pidindex==-1) return;
    455     //cs_debug("dvbapi: Stop descrambling CAID: %04x", demux[demux_id].ECMpids[demux[demux_id].pidindex].CA_System_ID);
    456 
    457428    demux[demux_id].demux_index=-1;
    458429    demux[demux_id].program_number=0;
     
    460431    demux[demux_id].pidindex=-1;
    461432
    462     dvbapi_stop_filter(demux_id, 0);
    463     dvbapi_stop_filter(demux_id, 1);
     433    dvbapi_stop_filter(demux_id, TYPE_ECM);
     434    dvbapi_stop_filter(demux_id, TYPE_EMM);
    464435
    465436    memset(demux[demux_id].buffer_cache_dmx, 0, CS_ECMSTORESIZE);
     
    916887
    917888                if (type[i]==1) {
    918                     if (pfd2[i].fd==listenfd) {
    919                         cs_debug("dvbapi: new socket connection");
     889                    if (pfd2[i].fd==listenfd) {                     
    920890                        connfd = accept(listenfd, (struct sockaddr *)&servaddr, (socklen_t *)&clilen);
    921                        
     891                        cs_debug("dvbapi: new socket connection %d", connfd);
     892
    922893                        if (connfd <= 0)
    923894                            continue;
     
    982953                        }
    983954                        if (demux[demux_index].demux_fd[n].type==TYPE_EMM) {
    984                             if (mbuf[0]==0x01) {
     955                            if (mbuf[0]==0x01) { //CAT
    985956                                cs_debug("dvbapi: receiving cat");
    986957                                dvbapi_parse_cat(demux_index, mbuf, len);
    987                                 if (demux[demux_index].pidindex > -1) {
    988                                     dvbapi_stop_filter(demux_index, TYPE_EMM);
    989                                     if (cfg->dvbapi_au==1) {
    990                                         for (g=0;g<demux[demux_index].ECMpidcount;g++) {
    991                                             if (demux[demux_index].demux_fd[n].CA_System_ID == demux[demux_index].ECMpids[g].CA_System_ID && demux[demux_index].ECMpids[g].EMM_PID>0) {
    992                                                 switch(demux[demux_index].demux_fd[n].CA_System_ID >> 8) {
    993                                                     case 0x17:
    994                                                     case 0x18: // NAGRA EMM
    995                                                         dvbapi_start_emm_filter(demux_index, SHARED, demux[demux_index].ECMpids[g].CA_System_ID, demux[demux_index].ECMpids[g].EMM_PID, 0x80, 0xF0, TYPE_EMM);
    996                                                         dvbapi_start_emm_filter(demux_index, GLOBAL, demux[demux_index].ECMpids[g].CA_System_ID, demux[demux_index].ECMpids[g].EMM_PID, 0x80, 0xF0, TYPE_EMM);
    997                                                         break;
    998                                                     default:
    999                                                         dvbapi_start_filter(demux_index, demux[demux_index].ECMpids[g].CA_System_ID, demux[demux_index].ECMpids[g].EMM_PID, 0x80, 0xF0, TYPE_EMM);
    1000                                                         break;
    1001                                                 }
    1002                                             }
     958                                if (demux[demux_index].pidindex < 0)
     959                                    continue;
     960                               
     961                                dvbapi_stop_filter(demux_index, TYPE_EMM);
     962                                if (cfg->dvbapi_au==0)
     963                                    continue;
     964                               
     965                                for (g=0;g<demux[demux_index].ECMpidcount;g++) {
     966                                    if (demux[demux_index].demux_fd[n].CA_System_ID == demux[demux_index].ECMpids[g].CA_System_ID && demux[demux_index].ECMpids[g].EMM_PID>0) {
     967                                        switch(demux[demux_index].demux_fd[n].CA_System_ID >> 8) {
     968                                            case 0x17:
     969                                            case 0x18: // NAGRA EMM
     970                                                dvbapi_start_emm_filter(demux_index, SHARED, demux[demux_index].ECMpids[g].CA_System_ID, demux[demux_index].ECMpids[g].EMM_PID, 0x80, 0xF0, TYPE_EMM);
     971                                                dvbapi_start_emm_filter(demux_index, GLOBAL, demux[demux_index].ECMpids[g].CA_System_ID, demux[demux_index].ECMpids[g].EMM_PID, 0x80, 0xF0, TYPE_EMM);
     972                                                break;
     973                                            default:
     974                                                dvbapi_start_filter(demux_index, demux[demux_index].ECMpids[g].CA_System_ID, demux[demux_index].ECMpids[g].EMM_PID, 0x80, 0xF0, TYPE_EMM);
     975                                                break;
    1003976                                        }
    1004977                                    }
    1005                                 }
     978                                }                                                                   
    1006979                                continue;
    1007980                            }
  • branches/modular/oscam-reader.c

    r1795 r1836  
    421421  int i, no, rc, ecs;
    422422  char *rtxt[] = { "error", "written", "skipped", "blocked" };
    423   //char *typedesc[]= { "unknown", "unique", "shared", "global" };
     423  char *typedesc[]= { "unknown", "unique", "shared", "global" };
    424424  struct timeb tps, tpe;
    425425
     
    457457    cs_ftime(&tpe);
    458458
    459     /*
    460     cs_log("%s emm: type=%s, len=%d, idx=%d, cnt=%d: %s (%d ms)",
     459    cs_log("%s emmtype=%s, len=%d, idx=%d, cnt=%d: %s (%d ms) by %s",
    461460           username(ep->cidx), typedesc[emmcache[i].type], ep->emm[2],
    462            i, no, rtxt[rc], 1000*(tpe.time-tps.time)+tpe.millitm-tps.millitm);
    463     */
    464     cs_log("%s type=%02x, len=%d, idx=%d, cnt=%d: %s (%d ms)",
    465            username(ep->cidx), emmcache[i].type, ep->emm[2],
    466            i, no, rtxt[rc], 1000*(tpe.time-tps.time)+tpe.millitm-tps.millitm);
     461           i, no, rtxt[rc], 1000*(tpe.time-tps.time)+tpe.millitm-tps.millitm, reader[ridx].label);
    467462  }
    468463
Note: See TracChangeset for help on using the changeset viewer.