This source file includes following definitions.
- sngisdn_test_flag
- sngisdn_clear_flag
- sngisdn_set_flag
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 #ifndef __FTMOD_SNG_ISDN_H__
36 #define __FTMOD_SNG_ISDN_H__
37
38 #include <stdio.h>
39 #include <string.h>
40 #include <stdarg.h>
41 #ifdef HAVE_STDINT_H
42 #include <stdint.h>
43 #endif
44 #ifdef HAVE_UNISTD_H
45 #include <unistd.h>
46 #endif
47 #include <ctype.h>
48
49 #include "private/ftdm_core.h"
50 #include "ftmod_sangoma_isdn_user.h"
51
52 #include <sng_isdn.h>
53
54
55
56
57 #define MAX_SPANS_PER_NFAS_LINK 8
58 #define NUM_E1_CHANNELS_PER_SPAN 32
59 #define NUM_T1_CHANNELS_PER_SPAN 24
60 #define NUM_BRI_CHANNELS_PER_SPAN 2
61 #define SNGISDN_EVENT_QUEUE_SIZE 100
62 #define SNGISDN_EVENT_POLL_RATE 100
63 #define SNGISDN_NUM_LOCAL_NUMBERS 8
64 #define SNGISDN_DCHAN_QUEUE_LEN 200
65
66
67
68 typedef enum {
69 FLAG_RESET_RX = (1 << 0),
70 FLAG_RESET_TX = (1 << 1),
71 FLAG_REMOTE_REL = (1 << 2),
72 FLAG_LOCAL_REL = (1 << 3),
73 FLAG_REMOTE_ABORT = (1 << 4),
74 FLAG_LOCAL_ABORT = (1 << 5),
75 FLAG_GLARE = (1 << 6),
76 FLAG_DELAYED_REL = (1 << 7),
77 FLAG_SENT_PROCEED = (1 << 8),
78 FLAG_SEND_DISC = (1 << 9),
79
80 FLAG_ACTIVATING = (1 << 10),
81
82 FLAG_MEDIA_READY = (1 << 11),
83 } sngisdn_flag_t;
84
85
86 typedef enum {
87 SNGISDN_SWITCH_INVALID = 0,
88 SNGISDN_SWITCH_NI2 ,
89 SNGISDN_SWITCH_5ESS,
90 SNGISDN_SWITCH_4ESS,
91 SNGISDN_SWITCH_DMS100,
92 SNGISDN_SWITCH_EUROISDN,
93 SNGISDN_SWITCH_QSIG,
94 SNGISDN_SWITCH_INSNET,
95 } sngisdn_switchtype_t;
96
97 typedef enum {
98 SNGISDN_SIGNALING_INVALID = 0,
99 SNGISDN_SIGNALING_CPE ,
100 SNGISDN_SIGNALING_NET,
101 } sngisdn_signalingtype_t;
102
103 typedef enum {
104 SNGISDN_TRACE_DISABLE = 0,
105 SNGISDN_TRACE_Q921 = 1,
106 SNGISDN_TRACE_Q931 = 2,
107 } sngisdn_tracetype_t;
108
109 typedef enum {
110 SNGISDN_OPT_DEFAULT = 0,
111 SNGISDN_OPT_TRUE = 1,
112 SNGISDN_OPT_FALSE = 2,
113 } sngisdn_opt_t;
114
115
116 typedef enum {
117 SNGISDN_AVAIL_DOWN = 1,
118 SNGISDN_AVAIL_PWR_SAVING = 5,
119 SNGISDN_AVAIL_UP = 10,
120 } sngisdn_avail_t;
121
122 typedef enum {
123 SNGISDN_EVENT_CON_IND = 1,
124 SNGISDN_EVENT_CON_CFM,
125 SNGISDN_EVENT_CNST_IND,
126 SNGISDN_EVENT_DISC_IND,
127 SNGISDN_EVENT_REL_IND,
128 SNGISDN_EVENT_DAT_IND,
129 SNGISDN_EVENT_SSHL_IND,
130 SNGISDN_EVENT_SSHL_CFM,
131 SNGISDN_EVENT_RMRT_IND,
132 SNGISDN_EVENT_RMRT_CFM,
133 SNGISDN_EVENT_FLC_IND,
134 SNGISDN_EVENT_FAC_IND,
135 SNGISDN_EVENT_STA_CFM,
136 SNGISDN_EVENT_SRV_IND,
137 SNGISDN_EVENT_SRV_CFM,
138 SNGISDN_EVENT_RST_CFM,
139 SNGISDN_EVENT_RST_IND,
140 } ftdm_sngisdn_event_id_t;
141
142 typedef struct ftdm_sngisdn_prog_ind {
143 ftdm_sngisdn_progind_loc_t loc;
144 ftdm_sngisdn_progind_descr_t descr;
145 } ftdm_sngisdn_progind_t;
146
147
148 #define SNGISDN_NUM_TIMERS 1
149
150 typedef enum {
151 SNGISDN_TIMER_FACILITY = 0,
152 } ftdm_sngisdn_timer_t;
153
154 typedef struct sngisdn_glare_data {
155 int16_t suId;
156 uint32_t suInstId;
157 uint32_t spInstId;
158 int16_t dChan;
159 ConEvnt setup;
160 uint8_t ces;
161 }sngisdn_glare_data_t;
162
163
164
165 typedef struct sngisdn_chan_data {
166 ftdm_channel_t *ftdmchan;
167 uint32_t flags;
168 uint8_t ces;
169 uint8_t dchan_id;
170 uint16_t call_ref;
171 uint32_t suInstId;
172 uint32_t spInstId;
173
174 uint8_t globalFlg;
175 sngisdn_glare_data_t glare;
176 ftdm_timer_id_t timers[SNGISDN_NUM_TIMERS];
177 } sngisdn_chan_data_t;
178
179
180 typedef struct sngisdn_span_data {
181 ftdm_span_t *ftdm_span;
182 ftdm_channel_t *dchan;
183 uint8_t link_id;
184 uint8_t switchtype;
185 uint8_t signalling;
186 uint8_t cc_id;
187 uint8_t dchan_id;
188 uint8_t span_id;
189 uint8_t tei;
190 uint8_t min_digits;
191 uint8_t trace_flags;
192 uint8_t overlap_dial;
193 uint8_t setup_arb;
194 uint8_t facility_ie_decode;
195 uint8_t facility;
196 int8_t facility_timeout;
197 uint8_t num_local_numbers;
198 uint8_t ignore_cause_value;
199 uint8_t raw_trace_q931;
200 uint8_t raw_trace_q921;
201 uint8_t timer_t3;
202 uint8_t restart_opt;
203 char* local_numbers[SNGISDN_NUM_LOCAL_NUMBERS];
204 ftdm_sched_t *sched;
205 ftdm_queue_t *event_queue;
206 } sngisdn_span_data_t;
207
208 typedef struct sngisdn_event_data {
209
210 int16_t suId;
211 int16_t dChan;
212 uint32_t suInstId;
213 uint32_t spInstId;
214 uint8_t ces;
215 uint8_t action;
216 uint8_t evntType;
217
218 sngisdn_chan_data_t *sngisdn_info;
219 sngisdn_span_data_t *signal_data;
220
221 ftdm_sngisdn_event_id_t event_id;
222
223 union
224 {
225 ConEvnt conEvnt;
226 CnStEvnt cnStEvnt;
227 DiscEvnt discEvnt;
228 RelEvnt relEvnt;
229 InfoEvnt infoEvnt;
230 SsHlEvnt ssHlEvnt;
231 RmRtEvnt rmRtEvnt;
232 StaEvnt staEvnt;
233 FacEvnt facEvnt;
234 Srv srvEvnt;
235 Rst rstEvnt;
236 }event;
237
238 } sngisdn_event_data_t;
239
240
241 typedef struct sngisdn_dchan_data {
242 uint8_t num_spans;
243 sngisdn_span_data_t *spans[MAX_L1_LINKS+1];
244 uint16_t num_chans;
245
246
247
248
249
250
251 sngisdn_chan_data_t *channels[MAX_SPANS_PER_NFAS_LINK*NUM_T1_CHANNELS_PER_SPAN];
252 }sngisdn_dchan_data_t;
253
254 typedef struct sngisdn_cc {
255
256 uint8_t config_done;
257 uint8_t activation_done;
258 uint8_t switchtype;
259 ftdm_trunk_type_t trunktype;
260 uint32_t last_suInstId;
261 ftdm_mutex_t *mutex;
262 sngisdn_chan_data_t *active_spInstIds[MAX_INSTID+1];
263 sngisdn_chan_data_t *active_suInstIds[MAX_INSTID+1];
264 }sngisdn_cc_t;
265
266
267 typedef struct ftdm_sngisdn_data {
268 uint8_t gen_config_done;
269 uint8_t num_cc;
270 struct sngisdn_cc ccs[MAX_VARIANTS+1];
271 uint8_t num_dchan;
272 sngisdn_dchan_data_t dchans[MAX_L1_LINKS+1];
273 sngisdn_span_data_t *spans[MAX_L1_LINKS+1];
274 }ftdm_sngisdn_data_t;
275
276
277
278 #define ISDN_FUNC_TRACE_ENTER(a)
279 #define ISDN_FUNC_TRACE_EXIT(a)
280
281
282 extern ftdm_sngisdn_data_t g_sngisdn_data;
283
284
285 ftdm_status_t ftmod_isdn_parse_cfg(ftdm_conf_parameter_t *ftdm_parameters, ftdm_span_t *span);
286
287
288 uint32_t get_unique_suInstId(int16_t cc_id);
289 void clear_call_data(sngisdn_chan_data_t *sngisdn_info);
290 void clear_call_glare_data(sngisdn_chan_data_t *sngisdn_info);
291 ftdm_status_t get_ftdmchan_by_suInstId(int16_t cc_id, uint32_t suInstId, sngisdn_chan_data_t **sngisdn_data);
292 ftdm_status_t get_ftdmchan_by_spInstId(int16_t cc_id, uint32_t spInstId, sngisdn_chan_data_t **sngisdn_data);
293
294 ftdm_status_t sngisdn_set_span_avail_rate(ftdm_span_t *span, sngisdn_avail_t avail);
295 ftdm_status_t sngisdn_set_chan_avail_rate(ftdm_channel_t *chan, sngisdn_avail_t avail);
296 void sngisdn_set_span_sig_status(ftdm_span_t *ftdmspan, ftdm_signaling_status_t status);
297 void sngisdn_set_chan_sig_status(ftdm_channel_t *ftdmchan, ftdm_signaling_status_t status);
298
299 ftdm_status_t sngisdn_activate_trace(ftdm_span_t *span, sngisdn_tracetype_t trace_opt);
300
301
302 void stack_hdr_init(Header *hdr);
303 void stack_pst_init(Pst *pst);
304
305
306 void sngisdn_snd_setup(ftdm_channel_t *ftdmchan);
307 void sngisdn_snd_setup_ack(ftdm_channel_t *ftdmchan);
308 void sngisdn_snd_proceed(ftdm_channel_t *ftdmchan, ftdm_sngisdn_progind_t prog_ind);
309 void sngisdn_snd_progress(ftdm_channel_t *ftdmchan, ftdm_sngisdn_progind_t prog_ind);
310 void sngisdn_snd_alert(ftdm_channel_t *ftdmchan, ftdm_sngisdn_progind_t prog_ind);
311 void sngisdn_snd_connect(ftdm_channel_t *ftdmchan);
312 void sngisdn_snd_disconnect(ftdm_channel_t *ftdmchan);
313 void sngisdn_snd_release(ftdm_channel_t *ftdmchan, uint8_t glare);
314 void sngisdn_snd_reset(ftdm_channel_t *ftdmchan);
315 void sngisdn_snd_con_complete(ftdm_channel_t *ftdmchan);
316 void sngisdn_snd_fac_req(ftdm_channel_t *ftdmchan);
317 void sngisdn_snd_info_req(ftdm_channel_t *ftdmchan);
318 void sngisdn_snd_status_enq(ftdm_channel_t *ftdmchan);
319 void sngisdn_snd_restart(ftdm_channel_t *ftdmchan);
320 void sngisdn_snd_data(ftdm_channel_t *dchan, uint8_t *data, ftdm_size_t len);
321 void sngisdn_snd_event(ftdm_channel_t *dchan, ftdm_oob_event_t event);
322
323
324 void sngisdn_rcv_con_ind(int16_t suId, uint32_t suInstId, uint32_t spInstId, ConEvnt *conEvnt, int16_t dChan, uint8_t ces);
325 void sngisdn_rcv_con_cfm(int16_t suId, uint32_t suInstId, uint32_t spInstId, CnStEvnt *cnStEvnt, int16_t dChan, uint8_t ces);
326 void sngisdn_rcv_cnst_ind(int16_t suId, uint32_t suInstId, uint32_t spInstId, CnStEvnt *cnStEvnt, uint8_t evntType, int16_t dChan, uint8_t ces);
327 void sngisdn_rcv_disc_ind(int16_t suId, uint32_t suInstId, uint32_t spInstId, DiscEvnt *discEvnt);
328 void sngisdn_rcv_rel_ind(int16_t suId, uint32_t suInstId, uint32_t spInstId, RelEvnt *relEvnt);
329 void sngisdn_rcv_dat_ind(int16_t suId, uint32_t suInstId, uint32_t spInstId, InfoEvnt *infoEvnt);
330 void sngisdn_rcv_sshl_ind(int16_t suId, uint32_t suInstId, uint32_t spInstId, SsHlEvnt *ssHlEvnt, uint8_t action);
331 void sngisdn_rcv_sshl_cfm(int16_t suId, uint32_t suInstId, uint32_t spInstId, SsHlEvnt *ssHlEvnt, uint8_t action);
332 void sngisdn_rcv_rmrt_ind(int16_t suId, uint32_t suInstId, uint32_t spInstId, RmRtEvnt *rmRtEvnt, uint8_t action);
333 void sngisdn_rcv_rmrt_cfm(int16_t suId, uint32_t suInstId, uint32_t spInstId, RmRtEvnt *rmRtEvnt, uint8_t action);
334 void sngisdn_rcv_flc_ind(int16_t suId, uint32_t suInstId, uint32_t spInstId, StaEvnt *staEvnt);
335 void sngisdn_rcv_fac_ind(int16_t suId, uint32_t suInstId, uint32_t spInstId, FacEvnt *facEvnt, uint8_t evntType, int16_t dChan, uint8_t ces);
336 void sngisdn_rcv_sta_cfm(int16_t suId, uint32_t suInstId, uint32_t spInstId, StaEvnt *staEvnt);
337 void sngisdn_rcv_srv_ind(int16_t suId, Srv *srvEvnt, int16_t dChan, uint8_t ces);
338 void sngisdn_rcv_srv_cfm(int16_t suId, Srv *srvEvnt, int16_t dChan, uint8_t ces);
339 void sngisdn_rcv_rst_cfm(int16_t suId, Rst *rstEvnt, int16_t dChan, uint8_t ces, uint8_t evntType);
340 void sngisdn_rcv_rst_ind(int16_t suId, Rst *rstEvnt, int16_t dChan, uint8_t ces, uint8_t evntType);
341 int16_t sngisdn_rcv_l1_data_req(uint16_t spId, sng_l1_frame_t *l1_frame);
342 int16_t sngisdn_rcv_l1_cmd_req(uint16_t spId, sng_l1_cmd_t *l1_cmd);
343
344
345 void sngisdn_process_con_ind (sngisdn_event_data_t *sngisdn_event);
346 void sngisdn_process_con_cfm (sngisdn_event_data_t *sngisdn_event);
347 void sngisdn_process_cnst_ind (sngisdn_event_data_t *sngisdn_event);
348 void sngisdn_process_disc_ind (sngisdn_event_data_t *sngisdn_event);
349 void sngisdn_process_rel_ind (sngisdn_event_data_t *sngisdn_event);
350 void sngisdn_process_dat_ind (sngisdn_event_data_t *sngisdn_event);
351 void sngisdn_process_sshl_ind (sngisdn_event_data_t *sngisdn_event);
352 void sngisdn_process_sshl_cfm (sngisdn_event_data_t *sngisdn_event);
353 void sngisdn_process_rmrt_ind (sngisdn_event_data_t *sngisdn_event);
354 void sngisdn_process_rmrt_cfm (sngisdn_event_data_t *sngisdn_event);
355 void sngisdn_process_flc_ind (sngisdn_event_data_t *sngisdn_event);
356 void sngisdn_process_fac_ind (sngisdn_event_data_t *sngisdn_event);
357 void sngisdn_process_sta_cfm (sngisdn_event_data_t *sngisdn_event);
358
359 void sngisdn_process_srv_ind (sngisdn_event_data_t *sngisdn_event);
360 void sngisdn_process_srv_cfm (sngisdn_event_data_t *sngisdn_event);
361 void sngisdn_process_rst_cfm (sngisdn_event_data_t *sngisdn_event);
362 void sngisdn_process_rst_ind (sngisdn_event_data_t *sngisdn_event);
363
364 void sngisdn_rcv_phy_ind(SuId suId, Reason reason);
365 void sngisdn_rcv_q921_ind(BdMngmt *status);
366
367 void sngisdn_trace_interpreted_q921(sngisdn_span_data_t *signal_data, ftdm_trace_dir_t dir, uint8_t *data, uint32_t data_len);
368 void sngisdn_trace_interpreted_q931(sngisdn_span_data_t *signal_data, ftdm_trace_dir_t dir, uint8_t *data, uint32_t data_len);
369 void sngisdn_trace_raw_q921(sngisdn_span_data_t *signal_data, ftdm_trace_dir_t dir, uint8_t *data, uint32_t data_len);
370 void sngisdn_trace_raw_q931(sngisdn_span_data_t *signal_data, ftdm_trace_dir_t dir, uint8_t *data, uint32_t data_len);
371
372 void get_memory_info(void);
373
374 ftdm_status_t sng_isdn_activate_trace(ftdm_span_t *span, sngisdn_tracetype_t trace_opt);
375 ftdm_status_t sngisdn_check_free_ids(void);
376
377 void sngisdn_rcv_q921_trace(BdMngmt *trc, Buffer *mBuf);
378 void sngisdn_rcv_q931_ind(InMngmt *status);
379 void sngisdn_rcv_q931_trace(InMngmt *trc, Buffer *mBuf);
380 void sngisdn_rcv_cc_ind(CcMngmt *status);
381 void sngisdn_rcv_sng_log(uint8_t level, char *fmt,...);
382 void sngisdn_rcv_sng_assert(char *message);
383
384 #ifdef NETBORDER_CALL_REF
385 ftdm_status_t get_callref(ftdm_channel_t *ftdmchan, BCCallRef* callRef);
386 #endif
387 ftdm_status_t get_calling_num(ftdm_channel_t *ftdmchan, CgPtyNmb *cgPtyNmb);
388 ftdm_status_t get_calling_num2(ftdm_channel_t *ftdmchan, CgPtyNmb *cgPtyNmb);
389 ftdm_status_t get_called_num(ftdm_channel_t *ftdmchan, CdPtyNmb *cdPtyNmb);
390 ftdm_status_t get_redir_num(ftdm_channel_t *ftdmchan, RedirNmb *redirNmb);
391 ftdm_status_t get_calling_name_from_display(ftdm_channel_t *ftdmchan, Display *display);
392 ftdm_status_t get_calling_name_from_usr_usr(ftdm_channel_t *ftdmchan, UsrUsr *usrUsr);
393 ftdm_status_t get_calling_subaddr(ftdm_channel_t *ftdmchan, CgPtySad *cgPtySad);
394 ftdm_status_t get_prog_ind_ie(ftdm_channel_t *ftdmchan, ProgInd *progInd);
395 ftdm_status_t get_facility_ie(ftdm_channel_t *ftdmchan, FacilityStr *facilityStr);
396 ftdm_status_t get_facility_ie_str(ftdm_channel_t *ftdmchan, uint8_t *data, uint8_t data_len);
397
398 ftdm_status_t set_calling_num(ftdm_channel_t *ftdmchan, CgPtyNmb *cgPtyNmb);
399 ftdm_status_t set_calling_num2(ftdm_channel_t *ftdmchan, CgPtyNmb *cgPtyNmb);
400 ftdm_status_t set_called_num(ftdm_channel_t *ftdmchan, CdPtyNmb *cdPtyNmb);
401 ftdm_status_t set_redir_num(ftdm_channel_t *ftdmchan, RedirNmb *redirNmb);
402 ftdm_status_t set_calling_name(ftdm_channel_t *ftdmchan, ConEvnt *conEvnt);
403 ftdm_status_t set_calling_subaddr(ftdm_channel_t *ftdmchan, CgPtySad *cgPtySad);
404 ftdm_status_t set_prog_ind_ie(ftdm_channel_t *ftdmchan, ProgInd *progInd, ftdm_sngisdn_progind_t prog_ind);
405 ftdm_status_t set_bear_cap_ie(ftdm_channel_t *ftdmchan, BearCap *bearCap);
406 ftdm_status_t set_chan_id_ie(ftdm_channel_t *ftdmchan, ChanId *chanId);
407 ftdm_status_t set_restart_ind_ie(ftdm_channel_t *ftdmchan, RstInd *rstInd);
408 ftdm_status_t set_facility_ie(ftdm_channel_t *ftdmchan, FacilityStr *facilityStr);
409 ftdm_status_t set_facility_ie_str(ftdm_channel_t *ftdmchan, uint8_t *data, uint8_t *data_len);
410
411 uint8_t sngisdn_get_infoTranCap_from_user(ftdm_bearer_cap_t bearer_capability);
412 uint8_t sngisdn_get_usrInfoLyr1Prot_from_user(ftdm_user_layer1_prot_t layer1_prot);
413 ftdm_bearer_cap_t sngisdn_get_infoTranCap_from_stack(uint8_t bearer_capability);
414 ftdm_user_layer1_prot_t sngisdn_get_usrInfoLyr1Prot_from_stack(uint8_t layer1_prot);
415
416 static __inline__ uint32_t sngisdn_test_flag(sngisdn_chan_data_t *sngisdn_info, sngisdn_flag_t flag)
417 {
418 return (uint32_t) sngisdn_info->flags & flag;
419 }
420 static __inline__ void sngisdn_clear_flag(sngisdn_chan_data_t *sngisdn_info, sngisdn_flag_t flag)
421 {
422 sngisdn_info->flags &= ~flag;
423 }
424
425 static __inline__ void sngisdn_set_flag(sngisdn_chan_data_t *sngisdn_info, sngisdn_flag_t flag)
426 {
427 sngisdn_info->flags |= flag;
428 }
429
430 #define sngisdn_set_trace_flag(obj, flag) ((obj)->trace_flags |= (flag))
431 #define sngisdn_clear_trace_flag(obj, flag) ((obj)->trace_flags &= ~(flag))
432 #define sngisdn_test_trace_flag(obj, flag) ((obj)->trace_flags & flag)
433
434
435 void handle_sng_log(uint8_t level, char *fmt,...);
436 void sngisdn_delayed_setup(void* p_sngisdn_info);
437 void sngisdn_delayed_release(void* p_sngisdn_info);
438 void sngisdn_delayed_connect(void* p_sngisdn_info);
439 void sngisdn_delayed_disconnect(void* p_sngisdn_info);
440 void sngisdn_facility_timeout(void* p_sngisdn_info);
441 void sngisdn_t3_timeout(void* p_sngisdn_info);
442
443
444 ftdm_status_t sngisdn_stack_cfg(ftdm_span_t *span);
445 ftdm_status_t sngisdn_stack_start(ftdm_span_t *span);
446 ftdm_status_t sngisdn_stack_stop(ftdm_span_t *span);
447 ftdm_status_t sngisdn_wake_up_phy(ftdm_span_t *span);
448
449 void sngisdn_print_phy_stats(ftdm_stream_handle_t *stream, ftdm_span_t *span);
450 void sngisdn_print_spans(ftdm_stream_handle_t *stream);
451 void sngisdn_print_span(ftdm_stream_handle_t *stream, ftdm_span_t *span);
452
453 #endif
454
455
456
457
458
459
460
461
462
463
464
465
466