1 #define MODULE_LOG_PREFIX "dvbapi"
7 #include "module-dvbapi.h"
8 #include "module-cacheex.h"
9 #include "module-dvbapi-azbox.h"
10 #include "module-dvbapi-mca.h"
11 #include "module-dvbapi-coolapi.h"
12 #include "module-dvbapi-stapi.h"
13 #include "module-dvbapi-chancache.h"
14 #include "module-stat.h"
15 #include "module-streamrelay.h"
16 #include "oscam-chk.h"
17 #include "oscam-client.h"
18 #include "oscam-config.h"
19 #include "oscam-ecm.h"
20 #include "oscam-emm.h"
21 #include "oscam-files.h"
22 #include "oscam-net.h"
23 #include "oscam-reader.h"
24 #include "oscam-string.h"
25 #include "oscam-time.h"
26 #include "oscam-work.h"
27 #include "reader-irdeto.h"
28 #include "cscrypt/md5.h"
29 extern int32_t exit_oscam
;
31 #if defined (__CYGWIN__)
37 #define DN_MULTISHOT 0
40 static const char *get_stream_type_txt(uint8_t stream_type
)
44 case 0x00: return "invalid";
45 case 0x01: return "MPEG-1 video";
46 case 0x02: return "MPEG-2 video"; // MPEG-1 (constrained parameter) or MPEG-2 video
47 case 0x03: return "MPEG-1 audio"; // MP1, MP2, MP3
48 case 0x04: return "MPEG-2 audio"; // MP1, MP2, MP3
49 case 0x05: return "MPEG-2 private sections";
50 case 0x06: return "MPEG-2 PES private data"; // AC-3, Enhanced AC-3, AC-4, DTS(-HD) audio, subtitles, etc (DVB) (depends on descriptor)
51 case 0x07: return "MHEG data";
52 case 0x08: return "DSM-CC data";
53 case 0x09: return "MPEG-2 over ATM data";
54 case 0x0A: return "DSM-CC data";
55 case 0x0B: return "DSM-CC data";
56 case 0x0C: return "DSM-CC data";
57 case 0x0D: return "DSM-CC data";
58 case 0x0E: return "MPEG-2 auxiliary data";
59 case 0x0F: return "MPEG-2 audio"; // AAC
60 case 0x10: return "MPEG-4 video";
61 case 0x11: return "MPEG-4 audio"; // AAC, HE AAC and AAC v2
62 case 0x12: return "MPEG-4 PES data";
63 case 0x13: return "MPEG-4 data";
64 case 0x14: return "DSM-CC data";
65 case 0x15: return "MPEG-7 MetaData";
66 case 0x16: return "MPEG-7 MetaData";
67 case 0x17: return "MPEG-7 MetaData";
68 case 0x18: return "MPEG-7 MetaData";
69 case 0x19: return "MPEG-7 MetaData";
70 case 0x1A: return "MPEG-2 IPMP data";
71 case 0x1B: return "AVC video";
72 case 0x1C: return "MPEG-4 audio"; // DST, ALS, SLS
73 case 0x24: return "HEVC video";
74 case 0x25: return "HEVC subset video";
75 case 0x2D: return "MPEG-H 3D audio"; // main stream
76 case 0x2E: return "MPEG-H 3D audio"; // auxiliary stream
77 case 0x42: return "Chinese video";
78 case 0x7F: return "IPMP data";
79 case 0x81: return "AC-3 audio (ATSC)"; // with descriptor tag 0x81
80 case 0x86: return "SCTE 35 data";
81 case 0x87: return "enhanced AC-3 audio (ATSC)";
82 //case 0x88: return "DTS-HD audio (ATSC 2.0)"; // fixme: has ATSC 2.0 ever been used?
83 //case 0x??: return "AC-4 audio (ATSC 3.0)"; // fixme: add the actual value when it gets published
84 //case 0x??: return "MPEG-H 3D audio (ATSC 3.0)"; // fixme: add the actual value when it gets published
85 case 0xD1: return "BBC Dirac video";
86 case 0xEA: return "VC-1 video";
87 default: return "user private";
91 static const char *get_descriptor_tag_txt(uint8_t descriptor_tag
)
93 switch(descriptor_tag
)
95 // Valid in all MPEG contexts:
96 case 0x00: return "reserved";
97 case 0x01: return "forbidden";
98 case 0x02: return "video stream";
99 case 0x03: return "audio stream";
100 case 0x04: return "hierarchy";
101 case 0x05: return "registration";
102 case 0x06: return "data stream alignment";
103 case 0x07: return "target background grid";
104 case 0x08: return "video window";
105 case 0x09: return "CA";
106 case 0x0A: return "ISO 639 language";
107 case 0x0B: return "system clock";
108 case 0x0C: return "multiplex buffer utilization";
109 case 0x0D: return "copyright";
110 case 0x0E: return "maximum bitrate";
111 case 0x0F: return "private data indicator";
112 case 0x10: return "smoothing buffer";
113 case 0x11: return "STD";
114 case 0x12: return "IBP";
115 case 0x13: return "DSM-CC carousel identifier";
116 case 0x14: return "DSM-CC association tag";
117 case 0x15: return "DSM-CC deferred association tags";
118 case 0x17: return "DSM-CC NPT reference";
119 case 0x18: return "DSM-CC NPT endpoint";
120 case 0x19: return "DSM-CC stream mode";
121 case 0x1A: return "DSM-CC stream event";
122 case 0x1B: return "MPEG-4 video";
123 case 0x1C: return "MPEG-4 audio";
124 case 0x1D: return "IOD";
125 case 0x1E: return "SL";
126 case 0x1F: return "FMC";
127 case 0x20: return "External ES id";
128 case 0x21: return "MuxCode";
129 case 0x22: return "FmxBufferSize";
130 case 0x23: return "MultiplexBuffer";
131 case 0x24: return "Content labeling";
132 case 0x25: return "Metadata association";
133 case 0x26: return "Metadata";
134 case 0x27: return "Metadata STD";
135 case 0x28: return "AVC video";
136 case 0x29: return "MPEG-2 IPMP";
137 case 0x2A: return "AVC timing and HRD";
138 case 0x2B: return "MPEG-2 AAC Audio";
139 case 0x2C: return "FlexMuxTiming";
140 case 0x2D: return "MPEG-4 Text";
141 case 0x2E: return "MPEG-4 Audio Extension";
142 case 0x2F: return "Auxiliary Video Stream";
143 case 0x30: return "SVC Extension";
144 case 0x31: return "MVC Extension";
145 case 0x32: return "J2K Video";
146 case 0x33: return "MVC Operation Point";
147 case 0x34: return "MPEG-2 Stereoscopic Video Format";
148 case 0x35: return "Stereoscopic Program Info";
149 case 0x36: return "Stereoscopic Video Info";
150 case 0x37: return "Transport Profile";
151 case 0x38: return "HEVC Video";
152 case 0x3F: return "MPEG-2 Extension";
153 // Valid in DVB context:
154 case 0x45: return "VBI data";
155 case 0x46: return "VBI teletext";
156 case 0x51: return "mosaic";
157 case 0x52: return "stream identifier";
158 case 0x56: return "teletext";
159 case 0x59: return "subtitling"; // with stream type 0x06
160 case 0x5F: return "private data specifier";
161 case 0x60: return "service move";
162 case 0x65: return "scrambling";
163 case 0x66: return "data broadcast id";
164 case 0x6A: return "AC-3"; // with stream type 0x06
165 case 0x6B: return "ancillary data";
166 case 0x6F: return "application signalling";
167 case 0x70: return "adaptation field data";
168 case 0x74: return "related content";
169 case 0x78: return "ECM repetition rate";
170 case 0x7A: return "enhanced AC-3"; // with stream type 0x06
171 case 0x7B: return "DTS"; // with stream type 0x06
172 case 0x7C: return "AAC"; // with stream type 0x06
173 case 0x7D: return "XAIT location";
174 case 0x7F: return "DVB extension";
175 // Valid in ATSC context:
176 case 0x81: return "AC-3"; // with stream type 0x81
177 case 0xCC: return "enhanced AC-3"; // with stream type 0x87
178 default: return "user private";
182 static const char *get_extension_descriptor_txt(uint8_t extension_tag
)
184 switch(extension_tag
)
186 case 0x02: return "CP";
187 case 0x06: return "supplementary audio";
188 case 0x0E: return "DTS-HD"; // with stream type 0x06
189 case 0x0F: return "DTS Neural"; // with stream type 0x06
190 case 0x11: return "T2MI";
191 case 0x13: return "URI linkage";
192 case 0x15: return "AC-4"; // with stream type 0x06
193 case 0x18: return "protection message";
194 case 0x19: return "audio preselection";
195 case 0x20: return "TTML subtitling"; // with stream type 0x06
196 default: return "Undefined";
200 void flush_read_fd(int32_t demux_id
, int32_t num
, int fd
)
202 if(!cfg
.dvbapi_listenport
&& cfg
.dvbapi_boxtype
!= BOXTYPE_PC_NODMX
)
204 cs_log_dbg(D_DVBAPI
,"Demuxer %d flushing stale input data of filter %d (fd:%d)", demux_id
, num
+ 1, fd
);
216 while(select(fd
+ 1, &rd
, NULL
, NULL
, &t
) > 0)
218 if(read(fd
, buff
, 100)) { ; }
223 static int dvbapi_ioctl(int fd
, uint32_t request
, ...)
227 va_start(args
, request
);
228 if(!(cfg
.dvbapi_boxtype
== BOXTYPE_SAMYGO
))
230 void *param
= va_arg(args
, void *);
231 ret
= ioctl(fd
, request
, param
);
239 struct dmx_sct_filter_params
*sFP
= va_arg(args
, struct dmx_sct_filter_params
*);
240 //fix filter for samygo
241 //note: we only have 14 available filter bytes (instead of 16) on samygo
242 memmove(&sFP
->filter
.filter
[3], &sFP
->filter
.filter
[1], 13);
243 memset(&sFP
->filter
.filter
[1], 0, 2);
244 memmove(&sFP
->filter
.mask
[3], &sFP
->filter
.mask
[1], 13);
245 memset(&sFP
->filter
.mask
[1], 0, 2);
247 uint8_t packet
[sizeof(request
) + sizeof(struct dmx_sct_filter_params
)];
248 memcpy(&packet
, &request
, sizeof(request
));
249 memcpy(&packet
[sizeof(request
)], sFP
, sizeof(struct dmx_sct_filter_params
));
250 ret
= send(fd
, packet
, sizeof(packet
), 0);
254 case DMX_SET_FILTER1
:
256 cs_log("error: samygo does not support DMX_SET_FILTER1");
263 ret
= send(fd
, &request
, sizeof(request
), 0);
264 if(!(ret
== 1)){ ret
= 1; }
268 case CA_GET_DESCR_INFO
:
270 ca_descr_info_t
*ca_descr_info
= va_arg(args
, ca_descr_info_t
*);
272 uint8_t packet
[sizeof(request
) + sizeof(ca_descr_info_t
)];
273 memcpy(&packet
[0], &request
, sizeof(request
));
274 memcpy(&packet
[sizeof(request
)], ca_descr_info
, sizeof(ca_descr_info_t
));
275 // sending data to UDP
276 ret
= send(fd
, &packet
[0], sizeof(packet
), 0);
282 ca_descr_t
*ca_descr
= va_arg(args
, ca_descr_t
*);
284 uint8_t packet
[sizeof(request
) + sizeof(ca_descr_t
)];
285 memcpy(&packet
[0], &request
, sizeof(request
));
286 memcpy(&packet
[sizeof(request
)], ca_descr
, sizeof(ca_descr_t
));
287 // sending data to UDP
288 ret
= send(fd
, &packet
[0], sizeof(packet
), 0);
294 ca_pid_t
*ca_pid2
= va_arg(args
, ca_pid_t
*);
296 uint8_t packet
[sizeof(request
) + sizeof(ca_pid_t
)];
297 memcpy(&packet
[0], &request
, sizeof(request
));
298 memcpy(&packet
[sizeof(request
)], ca_pid2
, sizeof(ca_pid_t
));
299 // sending data to UDP
300 ret
= send(fd
, &packet
[0], sizeof(packet
), 0);
304 case CA_SET_DESCR_MODE
:
306 cs_log("error: samygo does not support CA_SET_DESCR_MODE");
311 case CA_SET_DESCR_DATA
:
313 cs_log("error: samygo does not support CA_SET_DESCR_DATA");
319 if(ret
> 0) // send() may return larger than 1
324 #if defined(__powerpc__)
325 // Old dm500 boxes (ppc old) are using broken kernel, se we need some fixups
334 // FIXME: Workaround for su980 bug
335 // See: https://board.streamboard.tv/?postid=533940
336 if(boxtype_is("su980"))
348 int32_t pausecam
= 0, disable_pmt_files
= 0;
350 DEMUXTYPE demux
[MAX_DEMUX
];
351 struct s_dvbapi_priority
*dvbapi_priority
;
352 struct s_client
*dvbapi_client
;
354 const char *boxdesc
[] = { "none", "dreambox", "duckbox", "ufs910", "dbox2", "ipbox", "ipbox-pmt",
355 "dm7000", "qboxhd", "coolstream", "neumo", "pc", "pc-nodmx", "samygo" };
357 // when updating devices[BOX_COUNT] make sure to update these index defines
358 #define BOX_INDEX_QBOXHD 0
359 #define BOX_INDEX_DREAMBOX_DVBAPI3 1
360 #define BOX_INDEX_COOLSTREAM 6
362 static const struct box_devices devices
[BOX_COUNT
] =
364 /* QboxHD (dvb-api-3)*/ { "/tmp/virtual_adapter/", "ca%d", "demux%d", "/tmp/camd.socket", DVBAPI_3
},
365 /* dreambox (dvb-api-3)*/ { "/dev/dvb/adapter%d/", "ca%d", "demux%d", "/tmp/camd.socket", DVBAPI_3
},
366 /* wetek (dvb-api-3)*/ { "/dev/dvb%d.", "ca%d", "demux%d", "/tmp/camd.socket", DVBAPI_3
},
367 /* dreambox (dvb-api-1)*/ { "/dev/dvb/card%d/", "ca%d", "demux%d", "/tmp/camd.socket", DVBAPI_1
},
368 /* neumo (dvb-api-1)*/ { "/dev/", "demuxapi", "demuxapi", "/tmp/camd.socket", DVBAPI_1
},
370 /* sh4 (stapi5)*/ { "/dev/stapi/", "stpti5_ioctl", "stpti5_ioctl", "/tmp/camd.socket", STAPI
},
372 /* sh4 (stapi)*/ { "/dev/stapi/", "stpti4_ioctl", "stpti4_ioctl", "/tmp/camd.socket", STAPI
},
374 /* coolstream*/ { "/dev/cnxt/", "null", "null", "/tmp/camd.socket", COOLAPI
},
377 static int32_t selected_box
= -1;
378 static int32_t selected_api
= -1;
379 static int32_t maxfilter
= MAX_FILTER
;
380 static int32_t dir_fd
= -1;
381 static uint16_t last_client_proto_version
= 0;
382 static char *last_client_name
= NULL
;
383 static uint32_t ca_descramblers_total
= 0; // total number of available descramblers in box
384 static uint32_t ca_descramblers_used
= 0; // total number of used descramblers during decoding
385 static int32_t ca_fd
[CA_MAX
]; // holds fd handle of all ca devices (0 not in use)
386 static LLIST
*ll_activestreampids
; // list of all enabled streampids on ca devices
387 static int32_t assoc_fd
[MAX_ASSOC_FD
]; // list of all client sockets
389 bool is_dvbapi_usr(char *usr
)
391 return streq(cfg
.dvbapi_usr
, usr
);
402 struct timeb time_started
;
405 static LLIST
*ll_emm_active_filter
;
406 static LLIST
*ll_emm_inactive_filter
;
407 static LLIST
*ll_emm_pending_filter
;
409 int32_t add_emmfilter_to_list(int32_t demux_id
, uint8_t *filter
, uint16_t caid
, uint32_t provid
, uint16_t emmpid
, int32_t num
, bool enable
)
411 if(!ll_emm_active_filter
)
413 ll_emm_active_filter
= ll_create("ll_emm_active_filter");
416 if(!ll_emm_inactive_filter
)
418 ll_emm_inactive_filter
= ll_create("ll_emm_inactive_filter");
421 if(!ll_emm_pending_filter
)
423 ll_emm_pending_filter
= ll_create("ll_emm_pending_filter");
426 struct s_emm_filter
*filter_item
;
427 if(!cs_malloc(&filter_item
, sizeof(struct s_emm_filter
)))
432 filter_item
->demux_id
= demux_id
;
433 memcpy(filter_item
->filter
, filter
, 32);
434 filter_item
->caid
= caid
;
435 filter_item
->provid
= provid
;
436 filter_item
->pid
= emmpid
;
437 filter_item
->num
= num
;
441 cs_ftime(&filter_item
->time_started
);
445 memset(&filter_item
->time_started
, 0, sizeof(filter_item
->time_started
));
450 ll_append(ll_emm_active_filter
, filter_item
);
451 cs_log_dbg(D_DVBAPI
, "Demuxer %d Filter %d added to active emmfilters (CAID %04X PROVID %06X EMMPID %04X)",
452 filter_item
->demux_id
, filter_item
->num
, filter_item
->caid
, filter_item
->provid
, filter_item
->pid
);
456 ll_append(ll_emm_pending_filter
, filter_item
);
457 cs_log_dbg(D_DVBAPI
, "Demuxer %d Filter added to pending emmfilters (CAID %04X PROVID %06X EMMPID %04X)",
458 filter_item
->demux_id
, filter_item
->caid
, filter_item
->provid
, filter_item
->pid
);
462 ll_append(ll_emm_inactive_filter
, filter_item
);
463 cs_log_dbg(D_DVBAPI
, "Demuxer %d Filter added to inactive emmfilters (CAID %04X PROVID %06X EMMPID %04X)",
464 filter_item
->demux_id
, filter_item
->caid
, filter_item
->provid
, filter_item
->pid
);
469 int32_t is_emmfilter_in_list_internal(LLIST
*ll
, uint8_t *filter
, uint16_t emmpid
, uint32_t provid
, uint16_t caid
)
471 struct s_emm_filter
*filter_item
;
475 itr
= ll_iter_create(ll
);
476 while((filter_item
= ll_iter_next(&itr
)) != NULL
)
478 if(!memcmp(filter_item
->filter
, filter
, 32) && (filter_item
->pid
== emmpid
)
479 && (filter_item
->provid
== provid
) && (filter_item
->caid
== caid
))
488 int32_t is_emmfilter_in_list(uint8_t *filter
, uint16_t emmpid
, uint32_t provid
, uint16_t caid
)
490 if(!ll_emm_active_filter
)
492 ll_emm_active_filter
= ll_create("ll_emm_active_filter");
495 if(!ll_emm_inactive_filter
)
497 ll_emm_inactive_filter
= ll_create("ll_emm_inactive_filter");
500 if(!ll_emm_pending_filter
)
502 ll_emm_pending_filter
= ll_create("ll_emm_pending_filter");
505 if(is_emmfilter_in_list_internal(ll_emm_active_filter
, filter
, emmpid
, provid
, caid
)
506 || is_emmfilter_in_list_internal(ll_emm_inactive_filter
, filter
, emmpid
, provid
, caid
)
507 || is_emmfilter_in_list_internal(ll_emm_pending_filter
, filter
, emmpid
, provid
, caid
))
514 struct s_emm_filter
*get_emmfilter_by_filternum_internal(LLIST
*ll
, int32_t demux_id
, uint32_t num
)
516 struct s_emm_filter
*filter
;
520 itr
= ll_iter_create(ll
);
521 while((filter
= ll_iter_next(&itr
)))
523 if(filter
->demux_id
== demux_id
&& filter
->num
== num
)
532 struct s_emm_filter
*get_emmfilter_by_filternum(int32_t demux_id
, uint32_t num
)
534 if(!ll_emm_active_filter
)
536 ll_emm_active_filter
= ll_create("ll_emm_active_filter");
539 if(!ll_emm_inactive_filter
)
541 ll_emm_inactive_filter
= ll_create("ll_emm_inactive_filter");
544 if(!ll_emm_pending_filter
)
546 ll_emm_pending_filter
= ll_create("ll_emm_pending_filter");
549 struct s_emm_filter
*emm_filter
= NULL
;
551 emm_filter
= get_emmfilter_by_filternum_internal(ll_emm_active_filter
, demux_id
, num
);
557 emm_filter
= get_emmfilter_by_filternum_internal(ll_emm_inactive_filter
, demux_id
, num
);
563 emm_filter
= get_emmfilter_by_filternum_internal(ll_emm_pending_filter
, demux_id
, num
);
572 int8_t remove_emmfilter_from_list_internal(LLIST
*ll
, int32_t demux_id
, uint16_t caid
, uint32_t provid
, uint16_t pid
, uint32_t num
)
574 struct s_emm_filter
*filter
;
579 itr
= ll_iter_create(ll
);
580 while((filter
= ll_iter_next(&itr
)))
582 if(filter
->demux_id
== demux_id
&& filter
->caid
== caid
&& filter
->provid
== provid
&& filter
->pid
== pid
&& filter
->num
== num
)
584 ll_iter_remove_data(&itr
);
592 void remove_emmfilter_from_list(int32_t demux_id
, uint16_t caid
, uint32_t provid
, uint16_t pid
, uint32_t num
)
594 if((ll_emm_active_filter
&& remove_emmfilter_from_list_internal(ll_emm_active_filter
, demux_id
, caid
, provid
, pid
, num
))
595 || (ll_emm_inactive_filter
&& remove_emmfilter_from_list_internal(ll_emm_inactive_filter
, demux_id
, caid
, provid
, pid
, num
))
596 || (ll_emm_pending_filter
&& remove_emmfilter_from_list_internal(ll_emm_pending_filter
, demux_id
, caid
, provid
, pid
, num
)))
602 void dvbapi_net_add_str(uint8_t *packet
, int *size
, const char *str
)
604 uint8_t *str_len
= &packet
[*size
]; // string length
606 *str_len
= snprintf((char *) &packet
[*size
], DVBAPI_MAX_PACKET_SIZE
- *size
, "%s", str
);
610 int32_t dvbapi_net_send(uint32_t request
, int32_t socket_fd
, uint32_t msgid
, int32_t demux_id
,
611 uint32_t filter_number
, uint8_t *data
, struct s_client
*client
, ECM_REQUEST
*er
, uint16_t client_proto_version
)
613 uint8_t packet
[DVBAPI_MAX_PACKET_SIZE
]; // maximum possible packet size
623 // preparing packet - header
624 // in old protocol client expect this first byte as adapter index,
625 // changed in the new protocol to be always after request type (opcode)
626 if(client_proto_version
<= 0)
628 packet
[size
++] = demux
[demux_id
].adapter_index
; // adapter index - 1 byte
630 else if(client_proto_version
>= 3)
632 packet
[size
++] = 0xa5; // message start
634 memcpy(&packet
[size
], &u32
, 4);
640 if(client_proto_version
>= 1)
644 memcpy(&packet
[size
], &u32
, 4);
647 // preparing packet - adapter index for proto >= 1
648 if((request
!= DVBAPI_SERVER_INFO
) && client_proto_version
>= 1)
650 packet
[size
++] = demux
[demux_id
].adapter_index
; // adapter index - 1 byte
656 case DVBAPI_SERVER_INFO
:
658 int16_t proto_version
= htons(DVBAPI_PROTOCOL_VERSION
); // our protocol version
659 char capabilities
[128];
660 memset(capabilities
, 0, sizeof(capabilities
));
661 memcpy(&packet
[size
], &proto_version
, 2);
663 uint8_t *info_len
= &packet
[size
]; // info string length
666 if(cfg
.dvbapi_extended_cw_api
== 1)
668 cs_strncat(capabilities
, ",e1mk", sizeof(capabilities
)); // extended cw, key follows mode - supports CSA, DES, AES128
671 if(cfg
.dvbapi_extended_cw_api
== 2)
673 cs_strncat(capabilities
, ",e2", sizeof(capabilities
)); // usage of DES algo signalled through PID index - CSA and DES only
676 *info_len
= snprintf((char *) &packet
[size
], sizeof(packet
) - size
, "OSCam v%s, build r%s (%s); %s",
677 CS_VERSION
, CS_SVN_VERSION
, CS_TARGET
, capabilities
+ 1);
683 case DVBAPI_ECM_INFO
:
685 if(er
->rc
>= E_NOTFOUND
)
692 uint16_t sid
= htons(er
->srvid
); // service ID (program number)
693 memcpy(&packet
[size
], &sid
, 2);
696 uint16_t caid
= htons(er
->caid
); // CAID
697 memcpy(&packet
[size
], &caid
, 2);
700 uint16_t pid
= htons(er
->pid
); // PID
701 memcpy(&packet
[size
], &pid
, 2);
704 uint32_t prid
= htonl(er
->prid
); // Provider ID
705 memcpy(&packet
[size
], &prid
, 4);
708 uint32_t ecmtime
= htonl(client
->cwlastresptime
); // ECM time
709 memcpy(&packet
[size
], &ecmtime
, 4);
712 dvbapi_net_add_str(packet
, &size
, get_cardsystem_desc_by_caid(er
->caid
)); // cardsystem name
717 if(er
->selected_reader
)
719 dvbapi_net_add_str(packet
, &size
, er
->selected_reader
->label
); // reader
720 if(is_network_reader(er
->selected_reader
))
722 dvbapi_net_add_str(packet
, &size
, er
->selected_reader
->device
); // from
726 dvbapi_net_add_str(packet
, &size
, "local"); // from
728 dvbapi_net_add_str(packet
, &size
, reader_get_type_desc(er
->selected_reader
, 1)); // protocol
729 hops
= er
->selected_reader
->currenthops
;
734 dvbapi_net_add_str(packet
, &size
, "Cache"); // reader
735 dvbapi_net_add_str(packet
, &size
, "cache1"); // from
736 dvbapi_net_add_str(packet
, &size
, "none"); // protocol
740 dvbapi_net_add_str(packet
, &size
, "Cache"); // reader
741 dvbapi_net_add_str(packet
, &size
, "cache2"); // from
742 dvbapi_net_add_str(packet
, &size
, "none"); // protocol
746 dvbapi_net_add_str(packet
, &size
, "Cache"); // reader
747 dvbapi_net_add_str(packet
, &size
, "cache3"); // from
748 dvbapi_net_add_str(packet
, &size
, "none"); // protocol
751 packet
[size
++] = hops
; // hops
755 case DVBAPI_CA_GET_DESCR_INFO
:
757 int sct_cadescr_info_size
= sizeof(ca_descr_info_t
);
758 if(client_proto_version
>= 1)
760 ca_descr_info_t
*cadescr_info
= (ca_descr_info_t
*) data
;
761 cadescr_info
->num
= htonl(cadescr_info
->num
);
762 cadescr_info
->type
= htonl(cadescr_info
->type
);
764 memcpy(&packet
[size
], data
, sct_cadescr_info_size
);
765 size
+= sct_cadescr_info_size
;
769 case DVBAPI_CA_SET_DESCR
:
771 int sct_cadescr_size
= sizeof(ca_descr_t
);
772 if(client_proto_version
>= 1)
774 ca_descr_t
*cadesc
= (ca_descr_t
*) data
;
775 cadesc
->index
= htonl(cadesc
->index
);
776 cadesc
->parity
= htonl(cadesc
->parity
);
778 memcpy(&packet
[size
], data
, sct_cadescr_size
);
779 size
+= sct_cadescr_size
;
783 case DVBAPI_CA_SET_PID
:
785 int sct_capid_size
= sizeof(ca_pid_t
);
786 if(client_proto_version
>= 1)
788 ca_pid_t
*capid
= (ca_pid_t
*) data
;
789 capid
->pid
= htonl(capid
->pid
);
790 capid
->index
= htonl(capid
->index
);
792 memcpy(&packet
[size
], data
, sct_capid_size
);
793 size
+= sct_capid_size
;
797 case DVBAPI_CA_SET_DESCR_MODE
:
799 int sct_cadescr_mode_size
= sizeof(ca_descr_mode_t
);
800 if(client_proto_version
>= 1)
802 ca_descr_mode_t
*cadesc_mode
= (ca_descr_mode_t
*) data
;
803 cadesc_mode
->index
= htonl(cadesc_mode
->index
);
804 cadesc_mode
->algo
= htonl(cadesc_mode
->algo
);
805 cadesc_mode
->cipher_mode
= htonl(cadesc_mode
->cipher_mode
);
807 memcpy(&packet
[size
], data
, sct_cadescr_mode_size
);
808 size
+= sct_cadescr_mode_size
;
812 case DVBAPI_CA_SET_DESCR_DATA
:
814 ca_descr_data_t
*cadesc_data
= (ca_descr_data_t
*) data
;
815 uint32_t length
= cadesc_data
->length
;
816 if(client_proto_version
>= 1)
818 cadesc_data
->index
= htonl(cadesc_data
->index
);
819 cadesc_data
->parity
= htonl(cadesc_data
->parity
);
820 cadesc_data
->data_type
= htonl(cadesc_data
->data_type
);
821 cadesc_data
->length
= htonl(cadesc_data
->length
);
823 memcpy(&packet
[size
], &cadesc_data
->index
, 4);
824 memcpy(&packet
[size
+ 4], &cadesc_data
->parity
, 4);
825 memcpy(&packet
[size
+ 8], &cadesc_data
->data_type
, 4);
826 memcpy(&packet
[size
+ 12], &cadesc_data
->length
, 4);
827 memcpy(&packet
[size
+ 16], cadesc_data
->data
, length
);
832 case DVBAPI_DMX_SET_FILTER
:
833 case DVBAPI_DMX_STOP
:
835 int32_t sct_filter_size
= sizeof(struct dmx_sct_filter_params
);
836 packet
[size
++] = demux_id
; // demux id - 1 byte
837 packet
[size
++] = filter_number
; // filter number - 1 byte
838 if(data
) // filter data when starting
840 if(client_proto_version
>= 1)
842 struct dmx_sct_filter_params
*fp
= (struct dmx_sct_filter_params
*)data
;
843 // adding all dmx_sct_filter_params structure fields
844 // one by one to avoid padding problems
845 uint16_t pid
= htons(fp
->pid
);
846 memcpy(&packet
[size
], &pid
, 2);
848 memcpy(&packet
[size
], fp
->filter
.filter
, 16);
850 memcpy(&packet
[size
], fp
->filter
.mask
, 16);
852 memcpy(&packet
[size
], fp
->filter
.mode
, 16);
854 uint32_t timeout
= htonl(fp
->timeout
);
855 memcpy(&packet
[size
], &timeout
, 4);
857 uint32_t flags
= htonl(fp
->flags
);
858 memcpy(&packet
[size
], &flags
, 4);
863 memcpy(&packet
[size
], data
, sct_filter_size
); // dmx_sct_filter_params struct
864 size
+= sct_filter_size
;
867 else // pid when stopping
869 if(client_proto_version
>= 1)
871 uint16_t pid
= htons(demux
[demux_id
].demux_fd
[filter_number
].pid
);
872 memcpy(&packet
[size
], &pid
, 2);
877 uint16_t pid
= demux
[demux_id
].demux_fd
[filter_number
].pid
;
878 packet
[size
++] = pid
>> 8;
879 packet
[size
++] = pid
& 0xff;
885 default: // unknown request
887 cs_log("ERROR: dvbapi_net_send: invalid request");
892 cs_log_dump_dbg(D_DVBAPI
, packet
, size
, "Sending packet to dvbapi client (fd=%d):", socket_fd
);
893 send(socket_fd
, &packet
, size
, MSG_DONTWAIT
);
894 // always returning success as the client could close socket
898 int32_t dvbapi_set_filter(int32_t demux_id
, int32_t api
, uint16_t pid
, uint16_t caid
, uint32_t provid
,
899 uint8_t *filt
, uint8_t *mask
, int32_t timeout
, int32_t pidindex
, int32_t type
, int8_t add_to_emm_list
)
901 int32_t ret
= -1, n
= -1, i
, filterfd
= -1;
903 for(i
= 0; i
< maxfilter
&& demux
[demux_id
].demux_fd
[i
].fd
> 0; i
++) { ; }
907 cs_log_dbg(D_DVBAPI
, "no free filter");
916 openxcas_set_caid(demux
[demux_id
].ECMpids
[pidindex
].CAID
);
917 openxcas_set_ecm_pid(pid
);
920 demux
[demux_id
].demux_fd
[n
].fd
= DUMMY_FD
;
921 demux
[demux_id
].demux_fd
[n
].pidindex
= pidindex
;
922 demux
[demux_id
].demux_fd
[n
].pid
= pid
;
923 demux
[demux_id
].demux_fd
[n
].caid
= caid
;
924 demux
[demux_id
].demux_fd
[n
].provid
= provid
;
925 demux
[demux_id
].demux_fd
[n
].type
= type
;
926 memcpy(demux
[demux_id
].demux_fd
[n
].filter
, filt
, 16); // copy filter to check later on if receiver delivered accordingly
927 memcpy(demux
[demux_id
].demux_fd
[n
].mask
, mask
, 16); // copy mask to check later on if receiver delivered accordingly
935 if(cfg
.dvbapi_listenport
|| cfg
.dvbapi_boxtype
== BOXTYPE_PC_NODMX
)
937 ret
= filterfd
= DUMMY_FD
;
941 ret
= filterfd
= dvbapi_open_device(0, demux
[demux_id
].demux_index
, demux
[demux_id
].adapter_index
);
946 return ret
; // return if device cant be opened!
949 struct dmx_sct_filter_params sFP2
;
950 memset(&sFP2
, 0, sizeof(sFP2
));
952 sFP2
.timeout
= timeout
;
953 sFP2
.flags
= DMX_IMMEDIATE_START
;
955 if(cfg
.dvbapi_boxtype
== BOXTYPE_NEUMO
)
957 //DeepThought: on dgs/cubestation and neumo images, perhaps others
958 //the following code is needed to descramble
959 sFP2
.filter
.filter
[0] = filt
[0];
960 sFP2
.filter
.mask
[0] = mask
[0];
961 sFP2
.filter
.filter
[1] = 0;
962 sFP2
.filter
.mask
[1] = 0;
963 sFP2
.filter
.filter
[2] = 0;
964 sFP2
.filter
.mask
[2] = 0;
965 memcpy(sFP2
.filter
.filter
+ 3, filt
+ 1, 16 - 3);
966 memcpy(sFP2
.filter
.mask
+ 3, mask
+ 1, 16 - 3);
968 //DeepThought: in the drivers of the dgs/cubestation and neumo images,
969 //dvbapi 1 and 3 are somehow mixed. In the kernel drivers, the DMX_SET_FILTER
970 //ioctl expects to receive a dmx_sct_filter_params structure (DVBAPI 3) but
971 //due to a bug its sets the "positive mask" wrongly (they should be all 0).
972 //On the other hand, the DMX_SET_FILTER1 ioctl also uses the dmx_sct_filter_params
973 //structure, which is incorrect (it should be dmxSctFilterParams).
974 //The only way to get it right is to call DMX_SET_FILTER1 with the argument
975 //expected by DMX_SET_FILTER. Otherwise, the timeout parameter is not passed correctly.
976 ret
= dvbapi_ioctl(filterfd
, DMX_SET_FILTER1
, &sFP2
);
980 memcpy(sFP2
.filter
.filter
, filt
, 16);
981 memcpy(sFP2
.filter
.mask
, mask
, 16);
982 if(cfg
.dvbapi_listenport
|| cfg
.dvbapi_boxtype
== BOXTYPE_PC_NODMX
)
984 ret
= dvbapi_net_send(DVBAPI_DMX_SET_FILTER
,
985 demux
[demux_id
].socket_fd
,
992 demux
[demux_id
].client_proto_version
);
996 ret
= dvbapi_ioctl(filterfd
, DMX_SET_FILTER
, &sFP2
);
1004 ret
= filterfd
= dvbapi_open_device(0, demux
[demux_id
].demux_index
, demux
[demux_id
].adapter_index
);
1005 if(ret
< 0) { return ret
; } // return if device cant be opened!
1007 struct dmxSctFilterParams sFP1
;
1008 memset(&sFP1
, 0, sizeof(sFP1
));
1010 sFP1
.timeout
= timeout
;
1011 sFP1
.flags
= DMX_IMMEDIATE_START
;
1012 memcpy(sFP1
.filter
.filter
, filt
, 16);
1013 memcpy(sFP1
.filter
.mask
, mask
, 16);
1014 ret
= dvbapi_ioctl(filterfd
, DMX_SET_FILTER1
, &sFP1
);
1018 #if defined(WITH_STAPI) || defined(WITH_STAPI5)
1021 ret
= filterfd
= stapi_set_filter(demux_id
, pid
, filt
, mask
, n
, demux
[demux_id
].pmt_file
);
1024 ret
= -1; // error setting filter!
1030 #if defined WITH_COOLAPI || defined WITH_COOLAPI2
1033 ret
= filterfd
= coolapi_open_device(demux
[demux_id
].demux_index
, demux_id
);
1036 ret
= coolapi_set_filter(filterfd
, n
, pid
, filt
, mask
, type
);
1050 if(ret
!= -1) // filter set successful
1052 // only register if filter was set successful
1053 demux
[demux_id
].demux_fd
[n
].fd
= filterfd
;
1054 demux
[demux_id
].demux_fd
[n
].pidindex
= pidindex
;
1055 demux
[demux_id
].demux_fd
[n
].pid
= pid
;
1056 demux
[demux_id
].demux_fd
[n
].caid
= caid
;
1057 demux
[demux_id
].demux_fd
[n
].provid
= provid
;
1058 demux
[demux_id
].demux_fd
[n
].type
= type
;
1060 // copy filter and mask to check later on if receiver delivered accordingly
1061 memcpy(demux
[demux_id
].demux_fd
[n
].filter
, filt
, 16);
1062 memcpy(demux
[demux_id
].demux_fd
[n
].mask
, mask
, 16);
1064 cs_log_dbg(D_DVBAPI
, "Demuxer %d Filter %d started successfully (caid %04X provid %06X pid %04X)",
1065 demux_id
, n
+ 1, caid
, provid
, pid
);
1067 if(type
== TYPE_EMM
&& add_to_emm_list
)
1069 add_emmfilter_to_list(demux_id
, filt
, caid
, provid
, pid
, n
+ 1, true);
1074 cs_log("ERROR: Could not start demux filter (api: %d errno=%d %s)", selected_api
, errno
, strerror(errno
));
1080 * Get number of available descramblers from box. On success, it stores result on
1081 * global variable "ca_descramblers_total". On failure, it uses a safe default value.
1083 static int32_t dvbapi_get_descrambler_info(void)
1085 // In enigma2 all ca devices are listed under adapter0. In addition we only
1086 // need to ask one ca device to get the total number of descramblers. In
1087 // PC installations, there are no ca devices, so we use a predefined value.
1089 if(cfg
.dvbapi_boxtype
== BOXTYPE_PC
|| cfg
.dvbapi_boxtype
== BOXTYPE_PC_NODMX
)
1091 ca_descramblers_total
= INDEX_MAX_NET
;
1092 return 1; // nothing else to do for PCs
1095 int32_t fd
= 0, ca_offset
= 0;
1096 char device_path
[128], device_path2
[128];
1097 struct ca_descr_info descr_info
;
1098 memset(&descr_info
, 0, sizeof(descr_info
));
1100 // Use a safe default in case we fail to get the exact number
1101 ca_descramblers_total
= INDEX_MAX_LOCAL
;
1103 if(cfg
.dvbapi_boxtype
== BOXTYPE_DUCKBOX
||
1104 cfg
.dvbapi_boxtype
== BOXTYPE_DBOX2
||
1105 cfg
.dvbapi_boxtype
== BOXTYPE_UFS910
)
1110 // Ask device for exact number of ca descramblers
1111 snprintf(device_path2
, sizeof(device_path2
), devices
[selected_box
].ca_device
, ca_offset
);
1112 snprintf(device_path
, sizeof(device_path
), devices
[selected_box
].path
, 0);
1114 if (!cs_strncat(device_path
, device_path2
, sizeof(device_path
)))
1117 if((fd
= open(device_path
, O_RDWR
| O_NONBLOCK
)) < 0)
1119 cs_log("ERROR: Can't open device %s (errno=%d %s)", device_path
, errno
, strerror(errno
));
1123 if(dvbapi_ioctl(fd
, CA_GET_DESCR_INFO
, &descr_info
) < 0)
1125 cs_log_dbg(D_DVBAPI
,"ERROR: ioctl(CA_GET_DESCR_INFO): %s", strerror(errno
));
1130 cs_log("ERROR: Can't close device %s (errno=%d %s)", device_path
, errno
, strerror(errno
));
1133 // We got a valid response from device (count the ECD type only)
1134 if(descr_info
.num
> 0 && (descr_info
.type
& 1))
1136 ca_descramblers_total
= descr_info
.num
;
1137 cs_log("Detected %s device, total available descramblers: %d", device_path
, ca_descramblers_total
);
1144 static int32_t dvbapi_detect_api(void)
1146 #if defined WITH_COOLAPI || defined WITH_COOLAPI2
1147 selected_api
= COOLAPI
;
1148 selected_box
= BOX_INDEX_COOLSTREAM
;
1149 disable_pmt_files
= 1;
1150 cfg
.dvbapi_listenport
= 0;
1151 cs_log("Detected Coolstream API");
1154 if(cfg
.dvbapi_boxtype
== BOXTYPE_PC_NODMX
|| cfg
.dvbapi_boxtype
== BOXTYPE_PC
)
1156 selected_api
= DVBAPI_3
;
1157 selected_box
= BOX_INDEX_DREAMBOX_DVBAPI3
;
1158 if(cfg
.dvbapi_listenport
)
1160 cs_log("Using TCP listen socket, API forced to DVBAPIv3 (%d), userconfig boxtype: %d",
1161 selected_api
, cfg
.dvbapi_boxtype
);
1165 cs_log("Using %s listen socket, API forced to DVBAPIv3 (%d), userconfig boxtype: %d",
1166 devices
[selected_box
].cam_socket_path
, selected_api
, cfg
.dvbapi_boxtype
);
1170 else if(cfg
.dvbapi_boxtype
== BOXTYPE_SAMYGO
)
1172 selected_api
= DVBAPI_3
;
1173 selected_box
= BOX_INDEX_QBOXHD
;
1174 cfg
.dvbapi_listenport
= 0;
1175 disable_pmt_files
= 1;
1176 cs_log("Using SamyGO dvbapi v0.1");
1181 cfg
.dvbapi_listenport
= 0;
1184 int32_t i
= 0, n
= 0, devnum
= -1, dmx_fd
= 0, filtercount
= 0;
1185 char device_path
[128], device_path2
[128];
1186 static LLIST
*ll_max_fd
;
1187 ll_max_fd
= ll_create("ll_max_fd");
1194 struct s_open_fd
*open_fd
;
1196 while(i
< BOX_COUNT
)
1200 snprintf(device_path2
, sizeof(device_path2
), devices
[i
].demux_device
, 0);
1201 snprintf(device_path
, sizeof(device_path
), devices
[i
].path
, n
);
1205 if (cs_strncat(device_path
, device_path2
, sizeof(device_path
)))
1207 while((dmx_fd
= open(device_path
, O_RDWR
| O_NONBLOCK
)) > 0 && filtercount
< MAX_FILTER
)
1210 if(!cs_malloc(&open_fd
, sizeof(struct s_open_fd
)))
1215 open_fd
->fd
= dmx_fd
;
1216 ll_append(ll_max_fd
, open_fd
);
1222 itr
= ll_iter_create(ll_max_fd
);
1223 while((open_fd
= ll_iter_next(&itr
)))
1225 dmx_fd
= open_fd
->fd
;
1230 while(close(dmx_fd
) < 0);
1231 ll_iter_remove_data(&itr
);
1234 selected_api
= devices
[devnum
].api
;
1235 selected_box
= devnum
;
1237 if(cfg
.dvbapi_boxtype
== BOXTYPE_NEUMO
)
1239 selected_api
= DVBAPI_3
; //DeepThought
1242 #if defined(WITH_STAPI) || defined(WITH_STAPI5)
1243 if(selected_api
== STAPI
&& stapi_open() == 0)
1245 cs_log("ERROR: stapi: setting up stapi failed.");
1249 maxfilter
= filtercount
;
1250 cs_log("Detected %s Api: %d, userconfig boxtype: %d maximum number of filters is %d (oscam limit is %d)",
1251 device_path
, selected_api
, cfg
.dvbapi_boxtype
, filtercount
, MAX_FILTER
);
1253 #ifdef MODULE_STREAMRELAY
1254 // Log enabled demuxer fix
1255 if(cfg
.dvbapi_demuxer_fix
)
1257 cs_log("Demuxer fix enabled, try fixing stream relay audio/video sync...");
1262 // try at least 8 adapters
1263 if((strchr(devices
[i
].path
, '%') != NULL
) && (n
< 8))
1272 } while(n
!= 0); // n is set to 0 again if 8 adapters are tried!
1276 break; // check if box detected
1280 ll_destroy(&ll_max_fd
);
1290 static int32_t dvbapi_read_device(int32_t dmx_fd
, uint8_t *buf
, uint32_t length
)
1294 struct pollfd pfd
[1];
1297 pfd
[0].events
= (POLLIN
| POLLPRI
);
1299 while(count
< length
)
1301 if(poll(pfd
, 1, 0)) // fd ready for reading?
1303 if(pfd
[0].revents
& (POLLIN
| POLLPRI
)) // is there data to read?
1305 readed
= read(dmx_fd
, &buf
[count
], length
-count
);
1306 if(readed
< 0) // error occured while reading
1308 if(errno
== EINTR
|| errno
== EAGAIN
) // try again in case of interrupt
1313 cs_log("ERROR: Read error on fd %d (errno=%d %s)", dmx_fd
, errno
, strerror(errno
));
1314 return (errno
== EOVERFLOW
? 0 : -1);
1317 if(readed
> 0) // successful read
1322 if(readed
== 0 && count
> 0) // nothing to read left
1329 return -1; // other events than pollin/pri means bad news -> abort!
1337 cs_log_dump_dbg(D_TRACE
, buf
, count
, "Received:");
1341 int32_t dvbapi_open_device(int32_t type
, int32_t num
, int32_t adapter
)
1343 int32_t dmx_fd
, ret
;
1344 int32_t ca_offset
= 0;
1345 char device_path
[128], device_path2
[128];
1347 if(cfg
.dvbapi_listenport
|| cfg
.dvbapi_boxtype
== BOXTYPE_PC_NODMX
)
1354 snprintf(device_path2
, sizeof(device_path2
), devices
[selected_box
].demux_device
, num
);
1355 snprintf(device_path
, sizeof(device_path
), devices
[selected_box
].path
, adapter
);
1357 if (!cs_strncat(device_path
, device_path2
, sizeof(device_path
)))
1363 if(cfg
.dvbapi_boxtype
== BOXTYPE_DUCKBOX
1364 || cfg
.dvbapi_boxtype
== BOXTYPE_DBOX2
1365 || cfg
.dvbapi_boxtype
== BOXTYPE_UFS910
)
1370 if(cfg
.dvbapi_boxtype
== BOXTYPE_QBOXHD
1371 || cfg
.dvbapi_boxtype
== BOXTYPE_PC
1372 || cfg
.dvbapi_boxtype
== BOXTYPE_SAMYGO
)
1377 snprintf(device_path2
, sizeof(device_path2
), devices
[selected_box
].ca_device
, num
+ ca_offset
);
1378 snprintf(device_path
, sizeof(device_path
), devices
[selected_box
].path
, adapter
);
1380 if (!cs_strncat(device_path
, device_path2
, sizeof(device_path
)))
1385 if(cfg
.dvbapi_boxtype
== BOXTYPE_SAMYGO
)
1389 struct sockaddr_un saddr
;
1390 memset(&saddr
, 0, sizeof(saddr
));
1391 saddr
.sun_family
= AF_UNIX
;
1392 cs_strncpy(saddr
.sun_path
, device_path
, sizeof(saddr
.sun_path
));
1393 dmx_fd
= socket(AF_UNIX
, SOCK_STREAM
, 0);
1394 ret
= connect(dmx_fd
, (struct sockaddr
*)&saddr
, sizeof(saddr
));
1402 int32_t udp_port
= 9000;
1403 struct sockaddr_in saddr
;
1404 memset(&saddr
, 0, sizeof(saddr
));
1405 saddr
.sin_family
= AF_INET
;
1406 saddr
.sin_port
= htons(udp_port
+ adapter
);
1407 saddr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
1408 dmx_fd
= socket(PF_INET
, SOCK_DGRAM
, IPPROTO_UDP
);
1409 set_nonblock(dmx_fd
, true);
1410 ret
= connect(dmx_fd
, (struct sockaddr
*) &saddr
, sizeof(saddr
));
1415 cs_log_dbg(D_DVBAPI
, "NET DEVICE open (port = %d) fd %d", udp_port
+ adapter
, dmx_fd
);
1424 dmx_fd
= ret
= open(device_path
, O_RDWR
| O_NONBLOCK
);
1429 cs_log("ERROR: Can't open device %s (errno=%d %s)", device_path
, errno
, strerror(errno
));
1432 cs_log_dbg(D_DVBAPI
, "Open device %s (fd %d)", device_path
, dmx_fd
);
1436 uint16_t tunemm_caid_map(uint8_t direct
, uint16_t caid
, uint16_t srvid
)
1439 struct s_client
*cl
= cur_client();
1440 TUNTAB
*ttab
= &cl
->ttab
;
1449 for(i
= 0; i
< ttab
->ttnum
; i
++)
1451 if(caid
== ttab
->ttdata
[i
].bt_caidto
&&
1452 (srvid
== ttab
->ttdata
[i
].bt_srvid
|| ttab
->ttdata
[i
].bt_srvid
== 0xFFFF || !ttab
->ttdata
[i
].bt_srvid
))
1454 return ttab
->ttdata
[i
].bt_caidfrom
;
1460 for(i
= 0; i
< ttab
->ttnum
; i
++)
1462 if(caid
== ttab
->ttdata
[i
].bt_caidfrom
&&
1463 (srvid
== ttab
->ttdata
[i
].bt_srvid
|| ttab
->ttdata
[i
].bt_srvid
== 0xFFFF || !ttab
->ttdata
[i
].bt_srvid
))
1465 return ttab
->ttdata
[i
].bt_caidto
;
1472 int32_t dvbapi_stop_filter(int32_t demux_id
, int32_t type
, uint32_t msgid
)
1474 #if defined(WITH_COOLAPI) || defined(WITH_COOLAPI2)
1475 // We prevented PAT and PMT from starting, so lets don't close them either.
1476 if(type
== TYPE_PAT
|| type
== TYPE_PMT
)
1482 int32_t g
, error
= 0;
1484 // just stop them all, we don't want to risk leaving
1485 // any stale filter running due to lowering of maxfilters
1486 for(g
= 0; g
< MAX_FILTER
; g
++)
1488 if(demux
[demux_id
].demux_fd
[g
].type
== type
)
1490 if(dvbapi_stop_filternum(demux_id
, g
, msgid
) == -1)
1496 return !error
; // on error return 0, all ok 1
1499 int32_t dvbapi_stop_filternum(int32_t demux_id
, int32_t num
, uint32_t msgid
)
1501 int32_t retfilter
= -1, retfd
= -1, fd
= demux
[demux_id
].demux_fd
[num
].fd
, try = 0;
1505 demux
[demux_id
].demux_fd
[num
].type
= 0;
1506 demux
[demux_id
].demux_fd
[num
].fd
= 0;
1507 return 1; // all ok!
1521 cs_log_dbg(D_DVBAPI
, "Demuxer %d stop filter %d try %d (fd: %d api: %d, caid: %04X, provid: %06X, %spid: %04X)",
1527 demux
[demux_id
].demux_fd
[num
].caid
,
1528 demux
[demux_id
].demux_fd
[num
].provid
,
1529 demux
[demux_id
].demux_fd
[num
].type
== TYPE_ECM
? "ecm" : "emm",
1530 demux
[demux_id
].demux_fd
[num
].pid
);
1532 switch(selected_api
)
1536 if(cfg
.dvbapi_listenport
|| cfg
.dvbapi_boxtype
== BOXTYPE_PC_NODMX
)
1538 retfilter
= dvbapi_net_send(DVBAPI_DMX_STOP
,
1539 demux
[demux_id
].socket_fd
,
1546 demux
[demux_id
].client_proto_version
);
1550 retfilter
= dvbapi_ioctl(fd
, DMX_STOP
, NULL
);
1557 retfilter
= dvbapi_ioctl(fd
, DMX_STOP
, NULL
);
1561 #if defined(WITH_STAPI) || defined(WITH_STAPI5)
1564 retfilter
= stapi_remove_filter(demux_id
, num
, demux
[demux_id
].pmt_file
);
1565 if(retfilter
!= 1) // stapi returns 0 for error, 1 for all ok
1572 #if defined WITH_COOLAPI || defined WITH_COOLAPI2
1575 retfilter
= coolapi_remove_filter(fd
, num
);
1578 retfd
= coolapi_close_device(fd
);
1587 if(errno
== 9) // no error on bad file descriptor
1591 } while(retfilter
< 0 && try < 10);
1593 #if !defined WITH_COOLAPI && !defined WITH_COOLAPI2 // no fd close for coolapi and stapi, all others do close fd!
1604 // on bad filterfd dont try to close!
1605 if(!cfg
.dvbapi_listenport
&& cfg
.dvbapi_boxtype
!= BOXTYPE_PC_NODMX
&& errno
!= 9)
1607 if(selected_api
== STAPI
)
1609 retfd
= 0; // stapi closes its own filter fd!
1613 // flush filter input buffer in attempt to avoid overflow receivers internal buffer
1614 flush_read_fd(demux_id
, num
, fd
);
1618 retfd
= 0; // no error on bad file descriptor
1627 } while(retfd
< 0 && try < 10);
1632 return 1; // filter was already killed!
1635 if(retfilter
< 0) // error on remove filter
1637 cs_log("ERROR: Demuxer %d could not stop Filter %d (fd:%d api:%d errno=%d %s)",
1638 demux_id
, num
+ 1, fd
, selected_api
, errno
, strerror(errno
));
1642 if(retfd
< 0) // error on close filter fd
1644 cs_log("ERROR: Demuxer %d could not close fd of Filter %d (fd=%d api:%d errno=%d %s)",
1645 demux_id
, num
+ 1, fd
, selected_api
, errno
, strerror(errno
));
1649 // code below runs only if nothing has gone wrong
1650 if(demux
[demux_id
].demux_fd
[num
].type
== TYPE_ECM
) // ecm filter stopped: reset index!
1652 int32_t oldpid
= demux
[demux_id
].demux_fd
[num
].pidindex
;
1653 int32_t curpid
= demux
[demux_id
].pidindex
;
1655 // workaround: below dont run on stapi since it handles it own pids...
1656 // stapi need to be better integrated in oscam dvbapi.
1657 if(selected_api
!= STAPI
)
1660 for(z
= 0; z
< MAX_STREAM_INDICES
; z
++)
1662 uint32_t idx
= demux
[demux_id
].ECMpids
[oldpid
].index
[z
];
1663 demux
[demux_id
].ECMpids
[oldpid
].index
[z
] = INDEX_INVALID
;
1665 if(idx
!= INDEX_INVALID
) // if in use
1668 for(i
= 0; i
< demux
[demux_id
].STREAMpidcount
; i
++)
1672 // check streams of old disabled ecmpid
1673 if(!demux
[demux_id
].ECMpids
[oldpid
].streams
1674 || ((demux
[demux_id
].ECMpids
[oldpid
].streams
& (1 << i
)) == (uint
) (1 << i
)))
1676 // check if new ecmpid is using same streams
1677 if(curpid
!= -1 && (!demux
[demux_id
].ECMpids
[curpid
].streams
1678 || ((demux
[demux_id
].ECMpids
[curpid
].streams
& (1 << i
)) == (uint
) (1 << i
))))
1680 continue; // found same stream on old and new ecmpid -> skip! (and leave it enabled!)
1682 int32_t pidtobestopped
= demux
[demux_id
].STREAMpids
[i
];
1683 int32_t j
, k
, otherdemuxpid
;
1684 uint32_t otherdemuxidx
;
1686 for(j
= 0; j
< MAX_DEMUX
; j
++) // check other demuxers for same streampid with same index
1688 if(demux
[j
].program_number
== 0 || demux_id
== j
|| demux
[j
].ca_mask
!= demux
[demux_id
].ca_mask
)
1691 // skip empty demuxers
1692 // skip same demuxer
1693 // skip streampid running on other ca device
1696 otherdemuxpid
= demux
[j
].pidindex
;
1697 if(otherdemuxpid
== -1)
1699 continue; // Other demuxer not descrambling yet
1703 for(y
= 0; y
< MAX_STREAM_INDICES
; y
++)
1705 otherdemuxidx
= demux
[j
].ECMpids
[otherdemuxpid
].index
[y
];
1706 if(otherdemuxidx
== INDEX_INVALID
|| otherdemuxidx
!= idx
)
1708 continue; // Other demuxer has no index yet, or index is different
1711 for(k
= 0; k
< demux
[j
].STREAMpidcount
; k
++)
1713 if(!demux
[j
].ECMpids
[otherdemuxpid
].streams
1714 || ((demux
[j
].ECMpids
[otherdemuxpid
].streams
& (1 << k
)) == (uint
) (1 << k
)))
1716 if(demux
[j
].STREAMpids
[k
] == pidtobestopped
)
1718 continue; // found same streampid enabled with same index
1719 // on one or more other demuxers -> skip! (and leave it enabled!)
1722 match
= 1; // matching stream found
1729 for(j
= 0; j
< CA_MAX
; j
++)
1731 if(((demux
[demux_id
].ca_mask
& (1 << j
)) == (uint32_t) (1 << j
)))
1733 remove_streampid_from_list(j
, pidtobestopped
, idx
);
1745 if(demux
[demux_id
].demux_fd
[num
].type
== TYPE_EMM
) // If emm type remove from emm filterlist
1747 remove_emmfilter_from_list(demux_id
,
1748 demux
[demux_id
].demux_fd
[num
].caid
,
1749 demux
[demux_id
].demux_fd
[num
].provid
,
1750 demux
[demux_id
].demux_fd
[num
].pid
,
1753 demux
[demux_id
].demux_fd
[num
].type
= 0;
1754 demux
[demux_id
].demux_fd
[num
].fd
= 0;
1755 return 1; // all ok!
1758 void dvbapi_start_filter(int32_t demux_id
, int32_t pidindex
, uint16_t pid
, uint16_t caid
,
1759 uint32_t provid
, uint8_t table
, uint8_t mask
, int32_t timeout
, int32_t type
)
1762 for(i
= 0; i
< maxfilter
; i
++) // check if filter is present
1764 if(demux
[demux_id
].demux_fd
[i
].fd
> 0 &&
1765 demux
[demux_id
].demux_fd
[i
].pid
== pid
&&
1766 demux
[demux_id
].demux_fd
[i
].type
== type
&&
1767 demux
[demux_id
].demux_fd
[i
].filter
[0] == table
&&
1768 demux
[demux_id
].demux_fd
[i
].mask
[0] == mask
)
1775 memset(filter
, 0, 32);
1779 cs_log_dbg(D_DVBAPI
, "Demuxer %d try to start new filter for caid: %04X, provid: %06X, pid: %04X",
1780 demux_id
, caid
, provid
, pid
);
1782 dvbapi_set_filter(demux_id
, selected_api
, pid
, caid
, provid
, filter
, filter
+ 16, timeout
, pidindex
, type
, 0);
1785 void dvbapi_start_sdt_filter(int32_t demux_id
)
1787 dvbapi_start_filter(demux_id
, demux
[demux_id
].pidindex
, 0x0011, 0x001, 0x01, 0x42, 0xFF, 0, TYPE_SDT
);
1788 demux
[demux_id
].sdt_filter
= 0;
1791 void dvbapi_start_pat_filter(int32_t demux_id
)
1793 #if defined(WITH_COOLAPI) || defined(WITH_COOLAPI2)
1794 // PAT-Filter breaks API and OSCAM for Coolstream.
1798 dvbapi_start_filter(demux_id
, demux
[demux_id
].pidindex
, 0x0000, 0x001, 0x01, 0x00, 0xFF, 0, TYPE_PAT
);
1801 void dvbapi_start_pmt_filter(int32_t demux_id
)
1803 #if defined(WITH_COOLAPI) || defined(WITH_COOLAPI2)
1804 // PMT-Filter breaks API and OSCAM for Coolstream.
1808 uint8_t filter
[16], mask
[16];
1809 memset(filter
, 0, 16);
1810 memset(mask
, 0, 16);
1813 i2b_buf(2, demux
[demux_id
].program_number
, filter
+ 1); // add srvid to filter since the pid can deliver pmt for multiple srvid
1818 dvbapi_set_filter(demux_id
, selected_api
, demux
[demux_id
].pmtpid
, 0x001, 0x01, filter
, mask
, 0, 0, TYPE_PMT
, 0);
1821 void dvbapi_start_cat_filter(int32_t demux_id
)
1823 dvbapi_start_filter(demux_id
, demux
[demux_id
].pidindex
, 0x0001, 0x001, 0x01, 0x01, 0xFF, 0, TYPE_CAT
);
1824 demux
[demux_id
].emm_filter
= 0;
1827 void dvbapi_start_emm_filter(int32_t demux_id
)
1830 if(!demux
[demux_id
].EMMpidcount
)
1835 struct s_csystem_emm_filter
*dmx_filter
= NULL
;
1836 unsigned int filter_count
= 0;
1837 uint16_t caid
, ncaid
;
1839 struct s_reader
*rdr
= NULL
;
1840 struct s_client
*cl
= cur_client();
1842 if(!cl
|| !cl
->aureader_list
)
1847 LL_ITER itr
= ll_iter_create(cl
->aureader_list
);
1848 while((rdr
= ll_iter_next(&itr
)))
1850 if(!(rdr
->grp
& cl
->grp
))
1855 if(rdr
->audisabled
|| !rdr
->enable
|| (!is_network_reader(rdr
) && rdr
->card_status
!= CARD_INSERTED
))
1860 const struct s_cardsystem
*csystem
;
1862 cs_log_dbg(D_DVBAPI
, "Demuxer %d matching reader %s against available emmpids -> START!", demux_id
, rdr
->label
);
1864 for(c
= 0; c
< demux
[demux_id
].EMMpidcount
; c
++)
1866 caid
= ncaid
= demux
[demux_id
].EMMpids
[c
].CAID
;
1869 if(chk_is_betatunnel_caid(caid
) == 2)
1871 ncaid
= tunemm_caid_map(FROM_TO
, caid
, demux
[demux_id
].program_number
);
1873 provid
= demux
[demux_id
].EMMpids
[c
].PROVID
;
1877 match
= emm_reader_match(rdr
, caid
, provid
);
1881 match
= emm_reader_match(rdr
, ncaid
, provid
);
1886 if(rdr
->typ
== R_EMU
)
1888 csystem
= rdr
->csystem
;
1892 csystem
= get_cardsystem_by_caid(caid
);
1898 csystem
= get_cardsystem_by_caid(ncaid
);
1899 if(csystem
&& csystem
->get_tunemm_filter
)
1901 csystem
->get_tunemm_filter(rdr
, &dmx_filter
, &filter_count
);
1902 cs_log_dbg(D_DVBAPI
, "Demuxer %d setting emm filter for betatunnel: %04X -> %04X",
1903 demux_id
, ncaid
, caid
);
1907 cs_log_dbg(D_DVBAPI
, "Demuxer %d cardsystem for emm filter for caid %04X of reader %s not found",
1908 demux_id
, ncaid
, rdr
->label
);
1912 else if(csystem
->get_emm_filter
)
1914 if(rdr
->typ
== R_EMU
)
1916 csystem
->get_emm_filter_adv(rdr
, &dmx_filter
, &filter_count
, caid
, provid
, demux
[demux_id
].program_number
,
1917 demux
[demux_id
].tsid
, demux
[demux_id
].onid
, demux
[demux_id
].ens
);
1921 csystem
->get_emm_filter(rdr
, &dmx_filter
, &filter_count
);
1927 cs_log_dbg(D_DVBAPI
, "Demuxer %d cardsystem for emm filter for caid %04X of reader %s not found",
1928 demux_id
, caid
, rdr
->label
);
1932 for(j
= 0; j
< filter_count
; j
++)
1934 if(dmx_filter
[j
].enabled
== 0)
1940 memset(filter
, 0, sizeof(filter
)); // reset filter
1941 uint32_t usefilterbytes
= 16; // default use all filters
1942 memcpy(filter
, dmx_filter
[j
].filter
, usefilterbytes
);
1943 memcpy(filter
+ 16, dmx_filter
[j
].mask
, usefilterbytes
);
1944 int32_t emmtype
= dmx_filter
[j
].type
;
1946 if(filter
[0] && (((1 << (filter
[0] % 0x80)) & rdr
->b_nano
) && !((1 << (filter
[0] % 0x80)) & rdr
->s_nano
)))
1948 cs_log_dbg(D_DVBAPI
, "Demuxer %d reader %s emmfilter %d/%d blocked by userconfig -> SKIP!",
1949 demux_id
, rdr
->label
, j
+ 1, filter_count
);
1953 if((rdr
->blockemm
& emmtype
) && !(((1 << (filter
[0] % 0x80)) & rdr
->s_nano
) || (rdr
->saveemm
& emmtype
)))
1955 cs_log_dbg(D_DVBAPI
, "Demuxer %d reader %s emmfilter %d/%d blocked by userconfig -> SKIP!",
1956 demux_id
, rdr
->label
, j
+ 1, filter_count
);
1960 if(demux
[demux_id
].EMMpids
[c
].type
& emmtype
)
1962 cs_log_dbg(D_DVBAPI
, "Demuxer %d reader %s emmfilter %d/%d type match -> ENABLE!",
1963 demux_id
, rdr
->label
, j
+ 1, filter_count
);
1964 check_add_emmpid(demux_id
, filter
, c
, emmtype
);
1968 cs_log_dbg(D_DVBAPI
, "Demuxer %d reader %s emmfilter %d/%d type mismatch -> SKIP!",
1969 demux_id
, rdr
->label
, j
+ 1, filter_count
);
1972 // dmx_filter not use below this point;
1973 NULLFREE(dmx_filter
);
1977 cs_log_dbg(D_DVBAPI
, "Demuxer %d matching reader %s against available emmpids -> DONE!", demux_id
, rdr
->label
);
1980 if(demux
[demux_id
].emm_filter
== -1) // first run -1
1982 demux
[demux_id
].emm_filter
= 0;
1984 cs_log_dbg(D_DVBAPI
, "Demuxer %d handles %i emm filters", demux_id
, demux
[demux_id
].emm_filter
);
1987 void dvbapi_add_ecmpid_int(int32_t demux_id
, uint16_t caid
, uint16_t ecmpid
, uint32_t provid
, uint32_t cadata
, char *txt
)
1989 int32_t n
, added
= 0;
1990 int32_t stream
= demux
[demux_id
].STREAMpidcount
- 1;
1992 for(n
= 0; n
< demux
[demux_id
].ECMpidcount
; n
++)
1994 if(demux
[demux_id
].ECMpids
[n
].CAID
== caid
&& demux
[demux_id
].ECMpids
[n
].ECM_PID
== ecmpid
1995 && (!provid
|| (provid
&& demux
[demux_id
].ECMpids
[n
].PROVID
== provid
)))
2000 if(!demux
[demux_id
].ECMpids
[n
].streams
)
2002 // we already got this caid/ecmpid as global, no need to add the single stream
2003 cs_log_dbg(D_DVBAPI
, "Demuxer %d skipped stream CAID: %04X ECM_PID: %04X PROVID: %06X (Same as ECMPID %d)",
2004 demux_id
, caid
, ecmpid
, provid
, n
);
2007 demux
[demux_id
].ECMpids
[n
].streams
|= (1 << stream
);
2008 cs_log("Demuxer %d added stream to ecmpid %d CAID: %04X ECM_PID: %04X PROVID: %06X",
2009 demux_id
, n
, caid
, ecmpid
, provid
);
2019 if(demux
[demux_id
].ECMpidcount
>= MAX_ECM_PIDS
)
2021 cs_log("We reached maximum ECMpids: unable to add to demuxer %d ecmpid %d CAID: %04X ECM_PID: %04X PROVID: %06X %s",
2022 demux_id
, demux
[demux_id
].ECMpidcount
, caid
, ecmpid
, provid
, txt
);
2026 demux
[demux_id
].ECMpids
[demux
[demux_id
].ECMpidcount
].ECM_PID
= ecmpid
;
2027 demux
[demux_id
].ECMpids
[demux
[demux_id
].ECMpidcount
].CAID
= caid
;
2028 demux
[demux_id
].ECMpids
[demux
[demux_id
].ECMpidcount
].PROVID
= provid
;
2029 demux
[demux_id
].ECMpids
[demux
[demux_id
].ECMpidcount
].CHID
= 0x10000; // reset CHID
2030 demux
[demux_id
].ECMpids
[demux
[demux_id
].ECMpidcount
].checked
= 0;
2031 demux
[demux_id
].ECMpids
[demux
[demux_id
].ECMpidcount
].status
= 0;
2032 demux
[demux_id
].ECMpids
[demux
[demux_id
].ECMpidcount
].tries
= 0xFE;
2033 demux
[demux_id
].ECMpids
[demux
[demux_id
].ECMpidcount
].streams
= 0; // reset streams!
2034 demux
[demux_id
].ECMpids
[demux
[demux_id
].ECMpidcount
].irdeto_curindex
= 0xFE; // reset
2035 demux
[demux_id
].ECMpids
[demux
[demux_id
].ECMpidcount
].irdeto_maxindex
= 0; // reset
2036 demux
[demux_id
].ECMpids
[demux
[demux_id
].ECMpidcount
].irdeto_cycle
= 0xFE; // reset
2037 demux
[demux_id
].ECMpids
[demux
[demux_id
].ECMpidcount
].table
= 0;
2038 demux
[demux_id
].ECMpids
[demux
[demux_id
].ECMpidcount
].cadata
= cadata
;
2040 cs_log("Demuxer %d ecmpid %d CAID: %04X ECM_PID: %04X PROVID: %06X %s",
2041 demux_id
, demux
[demux_id
].ECMpidcount
, caid
, ecmpid
, provid
, txt
);
2043 // marker to fetch emms early irdeto needs them!
2044 if(caid_is_irdeto(caid
) || (caid_is_dre(caid
) && (provid
== 0x11 || provid
== 0xFE)))
2046 demux
[demux_id
].emmstart
.time
= 1;
2048 demux
[demux_id
].ECMpidcount
++;
2051 void dvbapi_add_ecmpid(int32_t demux_id
, uint16_t caid
, uint16_t ecmpid
, uint32_t provid
, uint32_t cadata
, char *txt
)
2053 dvbapi_add_ecmpid_int(demux_id
, caid
, ecmpid
, provid
, cadata
, txt
);
2054 struct s_dvbapi_priority
*joinentry
;
2056 for(joinentry
= dvbapi_priority
; joinentry
!= NULL
; joinentry
= joinentry
->next
)
2058 if((joinentry
->type
!= 'j')
2059 || (joinentry
->caid
&& joinentry
->caid
!= caid
)
2060 || (joinentry
->provid
&& joinentry
->provid
!= provid
)
2061 || (joinentry
->ecmpid
&& joinentry
->ecmpid
!= ecmpid
)
2062 || (joinentry
->srvid
&& joinentry
->srvid
!= demux
[demux_id
].program_number
))
2067 cs_log_dbg(D_DVBAPI
, "Join ecmpid %04X@%06X:%04X to %04X@%06X:%04X",
2068 caid
, provid
, ecmpid
, joinentry
->mapcaid
, joinentry
->mapprovid
, joinentry
->mapecmpid
);
2069 dvbapi_add_ecmpid_int(demux_id
, joinentry
->mapcaid
, joinentry
->mapecmpid
, joinentry
->mapprovid
, 0, txt
);
2073 void dvbapi_add_emmpid(int32_t demux_id
, uint16_t caid
, uint16_t emmpid
, uint32_t provid
, uint32_t cadata
, uint8_t type
)
2076 char cadatatext
[40];
2077 cs_strncpy(typetext
, ":", sizeof(typetext
));
2079 if(type
& 0x01) { cs_strncat(typetext
, "UNIQUE:", sizeof(typetext
)); }
2080 if(type
& 0x02) { cs_strncat(typetext
, "SHARED:", sizeof(typetext
)); }
2081 if(type
& 0x04) { cs_strncat(typetext
, "GLOBAL:", sizeof(typetext
)); }
2082 if(type
& 0xF8) { cs_strncat(typetext
, "UNKNOWN:", sizeof(typetext
)); }
2086 snprintf(cadatatext
, 40, " CA DATA %X ", cadata
);
2090 cadatatext
[0] = '\t'; cadatatext
[1] = '\0';
2093 if(caid
== 0x4AE1 && provid
== 0x11 && cadata
== 0)
2099 for(i
= 0; i
< demux
[demux_id
].EMMpidcount
; i
++)
2101 if(demux
[demux_id
].EMMpids
[i
].PID
== emmpid
&& demux
[demux_id
].EMMpids
[i
].CAID
== caid
&&
2102 demux
[demux_id
].EMMpids
[i
].PROVID
== provid
&& demux
[demux_id
].EMMpids
[i
].cadata
== cadata
)
2104 if(!(demux
[demux_id
].EMMpids
[i
].type
& type
))
2106 demux
[demux_id
].EMMpids
[i
].type
|= type
; // register this emm kind to this emmpid
2107 cs_log_dbg(D_DVBAPI
, "Added to existing emmpid %d additional emmtype %s",
2108 demux
[demux_id
].EMMpidcount
- 1, typetext
);
2114 if(i
< MAX_EMM_PIDS
)
2116 demux
[demux_id
].EMMpids
[demux
[demux_id
].EMMpidcount
].PID
= emmpid
;
2117 demux
[demux_id
].EMMpids
[demux
[demux_id
].EMMpidcount
].CAID
= caid
;
2118 demux
[demux_id
].EMMpids
[demux
[demux_id
].EMMpidcount
].PROVID
= provid
;
2119 demux
[demux_id
].EMMpids
[demux
[demux_id
].EMMpidcount
].type
= type
;
2120 demux
[demux_id
].EMMpids
[demux
[demux_id
].EMMpidcount
++].cadata
= cadata
;
2121 cs_log_dbg(D_DVBAPI
, "Added new emmpid %d CAID: %04X EMM_PID: %04X PROVID: %06X%sTYPE %s",
2122 demux
[demux_id
].EMMpidcount
- 1, caid
, emmpid
, provid
, cadatatext
, typetext
);
2126 cs_log_dbg(D_DVBAPI
, "We reached max emmpids: unable to add new emmpid %d CAID: %04X EMM_PID: %04X PROVID: %06X%sTYPE %s",
2127 demux
[demux_id
].EMMpidcount
- 1, caid
, emmpid
, provid
, cadatatext
, typetext
);
2131 static void dvbapi_parse_cat_ca_descriptor(int32_t demux_id
, const uint8_t *buffer
, uint8_t descriptor_length
)
2133 uint16_t i
, ca_system_id
, ca_pid
;
2134 uint32_t ca_provider
= 0, ca_data
= 0;
2136 if(descriptor_length
< 4)
2138 return; // CA descriptor has a minimum length of 4 bytes
2141 ca_system_id
= b2i(2, buffer
);
2142 ca_pid
= b2i(2, buffer
+ 2) & 0x1FFF;
2144 if(ca_system_id
== 0x0000 || ca_pid
== 0x1FFF)
2146 return; // This is not a valid CAID or EMM pid
2149 switch(ca_system_id
>> 8)
2153 dvbapi_add_emmpid(demux_id
, ca_system_id
, ca_pid
, 0, 0, EMM_UNIQUE
| EMM_GLOBAL
);
2155 for(i
= 5; i
< descriptor_length
; i
+= 4)
2157 ca_pid
= b2i(2, buffer
+ i
) & 0x1FFF;
2158 ca_provider
= b2i(2, buffer
+ i
+ 2);
2160 dvbapi_add_emmpid(demux_id
, ca_system_id
, ca_pid
, ca_provider
, 0, EMM_SHARED
);
2167 for(i
= 4; i
< descriptor_length
; i
+= 2 + buffer
[i
+ 1])
2169 if(buffer
[i
] == 0x14)
2171 ca_provider
= (b2i(3, buffer
+ i
+ 2) & 0xFFFFF0); // viaccess fixup: don't care about last digit
2172 dvbapi_add_emmpid(demux_id
, ca_system_id
, ca_pid
, ca_provider
, 0, EMM_UNIQUE
| EMM_SHARED
| EMM_GLOBAL
);
2180 if(descriptor_length
== 0x07 || descriptor_length
== 0x0B)
2182 for(i
= 5; i
< 5 + buffer
[4]; i
+= 2)
2184 ca_provider
= b2i(2, buffer
+ i
);
2185 dvbapi_add_emmpid(demux_id
, ca_system_id
, ca_pid
, ca_provider
, 0, EMM_UNIQUE
| EMM_SHARED
| EMM_GLOBAL
);
2190 dvbapi_add_emmpid(demux_id
, ca_system_id
, ca_pid
, ca_provider
, 0, EMM_UNIQUE
| EMM_SHARED
| EMM_GLOBAL
);
2198 if(caid_is_bulcrypt(ca_system_id
))
2200 dvbapi_add_emmpid(demux_id
, ca_system_id
, ca_pid
, 0, 0, EMM_UNIQUE
| EMM_SHARED
| EMM_GLOBAL
);
2204 ca_provider
= buffer
[4];
2206 if(buffer
[4] == 0xFE)
2208 dvbapi_add_emmpid(demux_id
, ca_system_id
, ca_pid
, ca_provider
, 0x102, EMM_GLOBAL
);
2212 if(descriptor_length
== 0x0A)
2214 ca_data
= b2i(4, buffer
+ 6);
2217 dvbapi_add_emmpid(demux_id
, ca_system_id
, ca_pid
, ca_provider
, ca_data
, EMM_UNIQUE
| EMM_SHARED
| EMM_GLOBAL
);
2223 dvbapi_add_emmpid(demux_id
, ca_system_id
, ca_pid
, 0, 0, EMM_UNIQUE
| EMM_SHARED
| EMM_GLOBAL
);
2228 static void dvbapi_parse_cat(int32_t demux_id
, const uint8_t *buffer
, uint16_t length
, uint32_t msgid
)
2230 #if defined WITH_COOLAPI || defined WITH_COOLAPI2
2231 // driver sometimes reports error if too many emm filter
2232 // but adding more ecm filter is no problem
2233 // ... so ifdef here instead of limiting MAX_FILTER
2234 demux
[demux_id
].max_emm_filter
= 14;
2236 if(cfg
.dvbapi_requestmode
== 1)
2238 uint16_t ecm_filter_needed
= 0, n
;
2239 for(n
= 0; n
< demux
[demux_id
].ECMpidcount
; n
++)
2241 if(demux
[demux_id
].ECMpids
[n
].status
> -1)
2243 ecm_filter_needed
++;
2247 if(maxfilter
- ecm_filter_needed
<= 0)
2249 demux
[demux_id
].max_emm_filter
= 0;
2253 demux
[demux_id
].max_emm_filter
= maxfilter
- ecm_filter_needed
;
2258 demux
[demux_id
].max_emm_filter
= maxfilter
- 1;
2263 uint8_t descriptor_tag
, descriptor_length
;
2265 dvbapi_stop_filter(demux_id
, TYPE_CAT
, msgid
);
2267 for(i
= 8; i
+ 1 < length
; i
+= 2 + descriptor_length
)
2269 descriptor_tag
= buffer
[i
];
2270 descriptor_length
= buffer
[i
+ 1];
2272 if(descriptor_tag
== 0x09) // There should be only CA descriptors here
2274 dvbapi_parse_cat_ca_descriptor(demux_id
, buffer
+ i
+ 2, descriptor_length
);
2279 static pthread_mutex_t lockindex
= PTHREAD_MUTEX_INITIALIZER
;
2281 uint32_t dvbapi_get_desc_index(int32_t demux_id
, int32_t pid
, int32_t stream_id
)
2283 int32_t i
, j
, k
, fail
= 1;
2286 if(cfg
.dvbapi_boxtype
== BOXTYPE_NEUMO
)
2288 sscanf(demux
[demux_id
].pmt_file
, "pmt%3d.tmp", &idx
);
2292 SAFE_MUTEX_LOCK(&lockindex
); // to avoid race when readers become responsive!
2293 while(fail
&& idx
<= INDEX_MAX
)
2296 for(i
= 0; i
< MAX_DEMUX
&& !fail
&& idx
< INDEX_MAX
; i
++)
2298 if(demux
[i
].program_number
== 0)
2300 continue; // skip empty demuxers
2303 if(demux
[i
].ca_mask
!= demux
[demux_id
].ca_mask
2304 && (!(cfg
.dvbapi_boxtype
== BOXTYPE_PC
|| cfg
.dvbapi_boxtype
== BOXTYPE_PC_NODMX
)))
2306 continue; // skip demuxer using other ca device
2309 for(j
= 0; j
< demux
[i
].ECMpidcount
&& !fail
; j
++) // search for new unique index
2311 for(k
= 0; k
< MAX_STREAM_INDICES
; k
++)
2313 if(demux
[i
].ECMpids
[j
].index
[k
] == idx
)
2323 if(selected_api
== DVBAPI_3
|| selected_api
== DVBAPI_1
)
2325 // make sure we haven't run out of descramblers
2326 if(ca_descramblers_used
< ca_descramblers_total
)
2328 ca_descramblers_used
++; // increase number of descramblers used
2332 idx
= INDEX_INVALID
; // we don't have any descramblers left
2335 else // old style check for STAPI, COOLAPI, etc
2337 if(idx
> ca_descramblers_total
)
2339 idx
= INDEX_INVALID
; // we don't have any descramblers left
2343 demux
[demux_id
].ECMpids
[pid
].index
[stream_id
] = idx
;
2344 SAFE_MUTEX_UNLOCK(&lockindex
); // and release it!
2349 void dvbapi_set_pid(int32_t demux_id
, int32_t num
, uint32_t idx
, bool enable
, bool use_des
, uint32_t msgid
)
2351 int32_t i
, currentfd
;
2352 uint16_t streampid
= demux
[demux_id
].STREAMpids
[num
];
2353 uint32_t newidx
= 0, curidx
;
2356 if(demux
[demux_id
].pidindex
== -1 && enable
)
2358 return; // no current pid on enable? --> exit
2361 switch(selected_api
)
2363 #if defined(WITH_STAPI) || defined(WITH_STAPI5)
2365 if(!enable
) idx
= INDEX_INVALID
;
2366 stapi_set_pid(demux_id
, num
, idx
, streampid
, demux
[demux_id
].pmt_file
); // only used to disable pids!!!
2370 #if defined WITH_COOLAPI || defined WITH_COOLAPI2
2376 for(i
= 0; i
< CA_MAX
; i
++)
2378 newidx
= INDEX_INVALID
;
2381 if(((demux
[demux_id
].ca_mask
& (1 << i
)) == (uint32_t) (1 << i
)))
2383 uint32_t action
= 0;
2386 action
= update_streampid_list(i
, streampid
, curidx
, use_des
);
2391 action
= remove_streampid_from_list(i
, streampid
, curidx
);
2394 if(action
!= NO_STREAMPID_LISTED
&& action
!= INVALID_STREAMPID_INDEX
&&
2395 action
!= FOUND_STREAMPID_INDEX
&& action
!= ADDED_STREAMPID_INDEX
&&
2396 action
!= REMOVED_STREAMPID_INDEX
)
2398 // removed last index of this streampid on ca? -> disable this pid with -1 on this ca
2399 if((action
== REMOVED_STREAMPID_LASTINDEX
|| action
== FIRST_STREAMPID_INDEX
)
2400 && (is_ca_used(i
, streampid
) == INDEX_INVALID
))
2402 curidx
= DVBAPI_INDEX_DISABLE
;
2405 // removed index of streampid that is used to decode on ca -> get a fresh one
2406 if(action
== REMOVED_DECODING_STREAMPID_INDEX
|| action
== FIRST_STREAMPID_INDEX
)
2408 newidx
= is_ca_used(i
, streampid
); // get an active index for this pid and enable it on ca device
2409 curidx
= DVBAPI_INDEX_DISABLE
;
2412 while(curidx
!= INDEX_INVALID
|| newidx
!= INDEX_INVALID
)
2414 memset(&ca_pid2
, 0, sizeof(ca_pid2
));
2415 ca_pid2
.pid
= streampid
;
2416 if(curidx
!= INDEX_INVALID
)
2418 (curidx
== DVBAPI_INDEX_DISABLE
) ? (ca_pid2
.index
= -1) : (ca_pid2
.index
= curidx
);
2419 cs_log_dbg(D_DVBAPI
, "Demuxer %d %s stream %d pid=0x%04x index=%d on ca%d",
2421 ((enable
&& curidx
!= DVBAPI_INDEX_DISABLE
) ? "enable" : "disable"),
2426 curidx
= INDEX_INVALID
; // flag this index as handled
2428 else if(newidx
!= INDEX_INVALID
)
2430 (newidx
== DVBAPI_INDEX_DISABLE
) ? (ca_pid2
.index
= -1) : (ca_pid2
.index
= newidx
);
2431 cs_log_dbg(D_DVBAPI
, "Demuxer %d %s stream %d pid=0x%04x by index=%d on ca%d",
2433 ((enable
&& action
== FIRST_STREAMPID_INDEX
) ? "enable" : "takeover"),
2438 newidx
= INDEX_INVALID
; // flag this takeover / new index as handled
2441 if(use_des
&& cfg
.dvbapi_extended_cw_api
== 2 && ca_pid2
.index
!= -1)
2443 ca_pid2
.index
|= 0x100; // flag DES algo through pid index
2446 if(cfg
.dvbapi_boxtype
== BOXTYPE_PC
|| cfg
.dvbapi_boxtype
== BOXTYPE_PC_NODMX
)
2448 dvbapi_net_send(DVBAPI_CA_SET_PID
, demux
[demux_id
].socket_fd
,
2452 (uint8_t *) &ca_pid2
,
2455 demux
[demux_id
].client_proto_version
);
2459 currentfd
= ca_fd
[i
];
2462 currentfd
= dvbapi_open_device(1, i
, demux
[demux_id
].adapter_index
);
2463 ca_fd
[i
] = currentfd
; // save fd of this ca
2468 if(dvbapi_ioctl(currentfd
, CA_SET_PID
, &ca_pid2
) == -1)
2470 cs_log_dbg(D_TRACE
| D_DVBAPI
,"CA_SET_PID ioctl error (errno=%d %s)", errno
, strerror(errno
));
2471 remove_streampid_from_list(i
, ca_pid2
.pid
, INDEX_DISABLE_ALL
);
2474 uint32_t result
= is_ca_used(i
, 0); // check if in use by any pid
2475 if(result
== INDEX_INVALID
)
2477 cs_log_dbg(D_DVBAPI
, "Demuxer %d close now unused CA%d device", demux_id
, i
);
2478 int32_t ret
= close(currentfd
);
2481 cs_log("ERROR: Could not close demuxer fd (errno=%d %s)", errno
, strerror(errno
));
2496 void dvbapi_stop_all_descrambling(uint32_t msgid
)
2500 for(j
= 0; j
< MAX_DEMUX
; j
++)
2502 if(demux
[j
].program_number
== 0)
2507 dvbapi_stop_descrambling(j
, msgid
);
2511 void dvbapi_stop_all_cat_emm_sdt_filtering(uint32_t msgid
)
2515 for(j
= 0; j
< MAX_DEMUX
; j
++)
2517 if(demux
[j
].program_number
== 0)
2522 dvbapi_stop_filter(j
, TYPE_EMM
, msgid
);
2523 dvbapi_stop_filter(j
, TYPE_SDT
, msgid
);
2524 dvbapi_stop_filter(j
, TYPE_CAT
, msgid
);
2525 demux
[j
].emm_filter
= -1;
2529 void dvbapi_stop_descrambling(int32_t demux_id
, uint32_t msgid
)
2532 if(demux
[demux_id
].program_number
== 0) { return; }
2533 char channame
[CS_SERVICENAME_SIZE
];
2535 i
= demux
[demux_id
].pidindex
;
2541 demux
[demux_id
].pidindex
= -1; // no ecmpid is to be descrambling since we start stop descrambling!
2543 get_servicename(dvbapi_client
, demux
[demux_id
].program_number
,
2544 demux
[demux_id
].ECMpidcount
> 0 ? demux
[demux_id
].ECMpids
[i
].PROVID
: NO_PROVID_VALUE
,
2545 demux
[demux_id
].ECMpidcount
> 0 ? demux
[demux_id
].ECMpids
[i
].CAID
: NO_CAID_VALUE
,
2546 channame
, sizeof(channame
));
2548 cs_log("Demuxer %d stopped descrambling for program %04X (%s)",
2549 demux_id
, demux
[demux_id
].program_number
, channame
);
2551 dvbapi_stop_filter(demux_id
, TYPE_EMM
, msgid
);
2552 dvbapi_stop_filter(demux_id
, TYPE_SDT
, msgid
);
2553 dvbapi_stop_filter(demux_id
, TYPE_PAT
, msgid
);
2554 dvbapi_stop_filter(demux_id
, TYPE_PMT
, msgid
);
2555 dvbapi_stop_filter(demux_id
, TYPE_CAT
, msgid
);
2557 for(i
= 0; i
< demux
[demux_id
].ECMpidcount
&& demux
[demux_id
].ECMpidcount
> 0; i
++)
2559 for(j
= 0; j
< MAX_STREAM_INDICES
; j
++)
2561 if(demux
[demux_id
].ECMpids
[i
].index
[j
] == INDEX_INVALID
)
2567 for(z
= 0; z
< demux
[demux_id
].STREAMpidcount
; z
++)
2569 dvbapi_set_pid(demux_id
, z
, demux
[demux_id
].ECMpids
[i
].index
[j
], false, false, msgid
); // disable streampid
2571 demux
[demux_id
].ECMpids
[i
].index
[j
] = INDEX_INVALID
;
2574 dvbapi_stop_filter(demux_id
, TYPE_ECM
, msgid
);
2576 pthread_mutex_destroy(&demux
[demux_id
].answerlock
);
2577 memset(&demux
[demux_id
], 0 , sizeof(DEMUXTYPE
));
2579 SAFE_MUTEX_INIT(&demux
[demux_id
].answerlock
, NULL
);
2580 for(i
= 0; i
< MAX_ECM_PIDS
; i
++)
2582 for(j
= 0; j
< MAX_STREAM_INDICES
; j
++)
2584 demux
[demux_id
].ECMpids
[i
].index
[j
] = INDEX_INVALID
;
2587 demux
[demux_id
].pidindex
= -1;
2588 demux
[demux_id
].curindex
= -1;
2590 if(!cfg
.dvbapi_listenport
&& cfg
.dvbapi_boxtype
!= BOXTYPE_PC_NODMX
)
2592 unlink(ECMINFO_FILE
);
2597 int32_t dvbapi_start_descrambling(int32_t demux_id
, int32_t pid
, int8_t checked
, uint32_t msgid
)
2599 int32_t started
= 0; // in case ecmfilter started = 1
2600 int32_t fake_ecm
= 0;
2602 struct s_reader
*rdr
;
2604 if(!(er
= get_ecmtask()))
2608 demux
[demux_id
].ECMpids
[pid
].checked
= checked
+ 1; // mark this pid as checked!
2610 struct s_dvbapi_priority
*p
;
2611 for(p
= dvbapi_priority
; p
!= NULL
; p
= p
->next
)
2614 || (p
->caid
&& p
->caid
!= demux
[demux_id
].ECMpids
[pid
].CAID
)
2615 || (p
->provid
&& p
->provid
!= demux
[demux_id
].ECMpids
[pid
].PROVID
)
2616 || (p
->ecmpid
&& p
->ecmpid
!= demux
[demux_id
].ECMpids
[pid
].ECM_PID
)
2617 || (p
->srvid
&& p
->srvid
!= demux
[demux_id
].program_number
)
2618 || (p
->pidx
&& p
->pidx
-1 != pid
)
2619 || (p
->cadata
&& p
->cadata
!= demux
[demux_id
].ECMpids
[pid
].cadata
))
2624 // if found chid and first run apply chid filter, on forced pids always apply!
2625 if(p
->type
== 'p' && p
->chid
< 0x10000 && (demux
[demux_id
].ECMpids
[pid
].checked
== 1 || (p
&& p
->force
)))
2627 if(demux
[demux_id
].ECMpids
[pid
].CHID
< 0x10000) // channelcache delivered chid
2629 er
->chid
= demux
[demux_id
].ECMpids
[pid
].CHID
;
2633 er
->chid
= p
->chid
; // no channelcache or no chid in use, so use prio chid
2634 demux
[demux_id
].ECMpids
[pid
].CHID
= p
->chid
;
2636 //cs_log("********* CHID %04X **************", demux[demux_id].ECMpids[pid].CHID);
2637 break; // we only accept one!
2641 if(demux
[demux_id
].ECMpids
[pid
].CHID
< 0x10000) // channelcache delivered chid
2643 er
->chid
= demux
[demux_id
].ECMpids
[pid
].CHID
;
2645 else // no channelcache or no chid in use
2648 demux
[demux_id
].ECMpids
[pid
].CHID
= 0x10000;
2653 er
->srvid
= demux
[demux_id
].program_number
;
2654 er
->caid
= demux
[demux_id
].ECMpids
[pid
].CAID
;
2655 er
->pid
= demux
[demux_id
].ECMpids
[pid
].ECM_PID
;
2656 er
->prid
= demux
[demux_id
].ECMpids
[pid
].PROVID
;
2657 er
->vpid
= demux
[demux_id
].ECMpids
[pid
].VPID
;
2658 er
->pmtpid
= demux
[demux_id
].pmtpid
;
2659 er
->onid
= demux
[demux_id
].onid
;
2663 cs_strncpy(er
->dev_name
, dev_list
[demux
[demux_id
].dev_index
].name
, sizeof(dev_list
[demux
[demux_id
].dev_index
].name
));
2668 for(rdr
= first_active_reader
; rdr
!= NULL
; rdr
= rdr
->next
)
2670 int8_t match
= matching_reader(er
, rdr
); // check for matching reader
2671 int64_t gone
= comp_timeb(&now
, &rdr
->emm_last
);
2672 if(gone
> 3600*1000 && rdr
->needsemmfirst
&& caid_is_irdeto(er
->caid
))
2674 cs_log("Warning reader %s received no emms for the last %d seconds -> skip, this reader needs emms first!",
2675 rdr
->label
, (int)(gone
/ 1000));
2676 continue; // skip this card needs to process emms first before it can be used for descramble
2681 match
= 1; // forced pid always started!
2684 if(!match
) // if this reader does not match, check betatunnel for it
2686 match
= lb_check_auto_betatunnel(er
, rdr
);
2689 if(!match
&& chk_is_betatunnel_caid(er
->caid
)) // these caids might be tunneled invisible by peers
2691 match
= 1; // so make it a match to try it!
2694 // check if cache-ex is matching
2695 if(config_enabled(CS_CACHEEX
) && (!match
&& (cacheex_is_match_alias(dvbapi_client
, er
))))
2697 match
= 1; // so make it a match to try it!
2700 // BISS1 and BISS2 mode 1/E or FAKE caid
2701 // ecm pid is fake, so send out one fake ecm request
2702 // special treatment: if we asked the cw first without starting a filter,
2703 // the cw request will be killed due to no ecmfilter started
2704 if(caid_is_fake(demux
[demux_id
].ECMpids
[pid
].CAID
) || caid_is_biss_fixed(demux
[demux_id
].ECMpids
[pid
].CAID
))
2708 er
->ecm
[0] = 0x80; // to pass the cache check it must be 0x80 or 0x81
2711 i2b_buf(2, er
->srvid
, er
->ecm
+ 3);
2713 for(j
= 0, n
= 5; j
< demux
[demux_id
].STREAMpidcount
; j
++, n
+= 2)
2715 i2b_buf(2, demux
[demux_id
].STREAMpids
[j
], er
->ecm
+ n
);
2720 cs_log("Demuxer %d trying to descramble PID %d CAID %04X PROVID %06X ECMPID %04X ANY CHID PMTPID %04X VPID %04X",
2723 demux
[demux_id
].ECMpids
[pid
].CAID
,
2724 demux
[demux_id
].ECMpids
[pid
].PROVID
,
2725 demux
[demux_id
].ECMpids
[pid
].ECM_PID
,
2726 demux
[demux_id
].pmtpid
,
2727 demux
[demux_id
].ECMpids
[pid
].VPID
);
2729 demux
[demux_id
].curindex
= pid
; // set current pid to the fresh started one
2730 dvbapi_start_filter(demux_id
,
2732 demux
[demux_id
].ECMpids
[pid
].ECM_PID
,
2733 demux
[demux_id
].ECMpids
[pid
].CAID
,
2734 demux
[demux_id
].ECMpids
[pid
].PROVID
,
2741 request_cw(dvbapi_client
, er
, demux_id
, 0); // do not register ecm since this try!
2743 break; // we started an ecmfilter so stop looking for next matching reader!
2746 if(match
) // if matching reader found check for irdeto cas if local irdeto card check if it received emms in last 60 minutes
2748 if(caid_is_irdeto(er
->caid
)) // irdeto cas init irdeto_curindex to wait for first index (00)
2750 if(demux
[demux_id
].ECMpids
[pid
].irdeto_curindex
== 0xFE)
2752 demux
[demux_id
].ECMpids
[pid
].irdeto_curindex
= 0x00;
2756 if(p
&& p
->chid
< 0x10000) // do we prio a certain chid?
2758 cs_log("Demuxer %d trying to descramble PID %d CAID %04X PROVID %06X ECMPID %04X CHID %04X PMTPID %04X VPID %04X",
2760 demux
[demux_id
].ECMpids
[pid
].CAID
,
2761 demux
[demux_id
].ECMpids
[pid
].PROVID
,
2762 demux
[demux_id
].ECMpids
[pid
].ECM_PID
,
2763 demux
[demux_id
].ECMpids
[pid
].CHID
,
2764 demux
[demux_id
].pmtpid
,
2765 demux
[demux_id
].ECMpids
[pid
].VPID
);
2769 cs_log("Demuxer %d trying to descramble PID %d CAID %04X PROVID %06X ECMPID %04X ANY CHID PMTPID %04X VPID %04X",
2771 demux
[demux_id
].ECMpids
[pid
].CAID
,
2772 demux
[demux_id
].ECMpids
[pid
].PROVID
,
2773 demux
[demux_id
].ECMpids
[pid
].ECM_PID
,
2774 demux
[demux_id
].pmtpid
,
2775 demux
[demux_id
].ECMpids
[pid
].VPID
);
2778 demux
[demux_id
].curindex
= pid
; // set current pid to the fresh started one
2779 dvbapi_start_filter(demux_id
,
2781 demux
[demux_id
].ECMpids
[pid
].ECM_PID
,
2782 demux
[demux_id
].ECMpids
[pid
].CAID
,
2783 demux
[demux_id
].ECMpids
[pid
].PROVID
,
2790 break; // we started an ecmfilter so stop looking for next matching reader!
2794 if(demux
[demux_id
].curindex
!= pid
)
2796 cs_log("Demuxer %d impossible to descramble PID %d CAID %04X PROVID %06X ECMPID %04X PMTPID %04X (NO MATCHING READER)",
2798 demux
[demux_id
].ECMpids
[pid
].CAID
,
2799 demux
[demux_id
].ECMpids
[pid
].PROVID
,
2800 demux
[demux_id
].ECMpids
[pid
].ECM_PID
,
2801 demux
[demux_id
].pmtpid
);
2803 demux
[demux_id
].ECMpids
[pid
].checked
= 4; // flag this pid as checked
2804 demux
[demux_id
].ECMpids
[pid
].status
= -1; // flag this pid as unusable
2805 dvbapi_edit_channel_cache(demux_id
, pid
, 0); // remove this pid from channelcache
2815 struct s_dvbapi_priority
*dvbapi_check_prio_match_emmpid(int32_t demux_id
, uint16_t caid
, uint32_t provid
, char type
)
2817 struct s_dvbapi_priority
*p
;
2819 uint16_t ecm_pid
= 0;
2821 for(i
= 0; i
< demux
[demux_id
].ECMpidcount
; i
++)
2823 if((demux
[demux_id
].ECMpids
[i
].CAID
== caid
) && (demux
[demux_id
].ECMpids
[i
].PROVID
== provid
))
2825 ecm_pid
= demux
[demux_id
].ECMpids
[i
].ECM_PID
;
2835 for(p
= dvbapi_priority
; p
!= NULL
; p
= p
->next
)
2838 || (p
->caid
&& p
->caid
!= caid
)
2839 || (p
->provid
&& p
->provid
!= provid
)
2840 || (p
->ecmpid
&& p
->ecmpid
!= ecm_pid
)
2841 || (p
->srvid
&& p
->srvid
!= demux
[demux_id
].program_number
)
2842 || (p
->pidx
&& p
->pidx
-1 !=i
)
2843 || (p
->type
== 'i' && (p
->chid
< 0x10000)))
2853 struct s_dvbapi_priority
*dvbapi_check_prio_match(int32_t demux_id
, int32_t pidindex
, char type
)
2855 if(!dvbapi_priority
)
2860 struct s_dvbapi_priority
*p
;
2861 struct s_ecmpid
*ecmpid
= &demux
[demux_id
].ECMpids
[pidindex
];
2863 for(p
= dvbapi_priority
; p
!= NULL
; p
= p
->next
)
2866 || (p
->caid
&& p
->caid
!= ecmpid
->CAID
)
2867 || (p
->provid
&& p
->provid
!= ecmpid
->PROVID
)
2868 || (p
->ecmpid
&& p
->ecmpid
!= ecmpid
->ECM_PID
)
2869 || (p
->srvid
&& p
->srvid
!= demux
[demux_id
].program_number
)
2870 || (p
->pidx
&& p
->pidx
-1 != pidindex
)
2871 || (p
->chid
< 0x10000 && p
->chid
!= ecmpid
->CHID
))
2881 void dvbapi_process_emm(int32_t demux_id
, int32_t filter_num
, uint8_t *buffer
, uint32_t len
)
2885 struct s_emm_filter
*filter
= get_emmfilter_by_filternum(demux_id
, filter_num
+ 1); // 0 is used for pending emmfilters, so everything increase 1
2888 cs_log_dbg(D_DVBAPI
, "Demuxer %d Filter %d no filter matches -> SKIP!", demux_id
, filter_num
+ 1);
2892 uint32_t provider
= filter
->provid
;
2893 uint16_t caid
= filter
->caid
;
2894 struct s_dvbapi_priority
*mapentry
= dvbapi_check_prio_match_emmpid(filter
->demux_id
, filter
->caid
, filter
->provid
, 'm');
2897 cs_log_dbg(D_DVBAPI
, "Demuxer %d mapping EMM from %04X@%06X to %04X@%06X",
2898 demux_id
, caid
, provider
, mapentry
->mapcaid
, mapentry
->mapprovid
);
2900 caid
= mapentry
->mapcaid
;
2901 provider
= mapentry
->mapprovid
;
2904 memset(&epg
, 0, sizeof(epg
));
2905 i2b_buf(2, caid
, epg
.caid
);
2906 i2b_buf(4, provider
, epg
.provid
);
2907 epg
.emmlen
= len
> sizeof(epg
.emm
) ? sizeof(epg
.emm
) : len
;
2908 memcpy(epg
.emm
, buffer
, epg
.emmlen
);
2910 if(config_enabled(READER_IRDETO
) && chk_is_betatunnel_caid(caid
) == 2)
2912 uint16_t ncaid
= tunemm_caid_map(FROM_TO
, caid
, demux
[demux_id
].program_number
);
2915 irdeto_add_emm_header(&epg
);
2916 i2b_buf(2, ncaid
, epg
.caid
);
2919 do_emm(dvbapi_client
, &epg
);
2922 void dvbapi_read_priority(void)
2925 char token
[128], str1
[128];
2927 int32_t i
, ret
, count
= 0;
2928 const char *cs_prio
= "oscam.dvbapi";
2930 fp
= fopen(get_config_filename(token
, sizeof(token
), cs_prio
), "r");
2933 cs_log_dbg(D_DVBAPI
, "ERROR: Can't open priority file %s", token
);
2939 cs_log_dbg(D_DVBAPI
, "reread priority file %s", cs_prio
);
2940 struct s_dvbapi_priority
*o
, *p
;
2941 for(p
= dvbapi_priority
; p
!= NULL
; p
= o
)
2946 dvbapi_priority
= NULL
;
2949 while(fgets(token
, sizeof(token
), fp
))
2951 // Ignore comments and empty lines
2952 if(token
[0] == '#' || token
[0] == '/' || token
[0] == '\n' || token
[0] == '\r' || token
[0] == '\0' || cs_strlen(token
) > 100)
2956 memset(str1
, 0, 128);
2958 for(i
= 0; i
< (int)cs_strlen(token
) && token
[i
] == ' '; i
++) { ; }
2960 if(i
== (int)cs_strlen(token
) - 1) // empty line or all spaces
2965 for(i
= 0; i
< (int)cs_strlen(token
); i
++)
2973 for(i
= 0; i
< (int)cs_strlen(token
); i
++)
2975 if((token
[i
] == ':' || token
[i
] == ' ') && token
[i
+ 1] == ':') // if "::" or " :"
2977 memmove(token
+ i
+ 2, token
+ i
+ 1, cs_strlen(token
) - i
+ 1); // insert extra position
2978 token
[i
+ 1] = '0'; // and fill it with NULL
2981 if(token
[i
] == '#' || token
[i
] == '/')
2989 #if defined(WITH_STAPI) || defined(WITH_STAPI5)
2990 uint32_t disablefilter
= 0;
2991 ret
= sscanf(trim(token
), "%c: %63s %63s %d", &type
, str1
, str1
+ 64, &disablefilter
);
2993 ret
= sscanf(trim(token
), "%c: %63s %63s", &type
, str1
, str1
+ 64);
2995 type
= tolower((uint8_t)type
);
2997 if(ret
< 1 || (type
!= 'p' && type
!= 'i' && type
!= 'm' && type
!= 'd' &&
2998 type
!= 's' && type
!= 'l' && type
!= 'j' && type
!= 'a' && type
!= 'x'))
3000 //fprintf(stderr, "Warning: line containing %s in %s not recognized, ignoring line\n", token, cs_prio);
3001 // fprintf would issue the warning to the command line, which is more consistent with other config warnings
3002 // however it takes OSCam a long time (>4 seconds) to reach this part of the program, so the warnings are
3003 // reaching tty rather late which leads to confusion. So send the warnings to log file instead
3004 cs_log_dbg(D_DVBAPI
, "WARN: line containing %s in %s not recognized, ignoring...", token
, cs_prio
);
3008 struct s_dvbapi_priority
*entry
;
3009 if(!cs_malloc(&entry
, sizeof(struct s_dvbapi_priority
)))
3014 cs_log("ERROR: Could not close oscam.dvbapi fd (errno=%d %s)", errno
, strerror(errno
));
3023 #if defined(WITH_STAPI) || defined(WITH_STAPI5)
3026 cs_strncpy(entry
->devname
, str1
, sizeof(entry
->devname
));
3027 cs_strncpy(entry
->pmtfile
, str1
+ 64, sizeof(entry
->pmtfile
));
3028 entry
->disablefilter
= disablefilter
;
3029 cs_log_dbg(D_DVBAPI
, "stapi prio: ret=%d | %c: %s %s | disable %d",
3030 ret
, type
, entry
->devname
, entry
->pmtfile
, disablefilter
);
3032 if(!dvbapi_priority
)
3034 dvbapi_priority
= entry
;
3038 struct s_dvbapi_priority
*p
;
3039 for(p
= dvbapi_priority
; p
->next
!= NULL
; p
= p
->next
) { ; }
3047 uint32_t caid
= 0, provid
= 0, srvid
= 0, ecmpid
= 0, cadata
= 0;;
3048 uint32_t chid
= 0x10000; //chid=0 is a valid chid
3050 ret
= sscanf(str1
, "%4x:%6x:%33[^:]:%4x:%4x:%8x"SCNx16
, &caid
, &provid
, c_srvid
, &ecmpid
, &chid
, &cadata
);
3053 cs_log("Error in oscam.dvbapi: ret=%d | %c: %04X %06X %s %04X %04X",
3054 ret
, type
, caid
, provid
, c_srvid
, ecmpid
, chid
);
3055 continue; // skip this entry!
3059 cs_log_dbg(D_DVBAPI
, "Parsing rule: ret=%d | %c: %04X %06X %s %04X %04X %04X",
3060 ret
, type
, caid
, provid
, c_srvid
, ecmpid
, chid
, cadata
);
3064 entry
->provid
= provid
;
3065 entry
->ecmpid
= ecmpid
;
3067 entry
->cadata
= cadata
;
3068 uint32_t delay
= 0, force
= 0, mapcaid
= 0, mapprovid
= 0, mapecmpid
= 0, pidx
= 0;
3073 ret
= sscanf(str1
+ 64, "%1d", &pidx
);
3074 entry
->pidx
= pidx
+ 1;
3075 if(ret
< 1) entry
->pidx
= 0;
3079 sscanf(str1
+ 64, "%4d", &delay
);
3080 entry
->delay
= delay
;
3084 entry
->delay
= dyn_word_atob(str1
+ 64);
3085 if(entry
->delay
== -1) { entry
->delay
= 0; }
3089 ret
= sscanf(str1
+ 64, "%1d:%1d", &force
, &pidx
);
3090 entry
->force
= force
;
3091 entry
->pidx
= pidx
+ 1;
3092 if(ret
< 2) entry
->pidx
= 0;
3096 sscanf(str1
+ 64, "%4x:%6x", &mapcaid
, &mapprovid
);
3097 if(!mapcaid
) { mapcaid
= 0xFFFF; }
3098 entry
->mapcaid
= mapcaid
;
3099 entry
->mapprovid
= mapprovid
;
3104 sscanf(str1
+ 64, "%4x:%6x:%4x", &mapcaid
, &mapprovid
, &mapecmpid
);
3105 if(!mapcaid
) { mapcaid
= 0xFFFF; }
3106 entry
->mapcaid
= mapcaid
;
3107 entry
->mapprovid
= mapprovid
;
3108 entry
->mapecmpid
= mapecmpid
;
3112 if(c_srvid
[0] == '=')
3114 struct s_srvid
*this;
3115 for(i
= 0; i
< 16; i
++)
3117 for(this = cfg
.srvid
[i
]; this != NULL
; this = this->next
)
3119 if(this->name
&& strcmp(this->name
, c_srvid
+ 1) == 0)
3121 struct s_dvbapi_priority
*entry2
;
3122 if(!cs_malloc(&entry2
, sizeof(struct s_dvbapi_priority
)))
3127 memcpy(entry2
, entry
, sizeof(struct s_dvbapi_priority
));
3128 entry2
->srvid
= this->srvid
;
3129 cs_log_dbg(D_DVBAPI
, "prio srvid: ret=%d | %c: %04X %06X %04X %04X %04X -> map %04X %06X %04X | prio %d | delay %d",
3143 if(!dvbapi_priority
)
3145 dvbapi_priority
= entry2
;
3149 struct s_dvbapi_priority
*p
;
3150 for(p
= dvbapi_priority
; p
->next
!= NULL
; p
= p
->next
) { ; }
3161 sscanf(c_srvid
, "%4x", &srvid
);
3162 entry
->srvid
= srvid
;
3164 cs_log_dbg(D_DVBAPI
, "prio: ret=%d | %c: %04X %06X %04X %04X %04X -> map %04X %06X %04X | prio %d | delay %d",
3178 if(!dvbapi_priority
)
3180 dvbapi_priority
= entry
;
3184 struct s_dvbapi_priority
*p
;
3185 for(p
= dvbapi_priority
; p
->next
!= NULL
; p
= p
->next
) { ; }
3189 cs_log_dbg(D_DVBAPI
, "Read %d entries from %s", count
, cs_prio
);
3194 cs_log("ERROR: Could not close oscam.dvbapi fd (errno=%d %s)", errno
, strerror(errno
));
3199 void dvbapi_resort_ecmpids(int32_t demux_id
)
3201 int32_t n
, cache
= 0, matching_done
= 0, found
= -1, match_reader_count
= 0, total_reader
= 0;
3202 uint16_t btun_caid
= 0;
3203 struct timeb start
,end
;
3206 for(n
= 0; n
< demux
[demux_id
].ECMpidcount
; n
++)
3208 demux
[demux_id
].ECMpids
[n
].status
= 0;
3209 demux
[demux_id
].ECMpids
[n
].checked
= 0;
3210 demux
[demux_id
].ECMpids
[n
].irdeto_curindex
= 0xFE;
3211 demux
[demux_id
].ECMpids
[n
].irdeto_maxindex
= 0;
3212 demux
[demux_id
].ECMpids
[n
].irdeto_cycle
= 0xFE;
3213 demux
[demux_id
].ECMpids
[n
].tries
= 0xFE;
3214 demux
[demux_id
].ECMpids
[n
].table
= 0;
3217 demux
[demux_id
].max_status
= 0;
3218 demux
[demux_id
].curindex
= -1;
3219 demux
[demux_id
].pidindex
= -1;
3221 struct s_reader
*rdr
;
3222 int32_t p_order
= demux
[demux_id
].ECMpidcount
+ 1;
3223 struct s_dvbapi_priority
*prio
;
3225 // handle prio order in oscam.dvbapi + ignore all chids
3226 for(rdr
= first_active_reader
; rdr
; rdr
= rdr
->next
)
3228 total_reader
++; // only need to calculate once!
3232 if(!cs_malloc(&er
, sizeof(ECM_REQUEST
)))
3237 for(prio
= dvbapi_priority
; prio
!= NULL
; prio
= prio
->next
)
3239 if(prio
->type
!= 'p' && prio
->type
!= 'i')
3244 for(n
= 0; n
< demux
[demux_id
].ECMpidcount
; n
++)
3246 if(demux
[demux_id
].ECMpids
[n
].status
== -1) continue; // skip ignores!
3248 er
->caid
= er
->ocaid
= demux
[demux_id
].ECMpids
[n
].CAID
;
3249 er
->prid
= demux
[demux_id
].ECMpids
[n
].PROVID
;
3250 er
->pid
= demux
[demux_id
].ECMpids
[n
].ECM_PID
;
3251 er
->srvid
= demux
[demux_id
].program_number
;
3252 er
->client
= cur_client();
3253 btun_caid
= chk_on_btun(SRVID_MASK
, er
->client
, er
);
3255 if(prio
->type
== 'p' && btun_caid
)
3257 er
->caid
= btun_caid
;
3260 if((prio
->caid
&& (prio
->caid
!= er
->caid
&& prio
->caid
!= er
->ocaid
))
3261 || (prio
->provid
&& prio
->provid
!= er
->prid
)
3262 || (prio
->srvid
&& prio
->srvid
!= er
->srvid
)
3263 || (prio
->ecmpid
&& prio
->ecmpid
!= er
->pid
)
3264 || (prio
->pidx
&& prio
->pidx
- 1 != n
))
3269 if(prio
->type
== 'p') // check for prio
3271 if(prio
->cadata
!= 0 && prio
->cadata
!= demux
[demux_id
].ECMpids
[n
].cadata
)
3276 if(prio
->chid
< 0x10000)
3278 demux
[demux_id
].ECMpids
[n
].CHID
= prio
->chid
;
3284 for(j
= 0; j
< demux
[demux_id
].ECMpidcount
; j
++)
3286 demux
[demux_id
].ECMpids
[j
].status
= -1;
3289 demux
[demux_id
].ECMpids
[n
].status
= 1;
3290 demux
[demux_id
].ECMpids
[n
].checked
= 0;
3291 demux
[demux_id
].max_status
= 1;
3292 demux
[demux_id
].max_emm_filter
= maxfilter
- 1;
3294 cs_log_dbg(D_DVBAPI
, "Demuxer %d prio forced%s ecmpid %d %04X@%06X:%04X:%04X (file)",
3296 ((prio
->caid
== er
->caid
&& prio
->caid
!= er
->ocaid
) ? " betatunneled" : ""),
3298 demux
[demux_id
].ECMpids
[n
].CAID
,
3299 demux
[demux_id
].ECMpids
[n
].PROVID
,
3300 demux
[demux_id
].ECMpids
[n
].ECM_PID
,
3301 (uint16_t) prio
->chid
);
3303 return; // go start descrambling since its forced by user!
3307 if(!demux
[demux_id
].ECMpids
[n
].status
) // only accept first matching prio from oscam.dvbapi
3309 demux
[demux_id
].ECMpids
[n
].status
= total_reader
+ p_order
--;
3311 cs_log_dbg(D_DVBAPI
, "Demuxer %d prio%s ecmpid %d %04X@%06X:%04X:%04X weight: %d (file)",
3313 ((prio
->caid
== er
->caid
&& prio
->caid
!= er
->ocaid
) ? " betatunneled" : ""),
3315 demux
[demux_id
].ECMpids
[n
].CAID
,
3316 demux
[demux_id
].ECMpids
[n
].PROVID
,
3317 demux
[demux_id
].ECMpids
[n
].ECM_PID
,
3318 (uint16_t) prio
->chid
,
3319 demux
[demux_id
].ECMpids
[n
].status
);
3321 continue; // evaluate next ecmpid
3325 // check for ignore all chids
3326 if(prio
->type
== 'i' && prio
->chid
== 0x10000 && demux
[demux_id
].ECMpids
[n
].status
== 0)
3328 cs_log_dbg(D_DVBAPI
, "Demuxer %d ignore ecmpid %d %04X@%06X:%04X all chids (file)",
3331 demux
[demux_id
].ECMpids
[n
].CAID
,
3332 demux
[demux_id
].ECMpids
[n
].PROVID
,
3333 demux
[demux_id
].ECMpids
[n
].ECM_PID
);
3334 demux
[demux_id
].ECMpids
[n
].status
= -1;
3335 continue; // evaluate next ecmpid
3340 for(n
= 0; n
< demux
[demux_id
].ECMpidcount
; n
++)
3342 if(demux
[demux_id
].ECMpids
[n
].status
== -1)
3344 continue; // skip ignores!
3350 er
->caid
= er
->ocaid
= demux
[demux_id
].ECMpids
[n
].CAID
;
3351 er
->prid
= demux
[demux_id
].ECMpids
[n
].PROVID
;
3352 er
->pid
= demux
[demux_id
].ECMpids
[n
].ECM_PID
;
3353 er
->srvid
= demux
[demux_id
].program_number
;
3354 er
->client
= cur_client();
3356 btun_caid
= chk_on_btun(SRVID_MASK
, er
->client
, er
);
3359 er
->caid
= btun_caid
;
3362 match_reader_count
= 0;
3364 for(rdr
= first_active_reader
; rdr
; rdr
= rdr
->next
)
3366 if(matching_reader(er
, rdr
))
3368 match_reader_count
++;
3372 if(match_reader_count
== 0)
3374 cs_log_dbg(D_DVBAPI
, "Demuxer %d ignore ecmpid %d %04X@%06X:%04X:%04X (no matching reader)",
3377 demux
[demux_id
].ECMpids
[n
].CAID
,
3378 demux
[demux_id
].ECMpids
[n
].PROVID
,
3379 demux
[demux_id
].ECMpids
[n
].ECM_PID
,
3380 demux
[demux_id
].ECMpids
[n
].CHID
);
3381 demux
[demux_id
].ECMpids
[n
].status
= -1;
3382 continue; // evaluate next ecmpid
3384 else // ecmpids with no matching readers are disabled and matching sidtabbits have now highest status
3386 for(nr
= 0, sidtab
= cfg
.sidtab
; sidtab
; sidtab
= sidtab
->next
, nr
++)
3388 if(sidtab
->num_caid
| sidtab
->num_provid
| sidtab
->num_srvid
)
3390 if((cfg
.dvbapi_sidtabs
.no
& ((SIDTABBITS
)1 << nr
)) && (chk_srvid_match(er
, sidtab
)))
3392 demux
[demux_id
].ECMpids
[n
].status
= -1; //ignore
3393 cs_log_dbg(D_DVBAPI
, "Demuxer %d ignore ecmpid %d %04X@%06X:%04X (service %s pos %d)",
3396 demux
[demux_id
].ECMpids
[n
].CAID
,
3397 demux
[demux_id
].ECMpids
[n
].PROVID
,
3398 demux
[demux_id
].ECMpids
[n
].ECM_PID
,
3401 continue; // evaluate next ecmpid
3403 if((cfg
.dvbapi_sidtabs
.ok
& ((SIDTABBITS
) 1 << nr
)) && (chk_srvid_match(er
, sidtab
)))
3405 demux
[demux_id
].ECMpids
[n
].status
++; // priority
3406 cs_log_dbg(D_DVBAPI
, "Demuxer %d prio ecmpid %d %04X@%06X:%04X weight: %d (service %s pos %d)",
3409 demux
[demux_id
].ECMpids
[n
].CAID
,
3410 demux
[demux_id
].ECMpids
[n
].PROVID
,
3411 demux
[demux_id
].ECMpids
[n
].ECM_PID
,
3412 demux
[demux_id
].ECMpids
[n
].status
,
3421 // ecmpid with highest prio from oscam.dvbapi has now highest status
3422 // check all ecmpids and get the highest amount cache-ex and local readers
3423 int32_t max_local_matching_reader
= 0, max_cacheex_reader
= 0;
3425 for(n
= 0; n
< demux
[demux_id
].ECMpidcount
; n
++)
3427 int32_t count_matching_cacheex_reader
= 0, count_matching_local_reader
= 0;
3428 if(demux
[demux_id
].ECMpids
[n
].status
== -1)
3430 continue; // skip ignores!
3433 er
->caid
= er
->ocaid
= demux
[demux_id
].ECMpids
[n
].CAID
;
3434 er
->prid
= demux
[demux_id
].ECMpids
[n
].PROVID
;
3435 er
->pid
= demux
[demux_id
].ECMpids
[n
].ECM_PID
;
3436 er
->srvid
= demux
[demux_id
].program_number
;
3437 er
->client
= cur_client();
3439 btun_caid
= chk_on_btun(SRVID_MASK
, er
->client
, er
);
3442 er
->caid
= btun_caid
;
3445 for(rdr
= first_active_reader
; rdr
; rdr
= rdr
->next
)
3447 if(matching_reader(er
, rdr
))
3449 if(cacheex_reader(rdr
))
3451 count_matching_cacheex_reader
++;
3453 else if(is_localreader(rdr
, er
))
3455 count_matching_local_reader
++;
3460 if(max_local_matching_reader
< count_matching_local_reader
)
3462 max_local_matching_reader
= count_matching_local_reader
;
3465 if(max_cacheex_reader
< count_matching_cacheex_reader
)
3467 max_cacheex_reader
= count_matching_cacheex_reader
;
3471 if(max_local_matching_reader
!= 0 || max_cacheex_reader
!= 0)
3473 p_order
= demux
[demux_id
].ECMpidcount
* 2;
3474 for(n
= 0; n
< demux
[demux_id
].ECMpidcount
; n
++)
3476 int32_t count_matching_cacheex_reader
= 0, count_matching_local_reader
= 0;
3477 int32_t localprio
= 1, cacheexprio
= 1;
3479 if(demux
[demux_id
].ECMpids
[n
].status
== -1)
3481 continue; // skip ignores!
3484 if(cfg
.preferlocalcards
== 2) // ecmpids with local reader get highest prio
3486 localprio
= max_cacheex_reader
+ p_order
+ 1;
3488 else if(cfg
.preferlocalcards
== 1) // ecmpids with cacheex reader get highest prio
3490 cacheexprio
= max_local_matching_reader
+ p_order
+ 1;
3493 er
->caid
= er
->ocaid
= demux
[demux_id
].ECMpids
[n
].CAID
;
3494 er
->prid
= demux
[demux_id
].ECMpids
[n
].PROVID
;
3495 er
->pid
= demux
[demux_id
].ECMpids
[n
].ECM_PID
;
3496 er
->srvid
= demux
[demux_id
].program_number
;
3497 er
->client
= cur_client();
3499 btun_caid
= chk_on_btun(SRVID_MASK
, er
->client
, er
);
3502 er
->caid
= btun_caid
;
3505 int32_t oldstatus
= demux
[demux_id
].ECMpids
[n
].status
;
3506 int32_t anyreader
= 0;
3508 for(rdr
= first_active_reader
; rdr
; rdr
= rdr
->next
)
3510 if(matching_reader(er
, rdr
))
3512 if(cfg
.preferlocalcards
== 0)
3516 demux
[demux_id
].ECMpids
[n
].status
++;
3522 if(cacheex_reader(rdr
))
3524 demux
[demux_id
].ECMpids
[n
].status
+= cacheexprio
;
3525 count_matching_cacheex_reader
++;
3529 if(is_localreader(rdr
, er
))
3531 demux
[demux_id
].ECMpids
[n
].status
+= localprio
;
3532 count_matching_local_reader
++;
3538 if(oldstatus
!= demux
[demux_id
].ECMpids
[n
].status
)
3542 cs_log_dbg(D_DVBAPI
, "Demuxer %d prio ecmpid %d %04X@%06X:%04X:%04X weight: %d (%d readers)",
3545 demux
[demux_id
].ECMpids
[n
].CAID
,
3546 demux
[demux_id
].ECMpids
[n
].PROVID
,
3547 demux
[demux_id
].ECMpids
[n
].ECM_PID
,
3548 demux
[demux_id
].ECMpids
[n
].CHID
,
3549 demux
[demux_id
].ECMpids
[n
].status
,
3554 cs_log_dbg(D_DVBAPI
, "Demuxer %d prio ecmpid %d %04X@%06X:%04X:%04X weight: %d (%d local and %d cacheex readers)",
3557 demux
[demux_id
].ECMpids
[n
].CAID
,
3558 demux
[demux_id
].ECMpids
[n
].PROVID
,
3559 demux
[demux_id
].ECMpids
[n
].ECM_PID
,
3560 demux
[demux_id
].ECMpids
[n
].CHID
,
3561 demux
[demux_id
].ECMpids
[n
].status
,
3562 count_matching_local_reader
,
3563 count_matching_cacheex_reader
);
3569 struct s_channel_cache
*c
= NULL
;
3571 for(n
= 0; n
< demux
[demux_id
].ECMpidcount
&& matching_done
== 0; n
++)
3573 if(demux
[demux_id
].ECMpids
[n
].status
== -1)
3575 continue; // skip ignores!
3578 c
= dvbapi_find_channel_cache(demux_id
, n
, 0); // find exact channel match
3582 cache
= 2; // found cache entry with higher priority
3583 demux
[demux_id
].ECMpids
[n
].status
++; // prioritize CAIDs which already decoded same caid:provid:srvid
3585 if(c
->chid
< 0x10000)
3587 demux
[demux_id
].ECMpids
[n
].CHID
= c
->chid
; // if chid registered in cache -> use it!
3589 cs_log_dbg(D_DVBAPI
, "Demuxer %d prio ecmpid %d %04X@%06X:%04X weight: %d (found caid/provid/srvid in cache)",
3592 demux
[demux_id
].ECMpids
[n
].CAID
,
3593 demux
[demux_id
].ECMpids
[n
].PROVID
,
3594 demux
[demux_id
].ECMpids
[n
].ECM_PID
,
3595 demux
[demux_id
].ECMpids
[n
].status
);
3602 // prioritize CAIDs which already decoded same caid:provid
3603 for(n
= 0; n
< demux
[demux_id
].ECMpidcount
&& matching_done
== 0; n
++)
3605 if(demux
[demux_id
].ECMpids
[n
].status
== -1) continue; // skip ignores!
3607 c
= dvbapi_find_channel_cache(demux_id
, n
, 1);
3610 cache
= 1; //found cache entry
3611 demux
[demux_id
].ECMpids
[n
].status
++;
3612 cs_log_dbg(D_DVBAPI
, "Demuxer %d prio ecmpid %d %04X@%06X:%04X weight: %d (found caid/provid in cache)",
3615 demux
[demux_id
].ECMpids
[n
].CAID
,
3616 demux
[demux_id
].ECMpids
[n
].PROVID
,
3617 demux
[demux_id
].ECMpids
[n
].ECM_PID
,
3618 demux
[demux_id
].ECMpids
[n
].status
);
3623 int32_t max_status
= 0;
3624 int32_t highest_priopid
= -1;
3626 for(n
= 0; n
< demux
[demux_id
].ECMpidcount
; n
++)
3628 if(demux
[demux_id
].ECMpids
[n
].status
== -1)
3630 continue; // skip ignores!
3633 if(demux
[demux_id
].ECMpids
[n
].status
> max_status
) // find highest prio pid
3635 max_status
= demux
[demux_id
].ECMpids
[n
].status
;
3636 highest_priopid
= n
;
3639 if(!USE_OPENXCAS
) // openxcas doesnt use prio and non-prio run: all are equal!
3641 if(demux
[demux_id
].ECMpids
[n
].status
== 0)
3643 demux
[demux_id
].ECMpids
[n
].checked
= 2; // set pids with no status to no prio run
3648 demux
[demux_id
].max_status
= max_status
; // register maxstatus
3650 // Found entry in channelcache that is valid and has exact match on srvid
3651 if(highest_priopid
!= -1 && found
== highest_priopid
&& cache
== 2)
3653 for(n
= 0; n
< demux
[demux_id
].ECMpidcount
; n
++)
3655 if(demux
[demux_id
].ECMpids
[n
].status
== -1)
3657 continue; // skip ignores!
3662 // disable non matching pid
3663 demux
[demux_id
].ECMpids
[n
].status
= -1;
3667 demux
[demux_id
].ECMpids
[n
].status
= 1;
3670 demux
[demux_id
].max_emm_filter
= maxfilter
- 1;
3671 demux
[demux_id
].max_status
= 1;
3672 cs_log("Demuxer %d found channel in cache and matching prio -> start descrambling ecmpid %d ", demux_id
, found
);
3677 int64_t gone
= comp_timeb(&end
, &start
);
3678 cs_log_dbg(D_DVBAPI
, "Demuxer %d sorting the ecmpids took %"PRId64
" ms", demux_id
, gone
);
3682 static void dvbapi_priority_read_entry_add(int32_t demux_id
, uint16_t video_pid
)
3684 struct s_dvbapi_priority
*add_entry
;
3686 for(add_entry
= dvbapi_priority
; add_entry
!= NULL
; add_entry
= add_entry
->next
)
3688 // ECM pid is misused to hold PMT pid in case of 'A' rule.
3689 // Some receivers don't forward the PMT pid, so use the video pid instead
3690 if(add_entry
->type
!= 'a' || add_entry
->srvid
!= demux
[demux_id
].program_number
3691 || (add_entry
->ecmpid
&& demux
[demux_id
].pmtpid
&& add_entry
->ecmpid
!= demux
[demux_id
].pmtpid
)
3692 || (add_entry
->ecmpid
&& !demux
[demux_id
].pmtpid
&& add_entry
->ecmpid
!= video_pid
))
3697 dvbapi_add_ecmpid(demux_id
, add_entry
->mapcaid
, add_entry
->mapecmpid
, add_entry
->mapprovid
, 0, "(fake ecm pid)");
3699 cs_log_dbg(D_DVBAPI
, "Demuxer %d added fake ecm pid %04X@%06X:%04X for program %04X", demux_id
,
3700 add_entry
->mapcaid
, add_entry
->mapprovid
, add_entry
->mapecmpid
, demux
[demux_id
].program_number
);
3705 static void dvbapi_priority_read_entry_map(int32_t demux_id
)
3708 struct s_dvbapi_priority
*map_entry
;
3710 for(j
= 0; j
< demux
[demux_id
].ECMpidcount
; j
++)
3712 map_entry
= dvbapi_check_prio_match(demux_id
, j
, 'm');
3715 cs_log_dbg(D_DVBAPI
, "Demuxer %d mapping ecm pid %d from %04X@%06X to %04X@%06X",
3716 demux_id
, j
, demux
[demux_id
].ECMpids
[j
].CAID
, demux
[demux_id
].ECMpids
[j
].PROVID
,
3717 map_entry
->mapcaid
, map_entry
->mapprovid
);
3719 demux
[demux_id
].ECMpids
[j
].CAID
= map_entry
->mapcaid
;
3720 demux
[demux_id
].ECMpids
[j
].PROVID
= map_entry
->mapprovid
;
3725 static void dvbapi_priority_read_entry_extra(int32_t demux_id
)
3727 struct s_dvbapi_priority
*extra_entry
;
3728 int32_t j
, k
, l
, m
, extra_demux_id
;
3730 for(extra_entry
= dvbapi_priority
; extra_entry
!= NULL
; extra_entry
= extra_entry
->next
)
3732 if(extra_entry
->type
!= 'x')
3737 for(j
= 0; j
<= demux
[demux_id
].ECMpidcount
; ++j
)
3739 if((extra_entry
->caid
&& extra_entry
->caid
!= demux
[demux_id
].ECMpids
[j
].CAID
)
3740 || (extra_entry
->provid
&& extra_entry
->provid
!= demux
[demux_id
].ECMpids
[j
].PROVID
)
3741 || (extra_entry
->ecmpid
&& extra_entry
->ecmpid
!= demux
[demux_id
].ECMpids
[j
].ECM_PID
)
3742 || (extra_entry
->srvid
&& extra_entry
->srvid
!= demux
[demux_id
].program_number
))
3747 cs_log("Mapping ecm pid %04X@%06X:%04X:%04X to extra demuxer",
3748 extra_entry
->caid
, extra_entry
->provid
, extra_entry
->ecmpid
, extra_entry
->srvid
);
3750 for(extra_demux_id
= 0; extra_demux_id
< MAX_DEMUX
; extra_demux_id
++)
3752 if(demux
[extra_demux_id
].program_number
!= 0)
3754 continue; // Skip occupied demuxers
3758 if(extra_demux_id
>= MAX_DEMUX
)
3760 cs_log("There is no free demuxer for extra streams");
3764 demux
[extra_demux_id
].ECMpids
[0] = demux
[demux_id
].ECMpids
[j
];
3765 demux
[extra_demux_id
].ECMpidcount
= 1;
3766 demux
[extra_demux_id
].STREAMpidcount
= 0;
3767 demux
[extra_demux_id
].program_number
= demux
[demux_id
].program_number
;
3768 demux
[extra_demux_id
].pmtpid
= demux
[demux_id
].pmtpid
;
3769 demux
[extra_demux_id
].demux_index
= demux
[demux_id
].demux_index
;
3770 demux
[extra_demux_id
].adapter_index
= demux
[demux_id
].adapter_index
;
3771 demux
[extra_demux_id
].ca_mask
= demux
[demux_id
].ca_mask
;
3772 demux
[extra_demux_id
].socket_fd
= demux
[demux_id
].socket_fd
;
3773 demux
[extra_demux_id
].stop_descrambling
= false;
3774 demux
[extra_demux_id
].rdr
= NULL
;
3775 demux
[extra_demux_id
].curindex
= -1;
3777 // Add streams to extra demux
3778 for(k
= 0; k
< demux
[demux_id
].STREAMpidcount
; ++k
)
3780 if(!demux
[demux_id
].ECMpids
[j
].streams
|| (demux
[demux_id
].ECMpids
[j
].streams
& (1 << k
)))
3782 demux
[extra_demux_id
].ECMpids
[0].streams
|= (1 << demux
[extra_demux_id
].STREAMpidcount
);
3783 demux
[extra_demux_id
].STREAMpids
[demux
[extra_demux_id
].STREAMpidcount
] = demux
[demux_id
].STREAMpids
[k
];
3784 demux
[extra_demux_id
].STREAMpidsType
[demux
[extra_demux_id
].STREAMpidcount
] = demux
[demux_id
].STREAMpidsType
[k
];
3785 ++demux
[extra_demux_id
].STREAMpidcount
;
3787 // Shift stream associations in normal demux because we will remove the stream entirely
3788 for(l
= 0; l
< demux
[demux_id
].ECMpidcount
; ++l
)
3790 for(m
= k
; m
< demux
[demux_id
].STREAMpidcount
- 1; ++m
)
3792 if(demux
[demux_id
].ECMpids
[l
].streams
& (1 << (m
+ 1)))
3794 demux
[demux_id
].ECMpids
[l
].streams
|= (1 << m
);
3798 demux
[demux_id
].ECMpids
[l
].streams
&= ~(1 << m
);
3803 // Remove stream association from normal demux device
3804 for(l
= k
; l
< demux
[demux_id
].STREAMpidcount
- 1; ++l
)
3806 demux
[demux_id
].STREAMpids
[l
] = demux
[demux_id
].STREAMpids
[l
+ 1];
3807 demux
[demux_id
].STREAMpidsType
[l
] = demux
[demux_id
].STREAMpidsType
[l
+ 1];
3810 --demux
[demux_id
].STREAMpidcount
;
3815 // Remove ecm pid from normal demuxer
3816 for(k
= j
; k
< demux
[demux_id
].ECMpidcount
; ++k
)
3818 demux
[demux_id
].ECMpids
[k
] = demux
[demux_id
].ECMpids
[k
+ 1];
3821 --demux
[demux_id
].ECMpidcount
;
3824 if(demux
[extra_demux_id
].STREAMpidcount
<= 0)
3826 cs_log("Found no streams for extra demuxer. Not starting additional decoding on it.");
3828 demux
[extra_demux_id
].program_number
= 0;
3829 demux
[extra_demux_id
].stop_descrambling
= true;
3832 if(demux
[demux_id
].STREAMpidcount
< 1)
3834 cs_log("Found no streams for normal demuxer. Not starting additional decoding on it.");
3840 static void dvbapi_parse_pmt_ca_descriptor(int32_t demux_id
, const uint8_t *buffer
, uint8_t descriptor_length
)
3842 uint16_t i
, ca_system_id
, ca_pid
;
3843 uint32_t ca_provider
= 0, ca_data
= 0;
3844 char txt
[40]; // room for PBM: 8 byte pbm and DATE: date
3845 memset(txt
, 0x00, sizeof(txt
));
3847 if(descriptor_length
< 4)
3849 return; // CA descriptor has a minimum length of 4 bytes
3852 ca_system_id
= b2i(2, buffer
);
3853 ca_pid
= b2i(2, buffer
+ 2) & 0x1FFF;
3855 if(ca_system_id
== 0x0000 || (!caid_is_biss_fixed(ca_system_id
) && !caid_is_fake(ca_system_id
) && ca_pid
== 0x1FFF))
3857 return; // This is not a valid CAID or ECM pid
3860 if(caid_is_seca(ca_system_id
))
3862 for(i
= 2; i
< descriptor_length
; i
+= 15)
3864 ca_pid
= b2i(2, buffer
+ i
) & 0x1FFF;
3865 ca_provider
= b2i(2, buffer
+ i
+ 2);
3867 int8_t year
= buffer
[i
+ 13] >> 1;
3868 int8_t month
= (((buffer
[i
+ 13] & 0x01) << 3) | (buffer
[i
+ 14] >> 5));
3869 int8_t day
= buffer
[i
+ 14] & 0x1F;
3871 snprintf(txt
, sizeof(txt
), "PBM: ");
3872 cs_hexdump(0, buffer
+ i
+ 5, 8, txt
+ 5, (2 * 8) + 1); // hexdump 8 byte pbm
3873 snprintf(txt
+ 20, sizeof(txt
) - 20, " DATE: %d-%d-%d", day
, month
, year
+ 1990);
3875 dvbapi_add_ecmpid(demux_id
, ca_system_id
, ca_pid
, ca_provider
, 0, txt
);
3880 if(caid_is_viaccess(ca_system_id
) && descriptor_length
== 0x0F && buffer
[10] == 0x14)
3882 ca_provider
= b2i(3, buffer
+ 12) & 0xFFFFF0;
3884 else if(caid_is_nagra(ca_system_id
) && descriptor_length
== 0x07)
3886 ca_provider
= b2i(2, buffer
+ 5);
3888 else if((ca_system_id
>> 8 == 0x4A || ca_system_id
== 0x2710) && descriptor_length
> 0x04)
3890 ca_provider
= buffer
[4];
3892 if(caid_is_dre(ca_system_id
) && descriptor_length
== 0x0A)
3894 ca_data
= b2i(4, buffer
+ 6);
3895 snprintf(txt
, 40, "CA DATA: %X", ca_data
);
3899 dvbapi_add_ecmpid(demux_id
, ca_system_id
, ca_pid
, ca_provider
, ca_data
, txt
);
3903 static void dvbapi_parse_pmt_descriptors(int32_t demux_id
, const uint8_t *buffer
, uint16_t length
, uint8_t *type
)
3906 uint8_t descriptor_tag
, descriptor_length
;
3908 for(i
= 0; i
+ 1 < length
; i
+= 2 + descriptor_length
)
3910 descriptor_tag
= buffer
[i
];
3911 descriptor_length
= buffer
[i
+ 1];
3913 cs_log_dbg(D_DVBAPI
, "Demuxer %d found %s descriptor (tag: %02X length: %02X)",
3914 demux_id
, get_descriptor_tag_txt(descriptor_tag
), descriptor_tag
, descriptor_length
);
3916 switch(descriptor_tag
)
3918 case 0x05: // Registration descriptor
3920 // "HDMV" format identifier is removed
3921 // OSCam does not need to know about Blu-ray
3922 const char format_identifiers_audio
[10][5] =
3924 "AC-3", "BSSD", "dmat", "DRA1", "DTS1",
3925 "DTS2", "DTS3", "EAC3", "mlpa", "Opus",
3928 for(j
= 0; j
< 10; j
++)
3930 if(memcmp(buffer
+ i
+ 2, format_identifiers_audio
[j
], 4) == 0)
3932 *type
= STREAM_AUDIO
;
3939 case 0x09: // CA descriptor
3941 dvbapi_parse_pmt_ca_descriptor(demux_id
, buffer
+ i
+ 2, descriptor_length
);
3945 case 0x59: // Subtitling descriptor (DVB)
3947 *type
= STREAM_SUBTITLE
;
3951 case 0x6A: // AC-3 descriptor (DVB)
3952 case 0x7A: // Enhanced AC-3 descriptor (DVB)
3953 case 0x7B: // DTS descriptor (DVB)
3954 case 0x7C: // AAC descriptor (DVB)
3955 case 0x81: // AC-3 descriptor (ATSC)
3956 case 0xCC: // Enhanced AC-3 descriptor (ATSC)
3958 *type
= STREAM_AUDIO
;
3962 case 0x7F: // Extension descriptor (DVB)
3964 uint8_t extension_descriptor_tag
= buffer
[i
+ 2];
3966 cs_log_dbg(D_DVBAPI
, "Demuxer %d found %s descriptor (extension tag: %02X)",
3967 demux_id
, get_extension_descriptor_txt(extension_descriptor_tag
), extension_descriptor_tag
);
3969 switch(extension_descriptor_tag
)
3971 case 0x0E: // DTS-HD descriptor (DVB)
3972 case 0x0F: // DTS Neural descriptor (DVB)
3973 case 0x15: // AC-4 descriptor (DVB)
3974 *type
= STREAM_AUDIO
;
3977 case 0x20: // TTML subtitling descriptor (DVB)
3978 *type
= STREAM_SUBTITLE
;
3982 *type
= STREAM_UNDEFINED
;
3994 void request_cw(struct s_client
*client
, ECM_REQUEST
*er
, int32_t demux_id
, uint8_t delayed_ecm_check
)
3998 int32_t filternum
= dvbapi_set_section_filter(demux_id
, er
, -1); // set ecm filter to odd -> even and visaversa
4001 cs_log_dbg(D_DVBAPI
, "Demuxer %d not requesting cw -> ecm filter was killed!", demux_id
);
4006 if(!delayed_ecm_check
) // no delayed ecm check for this filter
4008 memset(demux
[demux_id
].demux_fd
[filternum
].lastecmd5
, 0, CS_ECMSTORESIZE
); // no ecm delay check: zero it!
4012 uint8_t md5tmp
[MD5_DIGEST_LENGTH
];
4013 MD5(er
->ecm
, er
->ecmlen
, md5tmp
);
4015 if(!memcmp(demux
[demux_id
].demux_fd
[filternum
].prevecmd5
, md5tmp
, CS_ECMSTORESIZE
))
4017 if(demux
[demux_id
].demux_fd
[filternum
].prevresult
< E_NOTFOUND
)
4019 cs_log_dbg(D_DVBAPI
, "Demuxer %d not requesting same ecm again! -> SKIP!", demux_id
);
4025 cs_log_dbg(D_DVBAPI
, "Demuxer %d requesting same ecm again (previous result was not found!)", demux_id
);
4028 else if(!memcmp(demux
[demux_id
].demux_fd
[filternum
].lastecmd5
, md5tmp
, CS_ECMSTORESIZE
))
4030 if(demux
[demux_id
].demux_fd
[filternum
].lastresult
< E_NOTFOUND
)
4032 cs_log_dbg(D_DVBAPI
, "Demuxer %d not requesting same ecm again! -> SKIP!", demux_id
);
4038 cs_log_dbg(D_DVBAPI
, "Demuxer %d requesting same ecm again (previous result was not found!)", demux_id
);
4042 memcpy(demux
[demux_id
].demux_fd
[filternum
].prevecmd5
, demux
[demux_id
].demux_fd
[filternum
].lastecmd5
, CS_ECMSTORESIZE
);
4043 demux
[demux_id
].demux_fd
[filternum
].prevresult
= demux
[demux_id
].demux_fd
[filternum
].lastresult
;
4044 memcpy(demux
[demux_id
].demux_fd
[filternum
].lastecmd5
, md5tmp
, CS_ECMSTORESIZE
);
4045 demux
[demux_id
].demux_fd
[filternum
].lastresult
= 0xFF;
4048 er
->adapter_index
= demux
[demux_id
].adapter_index
;
4052 char buf
[ECM_FMT_LEN
];
4053 format_ecm(er
, buf
, ECM_FMT_LEN
);
4054 cs_log_dbg(D_DVBAPI
, "Demuxer %d request controlword for ecm %s", demux_id
, buf
);
4058 void dvbapi_try_next_caid(int32_t demux_id
, int8_t checked
, uint32_t msgid
)
4060 int32_t n
, j
, found
= -1, started
= 0;
4061 int32_t status
= demux
[demux_id
].max_status
;
4063 for(j
= status
; j
>= 0; j
--) // largest status first!
4065 for(n
= 0; n
< demux
[demux_id
].ECMpidcount
; n
++)
4067 //cs_log_dbg(D_DVBAPI,"Demuxer %d PID %d checked = %d status = %d (searching for pid with status = %d)",
4068 // demux_id, n, demux[demux_id].ECMpids[n].checked, demux[demux_id].ECMpids[n].status, j);
4070 if(demux
[demux_id
].ECMpids
[n
].checked
== checked
&& demux
[demux_id
].ECMpids
[n
].status
== j
)
4073 openxcas_set_provid(demux
[demux_id
].ECMpids
[found
].PROVID
);
4074 openxcas_set_caid(demux
[demux_id
].ECMpids
[found
].CAID
);
4075 openxcas_set_ecm_pid(demux
[demux_id
].ECMpids
[found
].ECM_PID
);
4077 // fixup for cas that need emm first!
4078 if(caid_is_irdeto(demux
[demux_id
].ECMpids
[found
].CAID
) || (caid_is_dre(demux
[demux_id
].ECMpids
[found
].CAID
)
4079 && ((demux
[demux_id
].ECMpids
[found
].PROVID
== 0x11 || demux
[demux_id
].ECMpids
[found
].PROVID
== 0xFE))))
4081 demux
[demux_id
].emmstart
.time
= 0;
4084 started
= dvbapi_start_descrambling(demux_id
, found
, checked
, msgid
);
4085 if(cfg
.dvbapi_requestmode
== 0 && started
== 1)
4087 return; // in requestmode 0 we only start 1 ecm request at the time
4093 if(found
== -1 && demux
[demux_id
].pidindex
== -1)
4095 cs_log("Demuxer %d no suitable readers found that can be used for decoding!", demux_id
);
4100 static void dvbapi_parse_pmt_program_info(int32_t demux_id
, const uint8_t *buffer
, uint16_t length
, uint8_t *ca_pmt_cmd_id
)
4102 uint16_t i
, offset
= 0;
4103 uint8_t descriptor_tag
, descriptor_length
;
4105 if(ca_pmt_cmd_id
!= NULL
) // We are on CA PMT parsing
4107 *ca_pmt_cmd_id
= buffer
[0];
4111 for(i
= offset
; i
+ 1 < length
; i
+= 2 + descriptor_length
)
4113 descriptor_tag
= buffer
[i
];
4114 descriptor_length
= buffer
[i
+ 1];
4116 if(descriptor_tag
== 0x09) // We only care about CA descriptors at program level
4118 dvbapi_parse_pmt_ca_descriptor(demux_id
, buffer
+ i
+ 2, descriptor_length
);
4123 static void dvbapi_parse_pmt_es_info(int32_t demux_id
, const uint8_t *buffer
, uint16_t length
, uint8_t *ca_pmt_cmd_id
, uint16_t *video_pid
)
4125 uint16_t i
, elementary_pid
, es_info_length
, offset
= 0;
4126 uint8_t stream_type
, type
;
4128 for(i
= 0; i
+ 4 < length
; i
+= 5 + es_info_length
)
4130 if(demux
[demux_id
].STREAMpidcount
>= MAX_STREAM_PIDS
)
4132 cs_log("Demuxer %d reached maximum number of elementary streams", demux_id
);
4136 type
= STREAM_UNDEFINED
;
4137 stream_type
= buffer
[i
];
4138 elementary_pid
= b2i(2, buffer
+ i
+ 1) & 0x1FFF;
4139 es_info_length
= b2i(2, buffer
+ i
+ 3) & 0x0FFF;
4141 cs_log_dbg(D_DVBAPI
,"Demuxer %d found %s stream (type: %02X pid: %04X)",
4142 demux_id
, get_stream_type_txt(stream_type
), stream_type
, elementary_pid
);
4144 if(es_info_length
!= 0 && es_info_length
< length
)
4146 if(ca_pmt_cmd_id
!= NULL
) // We are on CA PMT parsing
4148 // Only enigma2, Spark and VDR follow the CA PMT specification ("ca_pmt_cmd_id"
4149 // shall be present in the ES info loop). For the first two, checking for boxtype
4150 // "dreambox" is sufficient, but for VDR this is not enough, because it shares
4151 // the same boxtype with tvheadend. So, for every other box (including VDR and
4152 // tvheadend), we stick to the old style check based on the value (descriptors
4153 // with tag 0x00 or 0x01 are not allowed, so this works), while for enigma2 we
4154 // do a proper check, because the "ca_pmt_cmd_id" can also take greater values.
4155 if(cfg
.dvbapi_boxtype
== BOXTYPE_DREAMBOX
)
4157 *ca_pmt_cmd_id
= buffer
[i
+ 5]; // It should be identical for all ES and the same as in program info
4162 offset
= (buffer
[i
+ 5] <= 0x01) ? 1 : 0;
4166 // Parse descriptors at ES level
4167 dvbapi_parse_pmt_descriptors(demux_id
, buffer
+ i
+ 5 + offset
, es_info_length
, &type
);
4170 // Get basic stream type (video, audio, subtitle) for each ES pid
4185 *video_pid
= elementary_pid
;
4187 demux
[demux_id
].STREAMpidsType
[demux
[demux_id
].STREAMpidcount
] = STREAM_VIDEO
;
4198 demux
[demux_id
].STREAMpidsType
[demux
[demux_id
].STREAMpidcount
] = STREAM_AUDIO
;
4202 //case 0x81: some ATSC AC-3 streams do not contain the AC-3 descriptor!
4204 // Set the type based on the descriptors for these stream types
4205 demux
[demux_id
].STREAMpidsType
[demux
[demux_id
].STREAMpidcount
] = type
;
4209 demux
[demux_id
].STREAMpidsType
[demux
[demux_id
].STREAMpidcount
] = STREAM_UNDEFINED
;
4213 demux
[demux_id
].STREAMpids
[demux
[demux_id
].STREAMpidcount
] = elementary_pid
;
4214 demux
[demux_id
].STREAMpidcount
++;
4218 static void dvbapi_parse_pmt_info(int32_t demux_id
, const uint8_t *buffer
, uint16_t length
, uint16_t pcr_pid
, uint8_t *ca_pmt_cmd_id
)
4220 uint16_t i
, program_info_length
, video_pid
= 0;
4222 // Cleanout demuxer from possible stale info
4223 // (reset ECM pids and streams)
4224 for(i
= 0; i
< demux
[demux_id
].ECMpidcount
; i
++)
4226 demux
[demux_id
].ECMpids
[i
].streams
= 0;
4229 demux
[demux_id
].ECMpidcount
= 0;
4230 demux
[demux_id
].STREAMpidcount
= 0;
4232 // Parse program info
4233 // In case of CA PMT, read the ca_pmt_cmd_id as well
4234 program_info_length
= b2i(2, buffer
) & 0x0FFF;
4235 if(program_info_length
!= 0 && program_info_length
< length
)
4237 dvbapi_parse_pmt_program_info(demux_id
, buffer
+ 2, program_info_length
, ca_pmt_cmd_id
);
4240 // Parse elementary stream info
4241 // In case of CA PMT, read the ca_pmt_cmd_id for each stream as well
4242 dvbapi_parse_pmt_es_info(demux_id
, buffer
+ 2 + program_info_length
, length
- 2 - program_info_length
, ca_pmt_cmd_id
, &video_pid
);
4244 cs_log("Demuxer %d found %d ECM pids and %d STREAM pids in %sPMT", demux_id
,
4245 demux
[demux_id
].ECMpidcount
, demux
[demux_id
].STREAMpidcount
, ca_pmt_cmd_id
!= NULL
? "CA " : "");
4247 // Various retarded boxes misuse the "ca_pmt_cmd_id" value,
4248 // usually by setting it to zero. If we are on CA PMT parsing,
4249 // make sure we pass a value we can work with later on.
4250 if(ca_pmt_cmd_id
!= NULL
)
4252 *ca_pmt_cmd_id
= (*ca_pmt_cmd_id
< CA_PMT_CMD_OK_DESCRAMBLING
) ? CA_PMT_CMD_OK_DESCRAMBLING
: *ca_pmt_cmd_id
;
4255 // If no elementary streams are available, set the PMT pid as the
4256 // first stream (PMT cannot be encrypted, like it was mentioned
4257 // in the old comment, so not sure why this is needed...)
4258 if(demux
[demux_id
].STREAMpidcount
== 0)
4260 demux
[demux_id
].STREAMpids
[0] = demux
[demux_id
].pmtpid
;
4261 demux
[demux_id
].STREAMpidsType
[0] = STREAM_VIDEO
;
4262 demux
[demux_id
].STREAMpidcount
++;
4263 video_pid
= demux
[demux_id
].pmtpid
;
4266 // Fix for channels not listing the video pid inside the PMT: use the pcr pid instead
4267 if(video_pid
== 0 && pcr_pid
!= 0x1FFF)
4269 demux
[demux_id
].STREAMpids
[demux
[demux_id
].STREAMpidcount
] = pcr_pid
;
4270 demux
[demux_id
].STREAMpidsType
[demux
[demux_id
].STREAMpidcount
] = STREAM_VIDEO
;
4271 demux
[demux_id
].STREAMpidcount
++;
4272 video_pid
= pcr_pid
;
4274 cs_log("Demuxer %d found no video pid. Using the PCR pid %04X instead", demux_id
, pcr_pid
);
4277 // Register found video pid on all ECM pids of this demuxer
4278 for(i
= 0; i
< demux
[demux_id
].ECMpidcount
; i
++)
4280 demux
[demux_id
].ECMpids
[i
].VPID
= video_pid
;
4283 // Search for dvbapi priority entries for this program
4284 if(dvbapi_priority
!= NULL
)
4286 dvbapi_priority_read_entry_add(demux_id
, video_pid
);
4287 dvbapi_priority_read_entry_map(demux_id
);
4288 dvbapi_priority_read_entry_extra(demux_id
);
4292 typedef struct demux_parameters
4294 uint8_t demux_index
;
4295 uint8_t adapter_index
;
4297 uint16_t program_number
;
4302 } demux_parameters_t
;
4304 static void get_demux_parameters(const uint8_t *buffer
, demux_parameters_t
*parameters
)
4306 parameters
->ca_mask
= 1;
4307 parameters
->demux_index
= 0;
4308 parameters
->adapter_index
= 0;
4309 parameters
->pmtpid
= 0;
4310 parameters
->program_number
= b2i(2, buffer
+ 1);
4312 uint16_t program_info_length
= b2i(2, buffer
+ 4) & 0x0FFF;
4313 uint16_t pos
= 7; // 4 + 2 (program_info_length) + 1 (ca_pmt_cmd_id)
4315 while(pos
+ 1 < 5 + program_info_length
)
4317 uint8_t descriptor_tag
= buffer
[pos
];
4318 uint8_t descriptor_length
= buffer
[pos
+ 1];
4320 switch(descriptor_tag
)
4327 case ENIGMA_NAMESPACE
:
4329 if(descriptor_length
== 0x08)
4331 parameters
->ens
= b2i(4, buffer
+ pos
+ 2);
4332 parameters
->tsid
= b2i(2, buffer
+ pos
+ 6);
4333 parameters
->onid
= b2i(2, buffer
+ pos
+ 8);
4338 case DEMUX_CA_MASK_ADAPTER
:
4340 if(descriptor_length
== 0x02 && (cfg
.dvbapi_boxtype
== BOXTYPE_PC
||
4341 cfg
.dvbapi_boxtype
== BOXTYPE_PC_NODMX
|| cfg
.dvbapi_boxtype
== BOXTYPE_SAMYGO
))
4343 parameters
->demux_index
= buffer
[pos
+ 2]; // Usually 0, but not always
4344 parameters
->adapter_index
= buffer
[pos
+ 3]; // Can be 0, 1, 2, ...
4345 parameters
->ca_mask
= (1 << parameters
->adapter_index
); // use adapter_index as ca_mask
4347 else if(descriptor_length
== 0x03 && cfg
.dvbapi_boxtype
== BOXTYPE_QBOXHD
)
4349 // ca_mask = buffer[pos + 2]; // with STONE 1.0.4 always 0x01
4350 parameters
->demux_index
= buffer
[pos
+ 3]; // with STONE 1.0.4 always 0x00
4351 parameters
->adapter_index
= buffer
[pos
+ 4]; // with STONE 1.0.4 adapter index can be 0, 1, 2
4352 parameters
->ca_mask
= (1 << parameters
->adapter_index
); // use adapter_index as ca_mask
4354 else if(descriptor_length
== 0x02) // enigma2
4356 parameters
->ca_mask
= buffer
[pos
+ 2];
4357 uint8_t demux_tmp
= buffer
[pos
+ 3];
4359 if(demux_tmp
>= 8 && parameters
->ca_mask
== 0) // openpli based images
4361 parameters
->ca_mask
= 1 << demux_tmp
;
4364 if(demux_tmp
== 0xFF) // tryfix prismcube (0xFF -> "demux-1" = error!)
4368 parameters
->demux_index
= demux_tmp
;
4373 case ADAPTER_DEVICE
:
4375 if(descriptor_length
== 0x01)
4377 parameters
->adapter_index
= buffer
[pos
+ 2];
4384 if(descriptor_length
== 0x02)
4386 parameters
->pmtpid
= b2i(2, buffer
+ pos
+ 2);
4391 case SERVICE_TYPE_MASK
:
4396 if(descriptor_length
== 0x01)
4398 parameters
->demux_index
= buffer
[pos
+ 2];
4399 parameters
->ca_mask
= 1 << parameters
->demux_index
;
4406 if(descriptor_length
== 0x01)
4408 parameters
->ca_mask
= 1 << buffer
[pos
+ 2];
4415 cs_log_dbg(D_DVBAPI
, "Skipped unsupported or CA PMT irrelevant descriptor (tag: %02X length: %02X)", descriptor_tag
, descriptor_length
);
4420 pos
+= 2 + descriptor_length
;
4424 static void dvbapi_capmt_notify(struct demux_s
*dmx
)
4426 struct s_client
*cl
;
4427 for(cl
= first_client
->next
; cl
; cl
= cl
->next
)
4429 if((cl
->typ
== 'p' || cl
->typ
== 'r') && cl
->reader
&& cl
->reader
->ph
.c_capmt
)
4431 struct demux_s
*curdemux
;
4432 if(cs_malloc(&curdemux
, sizeof(struct demux_s
)))
4434 memcpy(curdemux
, dmx
, sizeof(struct demux_s
));
4435 add_job(cl
, ACTION_READER_CAPMT_NOTIFY
, curdemux
, sizeof(struct demux_s
));
4441 static void dvbapi_prepare_descrambling(int32_t demux_id
, uint32_t msgid
)
4443 bool is_powervu
= false, start_emm
= true;
4444 char service_name
[CS_SERVICENAME_SIZE
];
4446 // The CA PMT should have given us enough info to determine if descrambling
4447 // is possible. Parsing the (real) PMT is not necessary, unless we have a
4448 // PowerVu encrypted channel or (for some weird reason) no stream pids at all.
4449 // Actually, when no streams are available, we set the PMT pid as the 1st
4450 // stream pid, so we have to check against that. Finally, if the PMT pid is
4451 // not included in the CA PMT, we start the PAT filter instead.
4453 #ifdef WITH_EXTENDED_CW
4455 for(i
= 0; i
< demux
[demux_id
].ECMpidcount
; i
++)
4457 if(caid_is_powervu(demux
[demux_id
].ECMpids
[i
].CAID
))
4465 if(demux
[demux_id
].pmtpid
== 0)
4467 dvbapi_start_pat_filter(demux_id
);
4469 else if(demux
[demux_id
].STREAMpids
[0] == demux
[demux_id
].pmtpid
|| is_powervu
)
4471 dvbapi_start_pmt_filter(demux_id
);
4474 if(demux
[demux_id
].running
)
4476 disable_unused_streampids(demux_id
); // disable all streampids not in use anymore
4479 if(!demux
[demux_id
].running
&& demux
[demux_id
].ECMpidcount
!= 0) // only start demuxer if it wasn't running
4481 // remove all non important filtering
4482 // (there are images with limited amount of filters available!)
4483 dvbapi_stop_all_cat_emm_sdt_filtering(msgid
);
4485 get_servicename(dvbapi_client
, demux
[demux_id
].program_number
, demux
[demux_id
].ECMpids
[0].PROVID
,
4486 demux
[demux_id
].ECMpids
[0].CAID
, service_name
, sizeof(service_name
));
4488 cs_log_dbg(D_DVBAPI
, "Demuxer %d started descrambling for program %04X (%s) (fd: %d)",
4489 demux_id
, demux
[demux_id
].program_number
, service_name
, demux
[demux_id
].socket_fd
);
4491 demux
[demux_id
].running
= true; // mark channel as running
4492 openxcas_set_sid(demux
[demux_id
].program_number
);
4493 demux
[demux_id
].decodingtries
= -1;
4494 dvbapi_resort_ecmpids(demux_id
);
4495 dvbapi_try_next_caid(demux_id
, 0, msgid
);
4498 else if(demux
[demux_id
].ECMpidcount
== 0) // FTA: do logging and part of ecm handler
4500 get_servicename(dvbapi_client
, demux
[demux_id
].program_number
, NO_PROVID_VALUE
, NO_CAID_VALUE
,
4501 service_name
, sizeof(service_name
));
4503 cs_log_dbg(D_DVBAPI
, "Demuxer %d no descrambling needed for FTA program %04X (%s) (fd: %d)",
4504 demux_id
, demux
[demux_id
].program_number
, service_name
, demux
[demux_id
].socket_fd
);
4506 demux
[demux_id
].running
= false; // reset running flag
4507 demux
[demux_id
].pidindex
= -1; // reset ecmpid used for descrambling
4508 dvbapi_stop_filter(demux_id
, TYPE_ECM
, msgid
);
4510 if(cfg
.usrfileflag
) // add to user log previous channel + time on channel
4512 cs_statistics(dvbapi_client
);
4515 dvbapi_client
->last_srvid
= demux
[demux_id
].program_number
; // set new channel srvid
4516 dvbapi_client
->last_caid
= NO_CAID_VALUE
; // FTA channels have no caid!
4517 dvbapi_client
->last_provid
= NO_PROVID_VALUE
; // FTA channels have no provid!
4518 dvbapi_client
->lastswitch
= dvbapi_client
->last
= time((time_t *)0); // reset idle-Time & last switch
4521 #if defined(WITH_COOLAPI) || defined(WITH_COOLAPI2)
4522 // Don't start and Stop EMM Filters over and over again if we are on FTA
4523 if(dvbapi_client
->last_caid
== NO_CAID_VALUE
)
4529 // only do emm setup if au enabled and not running!
4530 if(cfg
.dvbapi_au
> 0 && demux
[demux_id
].EMMpidcount
== 0 && start_emm
== true)
4532 demux
[demux_id
].emm_filter
= -1; // to register first run emmfilter start
4534 if(demux
[demux_id
].emmstart
.time
== 1) // irdeto fetch emm cat direct!
4536 // trick to let emm fetching start after 30 seconds to speed up zapping
4537 cs_ftime(&demux
[demux_id
].emmstart
);
4539 dvbapi_start_cat_filter(demux_id
);
4543 cs_ftime(&demux
[demux_id
].emmstart
); // for all other caids delayed start!
4548 int32_t dvbapi_parse_capmt(const uint8_t *buffer
, uint32_t length
, int32_t connfd
, char *pmtfile
, uint16_t client_proto_version
, uint32_t msgid
)
4550 int32_t i
, demux_id
= -1;
4551 uint8_t ca_pmt_list_management
, ca_pmt_cmd_id
;
4552 bool is_update
= false;
4553 demux_parameters_t parameters
;
4554 memset(¶meters
, 0, sizeof(parameters
));
4556 #if defined WITH_COOLAPI || defined WITH_COOLAPI2
4557 ca_pmt_list_management
= CA_PMT_LIST_ONLY
;
4559 ca_pmt_list_management
= buffer
[0];
4562 // We received a new list of CA PMT objects.
4563 // Mark all demuxers to stop descrambling, but do not actually stop any of them,
4564 // until we verify the new list does not contain any previously selected program.
4565 if(ca_pmt_list_management
== CA_PMT_LIST_FIRST
|| ca_pmt_list_management
== CA_PMT_LIST_ONLY
)
4567 for(i
= 0; i
< MAX_DEMUX
; i
++)
4569 // Skip empty demuxers, demuxers belonging to different
4570 // CA PMT connections or handled by different PMT files.
4571 if(demux
[i
].program_number
== 0 || demux
[i
].socket_fd
!= connfd
||
4572 (demux
[i
].socket_fd
== -1 && pmtfile
&& strcmp(demux
[i
].pmt_file
, pmtfile
) != 0))
4577 demux
[i
].stop_descrambling
= true; // Mark for deletion if not used again by following CA PMT objects
4579 cs_log_dbg(D_DVBAPI
, "Demuxer %d marked to stop descrambling for program %04X (fd: %d)",
4580 i
, demux
[i
].program_number
, connfd
);
4584 // Read private descriptors inside the CA PMT message
4585 // in order to get adapter, demux, ca, pmt pid and more.
4586 get_demux_parameters(buffer
, ¶meters
);
4588 cs_log_dbg(D_DVBAPI
, "Received CA PMT list management %d for program %04X (pmt pid: %04X adapter: %d demux: %d camask: %d)",
4589 ca_pmt_list_management
, parameters
.program_number
, parameters
.pmtpid
, parameters
.adapter_index
,
4590 parameters
.demux_index
, parameters
.ca_mask
);
4592 // Search current demuxers for having the same program
4593 // as the one we received in this CA PMT object.
4594 for(i
= 0; i
< MAX_DEMUX
; i
++)
4596 if(demux
[i
].program_number
== 0)
4601 if(cfg
.dvbapi_boxtype
== BOXTYPE_IPBOX_PMT
)
4603 parameters
.demux_index
= i
; // fixup for ipbox
4606 bool full_check
= true, matched
= false;
4608 if(config_enabled(WITH_COOLAPI
) || config_enabled(WITH_COOLAPI2
) || cfg
.dvbapi_boxtype
== BOXTYPE_SAMYGO
)
4615 matched
= (connfd
> 0 && demux
[i
].socket_fd
== connfd
) && demux
[i
].program_number
== parameters
.program_number
;
4619 matched
= connfd
> 0 && demux
[i
].program_number
== parameters
.program_number
;
4626 // In PMT mode 6, when zapping between channels with the same program number and PMT pid
4627 // (sometimes the case with satellite feeds), as all hardware parameters being the same
4628 // (adapter, demux, ca_mask, connfd), the new program is considered an existing one (matched).
4629 // The only reliable way to determine whether we actually have a new program is to compare
4630 // the enigma namespace, tsid and onid as well.
4631 if(demux
[i
].demux_index
!= parameters
.demux_index
|| demux
[i
].ca_mask
!= parameters
.ca_mask
||
4632 demux
[i
].adapter_index
!= parameters
.adapter_index
|| demux
[i
].pmtpid
!= parameters
.pmtpid
||
4633 demux
[i
].ens
!= parameters
.ens
|| demux
[i
].tsid
!= parameters
.tsid
|| demux
[i
].onid
!= parameters
.onid
)
4639 // A program update is normally signaled by either a list management:
4640 // 1. UPDATE for an existing program
4641 // 2. ADD for an existing program (which according to the specifications should be treated as an UPDATE)
4642 // 3. ONLY for an existing program (with broken clients, in pmt modes other than 6)
4643 if(ca_pmt_list_management
== CA_PMT_LIST_UPDATE
|| ca_pmt_list_management
== CA_PMT_LIST_ADD
4644 || (cfg
.dvbapi_pmtmode
!= 6 && ca_pmt_list_management
== CA_PMT_LIST_ONLY
))
4647 cs_log("Demuxer %d received CA PMT update for program %04X", i
, parameters
.program_number
);
4650 cs_log("Demuxer %d continues processing for program %04X", i
, demux
[i
].program_number
);
4651 openxcas_set_sid(parameters
.program_number
);
4652 demux
[i
].stop_descrambling
= false; // don't stop current demuxer!
4654 break; // no need to explore other demuxers since we have a match!
4658 // We are currently processing the last object of the CA PMT list.
4659 // We should now stop descrambling all programs not included in this list.
4660 if(ca_pmt_list_management
!= CA_PMT_LIST_FIRST
&& ca_pmt_list_management
!= CA_PMT_LIST_MORE
)
4662 for(i
= 0; i
< MAX_DEMUX
; i
++)
4664 if(demux
[i
].program_number
== 0)
4669 if(demux
[i
].stop_descrambling
)
4671 dvbapi_stop_descrambling(i
, msgid
);
4676 // We continue reading the CA PMT object only when we get
4677 // a new program (demux_id == -1) or an updated program.
4678 if(!(demux_id
== -1 || is_update
))
4683 // We received a CA PMT object for a new program.
4684 // Let's find an empty demuxer for it.
4687 if(ca_pmt_list_management
== CA_PMT_LIST_UPDATE
)
4689 cs_log("ERROR: Received CA PMT list update for unknown program");
4693 for(demux_id
= 0; demux_id
< MAX_DEMUX
; demux_id
++)
4695 if(demux
[demux_id
].program_number
!= 0)
4697 continue; // Skip occupied demuxers
4700 // Probably this box doesn't send any private descriptor in the
4701 // CA PMT, so we have to improvise before saving to the demuxer.
4702 if(cfg
.dvbapi_boxtype
== BOXTYPE_IPBOX_PMT
)
4704 parameters
.ca_mask
= demux_id
+ 1;
4705 parameters
.demux_index
= demux_id
;
4708 demux
[demux_id
].demux_index
= parameters
.demux_index
;
4709 demux
[demux_id
].adapter_index
= parameters
.adapter_index
;
4710 demux
[demux_id
].ca_mask
= parameters
.ca_mask
;
4711 demux
[demux_id
].socket_fd
= connfd
;
4712 demux
[demux_id
].client_proto_version
= client_proto_version
;
4713 demux
[demux_id
].program_number
= parameters
.program_number
;
4714 demux
[demux_id
].pmtpid
= parameters
.pmtpid
;
4715 demux
[demux_id
].ens
= parameters
.ens
;
4716 demux
[demux_id
].tsid
= parameters
.tsid
;
4717 demux
[demux_id
].onid
= parameters
.onid
;
4718 demux
[demux_id
].stop_descrambling
= false;
4719 demux
[demux_id
].running
= false;
4720 demux
[demux_id
].sdt_filter
= -1;
4721 demux
[demux_id
].rdr
= NULL
;
4725 cs_strncpy(demux
[demux_id
].pmt_file
, pmtfile
, sizeof(demux
[demux_id
].pmt_file
));
4731 if(demux_id
>= MAX_DEMUX
)
4733 cs_log("There is no free demuxer for the new program! Aborting...");
4738 // We continue parsing the CA PMT info for new or updated programs.
4739 // For updated programs, we just delete all previous stream pids and
4740 // ECM pids and start parsing the fresh data.
4741 dvbapi_parse_pmt_info(demux_id
, buffer
+ 4, length
- 4, 0x1FFF, &ca_pmt_cmd_id
);
4743 // Finally, evaluate what response the host requires from OSCam.
4744 // This allows multiple CA applications to run at the host simultaneously.
4745 // "OK query" will be implemented at a later stage, when support is first
4746 // added in enigma2.
4747 switch(ca_pmt_cmd_id
)
4749 case CA_PMT_CMD_OK_DESCRAMBLING
:
4751 dvbapi_capmt_notify(&demux
[demux_id
]);
4752 dvbapi_prepare_descrambling(demux_id
, msgid
);
4756 case CA_PMT_CMD_QUERY
:
4758 cs_log("Received unsupported CA PMT command ID 'query' for program %04X", demux
[demux_id
].program_number
);
4759 dvbapi_stop_descrambling(demux_id
, msgid
); // Clear all data from this demuxer
4763 case CA_PMT_CMD_NOT_SELECTED
:
4765 cs_log("Program %04X is not selected for descrambling", demux
[demux_id
].program_number
);
4766 dvbapi_stop_descrambling(demux_id
, msgid
); // Clear all data from this demuxer
4772 cs_log("Received unknown or unsupported CA PMT command ID %02X from host", ca_pmt_cmd_id
);
4773 dvbapi_stop_descrambling(demux_id
, msgid
);
4779 static void dvbapi_parse_pmt(int32_t demux_id
, const uint8_t *buffer
, uint16_t length
, uint32_t msgid
)
4781 uint16_t program_number
= b2i(2, buffer
+ 3);
4782 uint16_t pcr_pid
= b2i(2, buffer
+ 8) & 0x1FFF;
4784 if(program_number
!= demux
[demux_id
].program_number
)
4786 cs_log("Demuxer %d received PMT for undefined program %04X", demux_id
, program_number
);
4790 dvbapi_stop_filter(demux_id
, TYPE_PMT
, msgid
);
4791 dvbapi_parse_pmt_info(demux_id
, buffer
+ 10, length
- 10 - 4, pcr_pid
, NULL
); // last 4 bytes are the CRC-32
4794 static void dvbapi_create_srvid_line(int32_t demux_id
, char *buffer
, uint32_t buflen
)
4796 int32_t i
, j
, pos
= 0;
4797 uint16_t caid_done
[32], cur_caid
;
4798 uint8_t caid_done_count
= 0, skip_caid
;
4800 if(demux
[demux_id
].ECMpidcount
== 0)
4802 snprintf(buffer
, buflen
, "%04X@%06X", NO_CAID_VALUE
, NO_PROVID_VALUE
);
4806 for(i
= 0; i
< demux
[demux_id
].ECMpidcount
&& i
< 32; i
++)
4809 for(j
= 0; j
< caid_done_count
; j
++)
4811 if(caid_done
[j
] == demux
[demux_id
].ECMpids
[i
].CAID
)
4823 cur_caid
= demux
[demux_id
].ECMpids
[i
].CAID
;
4824 pos
+= snprintf(buffer
+ pos
, buflen
- pos
, "%s%04X", caid_done_count
> 0 ? "," : "", cur_caid
== 0 ? NO_CAID_VALUE
: cur_caid
);
4826 for(j
= i
; j
< demux
[demux_id
].ECMpidcount
; j
++)
4828 if(demux
[demux_id
].ECMpids
[j
].PROVID
== 0)
4833 if(cur_caid
== demux
[demux_id
].ECMpids
[j
].CAID
)
4835 pos
+= snprintf(buffer
+ pos
, buflen
- pos
, "@%06X", demux
[demux_id
].ECMpids
[j
].PROVID
);
4839 caid_done
[caid_done_count
] = demux
[demux_id
].ECMpids
[i
].CAID
;
4844 static void dvbapi_write_sdt_info(int32_t demux_id
, const char *provider_name
, const char* service_name
, const char *service_type
)
4846 int8_t did_save_srvid
= 0;
4847 int32_t provid
, caid
, pidindex
;
4848 char tmp
[256], srvid_line
[1024];
4849 FILE *fpsave
= NULL
;
4851 pidindex
= demux
[demux_id
].pidindex
;
4854 caid
= demux
[demux_id
].ECMpids
[pidindex
].CAID
;
4855 provid
= demux
[demux_id
].ECMpids
[pidindex
].PROVID
;
4859 if(demux
[demux_id
].ECMpidcount
== 0 || demux
[demux_id
].ECMpids
[0].CAID
== 0)
4861 caid
= NO_CAID_VALUE
;
4862 provid
= NO_PROVID_VALUE
;
4866 caid
= demux
[demux_id
].ECMpids
[0].CAID
;
4867 provid
= demux
[demux_id
].ECMpids
[0].PROVID
;
4871 if(cs_strlen(provider_name
) && caid
!= NO_CAID_VALUE
)
4873 get_providername_or_null(provid
, caid
, tmp
, sizeof(tmp
));
4877 get_config_filename(tmp
, sizeof(tmp
), "oscam.provid");
4879 if((fpsave
= fopen(tmp
, "a")))
4881 fprintf(fpsave
, "\n%04X@%06X|%s|", caid
, provid
, provider_name
);
4888 if(cs_strlen(service_name
))
4890 get_servicename_or_null(cur_client(), demux
[demux_id
].program_number
, provid
, caid
, tmp
, sizeof(tmp
));
4894 get_config_filename(tmp
, sizeof(tmp
), "oscam.srvid2");
4896 if(!access(tmp
, F_OK
) && (fpsave
= fopen(tmp
, "a")))
4898 if((caid
!= NO_CAID_VALUE
) || (cfg
.dvbapi_read_sdt
> 1))
4900 dvbapi_create_srvid_line(demux_id
, srvid_line
, sizeof(srvid_line
));
4902 if(cfg
.dvbapi_write_sdt_prov
)
4904 fprintf(fpsave
, "\n%04X:%s|%s|%s||%s", demux
[demux_id
].program_number
, srvid_line
, service_name
, service_type
, provider_name
);
4908 fprintf(fpsave
, "\n%04X:%s|%s|%s", demux
[demux_id
].program_number
, srvid_line
, service_name
, service_type
);
4916 get_config_filename(tmp
, sizeof(tmp
), "oscam.srvid");
4918 if((fpsave
= fopen(tmp
, "a")))
4920 if((caid
!= NO_CAID_VALUE
) || (cfg
.dvbapi_read_sdt
> 1))
4922 dvbapi_create_srvid_line(demux_id
, srvid_line
, sizeof(srvid_line
));
4924 if(cfg
.dvbapi_write_sdt_prov
)
4926 fprintf(fpsave
, "\n%s:%04X|%s|%s|%s", srvid_line
, demux
[demux_id
].program_number
, provider_name
, service_name
, service_type
);
4930 fprintf(fpsave
, "\n%s:%04X||%s|%s", srvid_line
, demux
[demux_id
].program_number
, service_name
, service_type
);
4951 static uint32_t dvbapi_extract_sdt_string(char *buf
, uint32_t buflen
, const uint8_t *source
, uint8_t sourcelen
)
4953 uint32_t i
, j
, offset
= 0;
4954 int8_t iso_mode
= -1;
4956 const uint8_t *ptr_in
;
4958 size_t in_bytes
, out_bytes
;
4966 if(!cs_malloc(&tmpbuf
, buflen
))
4971 if(sourcelen
> buflen
- 1)
4973 sourcelen
= buflen
- 1;
4976 if(sourcelen
> 0 && source
[0] < 0x20)
4978 if(source
[0] >= 0x01 && source
[0] <= 0x0B && source
[0] != 0x08) // ISO/IEC 8859
4981 iso_mode
= 4 + source
[0];
4983 else if(source
[0] == 0x10) // Dynamically selected part of ISO/IEC 8859
4985 if(source
[1] == 0x00 && source
[2] >= 0x01 && source
[2] <= 0x0F && source
[2] != 0x0C)
4988 iso_mode
= source
[2];
4991 else if(source
[0] == 0x11) // ISO/IEC 10646
4996 // missing: 0x12 KSX1001-2004 (Korean Character Set)
4997 // missing: 0x13 GB-2312-1980 (Simplified Chinese Character Set)
4998 // missing: 0x14 Big5 subset of ISO/IEC 10646 (Traditional Chinese)
4999 else if(source
[0] == 0x15) // UTF-8 encoding of ISO/IEC 10646
5004 // missing: 0x1F Described by encoding_type_id
5012 if(offset
>= sourcelen
)
5020 for(i
= 0, j
= 0; i
< sourcelen
- offset
; i
++)
5022 if(source
[offset
+ i
] >= 0x80 && source
[offset
+ i
] <= 0x9F)
5027 tmpbuf
[j
] = source
[offset
+ i
];
5034 ptr_in
= (const uint8_t *)tmpbuf
;
5035 in_bytes
= cs_strlen(tmpbuf
);
5036 ptr_out
= (uint8_t *)buf
;
5039 #ifdef READ_SDT_CHARSETS
5042 memset(buf
, 0, buflen
);
5043 cs_log_dbg(D_DVBAPI
, "sdt-info dbg: iso_mode: %d offset: %u", iso_mode
, offset
);
5044 cs_log_dump_dbg(D_DVBAPI
, (uint8_t *)tmpbuf
, in_bytes
, "sdt-info dbg: raw string:");
5048 if(ISO6937toUTF8(&ptr_in
, &in_bytes
, &ptr_out
, &out_bytes
) == (size_t)(-1))
5050 cs_log_dbg(D_DVBAPI
, "sdt-info error: ISO6937toUTF8 failed");
5057 if(ISO8859toUTF8(iso_mode
, &ptr_in
, &in_bytes
, &ptr_out
, &out_bytes
) == (size_t)(-1))
5059 cs_log_dbg(D_DVBAPI
, "sdt-info error: ISO8859toUTF8 failed");
5068 cs_strncpy(buf
, tmpbuf
, buflen
);
5069 cs_log_dbg(D_DVBAPI
, "sdt-info warning: your build of oscam does not support iso-to-utf8 conversion, special chars may be corrupted!");
5072 else if(iso_mode
== -2)
5074 memset(buf
, 0, buflen
);
5075 cs_log_dbg(D_DVBAPI
, "sdt-info dbg: iso_mode: %d offset: %u", iso_mode
, offset
);
5077 if(UnicodetoUTF8(&ptr_in
, &in_bytes
, &ptr_out
, &out_bytes
) == (size_t)(-1))
5079 cs_log_dbg(D_DVBAPI
, "sdt-info error: UnicodetoUTF8 failed");
5084 else if(iso_mode
== -3) // No conversion, already in UTF-8
5086 memcpy(buf
, source
+ offset
, sourcelen
- offset
);
5087 buf
[sourcelen
- offset
] = '\0';
5088 cs_log_dbg(D_DVBAPI
, "sdt-info dbg: iso_mode: -3 offset: %u", offset
);
5091 cs_log_dump_dbg(D_DVBAPI
, (uint8_t *)buf
, cs_strlen(buf
), "sdt-info dbg: encoded string:");
5096 static const char *dvbapi_get_service_type(uint8_t service_type
)
5098 switch(service_type
)
5132 static void dvbapi_parse_service_descriptor(int32_t demux_id
, const uint8_t *buffer
, uint8_t descriptor_length
)
5134 uint8_t service_provider_name_length
, service_name_length
;
5135 char service_provider_name
[64], service_name
[64];
5136 const char *service_type
;
5138 if(descriptor_length
< 3)
5140 return; // Service descriptor has a minimum length of 3 bytes
5143 service_type
= dvbapi_get_service_type(buffer
[0]);
5145 service_provider_name_length
= buffer
[1];
5146 if(2 + service_provider_name_length
+ 1 > descriptor_length
)
5151 service_name_length
= buffer
[2 + service_provider_name_length
];
5152 if(2 + service_provider_name_length
+ 1 + service_name_length
> descriptor_length
)
5157 if(!dvbapi_extract_sdt_string(service_provider_name
, sizeof(service_provider_name
), buffer
+ 2, service_provider_name_length
) ||
5158 !dvbapi_extract_sdt_string(service_name
, sizeof(service_name
), buffer
+ 2 + service_provider_name_length
+ 1, service_name_length
))
5163 cs_log_dbg(D_DVBAPI
, "Demuxer %d got service info (provider: %s - name: %s - type: %s)",
5164 demux_id
, service_provider_name
, service_name
, service_type
);
5166 dvbapi_write_sdt_info(demux_id
, service_provider_name
, service_name
, service_type
);
5169 static void dvbapi_parse_sdt(int32_t demux_id
, const uint8_t *buffer
, uint16_t length
, uint32_t msgid
)
5171 uint8_t descriptor_tag
, descriptor_length
;
5172 uint16_t service_id
, descriptors_loop_length
, i
, j
;
5174 if(buffer
[0] != 0x42) // SDT sections with table_id value 0x42 describe the actual TS
5179 // Get the tsid and onid (in enigma2 STBs we have
5180 // already received them in the CA PMT message)
5181 demux
[demux_id
].tsid
= b2i(2, buffer
+ 3);
5182 demux
[demux_id
].onid
= b2i(2, buffer
+ 8);
5184 for(i
= 11; i
+ 5 < length
; i
+= 5 + descriptors_loop_length
)
5186 service_id
= b2i(2, buffer
+ i
);
5187 descriptors_loop_length
= b2i(2, buffer
+ i
+ 3) & 0x0FFF;
5189 if(service_id
!= demux
[demux_id
].program_number
)
5194 for(j
= 0; j
+ 1 < descriptors_loop_length
; j
+= 2 + descriptor_length
)
5196 descriptor_tag
= buffer
[i
+ 5 + j
];
5197 descriptor_length
= buffer
[i
+ 5 + j
+ 1];
5199 if(descriptor_tag
== 0x48)
5201 dvbapi_parse_service_descriptor(demux_id
, buffer
+ i
+ 5 + j
+ 2, descriptor_length
);
5205 dvbapi_stop_filter(demux_id
, TYPE_SDT
, msgid
);
5210 static void dvbapi_parse_pat(int32_t demux_id
, const uint8_t *buffer
, uint16_t length
, uint32_t msgid
)
5214 dvbapi_stop_filter(demux_id
, TYPE_PAT
, msgid
);
5216 for(i
= 8; i
+ 7 < length
; i
+= 4)
5218 srvid
= b2i(2, buffer
+ i
);
5224 if(demux
[demux_id
].program_number
== srvid
)
5226 demux
[demux_id
].pmtpid
= b2i(2, buffer
+ i
+ 2) & 0x1FFF;
5227 dvbapi_start_pmt_filter(demux_id
);
5233 int32_t dvbapi_init_listenfd(void)
5235 int32_t clilen
, listenfd
;
5236 struct sockaddr_un servaddr
;
5238 memset(&servaddr
, 0, sizeof(struct sockaddr_un
));
5239 servaddr
.sun_family
= AF_UNIX
;
5240 cs_strncpy(servaddr
.sun_path
, devices
[selected_box
].cam_socket_path
, sizeof(servaddr
.sun_path
));
5241 clilen
= sizeof(servaddr
.sun_family
) + cs_strlen(servaddr
.sun_path
);
5243 if(((unlink(devices
[selected_box
].cam_socket_path
) < 0) && (errno
!= ENOENT
))
5244 || ((listenfd
= socket(AF_UNIX
, SOCK_STREAM
, 0)) < 0)
5245 || (bind(listenfd
, (struct sockaddr
*)&servaddr
, clilen
) < 0)
5246 || (listen(listenfd
, 5) < 0))
5251 // change the access right on the camd.socket
5252 // this will allow oscam to run as root if needed
5253 // and still allow non root client to connect to the socket
5254 chmod(devices
[selected_box
].cam_socket_path
, S_IRWXU
| S_IRWXG
| S_IRWXO
);
5258 int32_t dvbapi_net_init_listenfd(void)
5261 struct SOCKADDR servaddr
;
5263 memset(&servaddr
, 0, sizeof(servaddr
));
5264 SIN_GET_FAMILY(servaddr
) = DEFAULT_AF
;
5265 SIN_GET_ADDR(servaddr
) = ADDR_ANY
;
5266 SIN_GET_PORT(servaddr
) = htons((uint16_t)cfg
.dvbapi_listenport
);
5268 if((listenfd
= socket(DEFAULT_AF
, SOCK_STREAM
, 0)) < 0)
5275 // azbox toolchain do not have this define
5277 #define IPV6_V6ONLY 26
5279 // set the server socket option to listen on IPv4 and IPv6 simultaneously
5280 setsockopt(listenfd
, IPPROTO_IPV6
, IPV6_V6ONLY
, (void *)&opt
, sizeof(opt
));
5284 setsockopt(listenfd
, SOL_SOCKET
, SO_REUSEADDR
, (void *)&opt
, sizeof(opt
));
5285 set_so_reuseport(listenfd
);
5287 if(bind(listenfd
, (struct sockaddr
*)&servaddr
, sizeof(servaddr
)) < 0)
5292 if(listen(listenfd
, 5) < 0)
5299 static pthread_mutex_t event_handler_lock
= PTHREAD_MUTEX_INITIALIZER
;
5301 void event_handler(int32_t UNUSED(signal
))
5303 struct stat pmt_info
;
5306 struct dirent entry
, *dp
= NULL
;
5308 int32_t pmt_fd
= -1;
5309 uint8_t mbuf
[2048]; // dirty fix: larger buffer needed for CA PMT mode 6 with many parallel channels to decode
5311 if(dvbapi_client
!= cur_client())
5316 SAFE_MUTEX_LOCK(&event_handler_lock
);
5317 if(cfg
.dvbapi_boxtype
== BOXTYPE_PC
|| cfg
.dvbapi_boxtype
== BOXTYPE_PC_NODMX
|| cfg
.dvbapi_boxtype
== BOXTYPE_SAMYGO
)
5323 int32_t standby_fd
= open(STANDBY_FILE
, O_RDONLY
);
5324 pausecam
= (standby_fd
> 0) ? 1 : 0;
5327 int32_t ret
= close(standby_fd
);
5330 cs_log("ERROR: Could not close standby fd (errno=%d %s)", errno
, strerror(errno
));
5335 if(cfg
.dvbapi_boxtype
== BOXTYPE_IPBOX
|| cfg
.dvbapi_pmtmode
== 1)
5337 SAFE_MUTEX_UNLOCK(&event_handler_lock
);
5341 for(i
= 0; i
< MAX_DEMUX
; i
++)
5343 if(demux
[i
].pmt_file
[0] != 0)
5345 snprintf(dest
, sizeof(dest
), "%s%s", TMPDIR
, demux
[i
].pmt_file
);
5346 pmt_fd
= open(dest
, O_RDONLY
);
5349 if(fstat(pmt_fd
, &pmt_info
) != 0)
5351 int32_t ret
= close(pmt_fd
);
5354 cs_log("ERROR: Could not close PMT fd (errno=%d %s)", errno
, strerror(errno
));
5359 if((time_t)pmt_info
.st_mtime
!= demux
[i
].pmt_time
)
5361 dvbapi_stop_descrambling(i
, 0);
5364 int32_t ret
= close(pmt_fd
);
5367 cs_log("ERROR: Could not close PMT fd (errno=%d %s)", errno
, strerror(errno
));
5373 cs_log("Demuxer %d Unable to open PMT file %s -> stop descrambling!", i
, dest
);
5374 dvbapi_stop_descrambling(i
, 0);
5379 if(disable_pmt_files
)
5381 SAFE_MUTEX_UNLOCK(&event_handler_lock
);
5385 dirp
= opendir(TMPDIR
);
5388 cs_log_dbg(D_DVBAPI
, "opendir failed (errno=%d %s)", errno
, strerror(errno
));
5389 SAFE_MUTEX_UNLOCK(&event_handler_lock
);
5393 while(!cs_readdir_r(dirp
, &entry
, &dp
))
5400 if(cs_strlen(dp
->d_name
) < 7)
5405 if(strncmp(dp
->d_name
, "pmt", 3) != 0 || strncmp(dp
->d_name
+ cs_strlen(dp
->d_name
) - 4, ".tmp", 4) != 0)
5410 #if defined(WITH_STAPI) || defined(WITH_STAPI5)
5411 struct s_dvbapi_priority
*p
;
5412 for(p
= dvbapi_priority
; p
!= NULL
; p
= p
->next
) // stapi: check if there is a device connected to this pmt file!
5414 if(p
->type
!= 's') { continue; } // stapi rule?
5415 if(strcmp(dp
->d_name
, p
->pmtfile
) != 0) { continue; } // same file?
5416 break; // found match!
5421 cs_log_dbg(D_DVBAPI
, "No matching S: line in oscam.dvbapi for pmtfile %s -> skip!", dp
->d_name
);
5426 if (!cs_strlen(TMPDIR
))
5428 cs_log_dbg(D_DVBAPI
, "BUG! cs_strlen(TMPDIR)!!!\n");
5432 if (!cs_strlen(dp
->d_name
))
5434 cs_log_dbg(D_DVBAPI
, "BUG! cs_strlen(dp->d_name)!!!\n");
5438 if((cs_strlen(dp
->d_name
) + cs_strlen(TMPDIR
) - 1) > sizeof(dest
))
5440 cs_log_dbg(D_DVBAPI
, "BUG! Sum of the (d_name + TMPDIR) = %u > sizeof(dest) !!!\n", (unsigned int)(cs_strlen(dp
->d_name
) + cs_strlen(TMPDIR
) - 1));
5445 memcpy(dest
, TMPDIR
, cs_strlen(TMPDIR
));
5446 memcpy(dest
+ cs_strlen(TMPDIR
), dp
->d_name
, cs_strlen(dp
->d_name
));
5447 dest
[cs_strlen(TMPDIR
) + cs_strlen(dp
->d_name
)] = '\0';
5448 pmt_fd
= open(dest
, O_RDONLY
);
5456 if(fstat(pmt_fd
, &pmt_info
) != 0)
5458 int32_t ret
= close(pmt_fd
);
5461 cs_log("ERROR: Could not close PMT fd (errno=%d %s)", errno
, strerror(errno
));
5468 for(i
= 0; i
< MAX_DEMUX
; i
++)
5470 if(strcmp(demux
[i
].pmt_file
, dp
->d_name
) == 0)
5472 if((time_t)pmt_info
.st_mtime
== demux
[i
].pmt_time
)
5482 int32_t ret
= close(pmt_fd
);
5485 cs_log("ERROR: Could not close PMT fd (errno=%d %s)", errno
, strerror(errno
));
5489 cs_log_dbg(D_DVBAPI
, "found pmt file %s", dest
);
5492 uint32_t len
= read(pmt_fd
, mbuf
, sizeof(mbuf
));
5493 int32_t ret
= close(pmt_fd
);
5497 cs_log("ERROR: Could not close PMT fd (errno=%d %s)", errno
, strerror(errno
));
5502 cs_log_dbg(D_DVBAPI
, "pmt file %s have invalid len!", dest
);
5510 // QboxHD pmt.tmp is the full capmt written as a string of hex values
5511 // pmt.tmp must be longer than 3 bytes (6 hex chars) and even length
5512 if((len
< 6) || ((len
% 2) != 0) || ((len
/ 2) > sizeof(dest
)))
5514 cs_log_dbg(D_DVBAPI
, "error parsing QboxHD pmt.tmp, incorrect length");
5518 for(j2
= 0, j1
= 0; j2
< len
; j2
+= 2, j1
++)
5521 if(sscanf((char *)mbuf
+ j2
, "%02X", &tmp
) != 1)
5523 cs_log_dbg(D_DVBAPI
, "error parsing QboxHD pmt.tmp, data not valid in position %d", j2
);
5524 SAFE_MUTEX_UNLOCK(&event_handler_lock
);
5529 memcpy(dest
+ j1
, &tmp
, 4);
5533 cs_log_dump_dbg(D_DVBAPI
, (uint8_t *)dest
, len
/ 2, "QboxHD pmt.tmp:");
5534 demux_id
= dvbapi_parse_capmt((uint8_t *)dest
+ 4, (len
/ 2) - 4, -1, dp
->d_name
, 0, 0);
5536 if(len
> sizeof(dest
))
5538 cs_log_dbg(D_DVBAPI
, "event_handler() dest buffer is to small for pmt data!");
5544 cs_log_dbg(D_DVBAPI
, "event_handler() received pmt is too small! (%d < 16 bytes!)", len
);
5548 cs_log_dump_dbg(D_DVBAPI
, mbuf
, len
, "PMT file:"); // Original PMT file
5550 // Do some tidying on the PMT file to make it compatible with the CA PMT parser
5551 dest
[0] = CA_PMT_LIST_ONLY
;
5552 memcpy(dest
+ 1, mbuf
+ 3, 2); // program_number
5553 uint16_t pmt_program_info_length
= b2i(2, mbuf
+ 10) & 0x0FFF;
5554 i2b_buf(2, pmt_program_info_length
+ 1, (uint8_t *)dest
+ 4);
5555 dest
[6] = CA_PMT_CMD_OK_DESCRAMBLING
;
5556 memcpy(dest
+ 7, mbuf
+ 12, len
- 12 - 4);
5558 cs_log_dump_dbg(D_DVBAPI
, (uint8_t *)dest
, 7 + len
- 12 - 4, "CA PMT:"); // Actual CA PMT message
5559 demux_id
= dvbapi_parse_capmt((uint8_t *)dest
, 7 + len
- 12 - 4, -1, dp
->d_name
, 0, 0);
5564 cs_strncpy(demux
[demux_id
].pmt_file
, dp
->d_name
, sizeof(demux
[demux_id
].pmt_file
));
5565 demux
[demux_id
].pmt_time
= (time_t)pmt_info
.st_mtime
;
5568 if(cfg
.dvbapi_pmtmode
== 3)
5570 disable_pmt_files
= 1;
5575 SAFE_MUTEX_UNLOCK(&event_handler_lock
);
5578 void *dvbapi_event_thread(void *cli
)
5580 struct s_client
*client
= (struct s_client
*) cli
;
5581 SAFE_SETSPECIFIC(getclient
, client
);
5582 set_thread_name(__func__
);
5592 void dvbapi_process_input(int32_t demux_id
, int32_t filter_num
, uint8_t *buffer
, int32_t len
, uint32_t msgid
)
5594 struct s_ecmpid
*curpid
= NULL
;
5595 int32_t pid
= demux
[demux_id
].demux_fd
[filter_num
].pidindex
;
5596 uint16_t filtertype
= demux
[demux_id
].demux_fd
[filter_num
].type
;
5597 uint16_t sctlen
= SCT_LEN(buffer
);
5601 cs_log_dbg(D_DVBAPI
, "Received filter data with invalid section length!");
5607 cs_log_dbg(D_DVBAPI
, "Received filter data with total length 0x%03X but section length is 0x%03X -> invalid length!", len
, sctlen
);
5611 if(demux_id
< 0 || demux_id
>= MAX_DEMUX
)
5613 cs_log("dvbapi_process_input(): error - received invalid demux_id (%d)", demux_id
);
5617 if(filter_num
< 0 || filter_num
>= MAX_FILTER
)
5619 cs_log("dvbapi_process_input(): error - received invalid filter_num (%d)", filter_num
);
5623 if(pid
!= -1 && filtertype
== TYPE_ECM
)
5625 curpid
= &demux
[demux_id
].ECMpids
[pid
];
5628 int32_t filt_match
= filtermatch(buffer
, filter_num
, demux_id
, sctlen
); // acts on all filters (sdt/emm/ecm)
5631 cs_log_dbg(D_DVBAPI
,"Demuxer %d receiver returned data not matching the filter -> delivered filter data discarded!", demux_id
);
5635 if(curpid
&& curpid
->tries
<= 0xF0 && filtertype
== TYPE_ECM
)
5637 curpid
->irdeto_maxindex
= 0;
5638 curpid
->irdeto_curindex
= 0xFE;
5639 curpid
->tries
= 0xFE; // reset timeout retry flag
5640 curpid
->irdeto_cycle
= 0xFE; // reset irdetocycle
5642 curpid
->checked
= 4; // flag ecmpid as checked
5643 curpid
->status
= -1; // flag ecmpid as unusable
5645 if(pid
== demux
[demux_id
].pidindex
)
5647 // current pid delivered problems so this pid isn't
5648 // being used to descramble any longer -> clear pidindex
5649 demux
[demux_id
].pidindex
= -1;
5651 // remove this pid from channel cache since we had no founds on any ecmpid!
5652 dvbapi_edit_channel_cache(demux_id
, pid
, 0);
5655 dvbapi_stop_filternum(demux_id
, filter_num
, msgid
); // stop this ecm filter!
5659 if(filtertype
== TYPE_ECM
)
5661 uint32_t chid
= 0x10000;
5662 int8_t pvu_skip
= 0;
5665 if(len
!= 0) // len = 0 receiver encountered an internal bufferoverflow!
5667 cs_log_dump_dbg(D_DVBAPI
, buffer
, sctlen
, "Demuxer %d filter %d fetched ECM data (length = 0x%03X):",
5668 demux_id
, filter_num
+ 1, sctlen
);
5670 if(sctlen
> MAX_ECM_SIZE
) // ecm too long to handle!
5672 cs_log_dbg(D_DVBAPI
, "Received data with total length 0x%03X but max supported ECM length is 0x%03X -> Please report!",
5673 sctlen
, MAX_ECM_SIZE
);
5677 curpid
->tries
-= 0x0E;
5682 if(!(buffer
[0] == 0x80 || buffer
[0] == 0x81))
5684 cs_log_dbg(D_DVBAPI
, "Received an ECM with invalid ecmtable ID %02X -> ignoring!", buffer
[0]);
5693 if(caid_is_powervu(curpid
->CAID
)) // ecm counter for powervu
5697 if(sctlen
- 11 > buffer
[9])
5699 if(buffer
[11 + buffer
[9]] > curpid
->pvu_counter
5700 || (curpid
->pvu_counter
== 255 && buffer
[11 + buffer
[9]] == 0)
5701 || ((curpid
->pvu_counter
- buffer
[11 + buffer
[9]]) > 5))
5703 curpid
->pvu_counter
= buffer
[11 + buffer
[9]];
5709 // wait for odd / even ecm change (only not for irdeto!)
5710 if((curpid
->table
== buffer
[0] && !caid_is_irdeto(curpid
->CAID
)) || pvu_skip
)
5712 if(!(er
= get_ecmtask()))
5716 er
->srvid
= demux
[demux_id
].program_number
;
5719 cs_strncpy(er
->dev_name
, dev_list
[demux
[demux_id
].dev_index
].name
, sizeof(dev_list
[demux
[demux_id
].dev_index
].name
));
5721 er
->tsid
= demux
[demux_id
].tsid
;
5722 er
->onid
= demux
[demux_id
].onid
;
5723 er
->pmtpid
= demux
[demux_id
].pmtpid
;
5724 er
->ens
= demux
[demux_id
].ens
;
5725 er
->caid
= curpid
->CAID
;
5726 er
->pid
= curpid
->ECM_PID
;
5727 er
->prid
= curpid
->PROVID
;
5728 er
->vpid
= curpid
->VPID
;
5729 er
->ecmlen
= sctlen
;
5730 memcpy(er
->ecm
, buffer
, er
->ecmlen
);
5731 chid
= get_subid(er
); // fetch chid or fake chid
5734 dvbapi_set_section_filter(demux_id
, er
, filter_num
);
5739 if(caid_is_irdeto(curpid
->CAID
))
5741 // 80 70 39 53 04 05 00 88
5742 // 81 70 41 41 01 06 00 13 00 06 80 38 1F 52 93 D2
5743 //if(buffer[5]>20) return;
5744 if(curpid
->irdeto_maxindex
!= buffer
[5]) // 6, register max irdeto index
5746 cs_log_dbg(D_DVBAPI
, "Found %d IRDETO ECM CHIDs", buffer
[5] + 1);
5747 curpid
->irdeto_maxindex
= buffer
[5]; // numchids = 7 (0..6)
5752 if(!(er
= get_ecmtask()))
5756 er
->srvid
= demux
[demux_id
].program_number
;
5759 cs_strncpy(er
->dev_name
, dev_list
[demux
[demux_id
].dev_index
].name
, sizeof(dev_list
[demux
[demux_id
].dev_index
].name
));
5762 er
->tsid
= demux
[demux_id
].tsid
;
5763 er
->onid
= demux
[demux_id
].onid
;
5764 er
->pmtpid
= demux
[demux_id
].pmtpid
;
5765 er
->ens
= demux
[demux_id
].ens
;
5766 er
->caid
= curpid
->CAID
;
5767 er
->pid
= curpid
->ECM_PID
;
5768 er
->prid
= curpid
->PROVID
;
5769 er
->vpid
= curpid
->VPID
;
5770 er
->ecmlen
= sctlen
;
5771 memcpy(er
->ecm
, buffer
, er
->ecmlen
);
5773 chid
= get_subid(er
); // fetch chid or fake chid
5774 uint32_t fixedprovid
= chk_provid(er
->ecm
, er
->caid
);
5776 if(fixedprovid
&& fixedprovid
!= er
->prid
)
5778 cs_log_dbg(D_DVBAPI
, "Fixing provid ecmpid %d from %06X -> %06X", pid
, curpid
->PROVID
, fixedprovid
);
5779 curpid
->PROVID
= fixedprovid
;
5783 cs_log_dbg(D_DVBAPI
, "Fixing provid filter %d from %06X -> %06X",
5784 filter_num
+ 1, demux
[demux_id
].demux_fd
[filter_num
].provid
, fixedprovid
);
5786 demux
[demux_id
].demux_fd
[filter_num
].provid
= fixedprovid
;
5788 cs_log_dbg(D_DVBAPI
, "Fixing provid ecmrequest from %06X -> %06X", er
->prid
, fixedprovid
);
5789 er
->prid
= fixedprovid
;
5793 // only used on receiver internal buffer overflow
5794 // to get quickly fresh ecm filterdata otherwise freezing!
5798 dvbapi_set_section_filter(demux_id
, er
, filter_num
);
5803 if(caid_is_irdeto(curpid
->CAID
))
5805 if(curpid
->irdeto_curindex
!= buffer
[4]) // old style wrong irdeto index
5807 if(curpid
->irdeto_curindex
== 0xFE) // check if this ecmfilter just started up
5809 // on startup set the current index to the irdeto index of the ecm
5810 curpid
->irdeto_curindex
= buffer
[4];
5812 else // we are already running and not interested in this ecm
5814 if(curpid
->table
!= buffer
[0]) // fix for receivers not supporting section filtering
5819 // set ecm filter to odd + even since
5820 // this ecm doesn't match with current irdeto index
5821 dvbapi_set_section_filter(demux_id
, er
, filter_num
);
5827 else // fix for receivers not supporting section filtering
5829 if(curpid
->table
== buffer
[0])
5835 cs_log_dbg(D_DVBAPI
, "Demuxer %d ECMTYPE %02X CAID %04X PROVID %06X ECMPID %04X IRDETO INDEX %02X MAX INDEX %02X CHID %04X CYCLE %02X VPID %04X",
5836 demux_id
, er
->ecm
[0], er
->caid
, er
->prid
, er
->pid
, er
->ecm
[4], er
->ecm
[5], er
->chid
, curpid
->irdeto_cycle
, er
->vpid
);
5840 cs_log_dbg(D_DVBAPI
, "Demuxer %d ECMTYPE %02X CAID %04X PROVID %06X ECMPID %04X FAKECHID %04X (unique part in ecm)",
5841 demux_id
, er
->ecm
[0], er
->caid
, er
->prid
, er
->pid
, er
->chid
);
5844 // check for matching chid (unique ecm part in case of non-irdeto cas)
5845 // plus added fix for seca2 monthly changing fakechid
5846 if((curpid
->CHID
< 0x10000) && !((chid
== curpid
->CHID
) || ((curpid
->CAID
>> 8 == 0x01) && (chid
& 0xF0FF) == (curpid
->CHID
& 0xF0FF))))
5848 if(caid_is_irdeto(curpid
->CAID
))
5850 // if same: we cycled all indexes but no luck!
5851 if((curpid
->irdeto_cycle
< 0xFE) && (curpid
->irdeto_cycle
== curpid
->irdeto_curindex
))
5853 struct s_dvbapi_priority
*forceentry
= dvbapi_check_prio_match(demux_id
, pid
, 'p');
5855 // forced pid? keep trying the forced ecmpid, no force kill ecm filter
5856 if(!forceentry
|| !forceentry
->force
)
5858 if(curpid
->checked
== 2)
5860 curpid
->checked
= 4;
5863 if(curpid
->checked
== 1)
5865 curpid
->checked
= 2;
5866 curpid
->CHID
= 0x10000;
5869 dvbapi_stop_filternum(demux_id
, filter_num
, msgid
); // stop this ecm filter!
5874 curpid
->irdeto_curindex
++; // set check on next index
5876 if(curpid
->irdeto_cycle
== 0xFE)
5878 curpid
->irdeto_cycle
= buffer
[4]; // on startup set to current irdeto index
5881 if(curpid
->irdeto_curindex
> curpid
->irdeto_maxindex
)
5883 curpid
->irdeto_curindex
= 0; // check if we reached max irdeto index, if so reset to 0
5887 // set ecm filter to odd + even since
5888 // this ecm doesn't match with current irdeto index
5889 dvbapi_set_section_filter(demux_id
, er
, filter_num
);
5894 else // all non irdeto cas systems
5896 struct s_dvbapi_priority
*forceentry
= dvbapi_check_prio_match(demux_id
, pid
, 'p');
5899 // set ecm filter to odd + even since
5900 // this ecm doesn't match with current irdeto index
5901 dvbapi_set_section_filter(demux_id
, er
, filter_num
);
5903 if(forceentry
&& forceentry
->force
)
5906 return; // forced pid? keep trying the forced ecmpid!
5909 if(curpid
->checked
== 2)
5911 curpid
->checked
= 4;
5914 if(curpid
->checked
== 1)
5916 curpid
->checked
= 2;
5917 curpid
->CHID
= 0x10000;
5920 dvbapi_stop_filternum(demux_id
, filter_num
, msgid
); // stop this ecm filter!
5926 struct s_dvbapi_priority
*p
;
5927 for(p
= dvbapi_priority
; p
!= NULL
; p
= p
->next
)
5930 || (p
->caid
&& p
->caid
!= curpid
->CAID
)
5931 || (p
->provid
&& p
->provid
!= curpid
->PROVID
)
5932 || (p
->ecmpid
&& p
->ecmpid
!= curpid
->ECM_PID
)
5933 || (p
->srvid
&& p
->srvid
!= demux
[demux_id
].program_number
))
5938 if((uint
)p
->delay
== sctlen
&& p
->force
< 6)
5953 curpid
->PROVID
= chk_provid(buffer
, curpid
->CAID
);
5956 if(caid_is_irdeto(curpid
->CAID
)) // irdeto: wait for the correct index
5958 if(buffer
[4] != curpid
->irdeto_curindex
)
5962 // set ecm filter to odd + even since
5963 // this ecm doesn't match with current irdeto index
5964 dvbapi_set_section_filter(demux_id
, er
, filter_num
);
5971 // we have an ecm with the correct irdeto index (or fakechid)
5972 for(p
= dvbapi_priority
; p
!= NULL
; p
= p
->next
) // check for ignore!
5975 || (p
->caid
&& p
->caid
!= curpid
->CAID
)
5976 || (p
->provid
&& p
->provid
!= curpid
->PROVID
)
5977 || (p
->ecmpid
&& p
->ecmpid
!= curpid
->ECM_PID
)
5978 || (p
->pidx
&& p
->pidx
- 1 != pid
)
5979 || (p
->srvid
&& p
->srvid
!= demux
[demux_id
].program_number
))
5984 // found an ignore chid match with current ecm -> ignoring this irdeto index
5985 if(p
->type
== 'i' && (p
->chid
< 0x10000 && p
->chid
== chid
))
5987 curpid
->irdeto_curindex
++;
5988 if(curpid
->irdeto_cycle
== 0xFE)
5990 curpid
->irdeto_cycle
= buffer
[4]; // on startup set to current irdeto index
5993 if(curpid
->irdeto_curindex
> curpid
->irdeto_maxindex
) // check if curindex is over the max
5995 curpid
->irdeto_curindex
= 0;
5999 // irdeto: wait for the correct index + check if we cycled all
6000 if(caid_is_irdeto(curpid
->CAID
) && (curpid
->irdeto_cycle
!= curpid
->irdeto_curindex
))
6002 // set ecm filter to odd + even since this chid has to be ignored!
6003 dvbapi_set_section_filter(demux_id
, er
, filter_num
);
6005 else // this fakechid has to be ignored, kill this filter!
6007 if(curpid
->checked
== 2)
6009 curpid
->checked
= 4;
6012 if(curpid
->checked
== 1)
6014 curpid
->checked
= 2;
6015 curpid
->CHID
= 0x10000;
6018 dvbapi_stop_filternum(demux_id
, filter_num
, msgid
); // stop this ecm filter!
6027 curpid
->table
= er
->ecm
[0];
6030 request_cw(dvbapi_client
, er
, demux_id
, 1); // register this ecm for delayed ecm response check
6031 return; // end of ecm filterhandling!
6034 if(filtertype
== TYPE_EMM
)
6036 if(len
!= 0) // len = 0 receiver encountered an internal buffer overflow!
6038 cs_log_dump_dbg(D_DVBAPI
, buffer
, sctlen
, "Demuxer %d filter %d fetched EMM data (length = 0x%03X):",
6039 demux_id
, filter_num
+ 1, sctlen
);
6041 if(sctlen
> MAX_EMM_SIZE
) // emm too long to handle!
6043 cs_log_dbg(D_DVBAPI
, "Received data with total length 0x%03X but max supported EMM length is 0x%03X -> Please report!",
6044 sctlen
, MAX_EMM_SIZE
);
6051 return; // just skip on internal buffer overflow
6055 if(caid_is_director(demux
[demux_id
].demux_fd
[filter_num
].caid
))
6065 for(i
= 0; i
+ 2 < sctlen
; i
++)
6067 if(buffer
[i
] == 0xF0 && (buffer
[i
+ 2] == 0xE1 || buffer
[i
+ 2] == 0xE4))
6069 emmhash
= (buffer
[3] << 8) | buffer
[sctlen
- 2];
6070 if(demux
[demux_id
].demux_fd
[filter_num
].cadata
== emmhash
)
6075 demux
[demux_id
].demux_fd
[filter_num
].cadata
= emmhash
;
6076 dvbapi_process_emm(demux_id
, filter_num
, buffer
, sctlen
);
6083 // fix to handle more than one irdeto emm packet
6084 uint8_t *pbuf
= buffer
;
6086 int32_t unhandled
= len
;
6091 sctlen
= SCT_LEN(pbuf
);
6093 if(unhandled
< 4 || (int32_t)sctlen
> unhandled
|| sctlen
> MAX_EMM_SIZE
|| sctlen
< 4)
6098 dvbapi_process_emm(demux_id
, filter_num
, pbuf
, sctlen
);
6100 unhandled
-= sctlen
;
6104 if(filtertype
== TYPE_SDT
)
6106 cs_log_dump_dbg(D_DVBAPI
, buffer
, sctlen
, "Demuxer %d filter %d fetched SDT data (length = 0x%03X):",
6107 demux_id
, filter_num
+ 1, sctlen
);
6109 dvbapi_parse_sdt(demux_id
, buffer
, sctlen
, msgid
);
6112 if(filtertype
== TYPE_PAT
)
6114 cs_log_dump_dbg(D_DVBAPI
, buffer
, sctlen
, "Demuxer %d filter %d fetched PAT data (length = 0x%03X):",
6115 demux_id
, filter_num
+ 1, sctlen
);
6117 dvbapi_parse_pat(demux_id
, buffer
, sctlen
, msgid
);
6120 if(filtertype
== TYPE_PMT
)
6122 cs_log_dump_dbg(D_DVBAPI
, buffer
, sctlen
, "Demuxer %d filter %d fetched PMT data (length = 0x%03X):",
6123 demux_id
, filter_num
+ 1, sctlen
);
6125 dvbapi_parse_pmt(demux_id
, buffer
, sctlen
, msgid
);
6128 if(filtertype
== TYPE_CAT
)
6130 cs_log_dump_dbg(D_DVBAPI
, buffer
, sctlen
, "Demuxer %d filter %d fetched CAT data (length = 0x%03X):",
6131 demux_id
, filter_num
+ 1, sctlen
);
6133 dvbapi_parse_cat(demux_id
, buffer
, sctlen
, msgid
);
6137 static int32_t dvbapi_recv(int32_t connfd
, uint8_t *mbuf
, size_t rlen
)
6139 ssize_t len
= cs_recv(connfd
, mbuf
, rlen
, MSG_DONTWAIT
);
6141 if((len
== -1 && (errno
!= EINTR
&& errno
!= EAGAIN
&& errno
!= EWOULDBLOCK
)) || (len
== 0))
6154 static uint16_t dvbapi_get_nbof_missing_header_bytes(uint8_t *mbuf
, uint16_t mbuf_len
, uint32_t msgid_size
)
6156 uint16_t commandsize
= 4;
6157 commandsize
+= msgid_size
;
6158 if(mbuf_len
< commandsize
)
6160 return commandsize
- mbuf_len
;
6165 uint32_t opcode
= b2i(4, mbuf
);
6167 if((opcode
& 0xFFFFF000) == DVBAPI_AOT_CA
)
6171 uint32_t size
= mbuf
[3] & 0x7F;
6172 if(mbuf_len
< (commandsize
+ size
))
6174 return (commandsize
+ size
) - mbuf_len
;
6183 case DVBAPI_FILTER_DATA
:
6185 commandsize
+= msgid_size
;
6186 if(mbuf_len
< commandsize
)
6188 return commandsize
- mbuf_len
;
6192 case DVBAPI_CLIENT_INFO
:
6194 commandsize
+= msgid_size
;
6195 if(mbuf_len
< commandsize
)
6197 return commandsize
- mbuf_len
;
6208 static void set_chunksize_data_len_to_invalid(uint16_t *chunksize
, uint16_t *data_len
)
6214 static void log_packeterror(uint16_t mbuf_len
, const char* command
)
6216 cs_log("dvbapi_get_packet_size(): error - buffer length (%" PRIu16
") too short for %s", mbuf_len
, command
);
6219 static bool is_commandsize_valid(uint32_t commandsize
, uint16_t mbuf_len
, const char* command
)
6221 bool isValid
= mbuf_len
>= commandsize
;
6224 log_packeterror(mbuf_len
, command
);
6229 static uint8_t get_asn1packetsize(uint8_t *mbuf
, uint16_t mbuf_len
, const char *command
, uint32_t *tmp_data_len
)
6231 uint8_t sizebytes
= 0;
6232 uint8_t commandsize
= 4;
6233 *tmp_data_len
= mbuf
[3] & 0x7F;
6236 sizebytes
= *tmp_data_len
;
6237 if(is_commandsize_valid(3 + sizebytes
, mbuf_len
, command
))
6239 *tmp_data_len
= b2i(sizebytes
, mbuf
+ 4);
6246 return commandsize
+ sizebytes
;
6249 static void dvbapi_get_packet_size(uint8_t *mbuf
, uint16_t mbuf_len
, uint16_t *chunksize
, uint16_t *data_len
)
6251 //chunksize: size of complete chunk in the buffer (an opcode with the data)
6252 //data_len: variable for internal data length (eg. for the filter data size, PMT len)
6258 cs_log("dvbapi_get_packet_size(): error - buffer length (%" PRIu16
") too short", mbuf_len
);
6259 set_chunksize_data_len_to_invalid(chunksize
, data_len
);
6263 int32_t commandsize
= 0;
6264 char* command
= "DVBAPI_UNKNOWN_COMMAND";
6265 uint32_t tmp_data_len
= 0;
6266 uint32_t opcode
= b2i(4, mbuf
);
6270 case DVBAPI_AOT_CA_STOP
:
6272 command
= "DVBAPI_AOT_CA_STOP";
6273 commandsize
= get_asn1packetsize(mbuf
, mbuf_len
, command
, &tmp_data_len
);
6276 case DVBAPI_FILTER_DATA
:
6278 command
= "DVBAPI_FILTER_DATA";
6280 if(is_commandsize_valid(commandsize
, mbuf_len
, command
))
6282 tmp_data_len
= b2i(2, mbuf
+ 7) & 0x0FFF;
6287 case DVBAPI_CLIENT_INFO
:
6289 command
= "DVBAPI_CLIENT_INFO";
6291 if(is_commandsize_valid(commandsize
, mbuf_len
, command
))
6293 tmp_data_len
= mbuf
[6];
6300 if((opcode
& 0xFFFFFF00) == DVBAPI_AOT_CA_PMT
)
6302 command
= "DVBAPI_AOT_CA_PMT";
6303 commandsize
= get_asn1packetsize(mbuf
, mbuf_len
, command
, &tmp_data_len
);
6308 cs_log("Unknown socket command received: 0x%08X", opcode
);
6314 if(tmp_data_len
== 0 || commandsize
== 0)
6316 set_chunksize_data_len_to_invalid(chunksize
, data_len
);
6320 if(tmp_data_len
+ commandsize
> 0xFFFF)
6322 cs_log("This packet is too big: %d bytes => truncated!", tmp_data_len
);
6323 tmp_data_len
= 0xFFFF - commandsize
;
6326 (*data_len
) = tmp_data_len
;
6327 (*chunksize
) += commandsize
+ tmp_data_len
;
6329 if(*chunksize
> mbuf_len
)
6331 cs_log_dbg(D_DVBAPI
, "This %s packet is incomplete => command length is (%" PRIu16
")", command
, *chunksize
);
6335 cs_log_dbg(D_DVBAPI
, "This is a %s packet with size %d => lets process it!", command
, (*chunksize
));
6339 static void dvbapi_handlesockmsg(uint8_t *mbuf
, uint16_t chunksize
, uint16_t data_len
, int32_t connfd
, uint16_t *client_proto_version
)
6342 if(*client_proto_version
>= 3)
6346 cs_log("Error: network packet malformed! (no start)");
6349 msgid
= b2i(4, mbuf
+ 1);
6353 uint32_t opcode
= b2i(4, mbuf
);
6356 case DVBAPI_FILTER_DATA
:
6358 int32_t demux_id
= mbuf
[4];
6359 int32_t filter_num
= mbuf
[5];
6361 if(demux_id
< 0 || demux_id
>= MAX_DEMUX
)
6363 cs_log("dvbapi_handlesockmsg(): error - received invalid demux_id (%d)", demux_id
);
6367 if(filter_num
< 0 || filter_num
>= MAX_FILTER
)
6369 cs_log("dvbapi_handlesockmsg(): error - received invalid filter_num (%d)", filter_num
);
6372 dvbapi_process_input(demux_id
, filter_num
, mbuf
+ 6, data_len
+ 3, msgid
);
6376 case DVBAPI_CLIENT_INFO
:
6378 uint16_t client_proto
= b2i(2, mbuf
+ 4);
6379 NULLFREE(last_client_name
);
6381 if(cs_malloc(&last_client_name
, data_len
+ 1))
6383 memcpy(last_client_name
, &mbuf
[7], data_len
);
6384 last_client_name
[data_len
] = 0;
6385 cs_log("Client connected: '%s' (protocol version = %" PRIu16
")", last_client_name
, client_proto
);
6387 dvbapi_net_send(DVBAPI_SERVER_INFO
, connfd
, msgid
, -1, -1, NULL
, NULL
, NULL
, client_proto
);
6389 // now the protocol handshake is complete set correct version so all further packets are sent with correct message id.
6390 (*client_proto_version
) = client_proto
;
6392 // setting the global var according to the client
6393 last_client_proto_version
= client_proto
;
6397 case DVBAPI_AOT_CA_PMT
:
6399 cs_log_dbg(D_DVBAPI
,"Received DVBAPI_AOT_CA_PMT object on socket %d:", connfd
);
6400 dvbapi_parse_capmt(mbuf
+ (chunksize
- data_len
), data_len
, connfd
, NULL
, *client_proto_version
, msgid
);
6404 case DVBAPI_AOT_CA_STOP
:
6406 cs_log_dbg(D_DVBAPI
, "Received DVBAPI_AOT_CA_STOP object on socket %d:", connfd
);
6407 if(cfg
.dvbapi_boxtype
== BOXTYPE_IPBOX
|| cfg
.dvbapi_boxtype
== BOXTYPE_PC_NODMX
|| cfg
.dvbapi_listenport
)
6410 int32_t demux_index
= mbuf
[7];
6411 for(i
= 0; i
< MAX_DEMUX
; i
++)
6413 // 0xff demux_index is a wildcard => close all related demuxers
6414 if(demux_index
== 0xff)
6416 if(demux
[i
].socket_fd
== connfd
)
6418 dvbapi_stop_descrambling(i
, msgid
);
6421 else if(demux
[i
].demux_index
== demux_index
)
6423 dvbapi_stop_descrambling(i
, msgid
);
6429 if(cfg
.dvbapi_boxtype
== BOXTYPE_IPBOX
)
6431 // check do we have any demux running on this fd
6432 int16_t execlose
= 1;
6433 for(i
= 0; i
< MAX_DEMUX
; i
++)
6435 if(demux
[i
].socket_fd
== connfd
)
6443 int32_t ret
= close(connfd
);
6446 cs_log("ERROR: Could not close PMT fd (errno=%d %s)", errno
, strerror(errno
));
6451 else if(cfg
.dvbapi_pmtmode
!= 6)
6453 int32_t ret
= close(connfd
);
6456 cs_log("ERROR: Could not close PMT fd (errno=%d %s)", errno
, strerror(errno
));
6463 if((opcode
& 0xFFFFFF00) == DVBAPI_AOT_CA_PMT
)
6465 cs_log_dbg(D_DVBAPI
, "Received DVBAPI_AOT_CA_PMT object on socket %d:", connfd
);
6466 dvbapi_parse_capmt(mbuf
+ (chunksize
- data_len
), data_len
, connfd
, NULL
, *client_proto_version
, msgid
);
6470 cs_log("Unknown socket command received: 0x%08X", opcode
);
6477 static bool dvbapi_handlesockdata(int32_t connfd
, uint8_t *mbuf
, uint16_t mbuf_size
, uint16_t unhandled_len
, uint16_t *new_unhandled_len
, uint16_t *client_proto_version
)
6479 int32_t recv_result
;
6480 uint16_t chunksize
= 1, data_len
= 1;
6481 uint8_t packet_count
= 1;
6482 uint32_t msgid_size
= 0;
6483 uint16_t missing_header_bytes
= 0;
6484 if(*client_proto_version
>= 3)
6491 missing_header_bytes
= dvbapi_get_nbof_missing_header_bytes(mbuf
, unhandled_len
, msgid_size
);
6493 if(missing_header_bytes
!= 0)
6495 // read first few bytes so we know packet type and length
6496 cs_log_dbg(D_TRACE
, "%s reading %" PRIu16
" bytes from connection fd %d", (unhandled_len
== 0) ? "Try" : "Continue", missing_header_bytes
, connfd
);
6498 recv_result
= dvbapi_recv(connfd
, mbuf
+ unhandled_len
, mbuf_size
- unhandled_len
);
6501 (*new_unhandled_len
) = unhandled_len
;
6502 return (recv_result
!= -1);
6506 unhandled_len
+= recv_result
;
6507 if(unhandled_len
< missing_header_bytes
)
6509 (*new_unhandled_len
) = unhandled_len
;
6515 cs_log_dump_dbg(D_DVBAPI
, mbuf
, unhandled_len
, "Got packetdata (msgid size: %d, clientprotocol: %d)", msgid_size
, *client_proto_version
);
6516 dvbapi_get_packet_size(mbuf
+msgid_size
, unhandled_len
-msgid_size
, &chunksize
, &data_len
);
6518 chunksize
+=msgid_size
;
6519 if(chunksize
> mbuf_size
)
6521 cs_log("***** WARNING: SOCKET DATA BUFFER OVERFLOW (%" PRIu16
" bytes), PLEASE REPORT! ****** ", chunksize
);
6522 (*new_unhandled_len
) = 0;
6526 if(unhandled_len
< chunksize
) // we are missing some bytes, try to read them
6528 cs_log_dbg(D_TRACE
, "Continue to read the missing %d bytes from connection fd %d", chunksize
- unhandled_len
, connfd
);
6529 recv_result
= dvbapi_recv(connfd
, mbuf
+ unhandled_len
, mbuf_size
- unhandled_len
);
6532 (*new_unhandled_len
) = unhandled_len
;
6533 return (recv_result
!= -1);
6537 unhandled_len
+= recv_result
;
6538 if(unhandled_len
< chunksize
)
6540 (*new_unhandled_len
) = unhandled_len
;
6546 dvbapi_handlesockmsg(mbuf
, chunksize
-msgid_size
, data_len
, connfd
, client_proto_version
);
6548 unhandled_len
-= chunksize
;
6549 if(unhandled_len
> 0)
6551 memmove(mbuf
, mbuf
+ chunksize
, unhandled_len
);
6553 } while(unhandled_len
!= 0 && packet_count
++ < 8);
6555 cs_log_dbg(D_DVBAPI
, "Processing socketdata completed after %d packets with %d bytes left unprocessed", packet_count
, unhandled_len
);
6557 (*new_unhandled_len
) = unhandled_len
;
6561 static void add_to_assoc_fd(int sock
)
6565 for(i
= 0; i
< MAX_ASSOC_FD
; i
++)
6567 if(assoc_fd
[i
] == sock
)
6569 return; // do not add twice
6573 for(i
= 0; i
< MAX_ASSOC_FD
; i
++)
6583 static void del_from_assoc_fd(int sock
)
6587 for(i
= 0; i
< MAX_ASSOC_FD
; i
++)
6589 if(assoc_fd
[i
] == sock
)
6596 static void *dvbapi_main_local(void *cli
)
6599 struct s_client
*client
= (struct s_client
*)cli
;
6600 client
->thread
= pthread_self();
6601 SAFE_SETSPECIFIC(getclient
, cli
);
6602 dvbapi_client
= cli
;
6603 int32_t maxpfdsize
= (MAX_DEMUX
* maxfilter
) + MAX_DEMUX
+ 2;
6604 struct pollfd pfd2
[maxpfdsize
];
6605 struct timeb start
, end
; // start time poll, end time poll
6606 #define PMT_SERVER_SOCKET "/tmp/.listen.camd.socket"
6607 struct sockaddr_un saddr
;
6608 saddr
.sun_family
= AF_UNIX
;
6609 cs_strncpy(saddr
.sun_path
, PMT_SERVER_SOCKET
, sizeof(saddr
.sun_path
));
6610 int32_t rc
, pfdcount
, g
, connfd
, clilen
;
6611 int32_t ids
[maxpfdsize
], fdn
[maxpfdsize
], type
[maxpfdsize
];
6612 struct SOCKADDR servaddr
;
6614 static const uint16_t mbuf_size
= 2048;
6616 uint16_t unhandled_buf_len
[maxpfdsize
], unhandled_buf_used
[maxpfdsize
];
6617 uint8_t *unhandled_buf
[maxpfdsize
];
6618 struct s_auth
*account
;
6620 uint16_t client_proto_version
[maxpfdsize
];
6622 if(!cs_malloc(&mbuf
, sizeof(uint8_t) * mbuf_size
))
6627 for(i
= 0; i
< maxpfdsize
; i
++)
6629 unhandled_buf
[i
] = NULL
;
6630 unhandled_buf_len
[i
] = 0;
6631 unhandled_buf_used
[i
] = 0;
6632 client_proto_version
[i
] = 0;
6635 for(account
= cfg
.account
; account
!= NULL
; account
= account
->next
)
6637 if((ok
= is_dvbapi_usr(account
->usr
)))
6643 cs_auth_client(client
, ok
? account
: (struct s_auth
*)(-1), "dvbapi");
6644 memset(demux
, 0, sizeof(demux
));
6646 for(i
= 0; i
< MAX_DEMUX
; i
++)
6648 SAFE_MUTEX_INIT(&demux
[i
].answerlock
, NULL
);
6649 for(j
= 0; j
< MAX_ECM_PIDS
; j
++)
6651 for(l
= 0; l
< MAX_STREAM_INDICES
; l
++)
6653 demux
[i
].ECMpids
[j
].index
[l
] = INDEX_INVALID
;
6656 demux
[i
].pidindex
= -1;
6657 demux
[i
].curindex
= -1;
6660 memset(ca_fd
, 0, sizeof(ca_fd
));
6661 memset(assoc_fd
, 0, sizeof(assoc_fd
));
6662 dvbapi_read_priority();
6663 dvbapi_load_channel_cache();
6665 // detect box type first and then get descrambler info
6666 dvbapi_get_descrambler_info();
6668 if(cfg
.dvbapi_pmtmode
== 1)
6670 disable_pmt_files
= 1;
6673 int32_t listenfd
= -1;
6674 if(cfg
.dvbapi_boxtype
!= BOXTYPE_IPBOX_PMT
&&
6675 cfg
.dvbapi_pmtmode
!= 2 && cfg
.dvbapi_pmtmode
!= 5 && cfg
.dvbapi_pmtmode
!= 6)
6677 if(!cfg
.dvbapi_listenport
)
6679 listenfd
= dvbapi_init_listenfd();
6683 listenfd
= dvbapi_net_init_listenfd();
6688 cs_log("ERROR: Could not init socket: (errno=%d: %s)", errno
, strerror(errno
));
6694 for(i
= 0; i
< MAX_DEMUX
; i
++) // init all demuxers!
6696 demux
[i
].pidindex
= -1;
6697 demux
[i
].curindex
= -1;
6700 if(cfg
.dvbapi_pmtmode
!= 4 && cfg
.dvbapi_pmtmode
!= 5 && cfg
.dvbapi_pmtmode
!= 6)
6702 struct sigaction signal_action
;
6703 signal_action
.sa_handler
= event_handler
;
6704 sigemptyset(&signal_action
.sa_mask
);
6705 signal_action
.sa_flags
= SA_RESTART
;
6706 sigaction(SIGRTMIN
+ 1, &signal_action
, NULL
);
6708 dir_fd
= open(TMPDIR
, O_RDONLY
);
6711 fcntl(dir_fd
, F_SETSIG
, SIGRTMIN
+ 1);
6712 fcntl(dir_fd
, F_NOTIFY
, DN_MODIFY
| DN_CREATE
| DN_DELETE
| DN_MULTISHOT
);
6713 event_handler(SIGRTMIN
+ 1);
6718 int32_t ret
= start_thread("dvbapi event", dvbapi_event_thread
, (void *) dvbapi_client
, NULL
, 1, 0);
6728 pfd2
[0].fd
= listenfd
;
6729 pfd2
[0].events
= (POLLIN
| POLLPRI
);
6733 #if defined WITH_COOLAPI || defined WITH_COOLAPI2 || defined WITH_NEUTRINO
6734 int sysret
= system("pzapit -rz");
6736 // To avoid not used and correct error handling by not ignoring system return value
6739 cs_ftime(&start
); // register start time
6743 if(pausecam
) // for dbox2, STAPI or PC in standby mode don't parse any ecm/emm or try to start next filter
6748 if(cfg
.dvbapi_pmtmode
== 6)
6752 cs_log("PMT mode 6: Connecting to enigma CA PMT listen socket...");
6755 if((listenfd
= socket(AF_UNIX
, SOCK_STREAM
, 0)) < 0)
6757 cs_log("socket error (errno=%d %s)", errno
, strerror(errno
));
6760 else if(connect(listenfd
, (struct sockaddr
*)&saddr
, sizeof(saddr
)) < 0)
6762 cs_log("socket connect error (errno=%d %s)", errno
, strerror(errno
));
6768 pfd2
[0].fd
= listenfd
;
6769 pfd2
[0].events
= (POLLIN
| POLLPRI
);
6771 cs_log("PMT mode 6: Successfully connected to CA PMT server (fd %d)", listenfd
);
6775 if(listenfd
== -1) // not connected!
6778 continue; // start fresh connect attempt!
6782 pfdcount
= (listenfd
> -1) ? 1 : 0;
6784 for(i
= 0; i
< MAX_ASSOC_FD
; i
++) // add all associated fds (this should include also demux[X].socket_fd)
6788 pfd2
[pfdcount
].fd
= assoc_fd
[i
];
6789 pfd2
[pfdcount
].events
= (POLLIN
| POLLPRI
);
6790 client_proto_version
[pfdcount
] = last_client_proto_version
;
6791 type
[pfdcount
++] = 1;
6795 for(i
= 0; i
< MAX_DEMUX
; i
++)
6797 if(demux
[i
].program_number
== 0)
6799 continue; // only evalutate demuxers that have channels assigned
6802 uint32_t ecmcounter
= 0, emmcounter
= 0;
6803 for(g
= 0; g
< maxfilter
; g
++)
6805 if(demux
[i
].demux_fd
[g
].fd
<= 0)
6807 continue; // deny obvious invalid fd!
6810 if(!cfg
.dvbapi_listenport
&& cfg
.dvbapi_boxtype
!= BOXTYPE_PC_NODMX
6811 && selected_api
!= STAPI
&& selected_api
!= COOLAPI
)
6813 pfd2
[pfdcount
].fd
= demux
[i
].demux_fd
[g
].fd
;
6814 pfd2
[pfdcount
].events
= (POLLIN
| POLLPRI
);
6817 type
[pfdcount
++] = 0;
6820 // count ecm filters to see if demuxing is possible anyway
6821 #ifdef MODULE_STREAMRELAY
6822 if(cfg
.dvbapi_demuxer_fix
)
6824 if(demux
[i
].demux_fd
[g
].type
== TYPE_ECM
|| demux
[i
].demux_fd
[g
].type
== 3 || demux
[i
].demux_fd
[g
].type
== 6)
6832 if(demux
[i
].demux_fd
[g
].type
== TYPE_ECM
)
6836 #ifdef MODULE_STREAMRELAY
6840 // count emm filters also
6841 if(demux
[i
].demux_fd
[g
].type
== TYPE_EMM
)
6847 // only produce log if something changed
6848 if(ecmcounter
!= demux
[i
].old_ecmfiltercount
|| emmcounter
!= demux
[i
].old_emmfiltercount
)
6850 cs_log_dbg(D_DVBAPI
, "Demuxer %d has %d ecmpids, %d streampids, %d ecmfilters and %d of max %d emmfilters",
6851 i
, demux
[i
].ECMpidcount
, demux
[i
].STREAMpidcount
, ecmcounter
, emmcounter
, demux
[i
].max_emm_filter
);
6853 demux
[i
].old_ecmfiltercount
= ecmcounter
; // save new amount of ecm filters
6854 demux
[i
].old_emmfiltercount
= emmcounter
; // save new amount of emm filters
6857 // delayed emm start for non irdeto caids,
6858 // start emm cat if not already done for this demuxer!
6862 int8_t do_emm_start
= (cfg
.dvbapi_au
> 0 && demux
[i
].emm_filter
== -1 && demux
[i
].EMMpidcount
== 0 && emmcounter
== 0);
6863 int8_t do_sdt_start
= (cfg
.dvbapi_read_sdt
&& demux
[i
].sdt_filter
== -1 && cfg
.dvbapi_boxtype
!= BOXTYPE_SAMYGO
);
6865 if(do_emm_start
|| do_sdt_start
)
6867 gone
= comp_timeb(&now
, &demux
[i
].emmstart
);
6868 if(gone
> 20 * 1000)
6872 cs_ftime(&demux
[i
].emmstart
); // trick to let emm fetching start after 30 seconds to speed up zapping
6873 dvbapi_start_cat_filter(i
);
6881 dvbapi_start_sdt_filter(i
);
6886 // early start for irdeto since they need emm before ecm
6887 // (pmt emmstart = 1 if detected caid 0x06)
6888 int32_t emmstarted
= demux
[i
].emm_filter
;
6890 // check every time since share readers might
6891 // give us new filters due to hexserial change
6892 if(cfg
.dvbapi_au
&& demux
[i
].EMMpidcount
> 0)
6894 if(!emmcounter
&& emmstarted
== -1)
6896 demux
[i
].emmstart
= now
;
6897 dvbapi_start_emm_filter(i
); // start emm filtering if emm pids are found
6901 gone
= comp_timeb(&now
, &demux
[i
].emmstart
);
6902 if(gone
> 30 * 1000)
6904 demux
[i
].emmstart
= now
;
6905 dvbapi_start_emm_filter(i
); // start emm filtering delayed if filters already were running
6906 rotate_emmfilter(i
); // rotate active emm filters
6911 // Restart decoding all caids we have ecmpids but no ecm filters!
6912 if(ecmcounter
== 0 && demux
[i
].ECMpidcount
> 0)
6914 int32_t started
= 0;
6916 // avoid race: not all pids are asked and checked out yet!
6917 for(g
= 0; g
< demux
[i
].ECMpidcount
; g
++)
6919 // check if prio run is done
6920 if(demux
[i
].ECMpids
[g
].checked
== 0 && demux
[i
].ECMpids
[g
].status
>= 0)
6922 dvbapi_try_next_caid(i
, 0, 0); // not done, so start next prio pid
6930 continue; // if started a filter proceed with next demuxer
6933 // all usable pids (with prio) are tried, lets start over again without prio!
6934 if(g
== demux
[i
].ECMpidcount
)
6936 // avoid race: not all pids are asked and checked out yet!
6937 for(g
= 0; g
< demux
[i
].ECMpidcount
; g
++)
6939 // check if noprio run is done
6940 if(demux
[i
].ECMpids
[g
].checked
== 2 && demux
[i
].ECMpids
[g
].status
>= 0)
6942 demux
[i
].ECMpids
[g
].irdeto_curindex
= 0xFE;
6943 demux
[i
].ECMpids
[g
].irdeto_maxindex
= 0;
6944 demux
[i
].ECMpids
[g
].irdeto_cycle
= 0xFE;
6945 demux
[i
].ECMpids
[g
].tries
= 0xFE;
6946 demux
[i
].ECMpids
[g
].table
= 0;
6947 demux
[i
].ECMpids
[g
].CHID
= 0x10000; // remove chid prio
6949 dvbapi_try_next_caid(i
, 2, 0); // not done, so start next no prio pid
6958 continue; // if started a filter proceed with next demuxer
6961 if(g
== demux
[i
].ECMpidcount
) // all usable pids are tried, lets start over again!
6963 if(demux
[i
].decodingtries
== -1) // first redecoding attempt?
6965 cs_ftime(&demux
[i
].decstart
);
6967 // re-init some used things from second run (without prio)
6968 for(g
= 0; g
< demux
[i
].ECMpidcount
; g
++)
6970 demux
[i
].ECMpids
[g
].checked
= 0;
6971 demux
[i
].ECMpids
[g
].irdeto_curindex
= 0xFE;
6972 demux
[i
].ECMpids
[g
].irdeto_maxindex
= 0;
6973 demux
[i
].ECMpids
[g
].irdeto_cycle
= 0xFE;
6974 demux
[i
].ECMpids
[g
].table
= 0;
6975 demux
[i
].decodingtries
= 0;
6977 // remove this pid from channel cache since we had no founds on any ecmpid!
6978 dvbapi_edit_channel_cache(i
, g
, 0);
6982 uint8_t number_of_enabled_pids
= 0;
6983 demux
[i
].decodingtries
++;
6984 dvbapi_resort_ecmpids(i
);
6986 for(g
= 0; g
< demux
[i
].ECMpidcount
; g
++) // count number of enabled pids!
6988 if(demux
[i
].ECMpids
[g
].status
>= 0) number_of_enabled_pids
++;
6991 if(!number_of_enabled_pids
)
6993 if(demux
[i
].decodingtries
== 10)
6995 demux
[i
].decodingtries
= 0;
6996 cs_log("Demuxer %d no enabled matching ecmpids -> decoding is waiting for matching readers!",i
);
7001 cs_ftime(&demux
[i
].decend
);
7002 demux
[i
].decodingtries
= -1; // reset to first run again!
7003 gone
= comp_timeb(&demux
[i
].decend
, &demux
[i
].decstart
);
7005 cs_log("Demuxer %d restarting decoding requests after %"PRId64
" ms with %d enabled and %d disabled ecmpids!",
7006 i
, gone
, number_of_enabled_pids
, (demux
[i
].ECMpidcount
-number_of_enabled_pids
));
7008 dvbapi_try_next_caid(i
, 0, 0);
7015 while(!(listenfd
== -1 && cfg
.dvbapi_pmtmode
== 6))
7017 rc
= poll(pfd2
, pfdcount
, 500);
7018 if(rc
< 0) // error occured while polling for fd's with fresh data
7020 if(errno
== EINTR
|| errno
== EAGAIN
) // try again in case of interrupt
7024 cs_log("ERROR: error on poll of %d fd's (errno=%d %s)", pfdcount
, errno
, strerror(errno
));
7035 cs_ftime(&end
); // register end time
7036 int64_t timeout
= comp_timeb(&end
, &start
);
7039 cs_log("*** WARNING: BAD TIME AFFECTING WHOLE OSCAM ECM HANDLING ****");
7041 cs_log_dbg(D_TRACE
, "New events occurred on %d of %d handlers after %"PRId64
" ms inactivity", rc
, pfdcount
, timeout
);
7042 cs_ftime(&start
); // register new start time for next poll
7045 for(i
= 0; i
< pfdcount
&& rc
> 0; i
++)
7047 if(pfd2
[i
].revents
== 0) { continue; } // skip sockets with no changes
7048 rc
--; //event handled!
7049 cs_log_dbg(D_TRACE
, "Now handling fd %d that reported event %d", pfd2
[i
].fd
, pfd2
[i
].revents
);
7051 if(pfd2
[i
].revents
& (POLLHUP
| POLLNVAL
| POLLERR
))
7055 del_from_assoc_fd(pfd2
[i
].fd
);
7057 for(j
= 0; j
< MAX_DEMUX
; j
++)
7059 // if listenfd closes stop all assigned decoding!
7060 if(demux
[j
].socket_fd
== pfd2
[i
].fd
)
7062 dvbapi_stop_descrambling(j
, 0);
7066 int32_t ret
= close(pfd2
[i
].fd
);
7067 if(ret
< 0 && errno
!= 9)
7069 cs_log("ERROR: Could not close demuxer socket fd (errno=%d %s)", errno
, strerror(errno
));
7072 if(pfd2
[i
].fd
== listenfd
&& cfg
.dvbapi_pmtmode
== 6)
7076 cs_log_dbg(D_DVBAPI
, "Socket %d reported hard connection close", pfd2
[i
].fd
);
7080 int32_t demux_id
= ids
[i
];
7083 if(cfg
.dvbapi_boxtype
!= BOXTYPE_SAMYGO
)
7085 // stop filter since its giving errors and wont return anything good
7086 dvbapi_stop_filternum(demux_id
, n
, 0);
7092 struct dmx_sct_filter_params sFP
;
7093 cs_log_dbg(D_DVBAPI
, "re-opening connection to demux socket");
7094 close(demux
[demux_id
].demux_fd
[n
].fd
);
7095 demux
[demux_id
].demux_fd
[n
].fd
= -1;
7097 ret
= dvbapi_open_device(0, demux
[demux_id
].demux_index
, demux
[demux_id
].adapter_index
);
7100 demux
[demux_id
].demux_fd
[n
].fd
= ret
;
7101 pid
= demux
[demux_id
].curindex
;
7102 memset(filter
, 0, 32);
7103 memset(&sFP
, 0, sizeof(sFP
));
7106 sFP
.pid
= demux
[demux_id
].ECMpids
[pid
].ECM_PID
;
7108 sFP
.flags
= DMX_IMMEDIATE_START
;
7109 memcpy(sFP
.filter
.filter
, filter
, 16);
7110 memcpy(sFP
.filter
.mask
, filter
+ 16, 16);
7111 ret
= dvbapi_ioctl(demux
[demux_id
].demux_fd
[n
].fd
, DMX_SET_FILTER
, &sFP
);
7116 // stop filter since it's giving errors and wont return anything good
7117 dvbapi_stop_filternum(demux_id
, n
, 0);
7121 continue; // continue with other events
7124 if(pfd2
[i
].revents
& (POLLIN
| POLLPRI
))
7128 if(pfd2
[i
].fd
== listenfd
)
7130 if(cfg
.dvbapi_pmtmode
== 6)
7133 disable_pmt_files
= 1;
7137 clilen
= sizeof(servaddr
);
7138 connfd
= accept(listenfd
, (struct sockaddr
*)&servaddr
, (socklen_t
*)&clilen
);
7139 cs_log_dbg(D_DVBAPI
, "new socket connection fd: %d", connfd
);
7141 if(cfg
.dvbapi_listenport
)
7143 // update webif data
7144 client
->ip
= SIN_GET_ADDR(servaddr
);
7145 client
->port
= ntohs(SIN_GET_PORT(servaddr
));
7148 add_to_assoc_fd(connfd
);
7150 if(cfg
.dvbapi_pmtmode
== 3 || cfg
.dvbapi_pmtmode
== 0)
7152 disable_pmt_files
= 1;
7157 cs_log_dbg(D_DVBAPI
, "accept() returns error on fd event %d (errno=%d %s)",
7158 pfd2
[i
].revents
, errno
, strerror(errno
));
7164 connfd
= pfd2
[i
].fd
;
7167 //reading and completing data from socket
7170 if(unhandled_buf_used
[i
])
7172 memcpy(mbuf
, unhandled_buf
[i
], unhandled_buf_used
[i
]);
7175 if(!dvbapi_handlesockdata(connfd
, mbuf
, mbuf_size
, unhandled_buf_used
[i
], &unhandled_buf_used
[i
], &client_proto_version
[i
]))
7177 unhandled_buf_used
[i
] = 0;
7178 client_proto_version
[i
] = 0; // reset protocol, next client could old protocol.
7179 last_client_proto_version
= 0;
7180 // client disconnects, stop all assigned decoding
7181 cs_log_dbg(D_DVBAPI
, "Socket %d reported connection close", connfd
);
7182 int active_conn
= 0; // other active connections counter
7184 for(j
= 0; j
< MAX_DEMUX
; j
++)
7186 if(demux
[j
].socket_fd
== connfd
)
7188 dvbapi_stop_descrambling(j
, 0);
7190 else if(demux
[j
].socket_fd
)
7196 // stop polling on this socket
7197 del_from_assoc_fd(connfd
);
7200 // last connection closed
7201 if(!active_conn
&& (cfg
.dvbapi_listenport
|| cfg
.dvbapi_boxtype
== BOXTYPE_PC_NODMX
))
7203 if(cfg
.dvbapi_listenport
)
7205 // update webif data
7206 client
->ip
= get_null_ip();
7213 if(unhandled_buf_used
[i
])
7215 if(unhandled_buf_used
[i
] > unhandled_buf_len
[i
])
7217 NULLFREE(unhandled_buf
[i
]);
7218 unhandled_buf_len
[i
] = unhandled_buf_used
[i
] < 128 ? 128 : unhandled_buf_used
[i
];
7219 if(!cs_malloc(&unhandled_buf
[i
], sizeof(uint8_t) * unhandled_buf_len
[i
]))
7221 unhandled_buf_len
[i
] = 0;
7222 unhandled_buf_used
[i
] = 0;
7226 memcpy(unhandled_buf
[i
], mbuf
, unhandled_buf_used
[i
]);
7232 int32_t demux_id
= ids
[i
];
7235 if((int)demux
[demux_id
].demux_fd
[n
].fd
!= pfd2
[i
].fd
)
7237 continue; // filter already killed, no need to process this data!
7240 len
= dvbapi_read_device(pfd2
[i
].fd
, mbuf
, mbuf_size
);
7241 if(len
< 0) // serious filterdata read error
7243 // stop filter since it's giving errors and won't return anything good
7244 dvbapi_stop_filternum(demux_id
, n
, 0);
7246 maxfilter
--; // lower maxfilters to avoid this with new filter setups!
7250 if(!len
) // receiver internal filter buffer overflow
7252 memset(mbuf
, 0, mbuf_size
);
7254 dvbapi_process_input(demux_id
, n
, mbuf
, len
, 0);
7256 continue; // continue with other events!
7261 for(j
= 0; j
< maxpfdsize
; j
++)
7263 NULLFREE(unhandled_buf
[j
]);
7270 void dvbapi_write_cw(int32_t demux_id
, int32_t pid
, int32_t stream_id
, uint8_t *cw
, uint8_t cw_length
, uint8_t *iv
,
7271 uint8_t iv_length
, enum ca_descr_algo algo
, enum ca_descr_cipher_mode cipher_mode
, uint32_t msgid
)
7273 int8_t n
, cw_empty
= 0;
7274 uint8_t null_cw
[cw_length
];
7275 ca_descr_t ca_descr
;
7276 ca_descr_mode_t ca_descr_mode
;
7277 ca_descr_data_t ca_descr_data
;
7279 memset(null_cw
, 0, cw_length
);
7280 memset(&ca_descr
, 0, sizeof(ca_descr
));
7281 memset(&ca_descr_mode
, 0, sizeof(ca_descr_mode
));
7282 memset(&ca_descr_data
, 0, sizeof(ca_descr_data
));
7284 if(memcmp(demux
[demux_id
].last_cw
[stream_id
][0], null_cw
, cw_length
) == 0
7285 && memcmp(demux
[demux_id
].last_cw
[stream_id
][1], null_cw
, cw_length
) == 0)
7287 cw_empty
= 1; // to make sure that both cws get written on constantcw
7290 for(n
= 0; n
< 2; n
++)
7292 // Check if cw has changed and if new cw is empty (all zeros)
7293 // Skip check for BISS1 - cw could be indeed zero
7294 // Skip check for BISS2 - we use the extended cw, so the "simple" cw is always zero
7295 if((memcmp(cw
+ (n
* cw_length
), demux
[demux_id
].last_cw
[stream_id
][n
], cw_length
) != 0 || cw_empty
)
7296 && (memcmp(cw
+ (n
* cw_length
), null_cw
, cw_length
) != 0 || caid_is_biss(demux
[demux_id
].ECMpids
[pid
].CAID
)))
7298 // prepare ca device
7299 uint32_t idx
= dvbapi_ca_set_pid(demux_id
, pid
, stream_id
, (algo
== CA_ALGO_DES
), msgid
);
7300 if(idx
== INDEX_INVALID
)
7302 return; // return on no index!
7305 #if defined WITH_COOLAPI || defined WITH_COOLAPI2
7306 ca_descr
.index
= idx
;
7307 ca_descr
.parity
= n
;
7309 // just to make the compiler happy (-Wunused-parameter)
7310 // (better move the coolapi code to a separate function)
7311 ca_descr_mode
.cipher_mode
= cipher_mode
;
7312 ca_descr_data
.data
= iv
;
7313 ca_descr_data
.length
= iv_length
;
7315 memcpy(demux
[demux_id
].last_cw
[stream_id
][n
], cw
+ (n
* 8), 8);
7316 memcpy(ca_descr
.cw
, cw
+ (n
* 8), 8);
7318 cs_log_dbg(D_DVBAPI
, "Demuxer %d write cw%d index: %d (ca_mask %d)",
7319 demux_id
, n
, ca_descr
.index
, demux
[demux_id
].ca_mask
);
7321 coolapi_write_cw(demux
[demux_id
].ca_mask
, demux
[demux_id
].STREAMpids
, demux
[demux_id
].STREAMpidcount
, &ca_descr
);
7323 int32_t i
, j
, write_cw
= 0;
7324 uint32_t usedidx
, lastidx
;
7326 char lastcw
[2 * cw_length
+ 1];
7327 char newcw
[2 * cw_length
+ 1];
7329 if(cs_dblevel
& D_DVBAPI
)
7331 cs_hexdump(0, demux
[demux_id
].last_cw
[stream_id
][n
], cw_length
, lastcw
, sizeof(lastcw
));
7332 cs_hexdump(0, cw
+ (n
* cw_length
), cw_length
, newcw
, sizeof(newcw
));
7336 for(i
= 0; i
< CA_MAX
; i
++)
7338 if(!(demux
[demux_id
].ca_mask
& (1 << i
)))
7340 continue; // ca not in use by this demuxer!
7342 lastidx
= INDEX_INVALID
;
7344 for(j
= 0; j
< demux
[demux_id
].STREAMpidcount
; j
++)
7347 if(!demux
[demux_id
].ECMpids
[pid
].streams
|| ((demux
[demux_id
].ECMpids
[pid
].streams
& (1 << j
)) == (uint
) (1 << j
)))
7349 usedidx
= is_ca_used(i
, demux
[demux_id
].STREAMpids
[j
]);
7350 if(usedidx
!= INDEX_INVALID
)
7354 cs_log_dbg(D_DVBAPI
,"Demuxer %d ca%d is using index %d for streampid %04X -> skip!",
7355 demux_id
, i
, usedidx
, demux
[demux_id
].STREAMpids
[j
]);
7356 continue; // if not used for descrambling -> skip!
7360 if(usedidx
== lastidx
)
7362 cs_log_dbg(D_DVBAPI
,"Demuxer %d ca%d is using index %d for streampid %04X -> skip, %s part of cw already written!",
7363 demux_id
, i
, usedidx
, demux
[demux_id
].STREAMpids
[j
], (n
== 1 ? "even" : "odd"));
7367 cs_log_dbg(D_DVBAPI
,"Demuxer %d ca%d is using index %d for streampid %04X -> write %s part of cw!",
7368 demux_id
, i
, usedidx
, demux
[demux_id
].STREAMpids
[j
], (n
== 1 ? "even" : "odd"));
7377 continue; // no need to write the cw since this ca isnt using it!
7381 ca_descr
.index
= usedidx
;
7382 ca_descr
.parity
= n
;
7384 memcpy(demux
[demux_id
].last_cw
[stream_id
][n
], cw
+ (n
* cw_length
), cw_length
);
7385 memcpy(ca_descr
.cw
, cw
+ (n
* 8), 8); // ca_descr is only used for 8 byte CWs
7387 cs_log_dbg(D_DVBAPI
, "Demuxer %d writing %s part (%s) of controlword, replacing expired (%s)",
7388 demux_id
, (n
== 1 ? "even" : "odd"), newcw
, lastcw
);
7390 cs_log_dbg(D_DVBAPI
, "Demuxer %d write cw%d index: %d (ca%d)", demux_id
, n
, ca_descr
.index
, i
);
7392 if(cfg
.dvbapi_extended_cw_api
== 1) // Set descrambler algorithm and mode
7394 ca_descr_mode
.index
= usedidx
;
7395 ca_descr_mode
.algo
= algo
;
7396 ca_descr_mode
.cipher_mode
= cipher_mode
;
7398 if(cfg
.dvbapi_boxtype
== BOXTYPE_PC
|| cfg
.dvbapi_boxtype
== BOXTYPE_PC_NODMX
)
7400 dvbapi_net_send(DVBAPI_CA_SET_DESCR_MODE
, demux
[demux_id
].socket_fd
, msgid
, demux_id
, -1 /*unused*/,
7401 (uint8_t *) &ca_descr_mode
, NULL
, NULL
, demux
[demux_id
].client_proto_version
);
7407 ca_fd
[i
] = dvbapi_open_device(1, i
, demux
[demux_id
].adapter_index
);
7408 if(ca_fd
[i
] <= 0) { continue; }
7411 if(dvbapi_ioctl(ca_fd
[i
], CA_SET_DESCR_MODE
, &ca_descr_mode
) < 0)
7413 cs_log("ERROR: ioctl(CA_SET_DESCR_MODE): %s", strerror(errno
));
7418 // Send 16 byte CW and IV for AES128, DVB-CISSA
7419 if(cfg
.dvbapi_extended_cw_api
== 1 && algo
== CA_ALGO_AES128
)
7422 ca_descr_data
.index
= usedidx
;
7423 ca_descr_data
.data_type
= CA_DATA_IV
;
7424 ca_descr_data
.data
= iv
;
7425 ca_descr_data
.length
= iv_length
;
7427 if(cfg
.dvbapi_boxtype
== BOXTYPE_PC
|| cfg
.dvbapi_boxtype
== BOXTYPE_PC_NODMX
)
7429 dvbapi_net_send(DVBAPI_CA_SET_DESCR_DATA
, demux
[demux_id
].socket_fd
, msgid
, demux_id
, -1 /*unused*/,
7430 (uint8_t *) &ca_descr_data
, NULL
, NULL
, demux
[demux_id
].client_proto_version
);
7434 if(dvbapi_ioctl(ca_fd
[i
], CA_SET_DESCR_DATA
, &ca_descr_data
) < 0)
7436 cs_log("ERROR: ioctl(CA_SET_DESCR_DATA): %s", strerror(errno
));
7441 ca_descr_data
.index
= usedidx
;
7442 ca_descr_data
.data_type
= CA_DATA_KEY
;
7443 ca_descr_data
.data
= cw
+ (n
* cw_length
);
7444 ca_descr_data
.length
= cw_length
;
7445 ca_descr_data
.parity
= n
;
7447 if(cfg
.dvbapi_boxtype
== BOXTYPE_PC
|| cfg
.dvbapi_boxtype
== BOXTYPE_PC_NODMX
)
7449 dvbapi_net_send(DVBAPI_CA_SET_DESCR_DATA
, demux
[demux_id
].socket_fd
, msgid
, demux_id
, -1 /*unused*/,
7450 (uint8_t *) &ca_descr_data
, NULL
, NULL
, demux
[demux_id
].client_proto_version
);
7454 if(dvbapi_ioctl(ca_fd
[i
], CA_SET_DESCR_DATA
, &ca_descr_data
) < 0)
7456 cs_log("ERROR: ioctl(CA_SET_DESCR_DATA): %s", strerror(errno
));
7460 else // Send 8 byte CW for DVB-CSA or DES
7462 if(cfg
.dvbapi_boxtype
== BOXTYPE_PC
|| cfg
.dvbapi_boxtype
== BOXTYPE_PC_NODMX
)
7464 dvbapi_net_send(DVBAPI_CA_SET_DESCR
, demux
[demux_id
].socket_fd
, msgid
, demux_id
, -1 /*unused*/,
7465 (uint8_t *) &ca_descr
, NULL
, NULL
, demux
[demux_id
].client_proto_version
);
7471 ca_fd
[i
] = dvbapi_open_device(1, i
, demux
[demux_id
].adapter_index
);
7478 if(dvbapi_ioctl(ca_fd
[i
], CA_SET_DESCR
, &ca_descr
) < 0)
7480 cs_log("ERROR: ioctl(CA_SET_DESCR): %s", strerror(errno
));
7489 cs_log_dbg(D_DVBAPI
, "Using %d of %d total descramblers", ca_descramblers_used
, ca_descramblers_total
);
7492 void delayer(ECM_REQUEST
*er
, uint32_t delay
)
7494 if(delay
<= 0) { return; }
7498 int64_t gone
= comp_timeb(&tpe
, &er
->tps
);
7502 cs_log_dbg(D_DVBAPI
, "delayer: gone=%"PRId64
" ms, cfg=%d ms -> delay=%"PRId64
" ms", gone
, delay
, delay
- gone
);
7503 cs_sleepms(delay
- gone
);
7507 #ifdef WITH_EXTENDED_CW
7508 bool caid_is_csa_alt(uint16_t caid
)
7510 return caid
== 0x09c4 || caid
== 0x098c || caid
==0x098d;
7513 bool select_csa_alt(ECM_REQUEST
*er
)
7515 if(caid_is_csa_alt(er
->caid
))
7517 if((er
->ecm
[2] - er
->ecm
[4]) == 4)
7526 void dvbapi_send_dcw(struct s_client
*client
, ECM_REQUEST
*er
)
7528 int32_t i
, j
, k
, handled
= 0;
7529 for(i
= 0; i
< MAX_DEMUX
; i
++)
7531 uint32_t nocw_write
= 0; // 0 = write cw, 1 = dont write cw to hardware demuxer
7533 // ignore empty demuxers, skip ecm response for other
7534 // srvid and ecm recponse for different adapter
7535 if(demux
[i
].program_number
== 0
7536 || demux
[i
].program_number
!= er
->srvid
7537 || demux
[i
].adapter_index
!= er
->adapter_index
)
7543 if(strcmp(dev_list
[demux
[i
].dev_index
].name
, er
->dev_name
) != 0)
7545 continue; // skip request if PTI device doesn't match request
7549 demux
[i
].rdr
= er
->selected_reader
;
7551 for(j
= 0; j
< demux
[i
].ECMpidcount
; j
++) // check for matching ecmpid
7553 if((demux
[i
].ECMpids
[j
].CAID
== er
->caid
|| demux
[i
].ECMpids
[j
].CAID
== er
->ocaid
)
7554 && demux
[i
].ECMpids
[j
].ECM_PID
== er
->pid
&& demux
[i
].ECMpids
[j
].PROVID
== er
->prid
7555 && demux
[i
].ECMpids
[j
].VPID
== er
->vpid
)
7561 if(j
== demux
[i
].ECMpidcount
)
7563 continue; // ecm response srvid ok but no matching ecmpid, perhaps this for other demuxer
7566 cs_log_dbg(D_DVBAPI
, "Demuxer %d %scontrol word received for PID %d CAID %04X PROVID %06X ECMPID %04X CHID %04X VPID %04X",
7567 i
, (er
->rc
>= E_NOTFOUND
? "no " : ""), j
, er
->caid
, er
->prid
, er
->pid
, er
->chid
, er
->vpid
);
7569 uint32_t status
= dvbapi_check_ecm_delayed_delivery(i
, er
);
7570 uint32_t comparecw0
= 0, comparecw1
= 0;
7573 if(cs_dblevel
& D_DVBAPI
)
7575 cs_hexdump(0, er
->ecmd5
, 16, ecmd5
, sizeof(ecmd5
));
7578 if(status
== 1 && er
->rc
) // wrong ecmhash
7580 cs_log_dbg(D_DVBAPI
, "Demuxer %d not interested in response ecmhash %s (requested different one)", i
, ecmd5
);
7584 if(status
== 2) // no filter
7586 cs_log_dbg(D_DVBAPI
, "Demuxer %d not interested in response ecmhash %s (filter already killed)", i
, ecmd5
);
7590 if(status
== 5) // empty cw
7592 cs_log_dbg(D_DVBAPI
, "Demuxer %d not interested in response ecmhash %s (delivered cw is empty!)", i
, ecmd5
);
7595 if(er
->rc
< E_NOTFOUND
)
7597 er
->rc
= E_NOTFOUND
;
7601 // 0=matching ecm hash, 2=no filter, 3=table reset, 4=cache-ex response
7602 // Check only against last_cw[0] (index 0) - No need to check the rest
7603 // Skip check for BISS1 - cw could be indeed zero
7604 // Skip check for BISS2 - we use the extended cw, so the "simple" cw is always zero
7605 if((status
== 0 || status
== 3 || status
== 4) && er
->rc
< E_NOTFOUND
&& !caid_is_biss(er
->caid
))
7607 // check for matching control word
7608 if(memcmp(er
->cw
, demux
[i
].last_cw
[0][0], 8) == 0 &&
7609 memcmp(er
->cw
+ 8, demux
[i
].last_cw
[0][1], 8) == 0)
7613 else if(memcmp(er
->cw
, demux
[i
].last_cw
[0][1], 8) == 0 &&
7614 memcmp(er
->cw
+ 8, demux
[i
].last_cw
[0][0], 8) == 0)
7619 if(comparecw0
== 1 || comparecw1
== 1)
7621 cs_log_dbg(D_DVBAPI
, "Demuxer %d duplicate controlword ecm response hash %s (duplicate controlword!)", i
, ecmd5
);
7626 if(status
== 3) // table reset
7628 cs_log_dbg(D_DVBAPI
, "Demuxer %d luckyshot new controlword ecm response hash %s (ecm table reset)", i
, ecmd5
);
7631 if(status
== 4) // no check on cache-ex responses!
7633 cs_log_dbg(D_DVBAPI
, "Demuxer %d new controlword from cache-ex reader (no ecmhash check possible)", i
);
7636 handled
= 1; // mark this ecm response as handled
7637 if(er
->rc
< E_NOTFOUND
&& cfg
.dvbapi_requestmode
== 0 && (demux
[i
].pidindex
== -1) && er
->caid
!= 0)
7639 demux
[i
].ECMpids
[j
].tries
= 0xFE; // reset timeout retry flag
7640 demux
[i
].ECMpids
[j
].irdeto_cycle
= 0xFE; // reset irdetocycle
7641 demux
[i
].pidindex
= j
; // set current index as *the* pid to descramble
7642 demux
[i
].ECMpids
[j
].checked
= 4;
7644 cs_log_dbg(D_DVBAPI
, "Demuxer %d descrambling PID %d CAID %04X PROVID %06X ECMPID %04X CHID %02X VPID %04X",
7645 i
, demux
[i
].pidindex
, er
->caid
, er
->prid
, er
->pid
, er
->chid
, er
->vpid
);
7648 if(er
->rc
< E_NOTFOUND
&& cfg
.dvbapi_requestmode
== 1 && er
->caid
!= 0) // FOUND
7650 SAFE_MUTEX_LOCK(&demux
[i
].answerlock
); // only process one ecm answer
7651 if(demux
[i
].ECMpids
[j
].checked
!= 4)
7653 int32_t t
, o
, ecmcounter
= 0;
7654 int32_t oldpidindex
= demux
[i
].pidindex
;
7655 demux
[i
].pidindex
= j
; // set current ecmpid as the new pid to descramble
7657 if(oldpidindex
!= -1)
7659 for(k
= 0; k
< MAX_STREAM_INDICES
; k
++)
7661 demux
[i
].ECMpids
[j
].index
[k
] = demux
[i
].ECMpids
[oldpidindex
].index
[k
]; // swap index with lower status pid that was descrambling
7662 demux
[i
].ECMpids
[j
].useMultipleIndices
= demux
[i
].ECMpids
[oldpidindex
].useMultipleIndices
;
7666 // check this pid with control word FOUND for higher status
7667 for(t
= 0; t
< demux
[i
].ECMpidcount
; t
++)
7669 if(t
!= j
&& demux
[i
].ECMpids
[j
].status
>= demux
[i
].ECMpids
[t
].status
)
7671 // check if ecm filter is in use and
7672 // stop all ecm filters of lower status pids
7673 for(o
= 0; o
< maxfilter
; o
++)
7675 if(demux
[i
].demux_fd
[o
].fd
> 0 && demux
[i
].demux_fd
[o
].type
== TYPE_ECM
7676 && demux
[i
].demux_fd
[o
].pidindex
== t
)
7678 // ecm filter belongs to lower status pid -> kill!
7679 dvbapi_stop_filternum(i
, o
, er
->msgid
);
7682 dvbapi_edit_channel_cache(i
, t
, 0); // remove lower status pid from channel cache
7683 demux
[i
].ECMpids
[t
].checked
= 4; // mark index t as low status
7687 for(o
= 0; o
< maxfilter
; o
++)
7689 if(demux
[i
].demux_fd
[o
].type
== TYPE_ECM
)
7691 ecmcounter
++; // count all ecm filters
7695 demux
[i
].ECMpids
[j
].tries
= 0xFE; // reset timeout retry flag
7696 demux
[i
].ECMpids
[j
].irdeto_cycle
= 0xFE; // reset irdeto cycle
7698 if(ecmcounter
== 1) // if total found running ecmfilters is 1 -> we found the "best" pid
7700 dvbapi_edit_channel_cache(i
, j
, 1);
7701 demux
[i
].ECMpids
[j
].checked
= 4; // mark best pid last ;)
7703 cs_log_dbg(D_DVBAPI
, "Demuxer %d descrambling PID %d CAID %04X PROVID %06X ECMPID %04X CHID %02X VPID %04X",
7704 i
, demux
[i
].pidindex
, er
->caid
, er
->prid
, er
->pid
, er
->chid
, er
->vpid
);
7706 SAFE_MUTEX_UNLOCK(&demux
[i
].answerlock
); // and release it!
7709 if(er
->rc
>= E_NOTFOUND
) // not found on requestmode 0 + 1
7711 if(er
->rc
== E_SLEEPING
)
7713 dvbapi_stop_descrambling(i
, er
->msgid
);
7717 struct s_dvbapi_priority
*forceentry
= dvbapi_check_prio_match(i
, j
, 'p');
7718 if(forceentry
&& forceentry
->force
) // forced pid? keep trying the forced ecmpid!
7720 // all cas or irdeto cas with forced prio chid
7721 if(!caid_is_irdeto(er
->caid
) || forceentry
->chid
< 0x10000)
7723 demux
[i
].ECMpids
[j
].table
= 0;
7724 dvbapi_set_section_filter(i
, er
, -1);
7727 else // irdeto cas without chid prio forced
7729 // init irdeto current index to first one
7730 if(demux
[i
].ECMpids
[j
].irdeto_curindex
== 0xFE)
7732 demux
[i
].ECMpids
[j
].irdeto_curindex
= 0x00;
7735 // check for last / max chid
7736 if(!(demux
[i
].ECMpids
[j
].irdeto_curindex
+ 1 > demux
[i
].ECMpids
[j
].irdeto_maxindex
))
7738 cs_log_dbg(D_DVBAPI
, "Demuxer %d trying next irdeto chid of FORCED PID %d CAID %04X PROVID %06X ECMPID %04X",
7739 i
, j
, er
->caid
, er
->prid
, er
->pid
);
7741 demux
[i
].ECMpids
[j
].irdeto_curindex
++; // irdeto index one up
7742 demux
[i
].ECMpids
[j
].table
= 0;
7743 dvbapi_set_section_filter(i
, er
, -1);
7749 // in case of timeout or fatal LB event give
7750 // this pid another try but no more than 1 try
7751 if((er
->rc
== E_TIMEOUT
|| (er
->rcEx
&& er
->rcEx
<= E2_CCCAM_NOCARD
))
7752 && demux
[i
].ECMpids
[j
].tries
== 0xFE)
7754 demux
[i
].ECMpids
[j
].tries
-= 0x07;
7755 demux
[i
].ECMpids
[j
].table
= 0;
7756 dvbapi_set_section_filter(i
, er
, -1);
7759 else // all not found responses exception: first timeout response and first fatal loadbalancer response
7761 demux
[i
].ECMpids
[j
].CHID
= 0x10000; // get rid of this prio chid since it failed!
7762 demux
[i
].ECMpids
[j
].tries
= 0xFE; // reset timeout retry
7765 if(caid_is_irdeto(er
->caid
))
7767 // init irdeto current index to first one
7768 if(demux
[i
].ECMpids
[j
].irdeto_curindex
== 0xFE)
7770 demux
[i
].ECMpids
[j
].irdeto_curindex
= 0x00;
7773 // check for last / max chid
7774 if(!(demux
[i
].ECMpids
[j
].irdeto_curindex
+ 1 > demux
[i
].ECMpids
[j
].irdeto_maxindex
))
7776 cs_log_dbg(D_DVBAPI
, "Demuxer %d trying next irdeto chid of PID %d CAID %04X PROVID %06X ECMPID %04X VPID %04X",
7777 i
, j
, er
->caid
, er
->prid
, er
->pid
, er
->vpid
);
7779 demux
[i
].ECMpids
[j
].irdeto_curindex
++; // irdeto index one up
7780 demux
[i
].ECMpids
[j
].table
= 0;
7781 dvbapi_set_section_filter(i
, er
, -1);
7786 dvbapi_edit_channel_cache(i
, j
, 0); // remove this pid from channelcache
7788 if(demux
[i
].pidindex
== j
)
7790 // current pid delivered a notfound so this pid isn't
7791 // being used to descramble any longer -> clear pidindex
7792 demux
[i
].pidindex
= -1;
7795 demux
[i
].ECMpids
[j
].irdeto_maxindex
= 0;
7796 demux
[i
].ECMpids
[j
].irdeto_curindex
= 0xFE;
7797 demux
[i
].ECMpids
[j
].tries
= 0xFE; // reset timeout retry flag
7798 demux
[i
].ECMpids
[j
].irdeto_cycle
= 0xFE; // reset irdetocycle
7799 demux
[i
].ECMpids
[j
].table
= 0;
7800 demux
[i
].ECMpids
[j
].checked
= 4; // flag ecmpid as checked
7801 demux
[i
].ECMpids
[j
].status
= -1; // flag ecmpid as unusable
7803 int32_t found
= 1; // setup for first run
7804 int32_t filternum
= -1;
7806 while(found
> 0) // disable all ecm + emm filters for this notfound
7810 filternum
= dvbapi_get_filternum(i
, er
, TYPE_ECM
); // get ecm filternumber
7811 if(filternum
> -1) // in case valid filter found
7813 int32_t fd
= demux
[i
].demux_fd
[filternum
].fd
;
7814 if(fd
> 0) // in case valid fd
7816 dvbapi_stop_filternum(i
, filternum
, er
->msgid
); // stop ecmfilter
7821 if(caid_is_irdeto(er
->caid
)) // in case irdeto cas stop old emm filters
7823 filternum
= dvbapi_get_filternum(i
, er
, TYPE_EMM
); // get emm filternumber
7824 if(filternum
> -1) // in case valid filter found
7826 int32_t fd
= demux
[i
].demux_fd
[filternum
].fd
;
7827 if(fd
> 0) // in case valid fd
7829 dvbapi_stop_filternum(i
, filternum
, er
->msgid
); // stop emmfilter
7838 // below this should be only run in case of ecm answer is found
7839 uint32_t chid
= get_subid(er
); // derive current chid in case of irdeto, or a unique part of ecm on other cas systems
7840 demux
[i
].ECMpids
[j
].CHID
= (chid
!= 0 ? chid
: 0x10000); // if not zero apply, otherwise use no chid value 0x10000
7841 dvbapi_edit_channel_cache(i
, j
, 1); // do it here to here after the right CHID is registered
7843 //dvbapi_set_section_filter(i, er); is not needed anymore (unsure)
7844 demux
[i
].ECMpids
[j
].tries
= 0xFE; // reset timeout retry flag
7845 demux
[i
].ECMpids
[j
].irdeto_cycle
= 0xFE; // reset irdeto cycle
7847 // cw was already written by another filter or current pid
7848 // isn't pid used to descramble so it ends here!
7849 if(nocw_write
|| demux
[i
].pidindex
!= j
)
7854 struct s_dvbapi_priority
*delayentry
= dvbapi_check_prio_match(i
, demux
[i
].pidindex
, 'd');
7859 if(delayentry
->delay
< 1000)
7861 delay
= delayentry
->delay
;
7862 cs_log_dbg(D_DVBAPI
, "specific delay: write cw %d ms after ecmrequest", delay
);
7865 else if(cfg
.dvbapi_delayer
> 0)
7867 delay
= cfg
.dvbapi_delayer
;
7868 cs_log_dbg(D_DVBAPI
, "generic delay: write cw %d ms after ecmrequest", delay
);
7873 #ifdef MODULE_STREAMRELAY
7874 bool set_dvbapi_cw
= true;
7875 if(chk_ctab_ex(er
->caid
, &cfg
.stream_relay_ctab
) && cfg
.stream_relay_enabled
)
7877 // streamserver set cw
7878 set_dvbapi_cw
= !stream_write_cw(er
);
7882 switch(selected_api
)
7884 #if defined(WITH_STAPI) || defined(WITH_STAPI5)
7886 stapi_write_cw(i
, er
->cw
, demux
[i
].STREAMpids
, demux
[i
].STREAMpidcount
, demux
[i
].pmt_file
);
7891 #ifdef WITH_EXTENDED_CW
7892 if(er
->cw_ex
.mode
!= demux
[i
].ECMpids
[j
].useMultipleIndices
)
7896 for(k
= 0; k
< demux
[i
].STREAMpidcount
; k
++)
7898 if(demux
[i
].ECMpids
[j
].useMultipleIndices
)
7900 idx
= demux
[i
].ECMpids
[j
].index
[k
];
7904 idx
= demux
[i
].ECMpids
[j
].index
[0];
7906 dvbapi_set_pid(i
, k
, idx
, false, false, er
->msgid
); // disable streampid
7909 for(k
= 0; k
< MAX_STREAM_INDICES
; k
++)
7911 demux
[i
].ECMpids
[j
].index
[k
] = INDEX_INVALID
;
7915 if(er
->cw_ex
.mode
== CW_MODE_MULTIPLE_CW
)
7917 int32_t key_pos_a
= 0;
7918 demux
[i
].ECMpids
[j
].useMultipleIndices
= 1;
7920 for(k
= 0; k
< demux
[i
].STREAMpidcount
; k
++)
7922 if(demux
[i
].STREAMpidsType
[k
] == STREAM_VIDEO
)
7924 dvbapi_write_cw(i
, j
, k
, er
->cw
, 8, NULL
, 0, er
->cw_ex
.algo
, er
->cw_ex
.algo_mode
, er
->msgid
);
7926 else if(demux
[i
].STREAMpidsType
[k
] == STREAM_AUDIO
)
7930 dvbapi_write_cw(i
, j
, k
, er
->cw_ex
.audio
[key_pos_a
], 8, NULL
, 0, er
->cw_ex
.algo
, er
->cw_ex
.algo_mode
, er
->msgid
);
7934 // Every channel that uses the extended cw has unencrypted subtitle streams,
7935 // so disable CW writing to save indices for audio streams and recordings.
7938 // dvbapi_write_cw(i, j, k, er->cw_ex.data, 8, NULL, 0, er->cw_ex.algo, er->cw_ex.algo_mode, er->msgid);
7944 demux
[i
].ECMpids
[j
].useMultipleIndices
= 0;
7946 if(er
->cw_ex
.algo
== CW_ALGO_AES128
)
7948 dvbapi_write_cw(i
, j
, 0, er
->cw_ex
.session_word
, 16, er
->cw_ex
.data
, 16, er
->cw_ex
.algo
, er
->cw_ex
.algo_mode
, er
->msgid
);
7950 else if(er
->cw_ex
.algo
== CW_ALGO_CSA
)
7952 if(select_csa_alt(er
))
7954 er
->cw_ex
.algo
= CW_ALGO_CSA_ALT
;
7956 dvbapi_write_cw(i
, j
, 0, er
->cw
, 8, NULL
, 0, er
->cw_ex
.algo
, er
->cw_ex
.algo_mode
, er
->msgid
);
7960 dvbapi_write_cw(i
, j
, 0, er
->cw
, 8, NULL
, 0, er
->cw_ex
.algo
, er
->cw_ex
.algo_mode
, er
->msgid
);
7964 cfg
.dvbapi_extended_cw_api
= 0; // in CSA mode extended_cw_api should be always 0 regardless what user selected!
7965 dvbapi_write_cw(i
, j
, 0, er
->cw
, 8, NULL
, 0, CA_ALGO_DVBCSA
, CA_MODE_CBC
, er
->msgid
);
7972 client
->last
= time((time_t *)0); // ********* TO BE FIXED LATER ON ******
7974 if((cfg
.dvbapi_listenport
|| cfg
.dvbapi_boxtype
== BOXTYPE_PC_NODMX
) && demux
[i
].client_proto_version
>= 2)
7976 dvbapi_net_send(DVBAPI_ECM_INFO
, demux
[i
].socket_fd
, 0, i
, 0, NULL
, client
, er
, demux
[i
].client_proto_version
);
7979 else if(!cfg
.dvbapi_listenport
&& cfg
.dvbapi_boxtype
!= BOXTYPE_PC_NODMX
)
7981 if(cfg
.dvbapi_ecminfo_file
!= 0 && cfg
.dvbapi_boxtype
!= BOXTYPE_SAMYGO
)
7983 #ifdef WITH_EXTENDED_CW
7984 // Only print CWs for index 0 in ecm.info file
7985 if(er
->cw_ex
.algo
== CA_ALGO_AES128
)
7987 dvbapi_write_ecminfo_file(client
, er
, demux
[i
].last_cw
[0][0], demux
[i
].last_cw
[0][1], 16);
7991 dvbapi_write_ecminfo_file(client
, er
, demux
[i
].last_cw
[0][0], demux
[i
].last_cw
[0][1], 8);
7994 dvbapi_write_ecminfo_file(client
, er
, demux
[i
].last_cw
[0][0], demux
[i
].last_cw
[0][1], 8);
8001 cs_log_dbg(D_DVBAPI
, "Unhandled ECM response received for CAID %04X PROVID %06X ECMPID %04X CHID %04X VPID %04X",
8002 er
->caid
, er
->prid
, er
->pid
, er
->chid
, er
->vpid
);
8006 static int8_t isValidCW(uint8_t *cw
)
8009 for(i
= 0; i
< 16; i
+= 4)
8011 if(((cw
[i
] + cw
[i
+ 1] + cw
[i
+ 2]) & 0xff) != cw
[i
+ 3])
8019 void dvbapi_write_ecminfo_file(struct s_client
*client
, ECM_REQUEST
*er
, uint8_t *lastcw0
, uint8_t *lastcw1
, uint8_t cw_length
)
8021 #define ECMINFO_TYPE_OSCAM 0
8022 #define ECMINFO_TYPE_OSCAM_MS 1
8023 #define ECMINFO_TYPE_WICARDD 2
8024 #define ECMINFO_TYPE_MGCAMD 3
8025 #define ECMINFO_TYPE_CCCAM 4
8026 #define ECMINFO_TYPE_CAMD3 5
8027 #define ECMINFO_TYPE_GBOX 6
8029 FILE *ecmtxt
= fopen(ECMINFO_FILE
, "w");
8030 if(ecmtxt
!= NULL
&& er
->rc
< E_NOTFOUND
)
8032 char tmp
[49]; // holds 16 byte cw - (2 hex digits + 1 space) * 16 byte + string termination)
8033 const char *reader_name
= NULL
, *from_name
= NULL
, *proto_name
= NULL
, *from_device
= NULL
;
8035 int32_t from_port
= 0;
8036 char system_name
[64];
8037 const char *const_system_name
= get_cardsystem_desc_by_caid(er
->caid
);
8039 cs_strncpy(system_name
, const_system_name
, sizeof(system_name
));
8040 system_name
[0] = (char)toupper((int)system_name
[0]);
8042 if(cfg
.dvbapi_ecminfo_type
<= ECMINFO_TYPE_WICARDD
)
8044 if(cfg
.dvbapi_ecminfo_type
== ECMINFO_TYPE_WICARDD
)
8046 fprintf(ecmtxt
, "system: %s\n", system_name
);
8049 fprintf(ecmtxt
, "caid: 0x%04X\npid: 0x%04X\n", er
->caid
, er
->pid
);
8051 if(cfg
.dvbapi_ecminfo_type
== ECMINFO_TYPE_WICARDD
)
8053 fprintf(ecmtxt
, "prov: %06X\n", (uint
) er
->prid
);
8057 fprintf(ecmtxt
, "prov: 0x%06X\n", (uint
) er
->prid
);
8060 fprintf(ecmtxt
, "chid: 0x%04X\n", er
->chid
);
8062 else if(cfg
.dvbapi_ecminfo_type
== ECMINFO_TYPE_MGCAMD
)
8064 fprintf(ecmtxt
, "===== %s ECM on CaID 0x%04X, pid 0x%04X =====\nprov: %06X\n",
8065 system_name
, er
->caid
, er
->pid
, (uint
) er
->prid
);
8067 else if(cfg
.dvbapi_ecminfo_type
== ECMINFO_TYPE_CCCAM
)
8069 char provider_name
[128];
8070 get_providername(er
->prid
, er
->caid
, provider_name
, sizeof(provider_name
));
8072 if(provider_name
[0])
8074 fprintf(ecmtxt
, "system: %s\ncaid: 0x%04X\nprovider: %s\nprovid: 0x%06X\npid: 0x%04X\n",
8075 system_name
, er
->caid
, provider_name
, (uint
) er
->prid
, er
->pid
);
8079 fprintf(ecmtxt
, "system: %s\ncaid: 0x%04X\nprovid: 0x%06X\npid: 0x%04X\n",
8080 system_name
, er
->caid
, (uint
) er
->prid
, er
->pid
);
8083 else if(cfg
.dvbapi_ecminfo_type
== ECMINFO_TYPE_CAMD3
)
8085 fprintf(ecmtxt
, "CAID 0x%04X, PID 0x%04X, PROVIDER 0x%06X\n",
8086 er
->caid
, er
->pid
, (uint
) er
->prid
);
8089 else if(cfg
.dvbapi_ecminfo_type
== ECMINFO_TYPE_GBOX
)
8091 fprintf(ecmtxt
, "===== %s ECM on CaID 0x%04X, pid 0x%04X, sid 0x%04X =====\nprov: %04X, slot: %d, level: %d, dist: %d\nprovider: %06X\n",
8092 system_name
, er
->caid
, er
->pid
, er
->srvid
, er
->selected_reader
->gbox_cw_src_peer
, er
->selected_reader
->gbox_crd_slot_lev
>> 4,
8093 er
->selected_reader
->gbox_crd_slot_lev
& 0xf, er
->selected_reader
->currenthops
, (uint
) er
->prid
);
8100 if(er
->selected_reader
)
8102 reader_name
= er
->selected_reader
->label
;
8103 if(is_network_reader(er
->selected_reader
))
8105 from_name
= er
->selected_reader
->device
;
8106 from_port
= er
->selected_reader
->r_port
;
8110 from_name
= "local";
8111 from_device
= er
->selected_reader
->device
;
8113 proto_name
= reader_get_type_desc(er
->selected_reader
, 1);
8114 hops
= er
->selected_reader
->currenthops
;
8118 reader_name
= "none";
8119 from_name
= "local";
8120 proto_name
= "none";
8125 reader_name
= "Cache";
8126 from_name
= "cache1";
8127 proto_name
= "none";
8131 reader_name
= "Cache";
8132 from_name
= "cache2";
8133 proto_name
= "none";
8137 reader_name
= "Cache";
8138 from_name
= "cache3";
8139 proto_name
= "none";
8143 if(cfg
.dvbapi_ecminfo_type
== ECMINFO_TYPE_GBOX
)
8148 if(er
->selected_reader
)
8150 if(is_network_reader(er
->selected_reader
))
8152 fprintf(ecmtxt
, "reader: %s\nfrom: %s:%d\nprotocol: %s\n",
8153 reader_name
, from_name
, from_port
, proto_name
);
8157 fprintf(ecmtxt
, "reader: %s\nfrom: %s - %s\nprotocol: %s\n",
8158 reader_name
, from_name
, from_device
, proto_name
);
8166 fprintf(ecmtxt
, "reader: %s\nfrom: %s:%d\nprotocol: %s\n",
8167 reader_name
, from_name
, from_port
, proto_name
);
8170 fprintf(ecmtxt
, "ecm time: %.3f\n", (float) client
->cwlastresptime
/ 1000);
8173 if(cfg
.dvbapi_ecminfo_type
<= ECMINFO_TYPE_OSCAM_MS
)
8178 if(er
->selected_reader
)
8180 if(is_network_reader(er
->selected_reader
))
8182 fprintf(ecmtxt
, "reader: %s\nfrom: %s:%d\nprotocol: %s\nhops: %d\n",
8183 reader_name
, from_name
, from_port
, proto_name
, hops
);
8187 fprintf(ecmtxt
, "reader: %s\nfrom: %s - %s\nprotocol: %s\nhops: %d\n",
8188 reader_name
, from_name
, from_device
, proto_name
, hops
);
8196 fprintf(ecmtxt
, "reader: %s\nfrom: %s:%d\nprotocol: %s\n",
8197 reader_name
, from_name
, from_port
, proto_name
);
8201 if(cfg
.dvbapi_ecminfo_type
== ECMINFO_TYPE_OSCAM
)
8203 fprintf(ecmtxt
, "ecm time: %.3f\n", (float) client
->cwlastresptime
/ 1000);
8207 fprintf(ecmtxt
, "ecm time: %d\n", client
->cwlastresptime
);
8211 if(cfg
.dvbapi_ecminfo_type
== ECMINFO_TYPE_CAMD3
)
8213 fprintf(ecmtxt
, "FROM: %s\n", reader_name
);
8214 fprintf(ecmtxt
, "CW0: %s\n", cs_hexdump(1, lastcw0
, cw_length
, tmp
, sizeof(tmp
)));
8215 fprintf(ecmtxt
, "CW1: %s\n", cs_hexdump(1, lastcw1
, cw_length
, tmp
, sizeof(tmp
)));
8219 fprintf(ecmtxt
, "cw0: %s\n", cs_hexdump(1, lastcw0
, cw_length
, tmp
, sizeof(tmp
)));
8220 fprintf(ecmtxt
, "cw1: %s\n", cs_hexdump(1, lastcw1
, cw_length
, tmp
, sizeof(tmp
)));
8223 if(cfg
.dvbapi_ecminfo_type
== ECMINFO_TYPE_WICARDD
|| cfg
.dvbapi_ecminfo_type
== ECMINFO_TYPE_MGCAMD
)
8229 if(cw_length
== 8) // only check checksum for 8 byte CWs
8231 fprintf(ecmtxt
, "Signature %s\n", (isValidCW(lastcw0
) || isValidCW(lastcw1
)) ? "OK" : "NOK");
8235 fprintf(ecmtxt
, "Signature %s\n", "OK");
8238 if(reader_name
!= NULL
)
8240 fprintf(ecmtxt
, "source: %s (%s at %s:%d)\n", reader_name
, proto_name
, from_name
, from_port
);
8243 walltime
= cs_time();
8244 localtime_r(&walltime
, <
);
8246 if(strftime(timebuf
, 32, "%a %b %d %H:%M:%S %Y", <
) != 0)
8248 fprintf(ecmtxt
, "%d msec -- %s\n", client
->cwlastresptime
, timebuf
);
8252 if(cfg
.dvbapi_ecminfo_type
== ECMINFO_TYPE_CCCAM
)
8254 if(reader_name
!= NULL
)
8256 fprintf(ecmtxt
, "using: %s\naddress: %s:%d\nhops: %d\n",
8257 proto_name
, from_name
, from_port
, hops
);
8259 fprintf(ecmtxt
, "ecm time: %d\n", client
->cwlastresptime
);
8265 int32_t ret
= fclose(ecmtxt
);
8268 cs_log("ERROR: Could not close ecmtxt fd (errno=%d %s)", errno
, strerror(errno
));
8275 void *dvbapi_start_handler(struct s_client
*cl
, uint8_t *UNUSED(mbuf
), int32_t module_idx
, void *(*_main_func
)(void *))
8277 // cs_log("dvbapi loaded fd=%d", idx);
8278 if(cfg
.dvbapi_enabled
== 1)
8280 dvbapi_detect_api();
8282 if(selected_box
== -1 || selected_api
== -1)
8284 cs_log("ERROR: Could not detect DVBAPI version.");
8288 cl
= create_client(get_null_ip());
8289 cl
->module_idx
= module_idx
;
8292 start_thread("dvbapi handler", _main_func
, (void *)cl
, &cl
->thread
, 1, 0);
8297 void *dvbapi_handler(struct s_client
*cl
, uint8_t *mbuf
, int32_t module_idx
)
8299 return dvbapi_start_handler(cl
, mbuf
, module_idx
, dvbapi_main_local
);
8302 int32_t dvbapi_set_section_filter(int32_t demux_id
, ECM_REQUEST
*er
, int32_t n
)
8304 if(!er
) { return -1; }
8306 if(USE_OPENXCAS
|| (selected_api
!= DVBAPI_3
&& selected_api
!= DVBAPI_1
&& selected_api
!= STAPI
) // only valid for dvbapi3, dvbapi1 and STAPI
8307 || (cfg
.dvbapi_boxtype
== BOXTYPE_IPBOX
|| cfg
.dvbapi_boxtype
== BOXTYPE_IPBOX_PMT
)) // reported buggy using sectionfiltering after 1~4 hours -> for now disabled!
8314 n
= dvbapi_get_filternum(demux_id
, er
, TYPE_ECM
);
8317 if(n
< 0) // in case no valid filter found;
8322 int32_t fd
= demux
[demux_id
].demux_fd
[n
].fd
;
8323 if(fd
< 1) // in case no valid fd
8330 memset(filter
, 0, 16);
8331 memset(mask
, 0, 16);
8332 struct s_ecmpid
*curpid
= NULL
;
8334 int32_t pid
= demux
[demux_id
].demux_fd
[n
].pidindex
;
8337 curpid
= &demux
[demux_id
].ECMpids
[pid
];
8340 if(curpid
->table
!= er
->ecm
[0] && curpid
->table
!= 0)
8342 return -1; // if current ecmtype differs from latest requested ecmtype do not apply section filtering!
8345 uint8_t ecmfilter
= 0;
8347 if(er
->ecm
[0] == 0x80)
8349 ecmfilter
= 0x81; // current processed ecm is even, next will be filtered for odd
8353 ecmfilter
= 0x80; // current processed ecm is odd, next will be filtered for even
8356 if(curpid
->table
!= 0) // cycle ecmtype from odd to even or even to odd
8358 filter
[0] = ecmfilter
; // only accept new ecms (if previous odd, filter for even and vice versa)
8360 cs_log_dbg(D_DVBAPI
, "Demuxer %d Filter %d set ecmtable to %s (CAID %04X PROVID %06X FD %d)",
8361 demux_id
, n
+ 1, (ecmfilter
== 0x80 ? "EVEN" : "ODD"), curpid
->CAID
, curpid
->PROVID
, fd
);
8363 else // not decoding right now so we are interessted in all ecm types!
8365 filter
[0] = 0x80; // set filter to wait for any ecms
8367 cs_log_dbg(D_DVBAPI
, "Demuxer %d Filter %d set ecmtable to ODD+EVEN (CAID %04X PROVID %06X FD %d)",
8368 demux_id
, n
+ 1, curpid
->CAID
, curpid
->PROVID
, fd
);
8371 uint32_t offset
= 0, extramask
= 0xFF;
8372 struct s_dvbapi_priority
*forceentry
= dvbapi_check_prio_match(demux_id
, pid
, 'p');
8373 //cs_log("**** curpid->CHID %04X, checked = %d, er->chid = %04X *****", curpid->CHID, curpid->checked, er->chid);
8374 // checked 4 to make sure we dont set chid filter and no such ecm in dvbstream except for forced pids!
8376 if(curpid
->CHID
< 0x10000 && (curpid
->checked
== 4 || (forceentry
&& forceentry
->force
)))
8378 switch(er
->caid
>> 8)
8385 case 0x05: // viaccess
8389 case 0x06: // irdeto
8393 case 0x09: // videoguard
8397 case 0x4A: // DRE-Crypt, Bulcrypt, Tongang and others?
8398 if(!caid_is_bulcrypt(er
->caid
))
8406 int32_t irdetomatch
= 1; // check if wanted irdeto index is the one the delivers current chid!
8407 if(caid_is_irdeto(curpid
->CAID
))
8409 if(curpid
->irdeto_curindex
== er
->ecm
[4]) { irdetomatch
= 1; } // ok apply chid filtering
8410 else { irdetomatch
= 0; } // skip chid filtering but apply irdeto index filtering
8413 if(offset
&& irdetomatch
) // we have a cas with chid or unique part in checked ecm
8415 i2b_buf(2, curpid
->CHID
, filter
+ (offset
- 2));
8416 mask
[(offset
- 2)] = 0xFF & extramask
; // additional mask seca2 chid can be FC10 or FD10 varies each month so only apply F?10
8417 mask
[(offset
- 1)] = 0xFF;
8418 cs_log_dbg(D_DVBAPI
, "Demuxer %d Filter %d set chid to %04X on fd %d", demux_id
, n
+ 1, curpid
->CHID
, fd
);
8422 // on irdeto we can always apply irdeto index filtering!
8423 if(caid_is_irdeto(curpid
->CAID
) && (curpid
->irdeto_curindex
< 0xFE))
8425 filter
[2] = curpid
->irdeto_curindex
;
8427 cs_log_dbg(D_DVBAPI
, "Demuxer %d Filter %d set irdetoindex to %d on fd %d",
8428 demux_id
, n
+ 1, curpid
->irdeto_curindex
, fd
);
8430 else // all other cas systems also cas systems without chid or unique ecm part
8432 cs_log_dbg(D_DVBAPI
, "Demuxer %d Filter %d set chid to ANY CHID on fd %d", demux_id
, n
+ 1, fd
);
8436 int32_t ret
= dvbapi_activate_section_filter(demux_id
, n
, fd
, curpid
->ECM_PID
, filter
, mask
, er
->msgid
);
8437 if(ret
< 0) // something went wrong setting filter!
8439 cs_log("Demuxer %d Filter %d (fd %d) error setting section filtering -> stop filter!", demux_id
, n
+ 1, fd
);
8441 ret
= dvbapi_stop_filternum(demux_id
, n
, er
->msgid
);
8444 cs_log("Demuxer %d Filter %d (fd %d) stopping filter failed -> kill all filters of this demuxer!", demux_id
, n
+ 1, fd
);
8445 dvbapi_stop_filter(demux_id
, TYPE_EMM
, er
->msgid
);
8446 dvbapi_stop_filter(demux_id
, TYPE_ECM
, er
->msgid
);
8453 int32_t dvbapi_activate_section_filter(int32_t demux_id
, int32_t num
, int32_t fd
, int32_t pid
, uint8_t *filter
, uint8_t *mask
, uint32_t msgid
)
8457 switch(selected_api
)
8461 struct dmx_sct_filter_params sFP2
;
8462 memset(&sFP2
, 0, sizeof(sFP2
));
8465 sFP2
.flags
= DMX_IMMEDIATE_START
;
8467 if(cfg
.dvbapi_boxtype
== BOXTYPE_NEUMO
)
8469 //DeepThought: on dgs/cubestation and neumo images, perhaps others
8470 //the following code is needed to descramble
8471 sFP2
.filter
.filter
[0] = filter
[0];
8472 sFP2
.filter
.mask
[0] = mask
[0];
8473 sFP2
.filter
.filter
[1] = 0;
8474 sFP2
.filter
.mask
[1] = 0;
8475 sFP2
.filter
.filter
[2] = 0;
8476 sFP2
.filter
.mask
[2] = 0;
8477 memcpy(sFP2
.filter
.filter
+ 3, filter
+ 1, 16 - 3);
8478 memcpy(sFP2
.filter
.mask
+ 3, mask
+ 1, 16 - 3);
8480 //DeepThought: in the drivers of the dgs/cubestation and neumo images,
8481 //dvbapi 1 and 3 are somehow mixed. In the kernel drivers, the DMX_SET_FILTER
8482 //ioctl expects to receive a dmx_sct_filter_params structure (DVBAPI 3) but
8483 //due to a bug its sets the "positive mask" wrongly (they should be all 0).
8484 //On the other hand, the DMX_SET_FILTER1 ioctl also uses the dmx_sct_filter_params
8485 //structure, which is incorrect (it should be dmxSctFilterParams).
8486 //The only way to get it right is to call DMX_SET_FILTER1 with the argument
8487 //expected by DMX_SET_FILTER. Otherwise, the timeout parameter is not passed correctly.
8489 ret
= dvbapi_ioctl(fd
, DMX_SET_FILTER1
, &sFP2
);
8493 memcpy(sFP2
.filter
.filter
, filter
, 16);
8494 memcpy(sFP2
.filter
.mask
, mask
, 16);
8496 if(cfg
.dvbapi_listenport
|| cfg
.dvbapi_boxtype
== BOXTYPE_PC_NODMX
)
8498 ret
= dvbapi_net_send(DVBAPI_DMX_SET_FILTER
,
8499 demux
[demux_id
].socket_fd
,
8506 demux
[demux_id
].client_proto_version
);
8510 ret
= dvbapi_ioctl(fd
, DMX_SET_FILTER
, &sFP2
);
8518 struct dmxSctFilterParams sFP1
;
8519 memset(&sFP1
, 0, sizeof(sFP1
));
8522 sFP1
.flags
= DMX_IMMEDIATE_START
;
8523 memcpy(sFP1
.filter
.filter
, filter
, 16);
8524 memcpy(sFP1
.filter
.mask
, mask
, 16);
8525 ret
= dvbapi_ioctl(fd
, DMX_SET_FILTER1
, &sFP1
);
8529 #if defined(WITH_STAPI) || defined(WITH_STAPI5)
8532 ret
= stapi_activate_section_filter(fd
, filter
, mask
);
8536 // Isn't implemented in COOLAPI-1 (legacy)
8537 #if defined WITH_COOLAPI2
8540 int32_t n
= coolapi_get_filter_num(fd
);
8545 coolapi_set_filter(fd
, n
, pid
, filter
, mask
, TYPE_ECM
);
8554 if(ret
!= -1) // only change filter/mask for comparing if box returned no errors!
8556 // copy filter and mask to check later on if receiver delivered accordingly
8557 memcpy(demux
[demux_id
].demux_fd
[num
].filter
, filter
, 16);
8558 memcpy(demux
[demux_id
].demux_fd
[num
].mask
, mask
, 16);
8563 int32_t dvbapi_check_ecm_delayed_delivery(int32_t demux_id
, ECM_REQUEST
*er
)
8566 int32_t filternum
= dvbapi_get_filternum(demux_id
, er
, TYPE_ECM
);
8567 char nullcw
[CS_ECMSTORESIZE
];
8568 memset(nullcw
, 0, CS_ECMSTORESIZE
);
8570 if(filternum
< 0) // if no matching filter act like ecm response is delayed
8575 if(memcmp(demux
[demux_id
].demux_fd
[filternum
].lastecmd5
, nullcw
, CS_ECMSTORESIZE
))
8577 demux
[demux_id
].demux_fd
[filternum
].lastresult
= er
->rc
; // save last result
8580 if(cs_dblevel
& D_DVBAPI
)
8582 cs_hexdump(0, er
->ecmd5
, 16, ecmd5
, sizeof(ecmd5
));
8585 cs_log_dbg(D_DVBAPI
, "Demuxer %d requested controlword for ecm %s on fd %d",
8586 demux_id
, ecmd5
, demux
[demux_id
].demux_fd
[filternum
].fd
);
8588 uint8_t md5tmp
[MD5_DIGEST_LENGTH
];
8589 MD5(er
->ecm
, er
->ecmlen
, md5tmp
);
8591 // 1 = no response on the ecm we request last for this fd!
8592 ret
= (memcmp(demux
[demux_id
].demux_fd
[filternum
].lastecmd5
, md5tmp
, CS_ECMSTORESIZE
) != 0 ? 1 : 0);
8595 // Check for null cw
8596 // Skip check for BISS1 - cw could be indeed zero
8597 // Skip check for BISS2 - we use the extended cw, so the "simple" cw is always zero
8598 if(memcmp(er
->cw
, nullcw
, 8) == 0 && memcmp(er
->cw
+ 8, nullcw
, 8) == 0 && !caid_is_biss(er
->caid
))
8603 struct s_ecmpid
*curpid
= NULL
;
8604 int32_t pid
= demux
[demux_id
].demux_fd
[filternum
].pidindex
;
8608 curpid
= &demux
[demux_id
].ECMpids
[pid
];
8609 if(curpid
->table
== 0) // on change table act like ecm response is found
8615 if(er
->rc
== E_CACHEEX
) // on cache-ex response act like ecm response is found
8623 int32_t dvbapi_get_filternum(int32_t demux_id
, ECM_REQUEST
*er
, int32_t type
)
8625 if(!er
) { return -1; }
8630 for(n
= 0; n
< maxfilter
; n
++) // determine fd
8632 // check for valid and right type (ecm or emm)
8633 if(demux
[demux_id
].demux_fd
[n
].fd
> 0 && demux
[demux_id
].demux_fd
[n
].type
== type
)
8635 if(type
== TYPE_ECM
&& er
->srvid
!= demux
[demux_id
].program_number
)
8640 if((demux
[demux_id
].demux_fd
[n
].pid
== er
->pid
) && ((demux
[demux_id
].demux_fd
[n
].provid
== er
->prid
)
8641 || demux
[demux_id
].demux_fd
[n
].provid
== 0 || er
->prid
== 0) && ((demux
[demux_id
].demux_fd
[n
].caid
== er
->caid
)
8642 || (demux
[demux_id
].demux_fd
[n
].caid
== er
->ocaid
))) // current ecm pid?
8644 fd
= demux
[demux_id
].demux_fd
[n
].fd
; // found!
8645 if(demux
[demux_id
].demux_fd
[n
].caid
== er
->ocaid
)
8647 // clear ecmd5 hash since betatunneled ecms hash different!
8648 memset(demux
[demux_id
].demux_fd
[n
].lastecmd5
, 0, CS_ECMSTORESIZE
);
8655 if(fd
> 0 && demux
[demux_id
].demux_fd
[n
].provid
== 0)
8657 demux
[demux_id
].demux_fd
[n
].provid
= er
->prid
; // hack to fill in provid into demuxer
8659 return (fd
> 0 ? n
: fd
); // return -1(fd) on not found, on found return filternumber(n)
8662 uint32_t dvbapi_ca_set_pid(int32_t demux_id
, int32_t pid
, int32_t stream_id
, bool use_des
, uint32_t msgid
)
8667 if(pid
== -1 || pid
> demux
[demux_id
].ECMpidcount
)
8669 return INDEX_INVALID
;
8672 if(demux
[demux_id
].ECMpids
[pid
].useMultipleIndices
)
8675 idx
= demux
[demux_id
].ECMpids
[pid
].index
[n
];
8677 if(idx
== INDEX_INVALID
) // if we have no index for this pid, get one!
8679 idx
= dvbapi_get_desc_index(demux_id
, pid
, n
);
8680 if(idx
== INDEX_INVALID
)
8682 cs_log_dbg(D_DVBAPI
, "Demuxer %d PID: %d CAID: %04X ECMPID: %04X has no free index",
8683 demux_id
, pid
, demux
[demux_id
].ECMpids
[pid
].CAID
, demux
[demux_id
].ECMpids
[pid
].ECM_PID
);
8685 return INDEX_INVALID
;
8688 cs_log_dbg(D_DVBAPI
, "Demuxer %d PID: %d CAID: %04X ECMPID: %04X is using index %d for stream %d",
8689 demux_id
, pid
, demux
[demux_id
].ECMpids
[pid
].CAID
, demux
[demux_id
].ECMpids
[pid
].ECM_PID
, idx
, n
);
8692 if(!demux
[demux_id
].ECMpids
[pid
].streams
|| ((demux
[demux_id
].ECMpids
[pid
].streams
& (1 << n
)) == (uint
) (1 << n
)))
8694 dvbapi_set_pid(demux_id
, n
, idx
, true, use_des
, msgid
); // enable stream pid
8698 dvbapi_set_pid(demux_id
, n
, idx
, false, false, msgid
); // disable stream pid
8703 idx
= demux
[demux_id
].ECMpids
[pid
].index
[0];
8705 if(idx
== INDEX_INVALID
) // if we have no index for this pid, get one!
8707 idx
= dvbapi_get_desc_index(demux_id
, pid
, 0);
8708 if(idx
== INDEX_INVALID
)
8710 cs_log_dbg(D_DVBAPI
, "Demuxer %d PID: %d CAID: %04X ECMPID: %04X has no free index",
8711 demux_id
, pid
, demux
[demux_id
].ECMpids
[pid
].CAID
, demux
[demux_id
].ECMpids
[pid
].ECM_PID
);
8713 return INDEX_INVALID
;
8716 cs_log_dbg(D_DVBAPI
, "Demuxer %d PID: %d CAID: %04X ECMPID: %04X is using index %d",
8717 demux_id
, pid
, demux
[demux_id
].ECMpids
[pid
].CAID
, demux
[demux_id
].ECMpids
[pid
].ECM_PID
, idx
);
8720 for(n
= 0; n
< demux
[demux_id
].STREAMpidcount
; n
++)
8722 if(!demux
[demux_id
].ECMpids
[pid
].streams
|| ((demux
[demux_id
].ECMpids
[pid
].streams
& (1 << n
)) == (uint
) (1 << n
)))
8724 dvbapi_set_pid(demux_id
, n
, idx
, true, use_des
, 0); // enable stream pid
8728 dvbapi_set_pid(demux_id
, n
, idx
, false, false, 0); // disable stream pid
8732 return idx
; // return ca index
8735 int8_t update_streampid_list(uint8_t cadevice
, uint16_t pid
, uint32_t idx
, bool use_des
)
8737 struct s_streampid
*listitem
, *newlistitem
;
8739 if(!ll_activestreampids
)
8741 ll_activestreampids
= ll_create("ll_activestreampids");
8744 if(idx
>= INDEX_MAX
)
8746 return INVALID_STREAMPID_INDEX
;
8749 if(ll_count(ll_activestreampids
) > 0)
8751 itr
= ll_iter_create(ll_activestreampids
);
8752 while((listitem
= ll_iter_next(&itr
)))
8754 if(cadevice
== listitem
->cadevice
&& pid
== listitem
->streampid
)
8756 if((listitem
->activeindexers
& (1 << idx
)) == (uint64_t) (1 << idx
))
8758 if(cfg
.dvbapi_extended_cw_api
== 2 && use_des
!= listitem
->use_des
)
8760 listitem
->use_des
= use_des
;
8761 return FIRST_STREAMPID_INDEX
;
8763 return FOUND_STREAMPID_INDEX
; // match found
8767 listitem
->activeindexers
|= (1 << idx
); // ca + pid found but not this index -> add this index
8768 cs_log_dbg(D_DVBAPI
, "Added existing streampid %04X with new index %d to ca%d", pid
, idx
, cadevice
);
8770 if(cfg
.dvbapi_extended_cw_api
== 2 && use_des
!= listitem
->use_des
)
8772 listitem
->use_des
= use_des
;
8773 return FIRST_STREAMPID_INDEX
;
8775 return ADDED_STREAMPID_INDEX
;
8781 if(!cs_malloc(&newlistitem
, sizeof(struct s_streampid
)))
8783 return FIRST_STREAMPID_INDEX
; // not sure if this is correct
8786 newlistitem
->cadevice
= cadevice
;
8787 newlistitem
->streampid
= pid
;
8788 newlistitem
->activeindexers
= (1 << idx
);
8789 newlistitem
->caindex
= idx
; // set this index as used to decode on ca device
8790 newlistitem
->use_des
= use_des
;
8792 ll_append(ll_activestreampids
, newlistitem
);
8793 cs_log_dbg(D_DVBAPI
, "Added new streampid %04X with index %d to ca%d", pid
, idx
, cadevice
);
8795 return FIRST_STREAMPID_INDEX
;
8798 int8_t remove_streampid_from_list(uint8_t cadevice
, uint16_t pid
, uint32_t idx
)
8800 struct s_streampid
*listitem
;
8804 if(!ll_activestreampids
)
8806 return NO_STREAMPID_LISTED
;
8809 if(idx
>= INDEX_MAX
)
8811 return INVALID_STREAMPID_INDEX
;
8814 if(ll_count(ll_activestreampids
) > 0)
8816 itr
= ll_iter_create(ll_activestreampids
);
8817 while((listitem
= ll_iter_next(&itr
)))
8819 if(cadevice
== listitem
->cadevice
&& pid
== listitem
->streampid
)
8821 if(idx
== INDEX_DISABLE_ALL
)
8823 listitem
->activeindexers
= 0;
8826 else if((listitem
->activeindexers
& (1 << idx
)) == (uint64_t) (1 << idx
))
8828 listitem
->activeindexers
&= ~(1 << idx
); // flag it as disabled for this index
8834 cs_log_dbg(D_DVBAPI
, "Remove streampid %04X using indexer %d from ca%d", pid
, idx
, cadevice
);
8837 if(listitem
->activeindexers
== 0 && removed
== 1) // all indexers disabled? -> remove pid from list!
8839 ll_iter_remove_data(&itr
);
8840 cs_log_dbg(D_DVBAPI
, "Removed last indexer of streampid %04X from ca%d", pid
, cadevice
);
8841 ca_descramblers_used
= count_active_indexers();
8842 return REMOVED_STREAMPID_LASTINDEX
;
8844 else if(removed
== 1)
8846 if(idx
!= INDEX_DISABLE_ALL
&& idx
!= listitem
->caindex
)
8848 return REMOVED_STREAMPID_INDEX
;
8852 listitem
->caindex
= INDEX_INVALID
;
8853 cs_log_dbg(D_DVBAPI
, "Streampid %04X index %d was used for decoding on ca%d", pid
, idx
, cadevice
);
8854 return REMOVED_DECODING_STREAMPID_INDEX
;
8857 return INVALID_STREAMPID_INDEX
;
8861 return NO_STREAMPID_LISTED
;
8864 void disable_unused_streampids(int16_t demux_id
)
8866 int32_t ecmpid
= demux
[demux_id
].pidindex
;
8868 if(ecmpid
== -1 // no active ecmpid!
8869 || !ll_activestreampids
8870 || selected_api
== STAPI
// stapi handles pids itself!
8871 || ll_count(ll_activestreampids
) == 0) // no items in list?
8877 if(demux
[demux_id
].ECMpids
[ecmpid
].useMultipleIndices
== 0)
8879 uint32_t idx
= demux
[demux_id
].ECMpids
[ecmpid
].index
[0];
8881 struct s_streampid
*listitem
;
8883 // search for old enabled streampids on
8884 // all ca devices that have to be disabled
8885 for(i
= 0; i
< CA_MAX
&& idx
!= INDEX_INVALID
; i
++)
8887 if(!((demux
[demux_id
].ca_mask
& (1 << i
)) == (uint32_t) (1 << i
)))
8889 continue; // ca is not used by this demuxer
8893 itr
= ll_iter_create(ll_activestreampids
);
8895 while((listitem
= ll_iter_next(&itr
)))
8897 if(i
!= listitem
->cadevice
)
8899 continue; // ca doesn't match
8902 if(!((listitem
->activeindexers
& (1 << (idx
))) == (uint64_t) (1 << (idx
))))
8904 continue; // index doesn't match
8907 for(n
= 0; n
< demux
[demux_id
].STREAMpidcount
; n
++)
8909 if(demux
[demux_id
].ECMpidcount
== 0) // FTA? -> disable stream!
8911 n
= demux
[demux_id
].STREAMpidcount
;
8915 // check if pid matches with current stream pid on demuxer
8916 if(listitem
->streampid
== demux
[demux_id
].STREAMpids
[n
])
8922 if(n
== demux
[demux_id
].STREAMpidcount
) // no match found
8924 demux
[demux_id
].STREAMpids
[n
] = listitem
->streampid
; // put it here temporarily!
8925 dvbapi_set_pid(demux_id
, n
, idx
, false, false, 0); // disable this unused streampid
8926 demux
[demux_id
].STREAMpids
[n
] = 0; // remove it from temp position!
8930 // ECMpidcount != 0 -> skip enabling on fta
8931 for(n
= 0; n
< demux
[demux_id
].STREAMpidcount
&& demux
[demux_id
].ECMpidcount
!= 0; n
++)
8933 ll_iter_reset(&itr
);
8934 if(!demux
[demux_id
].ECMpids
[ecmpid
].streams
|| ((demux
[demux_id
].ECMpids
[ecmpid
].streams
& (1 << n
)) == (uint
) (1 << n
)))
8936 while((listitem
= ll_iter_next(&itr
)))
8938 if(i
!= listitem
->cadevice
) // ca doesn't match
8943 if(!((listitem
->activeindexers
& (1 << (idx
))) == (uint64_t) (1 << (idx
)))) // index doesn't match
8948 // check if pid matches with current streampid on demuxer
8949 if(listitem
->streampid
== demux
[demux_id
].STREAMpids
[n
])
8955 if(!listitem
) // if streampid not listed -> enable it!
8957 dvbapi_set_pid(demux_id
, n
, idx
, true, false, 0); // enable streampid
8965 uint32_t idx
= INDEX_INVALID
;
8968 struct s_streampid
*listitem
;
8970 // search for old enabled streampids
8971 // on all ca devices that have to be disabled
8972 for(i
= 0; i
< CA_MAX
&& idx
!= INDEX_INVALID
; i
++)
8974 if(!((demux
[demux_id
].ca_mask
& (1 << i
)) == (uint32_t) (1 << i
)))
8976 continue; // continue if ca is unused by this demuxer
8980 itr
= ll_iter_create(ll_activestreampids
);
8982 while((listitem
= ll_iter_next(&itr
)))
8984 if(i
!= listitem
->cadevice
)
8986 continue; // ca doesn't match
8989 for(skip
= 1, j
= 0; j
< MAX_STREAM_INDICES
; j
++)
8991 idx
= demux
[demux_id
].ECMpids
[ecmpid
].index
[j
];
8992 if(idx
== INDEX_INVALID
)
8998 if((listitem
->activeindexers
& (1 << (idx
))) == (uint64_t) (1 << (idx
)))
9010 for(n
= 0; n
< demux
[demux_id
].STREAMpidcount
; n
++)
9012 if(demux
[demux_id
].ECMpidcount
== 0) // FTA? -> disable stream!
9014 n
= demux
[demux_id
].STREAMpidcount
;
9018 // check if pid matches with current streampid on demuxer
9019 if(listitem
->streampid
== demux
[demux_id
].STREAMpids
[n
])
9025 if(n
== demux
[demux_id
].STREAMpidcount
)
9027 demux
[demux_id
].STREAMpids
[n
] = listitem
->streampid
; // put it temp here!
9028 dvbapi_set_pid(demux_id
, n
, idx
, false, false, 0); // no match found so disable this now unused streampid
9029 demux
[demux_id
].STREAMpids
[n
] = 0; // remove temp!
9033 // ECMpidcount != 0 -> skip enabling on fta
9034 for(n
= 0; n
< demux
[demux_id
].STREAMpidcount
&& demux
[demux_id
].ECMpidcount
!= 0; n
++)
9036 ll_iter_reset(&itr
);
9037 if(!demux
[demux_id
].ECMpids
[ecmpid
].streams
|| ((demux
[demux_id
].ECMpids
[ecmpid
].streams
& (1 << n
)) == (uint
) (1 << n
)))
9039 while((listitem
= ll_iter_next(&itr
)))
9041 if(i
!= listitem
->cadevice
) // ca doesn't match
9046 for(skip
= 1, j
= 0; j
< MAX_STREAM_INDICES
; j
++)
9048 idx
= demux
[demux_id
].ECMpids
[ecmpid
].index
[j
];
9049 if(idx
== INDEX_INVALID
)
9054 if((listitem
->activeindexers
& (1 << (idx
))) == (uint64_t) (1 << (idx
)))
9056 skip
= 0; // index match
9066 // check if pid matches with current streampid on demuxer
9067 if(listitem
->streampid
== demux
[demux_id
].STREAMpids
[n
])
9073 if(!listitem
) // if streampid not listed -> enable it!
9075 dvbapi_set_pid(demux_id
, n
, idx
, true, false, 0); // enable streampid
9083 uint32_t is_ca_used(uint8_t cadevice
, int32_t pid
)
9085 struct s_streampid
*listitem
;
9087 if(!ll_activestreampids
)
9089 return INDEX_INVALID
;
9092 if(ll_count(ll_activestreampids
) > 0)
9094 itr
= ll_iter_create(ll_activestreampids
);
9095 while((listitem
= ll_iter_next(&itr
)))
9097 // if pid is 0, we match ca device only
9098 if(listitem
->cadevice
!= cadevice
|| (pid
&& listitem
->streampid
!= pid
))
9104 while(listitem
->caindex
== INDEX_INVALID
&& i
< INDEX_MAX
)
9106 if((listitem
->activeindexers
& (1 << i
)) == (uint64_t) (1 << i
))
9108 listitem
->caindex
= i
; // set fresh one
9109 cs_log_dbg(D_DVBAPI
, "Streampid %04X is now using index %d for decoding on ca%d", pid
, i
, cadevice
);
9115 if(listitem
->caindex
== INDEX_INVALID
)
9117 ll_iter_remove_data(&itr
);
9118 return INDEX_INVALID
;
9120 return listitem
->caindex
;
9123 return INDEX_INVALID
; // no indexer found for this pid!
9126 uint32_t count_active_indexers(void)
9128 uint i
, usecounter
= 0;
9129 struct s_streampid
*listitem
;
9132 if(!ll_activestreampids
)
9137 bool indexer_in_use
[ca_descramblers_total
];
9138 memset(&indexer_in_use
, 0, sizeof(indexer_in_use
));
9140 if(ll_count(ll_activestreampids
) > 0)
9142 itr
= ll_iter_create(ll_activestreampids
);
9143 while((listitem
= ll_iter_next(&itr
)))
9145 if(listitem
->caindex
!= INDEX_INVALID
&& listitem
->caindex
< INDEX_MAX
)
9147 indexer_in_use
[listitem
->caindex
] = true;
9151 for(i
= 0; i
< ca_descramblers_total
; i
++)
9153 if(indexer_in_use
[i
] == true)
9163 uint16_t dvbapi_get_client_proto_version(void)
9165 return last_client_proto_version
;
9168 const char *dvbapi_get_client_name(void)
9170 return last_client_name
? last_client_name
: "";
9173 void check_add_emmpid(int32_t demux_id
, uint8_t *filter
, int32_t l
, int32_t emmtype
)
9175 if(l
< 0) { return; }
9177 uint32_t typtext_idx
= 0;
9179 const char *typtext
[] = { "UNIQUE", "SHARED", "GLOBAL", "UNKNOWN" };
9181 while(((emmtype
>> typtext_idx
) & 0x01) == 0 && typtext_idx
< sizeof(typtext
) / sizeof(const char *))
9186 // filter already in list?
9187 if(is_emmfilter_in_list(filter
, demux
[demux_id
].EMMpids
[l
].PID
, demux
[demux_id
].EMMpids
[l
].PROVID
, demux
[demux_id
].EMMpids
[l
].CAID
))
9189 cs_log_dbg(D_DVBAPI
, "Demuxer %d duplicate emm filter type %s, emmpid: 0x%04X, emmcaid: %04X, emmprovid: %06X -> SKIPPED!",
9191 typtext
[typtext_idx
],
9192 demux
[demux_id
].EMMpids
[l
].PID
,
9193 demux
[demux_id
].EMMpids
[l
].CAID
,
9194 demux
[demux_id
].EMMpids
[l
].PROVID
);
9198 if(demux
[demux_id
].emm_filter
< demux
[demux_id
].max_emm_filter
) // can this filter be started?
9200 // try to activate this emmfilter
9201 ret
= dvbapi_set_filter(demux_id
,
9203 demux
[demux_id
].EMMpids
[l
].PID
,
9204 demux
[demux_id
].EMMpids
[l
].CAID
,
9205 demux
[demux_id
].EMMpids
[l
].PROVID
,
9209 demux
[demux_id
].pidindex
,
9213 if(ret
!= -1) // -1 if maxfilter reached or filter start error!
9215 if(demux
[demux_id
].emm_filter
== -1) // -1: first run of emm filtering on this demuxer
9217 demux
[demux_id
].emm_filter
= 0;
9219 demux
[demux_id
].emm_filter
++; // increase total active filters
9221 cs_log_dump_dbg(D_DVBAPI
, filter
, 32, "Demuxer %d started emm filter type %s, pid: 0x%04X",
9222 demux_id
, typtext
[typtext_idx
], demux
[demux_id
].EMMpids
[l
].PID
);
9225 else // not set successful, so add it to the list for try again later on!
9227 add_emmfilter_to_list(demux_id
, filter
, demux
[demux_id
].EMMpids
[l
].CAID
, demux
[demux_id
].EMMpids
[l
].PROVID
, demux
[demux_id
].EMMpids
[l
].PID
, 0, false);
9228 cs_log_dump_dbg(D_DVBAPI
, filter
, 32, "Demuxer %d added inactive emm filter type %s, pid: 0x%04X",
9229 demux_id
, typtext
[typtext_idx
], demux
[demux_id
].EMMpids
[l
].PID
);
9234 void rotate_emmfilter(int32_t demux_id
)
9236 // emm filter iteration
9237 if(!ll_emm_active_filter
)
9239 ll_emm_active_filter
= ll_create("ll_emm_active_filter");
9242 if(!ll_emm_inactive_filter
)
9244 ll_emm_inactive_filter
= ll_create("ll_emm_inactive_filter");
9247 if(!ll_emm_pending_filter
)
9249 ll_emm_pending_filter
= ll_create("ll_emm_pending_filter");
9252 uint32_t filter_count
= ll_count(ll_emm_active_filter
) + ll_count(ll_emm_inactive_filter
);
9253 if(demux
[demux_id
].max_emm_filter
> 0 && ll_count(ll_emm_inactive_filter
) > 0 && filter_count
> demux
[demux_id
].max_emm_filter
)
9255 int32_t filter_queue
= ll_count(ll_emm_inactive_filter
);
9256 int32_t stopped
= 0, started
= 0;
9259 struct s_emm_filter
*filter_item
;
9261 itr
= ll_iter_create(ll_emm_active_filter
);
9263 while((filter_item
= ll_iter_next(&itr
)) != NULL
)
9265 if(!ll_count(ll_emm_inactive_filter
) || started
== filter_queue
)
9270 int64_t gone
= comp_timeb(&now
, &filter_item
->time_started
);
9271 if(gone
> 45 * 1000)
9273 struct s_dvbapi_priority
*forceentry
= dvbapi_check_prio_match_emmpid(filter_item
->demux_id
, filter_item
->caid
, filter_item
->provid
, 'p');
9274 if(!forceentry
|| (forceentry
&& !forceentry
->force
))
9276 // stop active filter and add to pending list
9277 dvbapi_stop_filternum(filter_item
->demux_id
, filter_item
->num
- 1, 0);
9278 ll_iter_remove_data(&itr
);
9279 add_emmfilter_to_list(filter_item
->demux_id
, filter_item
->filter
, filter_item
->caid
, filter_item
->provid
, filter_item
->pid
, -1, false);
9285 if(stopped
> started
) // we have room for new filters, try to start an inactive emmfilter!
9287 struct s_emm_filter
*filter_item2
;
9288 LL_ITER itr2
= ll_iter_create(ll_emm_inactive_filter
);
9289 while((filter_item2
= ll_iter_next(&itr2
)))
9291 ret
= dvbapi_set_filter(filter_item2
->demux_id
,
9295 filter_item2
->provid
,
9296 filter_item2
->filter
,
9297 filter_item2
->filter
+ 16,
9299 demux
[filter_item2
->demux_id
].pidindex
,
9303 ll_iter_remove_data(&itr2
);
9311 itr
= ll_iter_create(ll_emm_pending_filter
);
9312 while((filter_item
= ll_iter_next(&itr
)) != NULL
) // move pending filters to inactive
9314 add_emmfilter_to_list(filter_item
->demux_id
, filter_item
->filter
, filter_item
->caid
, filter_item
->provid
, filter_item
->pid
, 0, false);
9315 ll_iter_remove_data(&itr
);
9320 int32_t filtermatch(uint8_t *buffer
, int32_t filter_num
, int32_t demux_id
, int32_t len
)
9322 int32_t i
, k
, match
;
9326 for(i
= 0, k
= 0; i
< 16 && match
; i
++, k
++)
9328 mask
= demux
[demux_id
].demux_fd
[filter_num
].mask
[i
];
9329 if(k
== 1) // skip len bytes
9339 flt
= (demux
[demux_id
].demux_fd
[filter_num
].filter
[i
]&mask
);
9340 cs_log_dbg(D_DVBAPI
,"Demuxer %d filter%d[%d] = %02X, filter mask[%d] = %02X, flt&mask = %02X , buffer[%d] = %02X, buffer[%d] & mask = %02X",
9341 demux_id
, filter_num
+ 1, i
, demux
[demux_id
].demux_fd
[filter_num
].filter
[i
], i
, mask
, flt
&mask
, k
, buffer
[k
], k
, buffer
[k
] & mask
);
9345 match
= (flt
== (buffer
[k
] & mask
));
9352 return (match
&& i
== 16); // 0 = delivered data does not match with filter, 1 = delivered data matches with filter
9356 * protocol structure
9358 void module_dvbapi(struct s_module
*ph
)
9360 ph
->desc
= "dvbapi";
9361 ph
->type
= MOD_CONN_SERIAL
;
9362 ph
->listenertype
= LIS_DVBAPI
;
9363 #if defined(WITH_AZBOX)
9364 ph
->s_handler
= azbox_handler
;
9365 ph
->send_dcw
= azbox_send_dcw
;
9366 #elif defined(WITH_MCA)
9367 ph
->s_handler
= mca_handler
;
9368 ph
->send_dcw
= mca_send_dcw
;
9369 selected_box
= selected_api
= 0; // HACK: This fixes incorrect warning about out of bounds array access in functionas that are not even called when WITH_MCA is defined
9371 ph
->s_handler
= dvbapi_handler
;
9372 ph
->send_dcw
= dvbapi_send_dcw
;
9375 #endif // HAVE_DVBAPI