Changeset 1181


Ignore:
Timestamp:
01/11/10 09:06:49 (12 years ago)
Author:
landlord
Message:

DVB API update: now with improved CA/demux/multi tuner device detection, improved EMM handling, CAID and priority settings

Location:
trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Distribution/doc/man/oscam.conf.5

    r1115 r1181  
    340340.RS 3n
    341341user name for DVB API client, default:anonymous
     342.RE
     343.PP
     344\fBignore\fP = \fBCAID[,CAID]...\fP
     345.RS 3n
     346CAIDs to be ignored, default:none
     347.RE
     348.PP
     349\fBpriority\fP = \fBCAID[,CAID]...\fP
     350.RS 3n
     351CAIDs to be prioritized, default:CAIDs of local SCs will be prioritized
    342352.RE
    343353.PP
  • trunk/Distribution/doc/txt/oscam.conf.txt

    r1115 r1181  
    246246      user name for DVB API client, default:anonymous
    247247
     248       ignore = CAID[,CAID]...
     249      CAIDs to be ignored, default:none
     250
     251       priority = CAID[,CAID]...
     252      CAIDs to be prioritized, default:CAIDs of local SCs will be  priori
     253      tized
     254
    248255       au = 0|1
    249256      1 = enable AU, default:0
    250257
    251258       boxtype = dbox2|dreambox|ufs910
    252       set  boxtype,  auto  detection  of  DVB   API   will   be   aspired,
     259      set   boxtype,   auto   detection   of  DVB  API  will  be  aspired,
    253260      default:dreambox
    254261
     
    258265
    259266       numusers = quantity
    260       anti-cascading:  user per account, 0 = anti-cascading not permitted,
     267      anti-cascading: user per account, 0 = anti-cascading not permitted,
    261268      default:0
    262269
     
    341348
    342349SEE ALSO
    343        oscam(1),     oscam.user(5),  oscam.server(5),      oscam.srvid(5),
    344        oscam.guess(5),    oscam.cert(5),    oscam.services(5),   oscam.ird(5),
     350       oscam(1),      oscam.user(5),      oscam.server(5),     oscam.srvid(5),
     351       oscam.guess(5),   oscam.cert(5),    oscam.services(5),    oscam.ird(5),
    345352       oscam.ac(5)
    346353
  • trunk/globals.h

    r1148 r1181  
    574574  int       dvbapi_enabled;
    575575  int       dvbapi_au;
    576   char      dvbapi_usr[64];
     576  char      dvbapi_usr[33]; 
    577577  char      dvbapi_boxtype[20];
     578  char      dvbapi_priority[64];
     579  char      dvbapi_ignore[64]; 
    578580#endif
    579581#ifdef CS_ANTICASC
  • trunk/module-dvbapi.c

    r1115 r1181  
    3535#define BUFSIZE 1024
    3636#define MAX_DEMUX 5
     37#define MAX_CAID 50
     38#define TAB_SIZE 30
     39#define ECM_PIDS 20
    3740
    3841static int listenfd = -1;
     
    4043typedef struct ECMPIDS
    4144{
    42     int CA_PID;
    43     int CA_System_ID;
    44     int EMM_PID;
     45    unsigned short CA_PID;
     46    unsigned short CA_System_ID;
     47    unsigned short EMM_PID;
    4548} ECMPIDSTYPE;
    4649
     
    5457    int active;
    5558    int ECMpidcount;
    56     ECMPIDSTYPE ECMpids[20];
     59    ECMPIDSTYPE ECMpids[ECM_PIDS];
    5760    unsigned int program_number;
    5861    unsigned int ca_system_id;
     
    6164    unsigned int emm_pid;
    6265    int STREAMpidcount;
    63     short STREAMpids[20];
     66    short STREAMpids[ECM_PIDS];
    6467    unsigned char buffer_cache_dmx[12];
    6568    unsigned char lastcw0[8];
     
    134137DEMUXTYPE demux[MAX_DEMUX];
    135138
     139unsigned short global_caid_list[MAX_CAID];
     140unsigned short prioritytab[TAB_SIZE], ignoretab[TAB_SIZE];
     141
    136142#define BOX_COUNT 2
    137143struct box_devices
     
    150156int selected_api=-1;
    151157
    152 int dvbapi_set_filter(int dmx_fd, int api, int pid, unsigned char filt, unsigned char mask, int timeout)
    153 {
    154     int command,ret;
     158int dvbapi_set_filter(int dmx_fd, int api, unsigned short pid, unsigned char filt, unsigned char mask, int timeout)
     159{
     160    int command,ret=-1;
    155161
    156162    cs_debug("dvbapi: set filter pid:%04x, value:%04x",pid, filt);
     
    159165    {
    160166        case 0:
     167            //dvbapi 3
     168            command=0;
     169            struct dmx_sct_filter_params sFP2;
     170
     171            memset(&sFP2,0,sizeof(sFP2));
     172
     173            sFP2.pid            = pid;
     174            sFP2.timeout            = timeout;
     175            sFP2.flags          = DMX_IMMEDIATE_START;
     176            sFP2.filter.filter[0]   = filt;
     177            sFP2.filter.mask[0]     = mask;
     178            ret=ioctl(dmx_fd, DMX_SET_FILTER, &sFP2);
     179
     180            break;
     181        case 1:
    161182            //dvbapi 1
    162183            command=0;
     
    173194
    174195            break;
    175         case 1:
    176             //dvbapi 3
    177             command=0;
    178             struct dmx_sct_filter_params sFP2;
    179 
    180             memset(&sFP2,0,sizeof(sFP2));
    181 
    182             sFP2.pid            = pid;
    183             sFP2.timeout            = timeout;
    184             sFP2.flags          = DMX_IMMEDIATE_START;
    185             sFP2.filter.filter[0]   = filt;
    186             sFP2.filter.mask[0]     = mask;
    187             ret=ioctl(dmx_fd, DMX_SET_FILTER, &sFP2);
    188 
    189             break;
    190196        default:
    191197            break;
     
    193199
    194200    if (ret < 0)
    195         cs_log("dvbapi: could not start demux filter (Errno: %d)", errno);
     201        cs_debug("dvbapi: could not start demux filter (Errno: %d)", errno);
    196202
    197203    return ret;
     
    235241    selected_box=devnum;
    236242    selected_api=apinum;
    237     cs_log("Detect %s Api: %d", devices[devnum].demux_device_path, apinum);
     243    cs_debug("dvbapi: Detected %s Api: %d", device_path, apinum);
    238244
    239245    return 1;
     
    267273            ca_offset=1;
    268274
    269         sprintf(device_path, devices[selected_box].ca_device_path, demux[index_demux].demux_index+ca_offset);
     275        sprintf(device_path, devices[selected_box].ca_device_path, demux[index_demux].cadev_index+ca_offset);
    270276    }
    271277
     
    273279        if (type==1 && errno==16) // ca device already open
    274280            for (i=0;i<MAX_DEMUX;i++)
    275                 if (demux[i].demux_index==demux[index_demux].demux_index && demux[i].ca_fd>0)
     281                if (demux[i].cadev_index==demux[index_demux].cadev_index && demux[i].ca_fd>0)
    276282                    dmx_fd=demux[i].ca_fd;
    277283
    278284        if (dmx_fd<=0)
    279             cs_log("dvbapi: error opening device %s (Errno: %d)", device_path, errno);
     285            cs_debug("dvbapi: error opening device %s (Errno: %d)", device_path, errno);
    280286    }
    281287
     
    298304}
    299305
    300 unsigned short dvbapi_get_provid(int demux_index, int pid)
     306unsigned long dvbapi_get_provid(int demux_index, unsigned short pid)
    301307{
    302308    unsigned char buf[BUFSIZE];
     
    310316
    311317    if (len > 0) {
    312         short int provid = (buf[10] << 8) | buf[11];
     318        unsigned long provid = (buf[10] << 8) | buf[11];
    313319        return provid;
    314320    }
     
    317323}
    318324
    319 unsigned short dvbapi_get_single_ecm(int demux_index, int caid, int pid, unsigned short provid)
     325unsigned short dvbapi_get_single_ecm(int demux_index, unsigned short caid, unsigned short pid, unsigned long provid)
    320326{
    321327    unsigned char buf[BUFSIZE];
     
    454460void dvbapi_stop_descrambling_all(int demux_index)
    455461{
    456     int i,j;
     462    int j;
    457463    for (j=0;j<MAX_DEMUX;j++) {
    458464        if (demux[j].demux_index != demux_index)
     
    465471}
    466472
    467 void dvbapi_start_descrambling(int demux_index, int caid, int capid, unsigned short provider_id)
     473void dvbapi_start_descrambling(int demux_index, unsigned short caid, unsigned short capid, unsigned long provider_id)
    468474{
    469475    int i;
     
    531537
    532538        //grep ecm
    533         dvbapi_get_single_ecm(demux_index, demux[demux_index].ECMpids[n].CA_System_ID,demux[demux_index].ECMpids[n].CA_PID, provid);
     539        dvbapi_get_single_ecm(demux_index, demux[demux_index].ECMpids[n].CA_System_ID, demux[demux_index].ECMpids[n].CA_PID, provid);
    534540
    535541        sleep(3); //try next if no cw for .. secs
     
    569575            n=0;
    570576            k++;
     577            continue;
    571578        }
    572579        n++;
     
    575582            return 0;
    576583
    577         sleep(1);
     584        sleep(10);
    578585    }
    579586
     
    617624                        continue;
    618625
    619                     if (buffer[0] == 0x80 | buffer[0] == 0x81)
     626                    if (buffer[0] == 0x80 || buffer[0] == 0x81)
    620627                    {
    621628                        if (memcmp(buffer, demux[demux_index].buffer_cache_dmx, 12) != 0) {
     
    677684}
    678685
     686int dvbapi_check_array(unsigned short *array, int len, unsigned short match)
     687{
     688    int i;
     689    for (i=0; i<len; i++) {
     690        if (array[i]==match) {
     691            return 1;
     692        }
     693    }
     694    return 0;
     695}
     696
     697void dvbapi_resort_ecmpids(int demux_index)
     698{
     699    ECMPIDSTYPE tmppids[ECM_PIDS];
     700    ECMPIDSTYPE tmppids2[ECM_PIDS];
     701
     702    int tmppidcount=0,tmppid2count=0,n;
     703
     704    int i,k,j;
     705
     706    for (i=0;i<MAX_CAID;i++)
     707        global_caid_list[i]=0;
     708
     709    k=0;
     710    for (i=0;i<CS_MAXREADER;i++) {
     711        for (j=0;j<16;j++) {
     712            if (reader[i].caid[j] != 0) {
     713                if (k+1>=MAX_CAID) break;
     714                global_caid_list[k]=reader[i].caid[j];
     715                k++;
     716               
     717            }
     718        }
     719    }
     720    for (n=0; n<demux[demux_index].ECMpidcount; n++) {
     721        if (dvbapi_check_array(ignoretab, TAB_SIZE, demux[demux_index].ECMpids[n].CA_System_ID)) {
     722            cs_debug("-> ignore %04x", demux[demux_index].ECMpids[n].CA_System_ID);
     723        } else if (dvbapi_check_array(global_caid_list, MAX_CAID, demux[demux_index].ECMpids[n].CA_System_ID)) {
     724            cs_debug("-> caid list %04x", demux[demux_index].ECMpids[n].CA_System_ID);
     725            tmppids[tmppidcount]=demux[demux_index].ECMpids[n];
     726            tmppidcount++;
     727        } else if (dvbapi_check_array(prioritytab, TAB_SIZE, demux[demux_index].ECMpids[n].CA_System_ID)) {
     728            cs_debug("-> priority %04x", demux[demux_index].ECMpids[n].CA_System_ID);
     729            tmppids[tmppidcount]=demux[demux_index].ECMpids[n];
     730            tmppidcount++;
     731        } else {
     732            tmppids2[tmppid2count]=demux[demux_index].ECMpids[n];
     733            tmppid2count++;
     734        }
     735    }
     736
     737    for (n=0;n<tmppid2count;n++) {
     738        tmppids[tmppidcount]=tmppids2[n];
     739        tmppidcount++;
     740    }
     741
     742    for (n=0; n<tmppidcount; n++) {
     743        demux[demux_index].ECMpids[n]=tmppids[n];
     744    }
     745
     746    demux[demux_index].ECMpidcount=tmppidcount;
     747    cs_debug("dvbapi: ECMpidscount is now %d", demux[demux_index].ECMpidcount);
     748
     749    return;
     750}
     751
    679752// from tuxbox camd
    680753int dvbapi_parse_capmt(unsigned char *buffer, unsigned int length)
    681754{
    682     int i, j, u;
    683     int n, added, ca_mask=1, demux_index2=0;
     755    int i, j, u, n, added;
     756    int ca_mask=0x01, demux_index2=0x00;
    684757
    685758    int ca_pmt_list_management = buffer[0];
    686759    unsigned int program_number = (buffer[1] << 8) | buffer[2];
    687     unsigned int program_info_length = ((buffer[4] & 0x0F) << 8) | buffer[5];
     760    int program_info_length = ((buffer[4] & 0x0F) << 8) | buffer[5];
    688761
    689762    switch (ca_pmt_list_management)
     
    711784        dvbapi_stop_descrambling_all(0);
    712785    }
    713 
    714786
    715787    for (i=0;i<MAX_DEMUX;i++) {
     
    741813    }
    742814
    743     cs_debug("dvbapi: got id %d", demux_id);
    744 
    745815    if (demux_id<0) {
    746816        cs_log("dvbapi: error no free id (MAX_DEMUX)");
    747         return;
     817        return 0;
    748818    }
    749819
     
    757827    demux[demux_id].STREAMpidcount=0;
    758828    demux[demux_id].active=1;
    759 
    760     cs_debug("dvbapi: demux index %d", demux[demux_id].demux_index);
     829    demux[demux_id].cadev_index=demux_index2;
     830
     831    for (i=0;i<8;i++) {
     832        if (ca_mask & (1 << i)) {
     833            demux[demux_id].cadev_index=i;
     834            break;
     835        }
     836    }
     837
     838    cs_debug("dvbapi: demux index: %d ca index: %d", demux[demux_id].demux_index, demux[demux_id].cadev_index);
    761839
    762840    //CA_PIDS for all streams
     
    800878            int ca_pmt_cmd_id = buffer[i + 5];
    801879            cs_debug("dvbapi: ca_pmt_cmd_id 0x%02x", ca_pmt_cmd_id);
    802             int descriptor_length=0;
     880            unsigned int descriptor_length=0;
    803881            for (j = 0; j < es_info_length - 1; j += descriptor_length + 2)
    804882            {
     
    832910
    833911    if (demux[demux_id].ECMpidcount>0) {
    834         pthread_create (&p3, NULL, thread_descrambling, (void *)demux_id);
     912        dvbapi_resort_ecmpids(demux_id);
     913        if (demux[demux_id].ECMpidcount>0)
     914            pthread_create (&p3, NULL, thread_descrambling, (void *)demux_id);
    835915    }
    836916
     
    842922void dvbapi_handlesockmsg (unsigned char *buffer, ssize_t len)
    843923{
    844     int i;
    845     unsigned int val, size;
     924    unsigned int val, size, i;
    846925
    847926    //cs_dump(buffer, len, "handlesockmsg:");
     
    872951            if ((3 + size + val) == len)
    873952                dvbapi_parse_capmt(buffer + 3 + size, val);
    874             else
     953            else {
    875954                cs_log("dvbapi: ca_pmt invalid length");
     955                cs_dump(buffer, len, "invalid length:");
     956            }
    876957            break;
    877958        case 0x3f:
     
    10101091    }
    10111092
     1093    char *ptr1, *ptr3;
     1094    //priority
     1095    for (i=0, ptr1=strtok(cfg->dvbapi_priority, ","); (i<20) && (ptr1); ptr1=strtok(NULL, ","))
     1096    {
     1097        unsigned long caid, prov;
     1098        if( (ptr3=strchr(trim(ptr1), ':')) )
     1099            *ptr3++='\0';
     1100        else
     1101            ptr3="";
     1102
     1103        if (((caid=a2i(ptr1, 2))|(prov=a2i(ptr3, 3))) < 0x10000)
     1104        {
     1105            prioritytab[i]=caid;
     1106            i++;
     1107        }
     1108    }
     1109    //ignore
     1110    for (i=0, ptr1=strtok(cfg->dvbapi_ignore, ","); (i<20) && (ptr1); ptr1=strtok(NULL, ","))
     1111    {
     1112        unsigned long caid, prov;
     1113        if( (ptr3=strchr(trim(ptr1), ':')) )
     1114            *ptr3++='\0';
     1115        else
     1116            ptr3="";
     1117
     1118        if (((caid=a2i(ptr1, 2))|(prov=a2i(ptr3, 3))) < 0x10000)
     1119        {
     1120            ignoretab[i]=caid;
     1121            i++;
     1122        }
     1123    }
    10121124
    10131125    pfd2[0].fd = fd_m2c;
     
    10511163    memcpy(cw_0, er->cw, 8);
    10521164    memcpy(cw_1, er->cw+8, 8);
    1053 
    1054     int cam_fd=0;
    10551165
    10561166    for (i=0;i<MAX_DEMUX;i++)
  • trunk/oscam-config.c

    r1148 r1181  
    542542static void chk_t_dvbapi(char *token, char *value)
    543543{
    544     if (!strcmp(token, "enabled"))  { cfg->dvbapi_enabled=atoi(value); return; }
    545     if (!strcmp(token, "au"))       { cfg->dvbapi_au=atoi(value); return; }
     544    if (!strcmp(token, "enabled"))  { cfg->dvbapi_enabled=atoi(value); return; }
     545    if (!strcmp(token, "au"))   { cfg->dvbapi_au=atoi(value); return; }
    546546    if (!strcmp(token, "boxtype"))  { strncpy(cfg->dvbapi_boxtype, value, sizeof(cfg->dvbapi_boxtype)-1); return; }
    547547    if (!strcmp(token, "user"))     { strncpy(cfg->dvbapi_usr, value, sizeof(cfg->dvbapi_usr)-1); return; }
     548        if (!strcmp(token, "priority")) { strncpy(cfg->dvbapi_priority, value, sizeof(cfg->dvbapi_priority)-1); return; }
     549        if (!strcmp(token, "ignore"))   { strncpy(cfg->dvbapi_ignore, value, sizeof(cfg->dvbapi_ignore)-1); return; }
    548550   
    549551    if (token[0] != '#')
Note: See TracChangeset for help on using the changeset viewer.