revert breaks some stupid old compilers
[oscam.git] / module-dvbapi.h
blob57ce902febbacc0b7c94b84f0bc15204ee53d7c7
1 #ifndef MODULE_DVBAPI_H_
2 #define MODULE_DVBAPI_H_
4 #ifdef HAVE_DVBAPI
5 #include <sys/un.h>
7 #define TYPE_ECM 1
8 #define TYPE_EMM 2
9 #define TYPE_SDT 3
10 #define TYPE_PAT 4
11 #define TYPE_PMT 5
13 //api
14 #define DVBAPI_3 0
15 #define DVBAPI_1 1
16 #define STAPI 2
17 #define COOLAPI 3
19 #ifdef __CYGWIN__
20 #define TMPDIR "./"
21 #define STANDBY_FILE "./.pauseoscam"
22 #define ECMINFO_FILE "./ecm.info"
23 #else
24 #define TMPDIR "/tmp/"
25 #define STANDBY_FILE "/tmp/.pauseoscam"
26 #define ECMINFO_FILE "/tmp/ecm.info"
27 #endif
29 #define MAX_DEMUX 16
30 #define MAX_CAID 50
31 #define ECM_PIDS 30
32 #define MAX_FILTER 32
34 #ifdef WITH_EXTENDED_CW
35 #define MAX_STREAM_INDICES 32
36 #else
37 #define MAX_STREAM_INDICES 1
38 #endif
40 #define BOX_COUNT 7
42 #define BOXTYPE_DREAMBOX 1
43 #define BOXTYPE_DUCKBOX 2
44 #define BOXTYPE_UFS910 3
45 #define BOXTYPE_DBOX2 4
46 #define BOXTYPE_IPBOX 5
47 #define BOXTYPE_IPBOX_PMT 6
48 #define BOXTYPE_DM7000 7
49 #define BOXTYPE_QBOXHD 8
50 #define BOXTYPE_COOLSTREAM 9
51 #define BOXTYPE_NEUMO 10
52 #define BOXTYPE_PC 11
53 #define BOXTYPE_PC_NODMX 12
54 #define BOXTYPE_SAMYGO 13
55 #define BOXTYPES 13
56 #define DMXMD5HASHSIZE 16 // use MD5()
58 // we store the results of remove_streampid_from_list()
59 // and update_streampid_list() in one variable, so make sure
60 // the return values do not collide
62 // remove_streampid_from_list()
63 #define NO_STREAMPID_LISTED 0x00
64 #define REMOVED_STREAMPID_INDEX 0x01
65 #define REMOVED_STREAMPID_LASTINDEX 0x02
66 #define REMOVED_DECODING_STREAMPID_INDEX 0x03
68 // update_streampid_list():
69 #define FOUND_STREAMPID_INDEX 0x10
70 #define ADDED_STREAMPID_INDEX 0x11
71 #define FIRST_STREAMPID_INDEX 0x12
73 // remove_streampid_from_list() and update_streampid_list()
74 #define INVALID_STREAMPID_INDEX 0x20
77 #define DUMMY_FD 0xFFFF
79 //constants used int socket communication:
80 #define DVBAPI_PROTOCOL_VERSION 3
82 #define DVBAPI_CA_SET_PID 0x40086f87
83 #define DVBAPI_CA_SET_DESCR 0x40106f86
84 #define DVBAPI_CA_SET_DESCR_MODE 0x400c6f88
85 #define DVBAPI_DMX_SET_FILTER 0x403c6f2b
86 #define DVBAPI_DMX_STOP 0x00006f2a
88 #define DVBAPI_AOT_CA 0x9F803000
89 #define DVBAPI_AOT_CA_PMT 0x9F803200 //least significant byte is length (ignored)
90 #define DVBAPI_AOT_CA_STOP 0x9F803F04
91 #define DVBAPI_FILTER_DATA 0xFFFF0000
92 #define DVBAPI_CLIENT_INFO 0xFFFF0001
93 #define DVBAPI_SERVER_INFO 0xFFFF0002
94 #define DVBAPI_ECM_INFO 0xFFFF0003
96 #define DVBAPI_MAX_PACKET_SIZE 262 //maximum possible packet size
98 #define DVBAPI_INDEX_DISABLE 0xFFFFFFFF // only used for ca_pid_t
101 typedef uint32_t ca_index_t;
103 // INDEX_MAX is limited by sizeof(uint64_t * 8) - 1 [ == 63 ]
104 #define INDEX_MAX_LOCAL 15
105 #define INDEX_MAX_NET 63
106 #define INDEX_MAX INDEX_MAX_NET
108 #define INDEX_DISABLE_ALL 0xEFFFFFFD // used for remove_streampid_from_list(), dvbapi_set_pid()
109 #define INDEX_INVALID 0xEFFFFFFF
111 struct box_devices
113 char *path;
114 char *ca_device;
115 char *demux_device;
116 char *cam_socket_path;
117 int8_t api;
120 struct s_ecmpids
122 uint16_t CAID;
123 uint32_t PROVID;
124 uint16_t ECM_PID;
125 uint32_t CHID;
126 uint16_t EMM_PID;
127 uint32_t VPID; // videopid
128 uint8_t irdeto_maxindex; // max irdeto indexes always fresh fetched from current ecm
129 uint8_t irdeto_curindex; // current irdeto index we want to handle
130 uint8_t irdeto_cycle; // temp var that holds the irdeto index we started with to detect if we cycled trough all indexes
131 int8_t checked;
132 int8_t status;
133 uint8_t tries;
134 unsigned char table;
135 ca_index_t index[MAX_STREAM_INDICES];
136 int8_t useMultipleIndices;
137 uint32_t streams;
138 uint32_t cadata;
141 typedef struct filter_s
143 uint32_t fd; //FilterHandle
144 int32_t pidindex;
145 int32_t pid;
146 uint16_t caid;
147 uint32_t provid;
148 uint16_t type;
149 int32_t count;
150 uchar filter[16];
151 uchar mask[16];
152 uchar lastecmd5[CS_ECMSTORESIZE]; // last requested ecm md5
153 int32_t lastresult;
154 uchar prevecmd5[CS_ECMSTORESIZE]; // previous requested ecm md5
155 int32_t prevresult;
156 #if defined(WITH_STAPI) || defined(WITH_STAPI5)
157 int32_t NumSlots;
158 uint32_t SlotHandle[10];
159 uint32_t BufferHandle[10];
160 #endif
161 } FILTERTYPE;
163 struct s_emmpids
165 uint16_t CAID;
166 uint32_t PROVID;
167 uint16_t PID;
168 uint8_t type;
169 uint32_t cadata;
172 #define PTINUM 10
173 #define SLOTNUM 20
175 typedef struct demux_s
177 int8_t demux_index;
178 FILTERTYPE demux_fd[MAX_FILTER];
179 uint32_t ca_mask;
180 int8_t adapter_index;
181 int32_t socket_fd;
182 uint16_t client_proto_version;
183 int8_t ECMpidcount;
184 struct timeb emmstart; // last time emm cat was started
185 struct s_ecmpids ECMpids[ECM_PIDS];
186 int8_t EMMpidcount;
187 struct s_emmpids EMMpids[ECM_PIDS];
188 uint16_t max_emm_filter;
189 int8_t STREAMpidcount;
190 uint16_t STREAMpids[ECM_PIDS];
191 uint8_t STREAMpidsType[ECM_PIDS];
192 int16_t pidindex;
193 int16_t curindex;
194 int8_t max_status;
195 uint16_t program_number;
196 uint16_t onid;
197 uint16_t tsid;
198 uint16_t pmtpid;
199 uint32_t enigma_namespace;
200 unsigned char lastcw[2][8];
201 int8_t emm_filter;
202 int8_t sdt_filter;
203 uchar hexserial[8];
204 struct s_reader *rdr;
205 char pmt_file[30];
206 time_t pmt_time;
207 uint8_t stopdescramble;
208 uint8_t running;
209 uint8_t old_ecmfiltercount; // previous ecm filtercount
210 uint8_t old_emmfiltercount; // previous emm filtercount
211 pthread_mutex_t answerlock; // requestmode 1 avoid race
212 #ifdef WITH_STAPI
213 uint32_t DescramblerHandle[PTINUM];
214 int32_t desc_pidcount;
215 uint32_t slot_assc[PTINUM][SLOTNUM];
216 #endif
217 #ifdef WITH_STAPI5
218 uint32_t dev_index;
219 #endif
220 int8_t decodingtries; // -1 = first run
221 struct timeb decstart,decend;
222 } DEMUXTYPE;
224 typedef struct s_streampid
226 uint8_t cadevice; // holds ca device
227 uint16_t streampid; // holds pids
228 uint64_t activeindexers; // bitmask indexers if streampid enabled for index bit is set
229 ca_index_t caindex; // holds index that is used to decode on ca device
230 bool use_des;
231 }STREAMPIDTYPE;
233 struct s_dvbapi_priority
235 char type; // p or i
236 uint16_t caid;
237 uint32_t provid;
238 uint16_t srvid;
239 uint32_t chid;
240 uint16_t ecmpid;
241 uint32_t cadata;
242 uint16_t mapcaid;
243 uint32_t mapprovid;
244 uint16_t mapecmpid;
245 int16_t delay;
246 int8_t force;
247 int8_t pidx;
248 #if defined(WITH_STAPI) || defined(WITH_STAPI5)
249 char devname[30];
250 char pmtfile[30];
251 int8_t disablefilter;
252 #endif
253 struct s_dvbapi_priority *next;
257 #define DMX_FILTER_SIZE 16
260 //dvbapi 1
261 typedef struct dmxFilter
263 uint8_t filter[DMX_FILTER_SIZE];
264 uint8_t mask[DMX_FILTER_SIZE];
265 } dmxFilter_t;
267 struct dmxSctFilterParams
269 uint16_t pid;
270 dmxFilter_t filter;
271 uint32_t timeout;
272 uint32_t flags;
273 #define DMX_CHECK_CRC 1
274 #define DMX_ONESHOT 2
275 #define DMX_IMMEDIATE_START 4
276 #define DMX_BUCKET 0x1000 /* added in 2005.05.18 */
277 #define DMX_KERNEL_CLIENT 0x8000
280 #define DMX_START1 _IOW('o',41,int)
281 #define DMX_STOP1 _IOW('o',42,int)
282 #define DMX_SET_FILTER1 _IOW('o',43,struct dmxSctFilterParams *)
283 //------------------------------------------------------------------
286 //dbox2+ufs
287 typedef struct dmx_filter
289 uint8_t filter[DMX_FILTER_SIZE];
290 uint8_t mask[DMX_FILTER_SIZE];
291 uint8_t mode[DMX_FILTER_SIZE];
292 } dmx_filter_t;
295 struct dmx_sct_filter_params
297 uint16_t pid;
298 dmx_filter_t filter;
299 uint32_t timeout;
300 uint32_t flags;
301 #define DMX_CHECK_CRC 1
302 #define DMX_ONESHOT 2
303 #define DMX_IMMEDIATE_START 4
304 #define DMX_KERNEL_CLIENT 0x8000
307 typedef struct ca_descr
309 uint32_t index;
310 uint32_t parity; /* 0 == even, 1 == odd */
311 unsigned char cw[8];
312 } ca_descr_t;
314 typedef struct ca_pid
316 uint32_t pid;
317 int32_t index; /* -1 == disable*/
318 } ca_pid_t;
320 enum ca_descr_algo {
321 CA_ALGO_DVBCSA,
322 CA_ALGO_DES,
323 CA_ALGO_AES128,
326 enum ca_descr_cipher_mode {
327 CA_MODE_ECB,
328 CA_MODE_CBC,
331 typedef struct ca_descr_mode {
332 uint32_t index;
333 enum ca_descr_algo algo;
334 enum ca_descr_cipher_mode cipher_mode;
335 } ca_descr_mode_t;
337 #define DMX_START _IO('o', 41)
338 #define DMX_STOP _IO('o', 42)
339 #define DMX_SET_FILTER _IOW('o', 43, struct dmx_sct_filter_params)
341 #define CA_SET_DESCR _IOW('o', 134, ca_descr_t)
342 #define CA_SET_PID _IOW('o', 135, ca_pid_t)
343 #define CA_SET_DESCR_MODE _IOW('o', 136, ca_descr_mode_t)
344 // --------------------------------------------------------------------
346 void dvbapi_stop_descrambling(int32_t demux_id, uint32_t msgid);
347 void dvbapi_stop_all_descrambling(uint32_t msgid);
348 void dvbapi_process_input(int32_t demux_id, int32_t filter_num, uchar *buffer, int32_t len, uint32_t msgid);
349 int32_t dvbapi_open_device(int32_t, int32_t, int);
350 int32_t dvbapi_stop_filternum(int32_t demux_index, int32_t num, uint32_t msgid);
351 int32_t dvbapi_stop_filter(int32_t demux_index, int32_t type, uint32_t msgid);
352 struct s_dvbapi_priority *dvbapi_check_prio_match(int32_t demux_id, int32_t pidindex, char type);
353 void dvbapi_send_dcw(struct s_client *client, ECM_REQUEST *er);
354 void dvbapi_write_cw(int32_t demux_id, uchar *cw, int32_t pid, int32_t stream_id, enum ca_descr_algo algo, enum ca_descr_cipher_mode cipher_mode, uint32_t msgid);
355 int32_t dvbapi_parse_capmt(unsigned char *buffer, uint32_t length, int32_t connfd, char *pmtfile, int8_t is_real_pmt, uint16_t existing_demux_id, uint16_t client_proto_version, uint32_t msgid);
356 void request_cw(struct s_client *client, ECM_REQUEST *er, int32_t demux_id, uint8_t delayed_ecm_check);
357 void dvbapi_try_next_caid(int32_t demux_id, int8_t checked, uint32_t msgid);
358 void dvbapi_read_priority(void);
359 int32_t dvbapi_set_section_filter(int32_t demux_index, ECM_REQUEST *er, int32_t n);
360 int32_t dvbapi_activate_section_filter(int32_t demux_index, int32_t num, int32_t fd, int32_t pid, uchar *filter, uchar *mask, uint32_t msgid);
361 int32_t dvbapi_check_ecm_delayed_delivery(int32_t demux_index, ECM_REQUEST *er);
362 int32_t dvbapi_get_filternum(int32_t demux_index, ECM_REQUEST *er, int32_t type);
363 ca_index_t dvbapi_ca_setpid(int32_t demux_index, int32_t pid, int32_t stream_id, bool use_des, uint32_t msgid);
364 void dvbapi_set_pid(int32_t demux_id, int32_t num, ca_index_t idx, bool enable, bool use_des, uint32_t msgid);
365 int8_t update_streampid_list(uint8_t cadevice, uint16_t pid, ca_index_t idx, bool use_des);
366 int8_t remove_streampid_from_list(uint8_t cadevice, uint16_t pid, ca_index_t idx);
367 void disable_unused_streampids(int16_t demux_id);
368 ca_index_t is_ca_used(uint8_t cadevice, int32_t pid);
369 uint16_t dvbapi_get_client_proto_version(void);
370 const char *dvbapi_get_client_name(void);
371 void rotate_emmfilter(int32_t demux_id);
372 int32_t filtermatch(uchar *buffer, int32_t filter_num, int32_t demux_id, int32_t len);
373 void delayer(ECM_REQUEST *er, uint32_t delay);
374 void check_add_emmpid(int32_t demux_index, uchar *filter, int32_t l, int32_t emmtype);
375 void *dvbapi_start_handler(struct s_client *cl, uchar *mbuf, int32_t module_idx, void * (*_main_func)(void *));
376 ca_index_t dvbapi_get_descindex(int32_t demux_index, int32_t pid, int32_t stream_id);
377 void dvbapi_write_ecminfo_file(struct s_client *client, ECM_REQUEST *er, uint8_t* lastcw0, uint8_t* lastcw1);
379 #if defined(WITH_AZBOX) || defined(WITH_MCA)
380 #define USE_OPENXCAS 1
381 extern int32_t openxcas_provid;
382 extern uint16_t openxcas_sid, openxcas_caid, openxcas_ecm_pid;
383 static inline void openxcas_set_caid(uint16_t _caid) { openxcas_caid = _caid; }
384 static inline void openxcas_set_ecm_pid(uint16_t _pid) { openxcas_ecm_pid = _pid; }
385 static inline void openxcas_set_sid(uint16_t _sid) { openxcas_sid = _sid; }
386 static inline void openxcas_set_provid(uint32_t _provid) { openxcas_provid = _provid; }
387 #else
388 #define USE_OPENXCAS 0
389 static inline void openxcas_set_caid(uint16_t UNUSED(_caid)) { }
390 static inline void openxcas_set_ecm_pid(uint16_t UNUSED(_pid)) { }
391 static inline void openxcas_set_sid(uint16_t UNUSED(_sid)) { }
392 static inline void openxcas_set_provid(uint32_t UNUSED(_provid)) { }
393 #endif
395 bool is_dvbapi_usr(char *usr);
396 static inline bool module_dvbapi_enabled(void) { return cfg.dvbapi_enabled; }
397 #else
398 static inline void dvbapi_stop_all_descrambling(uint32_t UNUSED(msgid)) { }
399 static inline void dvbapi_read_priority(void) { }
400 static inline bool is_dvbapi_usr(char *UNUSED(usr)) { return 0; }
401 static inline bool module_dvbapi_enabled(void) { return 0; }
402 #endif // WITH_DVBAPI
404 #endif // MODULE_DVBAPI_H_