Changeset 1013


Ignore:
Timestamp:
12/31/09 11:27:37 (12 years ago)
Author:
landlord
Message:

Added HAVE_DVBAPI compile option for DVBAPI module, reviewed 'module-dvbapi.c'

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/globals.h

    r1000 r1013  
    568568  unsigned long locals[CS_MAXLOCALS];
    569569  //struct s_irdeto_quess *itab[0xff];
     570#ifdef HAVE_DVBAPI
    570571  int       dvbapi_enabled;
    571572  int       dvbapi_au;
     
    574575  char      dvbapi_ca[128];
    575576  char      dvbapi_socket[128];
     577#endif
    576578#ifdef CS_ANTICASC
    577579  char      ac_enabled;
     
    842844extern void module_gbox(struct s_module *);
    843845extern void module_cccam(struct s_module *);
     846#ifdef HAVE_DVBAPI
    844847extern void module_dvbapi(struct s_module *);
     848#endif
    845849extern struct timeval *chk_pending(struct timeb tp_ctimeout);
    846850#endif  // CS_GLOBALS
  • trunk/module-dvbapi.c

    r1001 r1013  
    1717 */
    1818
     19#ifdef HAVE_DVBAPI
     20
    1921#include <errno.h>
    2022#include <fcntl.h>
     
    3133#include "globals.h"
    3234
    33 #ifdef OS_LINUX
    34 
    3535#include <linux/dvb/ca.h>
    3636#include <linux/dvb/dmx.h>
    3737
    38 #define CADEV           "/dev/dvb/adapter0/ca1"
     38#define CADEV       "/dev/dvb/adapter0/ca1"
    3939#define DMXDEV      "/dev/dvb/adapter0/demux0"
    40 #define CAMDSOCKET      "/tmp/camd.socket"
     40#define CAMDSOCKET  "/tmp/camd.socket"
    4141
    4242#define BUFSIZE 1024
     
    4646{
    4747    unsigned char descriptor_tag        : 8;
    48     unsigned char descriptor_length     : 8;
    49     unsigned short ca_system_id         : 16;
     48    unsigned char descriptor_length     : 8;
     49    unsigned short ca_system_id     : 16;
    5050    unsigned char reserved          : 3;
    5151    unsigned short ca_pid           : 13;
     
    5555typedef struct ca_pmt_program_info_s
    5656{
    57     unsigned char ca_pmt_cmd_id         : 8;
     57    unsigned char ca_pmt_cmd_id     : 8;
    5858    ca_descriptor * descriptor;
    5959} __attribute__ ((packed)) ca_pmt_program_info;
     
    6161typedef struct ca_pmt_es_info_s
    6262{
    63     unsigned char stream_type           : 8;
     63    unsigned char stream_type       : 8;
    6464    unsigned char reserved          : 3;
    6565    unsigned short elementary_pid       : 13;
    66     unsigned char reserved2         : 4;
     66    unsigned char reserved2         : 4;
    6767    unsigned short es_info_length       : 12;
    6868    ca_pmt_program_info * program_info;
     
    7373    unsigned char ca_pmt_list_management    : 8;
    7474    unsigned short program_number       : 16;
    75     unsigned char reserved1         : 2;
     75    unsigned char reserved1         : 2;
    7676    unsigned char version_number        : 5;
    7777    unsigned char current_next_indicator    : 1;
    78     unsigned char reserved2         : 4;
     78    unsigned char reserved2         : 4;
    7979    unsigned short program_info_length  : 12;
    8080    ca_pmt_program_info * program_info;
     
    8282} __attribute__ ((packed)) ca_pmt;
    8383
    84 
    8584static int camfd = -1;
    8685static int dmxfd_ecm = -1;
     
    8887static int listenfd = -1;
    8988
    90 
    9189// if set descrabling
    9290unsigned short global_capid=0;
     
    112110int ECMpidcount=0;
    113111
    114 
    115112unsigned short dvbapi_get_single_ecm(int caid, int pid, unsigned char filt, unsigned char mask)
    116113{
     
    126123
    127124
    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;
    133130
    134131    if ((dmx_fd = open(DMXDEV, O_RDWR)) < 0)
    135132        return 0;
    136    
     133
    137134    if (ioctl(dmx_fd, DMX_SET_FILTER, &sFP) < 0)
    138135        return 0;
    139    
     136
    140137    len=read(dmx_fd, buf, BUFSIZE);
    141        
     138
    142139    close(dmx_fd);
    143140
     
    159156    return 0;
    160157}
    161 
    162158
    163159unsigned short dvbapi_parse_cat(unsigned short ca_system_id)
     
    181177    if ((dmx_fd = open(DMXDEV, O_RDWR)) < 0)
    182178        return 0;
    183    
     179
    184180    if (ioctl(dmx_fd, DMX_SET_FILTER, &sFP) < 0)
    185181        return 0;
    186    
     182
    187183    len=read(dmx_fd, buf, BUFSIZE);
    188        
     184
    189185    close(dmx_fd);
    190186
     
    201197}
    202198
    203 
    204 
    205199int dvbapi_stop_filter(void)
    206200{
    207201    //cs_log("Stopping filtering...");
    208202
    209     if (ioctl(dmxfd_ecm,DMX_STOP)<0)
    210         return 0;
    211 
    212     if (ioctl(dmxfd_emm,DMX_STOP)<0)
    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
    215209    return 1;
    216210}
    217211
    218 
    219212unsigned short dvbapi_parse_ecm(unsigned char *buf, int len)
    220213{
    221214    unsigned short provid;
    222215
    223     provid=(buf[3]<<8)|buf[4]; 
     216    provid=(buf[3]<<8)|buf[4];
    224217    cs_debug("Read %d bytes\tTable-id: %02x\tCA section length: %d\tProvider ID: %04x", len, buf[0], len ,provid);
    225        
     218
    226219    //calen=((buf[1]<<8)+buf[2])&0x0fff;
    227    
     220
    228221    /*
    229222    provid=b2i(2, buf+3);
    230    
     223
    231224    i=(buf[4]==0xD2) ? buf[5] + 2 : 0;  // skip d2 nano
    232225    if ((buf[5+i]==3) && ((buf[4+i]==0x90) || (buf[4+i]==0x40)))
     
    255248}
    256249
    257 
    258250int dvbapi_set_filter(int fd, int pid, unsigned char filt, unsigned char mask)
    259251{
     
    263255    memset(&sFP,0,sizeof(sFP));
    264256
    265     sFP.pid                 = pid;
    266     sFP.timeout             = 3000; //wait max 3 seconds for ECM message, should be repeated every 500ms
    267     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             perror(" Status");
    274         return 0;
    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    }
    276268
    277269    return 1;
    278270}
    279271
    280 
    281 
    282 void dvbapi_stop_descramble() {
    283 
     272void dvbapi_stop_descramble()
     273{
    284274    dvbapi_stop_filter();
    285275
     
    300290}
    301291
    302 
    303292void dvbapi_start_descramble(int caid, int capid) {
    304293
    305294    cs_log("Softcam: Start descrambling CAID: %04x", caid);
    306295
    307     if (!dvbapi_set_filter(dmxfd_ecm,capid,0x80,0xF0))  //filter on ECM pid and 0x80 or 0x81 (mask 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");
    309298
    310299    global_capid=capid;
     
    328317    ca_pid.pid = capid;
    329318    ca_pid.index = 0;
    330     if (ioctl(camfd, CA_SET_PID, &ca_pid)==-1) 
     319    if (ioctl(camfd, CA_SET_PID, &ca_pid)==-1)
    331320        cs_log("Softcam: Error SET_PID");
    332321}
    333322
    334323// from tuxbox camd
    335 int dvbapi_parse_capmt(const unsigned char *buffer, const unsigned int length)
     324int dvbapi_parse_capmt(unsigned char *buffer, const unsigned int length)
     325
    336326{
    337327    unsigned short i, j;
    338     ca_pmt * pmt;
     328    ca_pmt *pmt;
    339329    int n;
    340330
    341     //cs_dump(buffer,length,"capmt:");
     331    cs_dump(buffer, length, "capmt:");
    342332    pmt = (ca_pmt *) malloc(sizeof(ca_pmt));
    343333
     
    366356    ECMpidcount=0;
    367357
    368     //CA_PIDS für alle Streams
     358    //CA_PIDS fr alle Streams
    369359    if (pmt->program_info_length != 0)
    370360    {
     
    381371
    382372            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
    384374            if (buffer[i + 7] == 0x09) {
    385375                ECMpids[ECMpidcount].CA_PID=pmt->program_info->descriptor->ca_pid;          //add the PID
     
    394384
    395385
    396     //CA_PIDs für einzelne Streams
     386    //CA_PIDs fr einzelne Streams
    397387    //
    398388    pmt->es_info = (ca_pmt_es_info *) malloc(sizeof(ca_pmt_es_info));
     
    438428
    439429    dvbapi_stop_descramble();
    440        
     430
    441431    cs_log("Softcam: Found %d ECMpids in PMT", ECMpidcount);
    442432
     
    461451    //cs_dump(buffer, len, "handlesockmsg:");
    462452
    463     if (buffer[0] != 0x9F) { 
     453    if (buffer[0] != 0x9F) {
    464454        cs_log("handlesockmsg() unknown socket command: %02x", buffer[0]);
    465455        return;
     
    478468            val = (val << 8) | buffer[i + 1 + 3];
    479469        size++;
    480     } else 
     470    } else
    481471    {
    482472        val = buffer[3] & 0x7F;
    483473        size = 1;
    484474    }
    485    
     475
    486476    if (buffer[2] == 0x30) // ca_info_enq
    487477        cs_debug("ca_info!!");
     
    502492        cs_log("client: handlesockmsg() unknown command");
    503493        cs_dump(buffer, len, "unknown command:");
    504     }               
    505 }
    506 
    507 
     494    }
     495}
    508496
    509497static int dvbapi_init_listenfd() {
    510    
     498
    511499    int clilen;
    512500    struct sockaddr_un servaddr;
     
    519507    if ((unlink(cfg->dvbapi_socket) < 0) && (errno != ENOENT))
    520508        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)
    524512        return 0;
    525513    if (listen(listenfd, 5) < 0)
     
    528516    return 1;
    529517}
    530 
    531 
    532 
    533518
    534519void *thread_check_zap(void *arg) {
     
    543528        //cs_log("check zap");
    544529
    545        
     530
    546531
    547532        connfd = accept(listenfd, (struct sockaddr *)&servaddr, (socklen_t *)&clilen);
    548533
    549         if (connfd <= 0) //socket not available         
     534        if (connfd <= 0) //socket not available
    550535            break;
    551        
     536
    552537        len = read(connfd, buffer, sizeof(buffer));
    553538
     
    559544        // if message begins with an apdu_tag and is longer than three bytes
    560545        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) {
    562547                memcpy(buffer_cache_capmt, buffer, 8);
    563548                dvbapi_handlesockmsg(buffer, len);
    564             }                                                   
     549            }
    565550        }
    566551
    567         close(connfd);     
     552        close(connfd);
    568553
    569554    }
     
    571556}
    572557
    573 
    574558void *thread_check_dmx(void *arg) {
    575    
     559
    576560    struct pollfd pfd2[2];
    577561    int rc,len,i;
     
    591575            dvbapi_stop_filter();
    592576            break;
    593         }   
     577        }
    594578
    595579        for (i = 0; i < 2; i++) {
     
    598582                    if ((len = read(dmxfd_ecm, buffer, BUFSIZE)) <= 0)
    599583                        break;
    600        
     584
    601585                    if (len != (((buffer[1] & 0xf) << 8) | buffer[2]) + 3) //invaild CAT length
    602                         break;                 
    603            
     586                        break;
     587
    604588                    if (buffer[0] == 0x80 | buffer[0] == 0x81)
    605589                    {
    606590                        if (memcmp(buffer, buffer_cache_dmx, 12) != 0) {
    607591                            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"); }
    609593                        }
    610594                    }
     
    613597
    614598                if (pfd2[i].fd == dmxfd_emm) {
    615                     if ((len = read(dmxfd_emm, buffer, BUFSIZE)) <= 0) 
     599                    if ((len = read(dmxfd_emm, buffer, BUFSIZE)) <= 0)
    616600                        break;
    617        
     601
    618602                    if (len != (((buffer[1] & 0xf) << 8) | buffer[2]) + 3) //invaild CAT length
    619                         break;                 
     603                        break;
    620604
    621605                    /*
     
    626610                    if( (buffer[0]==0x83) && (buffer[7]==0x00) ) emmtype = 2; // G
    627611
    628                    
     612
    629613                    */
    630614                    cs_log("EMM Type: 0x%02x", buffer[0]);
     
    642626                    epg.l=len;
    643627                    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);
    645629
    646630                    do_emm(&epg);
     
    648632                }
    649633            }
    650         }       
     634        }
    651635
    652636    }
    653637    return 0;
    654638}
    655 
    656639
    657640int dvbapi_main_local()
     
    675658    }
    676659
    677     for (i=0;i<20;i++)      //clean ECMpids array
    678     { 
    679         ECMpids[i].CA_PID       = 0; 
    680         ECMpids[i].CA_System_ID = 0;
     660    for (i=0;i<20;i++)      //clean ECMpids array
     661    {
     662        ECMpids[i].CA_PID       = 0;
     663        ECMpids[i].CA_System_ID = 0;
    681664    }
    682665
     
    711694
    712695    while (1) {
    713         if (master_pid!=getppid()) { 
     696        if (master_pid!=getppid()) {
    714697            cs_log("master died");
    715698            cs_exit(0);
     
    724707            chk_dcw(fd_m2c);
    725708        }
    726        
     709
    727710    }
    728711    return 0;
    729712}
    730 
    731 
    732713
    733714static void dvbapi_send_dcw(ECM_REQUEST *er) {
     
    749730    {
    750731        ca_descr.index = 0;
    751         ca_descr.parity = 0;
     732        ca_descr.parity = 0;
    752733        memcpy(lastcw0,cw_0,8);
    753         memcpy(ca_descr.cw,cw_0,8); 
     734        memcpy(ca_descr.cw,cw_0,8);
    754735        if (ioctl(camfd,CA_SET_DESCR,&ca_descr) < 0) perror("CA_SET_DESCR");
    755736    }
    756737
    757738    if (memcmp(cw_1,lastcw1,8))
    758     {       
     739    {
    759740        ca_descr.index = 0;
    760         ca_descr.parity = 1;
     741        ca_descr.parity = 1;
    761742        memcpy(lastcw1,cw_1,8);
    762743        memcpy(ca_descr.cw,cw_1,8);
     
    766747}
    767748
    768 
    769 
    770749static void dvbapi_handler(int idx) {
    771     static struct s_auth *account=0; 
    772    
     750    static struct s_auth *account=0;
     751
    773752    if (cfg->dvbapi_enabled != 1) {
    774753        cs_log("client disabled");
     
    788767
    789768    int ok=0;
    790    
     769
    791770    if( !account )
    792771    {
     
    804783    cs_exit(0);
    805784
    806     return; 
     785    return;
    807786
    808787}
     
    822801}
    823802
    824 #else // non OS_LINUX
    825803void module_dvbapi(struct s_module *ph) {}
    826804
    827 #endif // OS_LINUX
    828 
     805#endif // HAVE_DVBAPI
  • trunk/oscam-config.c

    r1000 r1013  
    522522static void chk_t_dvbapi(char *token, char *value)
    523523{
     524#ifndef HAVE_DVBAPI
     525    fprintf(stderr, "Warning: OSCam compiled without DVBAPI Support\n");
     526#else
    524527    if (!strcmp(token, "enabled"))  { cfg->dvbapi_enabled=atoi(value); return; }
    525     if (!strcmp(token, "au"))       { cfg->dvbapi_au=atoi(value); return; }
     528    if (!strcmp(token, "au"))   { cfg->dvbapi_au=atoi(value); return; }
    526529    if (!strcmp(token, "demux"))    { strncpy(cfg->dvbapi_demux, value, sizeof(cfg->dvbapi_demux)-1); return; }
    527     if (!strcmp(token, "ca"))       { strncpy(cfg->dvbapi_ca, value, sizeof(cfg->dvbapi_ca)-1); return; }
     530    if (!strcmp(token, "ca"))   { strncpy(cfg->dvbapi_ca, value, sizeof(cfg->dvbapi_ca)-1); return; }
    528531    if (!strcmp(token, "socket"))   { strncpy(cfg->dvbapi_socket, value, sizeof(cfg->dvbapi_socket)-1); return; }
    529532    if (!strcmp(token, "user"))     { strncpy(cfg->dvbapi_usr, value, sizeof(cfg->dvbapi_usr)-1); return; }
    530533   
    531534    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
    533537}
    534538
  • trunk/oscam.c

    r1000 r1013  
    21742174           module_radegast,
    21752175           module_oscam_ser,
     2176#ifdef HAVE_DVBAPI
    21762177       module_dvbapi,
     2178#endif
    21772179           0
    21782180  };
Note: See TracChangeset for help on using the changeset viewer.