finish chan_misdn commit
[asterisk/asterisk.git] / channels / misdn / isdn_lib.h
1 /*
2  * Chan_Misdn -- Channel Driver for Asterisk
3  *
4  * Interface to mISDN
5  *
6  * Copyright (C) 2004, Christian Richter
7  *
8  * Christian Richter <crich@beronet.com>
9  *
10  * This program is free software, distributed under the terms of
11  * the GNU General Public License
12  */
13
14 #ifndef TE_LIB
15 #define TE_LIB
16
17 #include <mISDNlib.h>
18 #include <isdn_net.h>
19 #include <l3dss1.h>
20 #include <net_l3.h>
21
22 #include <pthread.h>
23
24 #ifndef mISDNUSER_HEAD_SIZE
25
26 #ifdef MISDNUSER_JOLLY
27 #define mISDNUSER_HEAD_SIZE (sizeof(mISDNuser_head_t))
28 #else
29 #define mISDNUSER_HEAD_SIZE (sizeof(mISDN_head_t))
30 #endif
31 #endif
32
33 #define MISDN_ASTERISK_TECH_PVT(ast) ast->tech_pvt
34 #define MISDN_ASTERISK_PVT(ast) 1
35 #define MISDN_ASTERISK_TYPE(ast) ast->tech->type
36
37
38 /* #include "ies.h" */
39
40 #define MAX_BCHANS 30
41
42
43 /** For initialization usage **/
44 /* typedef int ie_nothing_t ;*/
45 /** end of init usage **/
46
47
48 enum bc_state_e {
49         STATE_NOTHING=0,
50         STATE_NULL,
51         STATE_CALL_INIT,
52         STATE_CONNECTED,
53         STATE_HOLD_ACKNOWLEDGE
54 };
55
56
57 enum tone_e {
58         TONE_NONE=0,
59         TONE_DIAL,
60         TONE_ALERTING,
61         TONE_BUSY,
62         TONE_FILE
63 };
64
65 enum misdn_err_e {
66         ENOCHAN=1
67 };
68
69
70
71 enum mISDN_NUMBER_PLAN {
72         NUMPLAN_UNINITIALIZED=-1,
73         NUMPLAN_INTERNATIONAL=0x1,
74         NUMPLAN_NATIONAL=0x2,
75         NUMPLAN_SUBSCRIBER=0x4,
76         NUMPLAN_UNKNOWN=0x0
77 }; 
78
79
80 enum event_response_e {
81         RESPONSE_IGNORE_SETUP_WITHOUT_CLOSE,
82         RESPONSE_IGNORE_SETUP,
83         RESPONSE_ERR,
84         RESPONSE_OK
85 };
86
87
88
89 enum event_e {
90         EVENT_NOTHING,
91         EVENT_BCHAN_DATA,
92         EVENT_CLEANUP,
93         EVENT_PROCEEDING,
94         EVENT_PROGRESS,
95         EVENT_SETUP,
96         EVENT_ALERTING,
97         EVENT_CONNECT,
98         EVENT_SETUP_ACKNOWLEDGE,
99         EVENT_CONNECT_ACKNOWLEDGE ,
100         EVENT_USER_INFORMATION,
101         EVENT_SUSPEND_REJECT,
102         EVENT_RESUME_REJECT,
103         EVENT_HOLD,
104         EVENT_SUSPEND,
105         EVENT_RESUME,
106         EVENT_HOLD_ACKNOWLEDGE,
107         EVENT_SUSPEND_ACKNOWLEDGE,
108         EVENT_RESUME_ACKNOWLEDGE,
109         EVENT_HOLD_REJECT,
110         EVENT_RETRIEVE,
111         EVENT_RETRIEVE_ACKNOWLEDGE,
112         EVENT_RETRIEVE_REJECT,
113         EVENT_DISCONNECT,
114         EVENT_RESTART,
115         EVENT_RELEASE,
116         EVENT_RELEASE_COMPLETE,
117         EVENT_FACILITY,
118         EVENT_NOTIFY,
119         EVENT_STATUS_ENQUIRY,
120         EVENT_INFORMATION,
121         EVENT_STATUS,
122         EVENT_TIMEOUT,
123         EVENT_DTMF_TONE,
124         EVENT_NEW_L3ID,
125         EVENT_NEW_BC,
126         EVENT_UNKNOWN
127 }; 
128
129
130 enum ie_name_e {
131         IE_DUMMY,
132         IE_LAST
133 };
134
135 enum { /* bearer capability */
136         INFO_CAPABILITY_SPEECH=0,
137         INFO_CAPABILITY_AUDIO_3_1K=0x10 ,
138         INFO_CAPABILITY_AUDIO_7K=0x11 ,
139         INFO_CAPABILITY_VIDEO =0x18,
140         INFO_CAPABILITY_DIGITAL_UNRESTRICTED =0x8,
141         INFO_CAPABILITY_DIGITAL_RESTRICTED =0x09,
142         INFO_CAPABILITY_DIGITAL_UNRESTRICTED_TONES
143 };
144
145 enum { /* progress indicators */
146         INFO_PI_CALL_NOT_E2E_ISDN =0x01,
147         INFO_PI_CALLED_NOT_ISDN =0x02,
148         INFO_PI_CALLER_NOT_ISDN =0x03,
149         INFO_PI_CALLER_RETURNED_TO_ISDN =0x04,
150         INFO_PI_INBAND_AVAILABLE =0x08,
151         INFO_PI_DELAY_AT_INTERF =0x0a,
152         INFO_PI_INTERWORKING_WITH_PUBLIC =0x10,
153         INFO_PI_INTERWORKING_NO_RELEASE =0x11,
154         INFO_PI_INTERWORKING_NO_RELEASE_PRE_ANSWER =0x12,
155         INFO_PI_INTERWORKING_NO_RELEASE_POST_ANSWER =0x13
156 };
157
158 enum { /*CODECS*/
159         INFO_CODEC_ULAW=2,
160         INFO_CODEC_ALAW=3
161 }; 
162
163
164 enum layer_e {
165         L3,
166         L2,
167         L1,
168         UNKNOWN
169 }; 
170
171 enum facility_type {
172         FACILITY_NONE,
173         FACILITY_CALLDEFLECT
174 };
175
176 struct misdn_bchannel {
177         /** init stuff **/
178         int b_stid;
179         /* int b_addr; */
180         int layer_id;
181   
182         /** var stuff**/
183         int l3_id;
184         int pid;
185         int ces;
186   
187         int channel;
188         int channel_preselected;
189         
190         int in_use;
191         int addr;
192
193         unsigned char * bframe;
194         int bframe_len;
195         int time_usec;
196         
197         sem_t astsem;
198         sem_t misdnsem;
199         ibuffer_t *astbuf;
200         ibuffer_t *misdnbuf;
201   
202         /* dtmf digit */
203         int dtmf;
204         int send_dtmf;
205
206         /* wether we should use jollys dsp or not */
207         int nodsp;
208         
209         /* wether we should use our jitter buf system or not */
210         int nojitter;
211         
212         enum mISDN_NUMBER_PLAN dnumplan;
213         enum mISDN_NUMBER_PLAN rnumplan;
214         enum mISDN_NUMBER_PLAN onumplan;
215
216         int progress_coding;
217         int progress_location;
218         int progress_indicator;
219         
220         enum facility_type facility;
221         char facility_calldeflect_nr[15];
222         
223         enum event_e evq;
224         
225         /*** CRYPTING STUFF ***/
226         
227         int crypt;
228         int curprx;
229         int curptx; 
230         char crypt_key[255];
231   
232         int crypt_state;
233     
234         /*char ast_dtmf_buf[255];
235           char misdn_dtmf_buf[255]; */
236   
237         /*** CRYPTING STUFF END***/
238   
239         int active;
240         int upset;
241
242         enum tone_e tone;
243         int tone_cnt;
244         int tone_cnt2;
245   
246         enum bc_state_e state;
247
248         int holded;
249         int stack_holder;
250         
251         int pres;
252   
253         int nohdlc;
254         
255         int capability;
256         int law;
257         /** V110 Stuff **/
258         int rate;
259         int mode;
260
261         int user1;
262         int urate;
263         int async;
264         /* V110 */
265   
266         unsigned char display[84];
267         unsigned char msn[32];
268         unsigned char oad[32];
269         unsigned char rad[32];
270         unsigned char dad[32];
271         unsigned char orig_dad[32];
272         unsigned char keypad[32];
273   
274         unsigned char info_dad[64];
275         unsigned char infos_pending[64];
276         unsigned char info_keypad[32];
277         unsigned char clisub[24];
278         unsigned char cldsub[24];
279         unsigned char fac[132];
280         unsigned char uu[256];
281   
282         int cause;
283         int out_cause;
284   
285         /* struct misdn_bchannel hold_bc; */
286   
287         /** list stuf **/
288
289         int ec_enable;
290         int ec_deftaps;
291         int ec_whenbridged;
292         int ec_training;
293         
294         int orig;
295
296         int txgain;
297         int rxgain;
298   
299         struct misdn_bchannel *next;
300         struct misdn_stack *stack;
301 };
302
303 struct misdn_stack {
304         /** is first element because &nst equals &mISDNlist **/
305         net_stack_t nst;
306         manager_t mgr;
307   
308         int d_stid;
309   
310         int b_num;
311   
312         int b_stids[MAX_BCHANS + 1];
313   
314         int ptp;
315         int lower_id;
316         int upper_id;
317   
318         int l2link;
319   
320         time_t l2establish;
321   
322         int l1link;
323         int midev;
324   
325         enum mode_e {NT_MODE, TE_MODE} mode;
326         int pri;
327   
328
329         int procids[0x100+1];
330
331         msg_queue_t downqueue;
332         int busy;
333   
334         int port;
335         struct misdn_bchannel bc[MAX_BCHANS + 1];
336   
337         struct misdn_bchannel* bc_list; 
338   
339         int channels[MAX_BCHANS + 1];
340
341   
342   
343         int te_choose_channel;
344   
345
346         struct misdn_bchannel *holding; /* Queue which holds holded channels :) */
347   
348         struct misdn_stack *next;
349 }; 
350
351 struct misdn_stack* get_misdn_stack( void );
352
353 enum event_response_e (*cb_event) (enum event_e event, struct misdn_bchannel *bc, void *user_data);
354 void (*cb_log) (int level, int port, char *tmpl, ...);
355 int (*cb_clearl3_true)(void);
356
357 struct misdn_lib_iface {
358         
359         enum event_response_e (*cb_event)(enum event_e event, struct misdn_bchannel *bc, void *user_data);
360         void (*cb_log)(int level, int port, char *tmpl, ...);
361         int (*cb_clearl3_true)(void);
362 };
363
364 /***** USER IFACE **********/
365
366 int misdn_lib_init(char *portlist, struct misdn_lib_iface* iface, void *user_data);
367 int misdn_lib_send_event(struct misdn_bchannel *bc, enum event_e event );
368 void misdn_lib_destroy(void);
369
370 void misdn_lib_log_ies(struct misdn_bchannel *bc);
371
372 char *manager_isdn_get_info(enum event_e event);
373
374 void misdn_lib_transfer(struct misdn_bchannel* holded_bc);
375
376 struct misdn_bchannel* misdn_lib_get_free_bc(int port, int channel);
377
378 void manager_bchannel_activate(struct misdn_bchannel *bc);
379 void manager_bchannel_deactivate(struct misdn_bchannel * bc);
380 int manager_tx2misdn_frm(struct misdn_bchannel *bc, void *data, int len);
381 void manager_send_tone (struct misdn_bchannel *bc, enum tone_e tone);
382
383 void manager_ph_control(struct misdn_bchannel *bc, int c1, int c2);
384
385
386 int misdn_lib_port_restart(int port);
387 int misdn_lib_get_port_info(int port);
388
389 int misdn_lib_port_up(int port);
390
391 int misdn_lib_get_port_up (int port) ;
392      
393 int misdn_lib_maxports_get(void) ;
394
395 void misdn_lib_release(struct misdn_bchannel *bc);
396
397 int misdn_cap_is_speech(int cap);
398 int misdn_inband_avail(struct misdn_bchannel *bc);
399
400 int misdn_lib_send_facility(struct misdn_bchannel *bc, enum facility_type fac, void *data);
401
402
403 struct isdn_msg {
404         unsigned long misdn_msg;
405   
406         enum layer_e layer;
407         enum event_e event;
408   
409         void (*msg_parser)(struct isdn_msg *msgs, msg_t *msg, struct misdn_bchannel *bc, int nt);
410         msg_t *(*msg_builder)(struct isdn_msg *msgs, struct misdn_bchannel *bc, int nt);
411         void (*msg_printer)(struct isdn_msg *msgs);
412   
413         char *info;
414   
415 } ; 
416
417
418
419
420
421
422
423
424 void manager_ec_enable(struct misdn_bchannel *bc);
425 void manager_ec_disable(struct misdn_bchannel *bc);
426
427
428 /* for isdn_msg_parser.c */
429 msg_t *create_l3msg(int prim, int mt, int dinfo , int size, int nt);
430
431
432
433 #define PRI_TRANS_CAP_SPEECH                                    0x0
434 #define PRI_TRANS_CAP_DIGITAL                                   0x08
435 #define PRI_TRANS_CAP_RESTRICTED_DIGITAL                        0x09
436 #define PRI_TRANS_CAP_3_1K_AUDIO                                0x10
437 #define PRI_TRANS_CAP_7K_AUDIO                                  0x11
438
439 #endif