ce8900b27db8ab7d00964d57032ddc04272b71b0
[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 <mISDNuser/suppserv.h>
18
19 /** For initialization usage **/
20 /* typedef int ie_nothing_t ;*/
21 /** end of init usage **/
22
23
24 /* 
25  * uncomment the following to make chan_misdn create
26  * record files in /tmp/misdn-{rx|tx}-PortChannel format 
27  * */
28
29 /*#define MISDN_SAVE_DATA*/
30
31 #ifdef WITH_BEROEC
32 typedef int beroec_t;
33
34
35 enum beroec_type {
36         BEROEC_FULLBAND=0,
37         BEROEC_SUBBAND,
38         BEROEC_FASTSUBBAND
39 };
40
41 void beroec_init(void);
42 void beroec_exit(void);
43 beroec_t *beroec_new(int tail, enum beroec_type type, int anti_howl,
44                      int tonedisable, int zerocoeff, int adapt, int nlp);
45
46 void beroec_destroy(beroec_t *ec);
47 int beroec_cancel_alaw_chunk(beroec_t *ec, 
48         char *send, 
49         char *receive , 
50         int len);
51
52 int beroec_version(void);
53 #endif
54
55
56
57 enum tone_e {
58         TONE_NONE=0,
59         TONE_DIAL,
60         TONE_ALERTING,
61         TONE_FAR_ALERTING,
62         TONE_BUSY,
63         TONE_HANGUP,
64         TONE_CUSTOM,
65         TONE_FILE
66 };
67
68
69
70 #define MAX_BCHANS 31
71
72 enum bchannel_state {
73         BCHAN_CLEANED=0,
74         BCHAN_EMPTY,
75         BCHAN_SETUP,
76         BCHAN_SETUPED,
77         BCHAN_ACTIVE,
78         BCHAN_ACTIVATED,
79         BCHAN_BRIDGE,
80         BCHAN_BRIDGED,
81         BCHAN_RELEASE,
82         BCHAN_RELEASED,
83         BCHAN_CLEAN,
84         BCHAN_CLEAN_REQUEST,
85         BCHAN_ERROR
86 };
87
88
89 enum misdn_err_e {
90         ENOCHAN=1
91 };
92
93
94 enum mISDN_NUMBER_PLAN {
95         NUMPLAN_UNINITIALIZED=-1,
96         NUMPLAN_INTERNATIONAL=0x1,
97         NUMPLAN_NATIONAL=0x2,
98         NUMPLAN_SUBSCRIBER=0x4,
99         NUMPLAN_UNKNOWN=0x0
100 }; 
101
102
103 enum event_response_e {
104         RESPONSE_IGNORE_SETUP_WITHOUT_CLOSE,
105         RESPONSE_IGNORE_SETUP,
106         RESPONSE_RELEASE_SETUP,
107         RESPONSE_ERR,
108         RESPONSE_OK
109 };
110
111
112 enum event_e {
113         EVENT_NOTHING,
114         EVENT_TONE_GENERATE,
115         EVENT_BCHAN_DATA,
116         EVENT_BCHAN_ACTIVATED,
117         EVENT_BCHAN_ERROR,
118         EVENT_CLEANUP,
119         EVENT_PROCEEDING,
120         EVENT_PROGRESS,
121         EVENT_SETUP,
122         EVENT_ALERTING,
123         EVENT_CONNECT,
124         EVENT_SETUP_ACKNOWLEDGE,
125         EVENT_CONNECT_ACKNOWLEDGE ,
126         EVENT_USER_INFORMATION,
127         EVENT_SUSPEND_REJECT,
128         EVENT_RESUME_REJECT,
129         EVENT_HOLD,
130         EVENT_SUSPEND,
131         EVENT_RESUME,
132         EVENT_HOLD_ACKNOWLEDGE,
133         EVENT_SUSPEND_ACKNOWLEDGE,
134         EVENT_RESUME_ACKNOWLEDGE,
135         EVENT_HOLD_REJECT,
136         EVENT_RETRIEVE,
137         EVENT_RETRIEVE_ACKNOWLEDGE,
138         EVENT_RETRIEVE_REJECT,
139         EVENT_DISCONNECT,
140         EVENT_RESTART,
141         EVENT_RELEASE,
142         EVENT_RELEASE_COMPLETE,
143         EVENT_FACILITY,
144         EVENT_NOTIFY,
145         EVENT_STATUS_ENQUIRY,
146         EVENT_INFORMATION,
147         EVENT_STATUS,
148         EVENT_TIMEOUT,
149         EVENT_DTMF_TONE,
150         EVENT_NEW_L3ID,
151         EVENT_NEW_BC,
152         EVENT_PORT_ALARM,
153         EVENT_NEW_CHANNEL,
154         EVENT_UNKNOWN
155 }; 
156
157
158 enum ie_name_e {
159         IE_DUMMY,
160         IE_LAST
161 };
162
163 enum { /* bearer capability */
164         INFO_CAPABILITY_SPEECH=0,
165         INFO_CAPABILITY_AUDIO_3_1K=0x10 ,
166         INFO_CAPABILITY_AUDIO_7K=0x11 ,
167         INFO_CAPABILITY_VIDEO =0x18,
168         INFO_CAPABILITY_DIGITAL_UNRESTRICTED =0x8,
169         INFO_CAPABILITY_DIGITAL_RESTRICTED =0x09,
170         INFO_CAPABILITY_DIGITAL_UNRESTRICTED_TONES
171 };
172
173 enum { /* progress indicators */
174         INFO_PI_CALL_NOT_E2E_ISDN =0x01,
175         INFO_PI_CALLED_NOT_ISDN =0x02,
176         INFO_PI_CALLER_NOT_ISDN =0x03,
177         INFO_PI_CALLER_RETURNED_TO_ISDN =0x04,
178         INFO_PI_INBAND_AVAILABLE =0x08,
179         INFO_PI_DELAY_AT_INTERF =0x0a,
180         INFO_PI_INTERWORKING_WITH_PUBLIC =0x10,
181         INFO_PI_INTERWORKING_NO_RELEASE =0x11,
182         INFO_PI_INTERWORKING_NO_RELEASE_PRE_ANSWER =0x12,
183         INFO_PI_INTERWORKING_NO_RELEASE_POST_ANSWER =0x13
184 };
185
186 enum { /*CODECS*/
187         INFO_CODEC_ULAW=2,
188         INFO_CODEC_ALAW=3
189 }; 
190
191
192 enum layer_e {
193         L3,
194         L2,
195         L1,
196         UNKNOWN
197 }; 
198
199
200
201 struct misdn_bchannel {
202         struct send_lock *send_lock;
203
204         int nt;
205         int port;
206         /** init stuff **/
207         int b_stid;
208         /* int b_addr; */
209         int layer_id;
210
211         int layer;
212         
213         /*state stuff*/
214         int need_disconnect;
215         int need_release;
216         int need_release_complete;
217
218         int dec;
219         /** var stuff**/
220         int l3_id;
221         int pid;
222         int ces;
223
224         int restart_channel;
225         int channel;
226         int channel_preselected;
227         
228         int in_use;
229         int cw;
230         int addr;
231
232         char * bframe;
233         int bframe_len;
234         int time_usec;
235         
236         
237         void *astbuf;
238
239         void *misdnbuf;
240
241         int te_choose_channel;
242         int early_bconnect;
243         
244         /* dtmf digit */
245         int dtmf;
246         int send_dtmf;
247
248         /* get setup ack */
249         int need_more_infos;
250
251         /* may there be more infos ?*/
252         int sending_complete;
253
254
255         /* wether we should use jollys dsp or not */
256         int nodsp;
257         
258         /* wether we should use our jitter buf system or not */
259         int nojitter;
260         
261         enum mISDN_NUMBER_PLAN dnumplan;
262         enum mISDN_NUMBER_PLAN rnumplan;
263         enum mISDN_NUMBER_PLAN onumplan;
264         enum mISDN_NUMBER_PLAN cpnnumplan;
265
266         int progress_coding;
267         int progress_location;
268         int progress_indicator;
269
270         struct FacParm fac_in;
271         struct FacParm fac_out;
272
273         /* storing the current AOCD info here */
274         enum FacFunction AOCDtype;
275         union {
276                 struct FacAOCDCurrency currency;
277                 struct FacAOCDChargingUnit chargingUnit;
278         } AOCD;
279         int AOCD_need_export;
280         
281         enum event_e evq;
282         
283         /*** CRYPTING STUFF ***/
284         
285         int crypt;
286         int curprx;
287         int curptx; 
288         char crypt_key[255];
289   
290         int crypt_state;
291     
292         /*char ast_dtmf_buf[255];
293           char misdn_dtmf_buf[255]; */
294   
295         /*** CRYPTING STUFF END***/
296   
297         int active;
298         int upset;
299
300         int generate_tone;
301         int tone_cnt;
302  
303         enum bchannel_state bc_state;
304         enum bchannel_state next_bc_state;
305
306         int conf_id;
307         
308         int holded;
309         int stack_holder;
310
311         int pres;
312         int screen;
313         
314         int capability;
315         int law;
316         /** V110 Stuff **/
317         int rate;
318         int mode;
319
320         int user1;
321         int urate;
322         int hdlc;
323         /* V110 */
324   
325         char display[84];
326         char msn[32];
327         char oad[32];
328         char rad[32];
329         char dad[32];
330         char cad[32];
331         char orig_dad[32];
332         char keypad[32];
333
334         char info_dad[64];
335         char infos_pending[64];
336
337 /*      unsigned char info_keypad[32]; */
338 /*      unsigned char clisub[24]; */
339 /*      unsigned char cldsub[24]; */
340
341         char uu[256];
342         int uulen;
343   
344         int cause;
345         int out_cause;
346   
347         /* struct misdn_bchannel hold_bc; */
348   
349         /** list stuf **/
350
351 #ifdef MISDN_1_2
352         char pipeline[128];
353 #else
354         int ec_enable;
355         int ec_deftaps;
356 #endif
357
358 #ifdef WITH_BEROEC
359         beroec_t *ec;
360         int bnec_tail;
361         int bnec_ah;
362         int bnec_nlp;
363         int bnec_td;
364         int bnec_adapt;
365         int bnec_zero;
366 #endif
367         
368         int orig;
369
370         int txgain;
371         int rxgain;
372   
373         struct misdn_bchannel *next;
374 };
375
376
377 enum event_response_e (*cb_event) (enum event_e event, struct misdn_bchannel *bc, void *user_data);
378 void (*cb_log) (int level, int port, char *tmpl, ...);
379 int (*cb_jb_empty)(struct misdn_bchannel *bc, char *buffer, int len);
380
381 struct misdn_lib_iface {
382         enum event_response_e (*cb_event)(enum event_e event, struct misdn_bchannel *bc, void *user_data);
383         void (*cb_log)(int level, int port, char *tmpl, ...);
384         int (*cb_jb_empty)(struct misdn_bchannel *bc, char *buffer, int len);
385 };
386
387 /***** USER IFACE **********/
388
389 void misdn_lib_nt_debug_init( int flags, char *file );
390
391 int misdn_lib_init(char *portlist, struct misdn_lib_iface* iface, void *user_data);
392 int misdn_lib_send_event(struct misdn_bchannel *bc, enum event_e event );
393 void misdn_lib_destroy(void);
394
395 void misdn_lib_isdn_l1watcher(int port);
396
397 void misdn_lib_log_ies(struct misdn_bchannel *bc);
398
399 char *manager_isdn_get_info(enum event_e event);
400
401 void misdn_lib_transfer(struct misdn_bchannel* holded_bc);
402
403 struct misdn_bchannel* misdn_lib_get_free_bc(int port, int channel, int inout, int dec);
404
405 void manager_bchannel_activate(struct misdn_bchannel *bc);
406 void manager_bchannel_deactivate(struct misdn_bchannel * bc);
407
408 int misdn_lib_tx2misdn_frm(struct misdn_bchannel *bc, void *data, int len);
409
410 void manager_ph_control(struct misdn_bchannel *bc, int c1, int c2);
411
412 void isdn_lib_update_rxgain (struct misdn_bchannel *bc);
413 void isdn_lib_update_txgain (struct misdn_bchannel *bc);
414 void isdn_lib_update_ec (struct misdn_bchannel *bc);
415 void isdn_lib_stop_dtmf (struct misdn_bchannel *bc);
416
417 int misdn_lib_port_restart(int port);
418 int misdn_lib_pid_restart(int pid);
419 int misdn_lib_send_restart(int port, int channel);
420
421 int misdn_lib_get_port_info(int port);
422
423 int misdn_lib_is_port_blocked(int port);
424 int misdn_lib_port_block(int port);
425 int misdn_lib_port_unblock(int port);
426
427 int misdn_lib_port_is_pri(int port);
428
429 int misdn_lib_port_up(int port, int notcheck);
430
431 int misdn_lib_get_port_down(int port);
432
433 int misdn_lib_get_port_up (int port) ;
434      
435 int misdn_lib_maxports_get(void) ;
436
437 void misdn_lib_release(struct misdn_bchannel *bc);
438
439 int misdn_cap_is_speech(int cap);
440 int misdn_inband_avail(struct misdn_bchannel *bc);
441
442 void manager_ec_enable(struct misdn_bchannel *bc);
443 void manager_ec_disable(struct misdn_bchannel *bc);
444
445 void misdn_lib_send_tone(struct misdn_bchannel *bc, enum tone_e tone);
446
447 void get_show_stack_details(int port, char *buf);
448
449
450 void misdn_lib_tone_generator_start(struct misdn_bchannel *bc);
451 void misdn_lib_tone_generator_stop(struct misdn_bchannel *bc);
452
453
454 void misdn_lib_setup_bc(struct misdn_bchannel *bc);
455
456 void misdn_lib_bridge( struct misdn_bchannel * bc1, struct misdn_bchannel *bc2);
457 void misdn_lib_split_bridge( struct misdn_bchannel * bc1, struct misdn_bchannel *bc2);
458
459 void misdn_lib_echo(struct misdn_bchannel *bc, int onoff);
460
461 int misdn_lib_is_ptp(int port);
462 int misdn_lib_get_maxchans(int port);
463
464 void misdn_lib_reinit_nt_stack(int port);
465
466 #define PRI_TRANS_CAP_SPEECH                                    0x0
467 #define PRI_TRANS_CAP_DIGITAL                                   0x08
468 #define PRI_TRANS_CAP_RESTRICTED_DIGITAL                        0x09
469 #define PRI_TRANS_CAP_3_1K_AUDIO                                0x10
470 #define PRI_TRANS_CAP_7K_AUDIO                                  0x11
471
472
473
474 char *bc_state2str(enum bchannel_state state);
475 void bc_state_change(struct misdn_bchannel *bc, enum bchannel_state state);
476
477
478 #endif