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