Changeset 10652


Ignore:
Timestamp:
Apr 24, 2015, 11:16:16 AM (5 years ago)
Author:
manio
Message:

dvbapi: add support for ECMINFO in network mode (bump proto to v2)

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/README.dvbapi_protocol

    r10389 r10652  
    1831839F 80 3f 04 83 02 00 <demux index>
    184184If <demux index> is 0xff, then it is parsed as a wildcard and all demuxers associated with the connection are stopped.
     185
     186
     187In protocol version 2 the new packet with ECM info data was introduced:
     188
     189-= DVBAPI_ECM_INFO =-
     190-----------------------------------------------------------------------
     191type/size                description
     192-----------------------------------------------------------------------
     193uint32_t                 operation code -> DVBAPI_ECM_INFO
     194uint8_t                  adapter index
     195uint16_t                 Service ID
     196uint16_t                 CAID
     197uint16_t                 PID
     198uint32_t                 Provider ID
     199uint32_t                 ECM time (ms)
     200uint8_t                  size of followed string (255 bytes max)
     201string                   reader name (string length should be max 255 bytes)
     202uint8_t                  size of followed string (255 bytes max)
     203string                   from - source name (string length should be max 255 bytes)
     204uint8_t                  size of followed string (255 bytes max)
     205string                   protocol name (string length should be max 255 bytes)
     206uint8_t                  hops (cccam & gbox; set to 0 otherwise)
  • trunk/module-dvbapi.c

    r10647 r10652  
    366366}
    367367
    368 int32_t dvbapi_net_send(uint32_t request, int32_t socket_fd, int32_t demux_index, uint32_t filter_number, unsigned char *data)
    369 {
    370     unsigned char packet[262];                                          //maximum possible packet size
     368void dvbapi_net_add_str(unsigned char *packet, int *size, const char *str)
     369{
     370    unsigned char *str_len = &packet[*size];                            //string length
     371    *size += 1;
     372
     373    *str_len = snprintf((char *) &packet[*size], DVBAPI_MAX_PACKET_SIZE - *size, "%s", str);
     374    *size += *str_len;
     375}
     376
     377int32_t dvbapi_net_send(uint32_t request, int32_t socket_fd, int32_t demux_index, uint32_t filter_number, unsigned char *data, struct s_client *client, ECM_REQUEST *er)
     378{
     379    unsigned char packet[DVBAPI_MAX_PACKET_SIZE];                       //maximum possible packet size
    371380    int32_t size = 0;
    372381
     
    406415            *info_len = snprintf((char *) &packet[size], sizeof(packet) - size, "OSCam v%s, build r%s (%s)", CS_VERSION, CS_SVN_VERSION, CS_TARGET);
    407416            size += *info_len;
     417            break;
     418        }
     419        case DVBAPI_ECM_INFO:
     420        {
     421            if (er->rc >= E_NOTFOUND)
     422                return 0;
     423
     424            int8_t hops = 0;
     425
     426            uint16_t sid = htons(er->srvid);                                  //service ID (program number)
     427            memcpy(&packet[size], &sid, 2);
     428            size += 2;
     429
     430            uint16_t caid = htons(er->caid);                                  //CAID
     431            memcpy(&packet[size], &caid, 2);
     432            size += 2;
     433
     434            uint16_t pid = htons(er->pid);                                    //PID
     435            memcpy(&packet[size], &pid, 2);
     436            size += 2;
     437
     438            uint32_t prid = htonl(er->prid);                                  //Provider ID
     439            memcpy(&packet[size], &prid, 4);
     440            size += 4;
     441
     442            uint32_t ecmtime = htonl(client->cwlastresptime);                 //ECM time
     443            memcpy(&packet[size], &ecmtime, 4);
     444            size += 4;
     445
     446            switch (er->rc)
     447            {
     448                case E_FOUND:
     449                    if (er->selected_reader)
     450                    {
     451                        dvbapi_net_add_str(packet, &size, er->selected_reader->label);                   //reader
     452                        if (is_network_reader(er->selected_reader))
     453                            dvbapi_net_add_str(packet, &size, er->selected_reader->device);          //from
     454                        else
     455                            dvbapi_net_add_str(packet, &size, "local");                              //from
     456                        dvbapi_net_add_str(packet, &size, reader_get_type_desc(er->selected_reader, 1)); //protocol
     457                        hops = er->selected_reader->currenthops;
     458                    }
     459                    break;
     460
     461                case E_CACHE1:
     462                    dvbapi_net_add_str(packet, &size, "Cache");       //reader
     463                    dvbapi_net_add_str(packet, &size, "cache1");      //from
     464                    dvbapi_net_add_str(packet, &size, "none");        //protocol
     465                    break;
     466
     467                case E_CACHE2:
     468                    dvbapi_net_add_str(packet, &size, "Cache");       //reader
     469                    dvbapi_net_add_str(packet, &size, "cache2");      //from
     470                    dvbapi_net_add_str(packet, &size, "none");        //protocol
     471                    break;
     472
     473                case E_CACHEEX:
     474                    dvbapi_net_add_str(packet, &size, "Cache");       //reader
     475                    dvbapi_net_add_str(packet, &size, "cache3");      //from
     476                    dvbapi_net_add_str(packet, &size, "none");        //protocol
     477                    break;
     478            }
     479
     480            packet[size++] = hops;                                            //hops
     481
    408482            break;
    409483        }
     
    577651            memcpy(sFP2.filter.mask, mask, 16);
    578652            if (cfg.dvbapi_listenport || cfg.dvbapi_boxtype == BOXTYPE_PC_NODMX)
    579                 ret = dvbapi_net_send(DVBAPI_DMX_SET_FILTER, demux[demux_id].socket_fd, demux_id, n, (unsigned char *) &sFP2);
     653                ret = dvbapi_net_send(DVBAPI_DMX_SET_FILTER, demux[demux_id].socket_fd, demux_id, n, (unsigned char *) &sFP2, NULL, NULL);
    580654            else
    581655                ret = dvbapi_ioctl(demux[demux_id].demux_fd[n].fd, DMX_SET_FILTER, &sFP2);
     
    860934        case DVBAPI_3:
    861935            if (cfg.dvbapi_listenport || cfg.dvbapi_boxtype == BOXTYPE_PC_NODMX)
    862                 retfilter = dvbapi_net_send(DVBAPI_DMX_STOP, demux[demux_index].socket_fd, demux_index, num, NULL);
     936                retfilter = dvbapi_net_send(DVBAPI_DMX_STOP, demux[demux_index].socket_fd, demux_index, num, NULL, NULL, NULL);
    863937            else
    864938                retfilter = dvbapi_ioctl(fd, DMX_STOP, NULL);
     
    13911465
    13921466                    if(cfg.dvbapi_boxtype == BOXTYPE_PC || cfg.dvbapi_boxtype == BOXTYPE_PC_NODMX)
    1393                         dvbapi_net_send(DVBAPI_CA_SET_PID, demux[demux_id].socket_fd, demux_id, -1 /*unused*/, (unsigned char *) &ca_pid2);
     1467                        dvbapi_net_send(DVBAPI_CA_SET_PID, demux[demux_id].socket_fd, demux_id, -1 /*unused*/, (unsigned char *) &ca_pid2, NULL, NULL);
    13941468                    else
    13951469                    {
     
    40574131
    40584132                                            // as a response we are sending our info to the client:
    4059                                             dvbapi_net_send(DVBAPI_SERVER_INFO, connfd, -1, -1, NULL);
     4133                                            dvbapi_net_send(DVBAPI_SERVER_INFO, connfd, -1, -1, NULL, NULL, NULL);
    40604134                                            break;
    40614135                                        }
     
    42124286
    42134287                if(cfg.dvbapi_boxtype == BOXTYPE_PC || cfg.dvbapi_boxtype == BOXTYPE_PC_NODMX)
    4214                     dvbapi_net_send(DVBAPI_CA_SET_DESCR, demux[demux_id].socket_fd, demux_id, -1 /*unused*/, (unsigned char *) &ca_descr);
     4288                    dvbapi_net_send(DVBAPI_CA_SET_DESCR, demux[demux_id].socket_fd, demux_id, -1 /*unused*/, (unsigned char *) &ca_descr, NULL, NULL);
    42154289                else
    42164290                {
     
    45214595
    45224596        FILE *ecmtxt = NULL;
    4523         if (!cfg.dvbapi_listenport && cfg.dvbapi_boxtype != BOXTYPE_PC_NODMX)
     4597        if (cfg.dvbapi_listenport && client_proto_version >= 2)
     4598            dvbapi_net_send(DVBAPI_ECM_INFO, demux[i].socket_fd, i, 0, NULL, client, er);
     4599        else if (!cfg.dvbapi_listenport && cfg.dvbapi_boxtype != BOXTYPE_PC_NODMX)
    45244600            ecmtxt = fopen(ECMINFO_FILE, "w");
    45254601        if(ecmtxt != NULL && er->rc < E_NOTFOUND)
     
    47714847            memcpy(sFP2.filter.mask, mask, 16);
    47724848            if (cfg.dvbapi_listenport || cfg.dvbapi_boxtype == BOXTYPE_PC_NODMX)
    4773                 ret = dvbapi_net_send(DVBAPI_DMX_SET_FILTER, demux[demux_index].socket_fd, demux_index, num, (unsigned char *) &sFP2);
     4849                ret = dvbapi_net_send(DVBAPI_DMX_SET_FILTER, demux[demux_index].socket_fd, demux_index, num, (unsigned char *) &sFP2, NULL, NULL);
    47744850            else
    47754851                ret = dvbapi_ioctl(fd, DMX_SET_FILTER, &sFP2);
  • trunk/module-dvbapi.h

    r10622 r10652  
    5050
    5151//constants used int socket communication:
    52 #define DVBAPI_PROTOCOL_VERSION         1
     52#define DVBAPI_PROTOCOL_VERSION         2
    5353
    5454#define DVBAPI_CA_SET_PID      0x40086f87
     
    6363#define DVBAPI_CLIENT_INFO     0xFFFF0001
    6464#define DVBAPI_SERVER_INFO     0xFFFF0002
     65#define DVBAPI_ECM_INFO        0xFFFF0003
     66
     67#define DVBAPI_MAX_PACKET_SIZE 262         //maximum possible packet size
    6568
    6669struct box_devices
Note: See TracChangeset for help on using the changeset viewer.