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 #include <stdint.h>
42 #include <unistd.h>
43 #include <ctype.h>
44
45 #include "private/ftdm_core.h"
46
47 #include <sng_isdn.h>
48
49
50
51
52 #define MAX_SPANS_PER_NFAS_LINK 8
53 #define NUM_E1_CHANNELS_PER_SPAN 32
54 #define NUM_T1_CHANNELS_PER_SPAN 24
55 #define NUM_BRI_CHANNELS_PER_SPAN 2
56 #define SNGISDN_EVENT_QUEUE_SIZE 100
57 #define SNGISDN_EVENT_POLL_RATE 100
58
59
60
61 typedef enum {
62 FLAG_RESET_RX = (1 << 0),
63 FLAG_RESET_TX = (1 << 1),
64 FLAG_REMOTE_REL = (1 << 2),
65 FLAG_LOCAL_REL = (1 << 3),
66 FLAG_REMOTE_ABORT = (1 << 4),
67 FLAG_LOCAL_ABORT = (1 << 5),
68 FLAG_GLARE = (1 << 6),
69 FLAG_DELAYED_REL = (1 << 7),
70 FLAG_SENT_PROCEED = (1 << 8),
71 FLAG_SEND_DISC = (1 << 9),
72 } sngisdn_flag_t;
73
74
75 typedef enum {
76 SNGISDN_SWITCH_INVALID = 0,
77 SNGISDN_SWITCH_NI2 ,
78 SNGISDN_SWITCH_5ESS,
79 SNGISDN_SWITCH_4ESS,
80 SNGISDN_SWITCH_DMS100,
81 SNGISDN_SWITCH_EUROISDN,
82 SNGISDN_SWITCH_QSIG,
83 SNGISDN_SWITCH_INSNET,
84 } sngisdn_switchtype_t;
85
86 typedef enum {
87 SNGISDN_SIGNALING_INVALID = 0,
88 SNGISDN_SIGNALING_CPE ,
89 SNGISDN_SIGNALING_NET,
90 } sngisdn_signalingtype_t;
91
92 typedef enum {
93 SNGISDN_TRACE_DISABLE = 0,
94 SNGISDN_TRACE_Q921 = 1,
95 SNGISDN_TRACE_Q931 = 2,
96 } sngisdn_tracetype_t;
97
98 typedef enum {
99 SNGISDN_OPT_DEFAULT = 0,
100 SNGISDN_OPT_TRUE = 1,
101 SNGISDN_OPT_FALSE = 2,
102 } sngisdn_opt_t;
103
104
105 typedef enum {
106 SNGISDN_AVAIL_DOWN = 1,
107 SNGISDN_AVAIL_PWR_SAVING = 5,
108 SNGISDN_AVAIL_UP = 10,
109 } sngisdn_avail_t;
110
111 typedef enum {
112 SNGISDN_EVENT_CON_IND = 1,
113 SNGISDN_EVENT_CON_CFM,
114 SNGISDN_EVENT_CNST_IND,
115 SNGISDN_EVENT_DISC_IND,
116 SNGISDN_EVENT_REL_IND,
117 SNGISDN_EVENT_DAT_IND,
118 SNGISDN_EVENT_SSHL_IND,
119 SNGISDN_EVENT_SSHL_CFM,
120 SNGISDN_EVENT_RMRT_IND,
121 SNGISDN_EVENT_RMRT_CFM,
122 SNGISDN_EVENT_FLC_IND,
123 SNGISDN_EVENT_FAC_IND,
124 SNGISDN_EVENT_STA_CFM,
125 SNGISDN_EVENT_SRV_IND,
126 SNGISDN_EVENT_SRV_CFM,
127 SNGISDN_EVENT_RST_CFM,
128 SNGISDN_EVENT_RST_IND,
129 } ftdm_sngisdn_event_id_t;
130
131
132 #define SNGISDN_NUM_TIMERS 1
133
134 typedef enum {
135 SNGISDN_TIMER_FACILITY = 0,
136 } ftdm_sngisdn_timer_t;
137
138 typedef struct sngisdn_glare_data {
139 int16_t suId;
140 uint32_t suInstId;
141 uint32_t spInstId;
142 int16_t dChan;
143 ConEvnt setup;
144 uint8_t ces;
145 }sngisdn_glare_data_t;
146
147
148
149 typedef struct sngisdn_chan_data {
150 ftdm_channel_t *ftdmchan;
151 uint32_t flags;
152 uint8_t ces;
153 uint8_t dchan_id;
154 uint32_t suInstId;
155 uint32_t spInstId;
156
157 uint8_t globalFlg;
158 sngisdn_glare_data_t glare;
159 ftdm_timer_id_t timers[SNGISDN_NUM_TIMERS];
160 } sngisdn_chan_data_t;
161
162
163 typedef struct sngisdn_span_data {
164 ftdm_span_t *ftdm_span;
165 uint8_t link_id;
166 uint8_t switchtype;
167 uint8_t signalling;
168 uint8_t cc_id;
169 uint8_t dchan_id;
170 uint8_t span_id;
171 uint8_t tei;
172 uint8_t min_digits;
173 uint8_t trace_flags;
174 uint8_t overlap_dial;
175 uint8_t setup_arb;
176 uint8_t facility;
177 int8_t facility_timeout;
178 ftdm_sched_t *sched;
179 ftdm_queue_t *event_queue;
180 } sngisdn_span_data_t;
181
182 typedef struct sngisdn_event_data {
183
184 int16_t suId;
185 int16_t dChan;
186 uint32_t suInstId;
187 uint32_t spInstId;
188 uint8_t ces;
189 uint8_t action;
190 uint8_t evntType;
191
192 sngisdn_chan_data_t *sngisdn_info;
193 sngisdn_span_data_t *signal_data;
194
195 ftdm_sngisdn_event_id_t event_id;
196
197 union
198 {
199 ConEvnt conEvnt;
200 CnStEvnt cnStEvnt;
201 DiscEvnt discEvnt;
202 RelEvnt relEvnt;
203 InfoEvnt infoEvnt;
204 SsHlEvnt ssHlEvnt;
205 RmRtEvnt rmRtEvnt;
206 StaEvnt staEvnt;
207 FacEvnt facEvnt;
208 Srv srvEvnt;
209 Rst rstEvnt;
210 }event;
211
212 } sngisdn_event_data_t;
213
214
215 typedef struct sngisdn_dchan_data {
216 uint8_t num_spans;
217 sngisdn_span_data_t *spans[MAX_L1_LINKS+1];
218 uint16_t num_chans;
219
220
221
222
223
224
225 sngisdn_chan_data_t *channels[MAX_SPANS_PER_NFAS_LINK*NUM_T1_CHANNELS_PER_SPAN];
226 }sngisdn_dchan_data_t;
227
228 typedef struct sngisdn_cc {
229
230 uint8_t config_done;
231 uint8_t activation_done;
232 uint8_t switchtype;
233 ftdm_trunk_type_t trunktype;
234 uint32_t last_suInstId;
235 ftdm_mutex_t *mutex;
236 sngisdn_chan_data_t *active_spInstIds[MAX_INSTID+1];
237 sngisdn_chan_data_t *active_suInstIds[MAX_INSTID+1];
238 }sngisdn_cc_t;
239
240
241 typedef struct ftdm_sngisdn_data {
242 uint8_t gen_config_done;
243 uint8_t num_cc;
244 struct sngisdn_cc ccs[MAX_VARIANTS+1];
245 uint8_t num_dchan;
246 sngisdn_dchan_data_t dchans[MAX_L1_LINKS+1];
247 sngisdn_span_data_t *spans[MAX_L1_LINKS+1];
248 }ftdm_sngisdn_data_t;
249
250
251
252 #define ISDN_FUNC_TRACE_ENTER(a)
253 #define ISDN_FUNC_TRACE_EXIT(a)
254
255
256 extern ftdm_sngisdn_data_t g_sngisdn_data;
257
258
259 ftdm_status_t ftmod_isdn_parse_cfg(ftdm_conf_parameter_t *ftdm_parameters, ftdm_span_t *span);
260
261
262 uint32_t get_unique_suInstId(uint8_t cc_id);
263 void clear_call_data(sngisdn_chan_data_t *sngisdn_info);
264 void clear_call_glare_data(sngisdn_chan_data_t *sngisdn_info);
265
266
267 void stack_hdr_init(Header *hdr);
268 void stack_pst_init(Pst *pst);
269 ftdm_status_t get_ftdmchan_by_spInstId(uint8_t cc_id, uint32_t spInstId, sngisdn_chan_data_t **sngisdn_data);
270 ftdm_status_t get_ftdmchan_by_suInstId(uint8_t cc_id, uint32_t suInstId, sngisdn_chan_data_t **sngisdn_data);
271 ftdm_status_t sng_isdn_set_avail_rate(ftdm_span_t *ftdmspan, sngisdn_avail_t avail);
272
273
274 void sngisdn_snd_setup(ftdm_channel_t *ftdmchan);
275 void sngisdn_snd_setup_ack(ftdm_channel_t *ftdmchan);
276 void sngisdn_snd_proceed(ftdm_channel_t *ftdmchan);
277 void sngisdn_snd_progress(ftdm_channel_t *ftdmchan);
278 void sngisdn_snd_alert(ftdm_channel_t *ftdmchan);
279 void sngisdn_snd_connect(ftdm_channel_t *ftdmchan);
280 void sngisdn_snd_disconnect(ftdm_channel_t *ftdmchan);
281 void sngisdn_snd_release(ftdm_channel_t *ftdmchan, uint8_t glare);
282 void sngisdn_snd_reset(ftdm_channel_t *ftdmchan);
283 void sngisdn_snd_con_complete(ftdm_channel_t *ftdmchan);
284 void sngisdn_snd_info_req(ftdm_channel_t *ftdmchan);
285 void sngisdn_snd_status_enq(ftdm_channel_t *ftdmchan);
286
287
288 void sngisdn_rcv_con_ind (int16_t suId, uint32_t suInstId, uint32_t spInstId, ConEvnt *conEvnt, int16_t dChan, uint8_t ces);
289 void sngisdn_rcv_con_cfm (int16_t suId, uint32_t suInstId, uint32_t spInstId, CnStEvnt *cnStEvnt, int16_t dChan, uint8_t ces);
290 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);
291 void sngisdn_rcv_disc_ind (int16_t suId, uint32_t suInstId, uint32_t spInstId, DiscEvnt *discEvnt);
292 void sngisdn_rcv_rel_ind (int16_t suId, uint32_t suInstId, uint32_t spInstId, RelEvnt *relEvnt);
293 void sngisdn_rcv_dat_ind (int16_t suId, uint32_t suInstId, uint32_t spInstId, InfoEvnt *infoEvnt);
294 void sngisdn_rcv_sshl_ind (int16_t suId, uint32_t suInstId, uint32_t spInstId, SsHlEvnt *ssHlEvnt, uint8_t action);
295 void sngisdn_rcv_sshl_cfm (int16_t suId, uint32_t suInstId, uint32_t spInstId, SsHlEvnt *ssHlEvnt, uint8_t action);
296 void sngisdn_rcv_rmrt_ind (int16_t suId, uint32_t suInstId, uint32_t spInstId, RmRtEvnt *rmRtEvnt, uint8_t action);
297 void sngisdn_rcv_rmrt_cfm (int16_t suId, uint32_t suInstId, uint32_t spInstId, RmRtEvnt *rmRtEvnt, uint8_t action);
298 void sngisdn_rcv_flc_ind (int16_t suId, uint32_t suInstId, uint32_t spInstId, StaEvnt *staEvnt);
299 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);
300 void sngisdn_rcv_sta_cfm ( int16_t suId, uint32_t suInstId, uint32_t spInstId, StaEvnt *staEvnt);
301 void sngisdn_rcv_srv_ind ( int16_t suId, Srv *srvEvnt, int16_t dChan, uint8_t ces);
302 void sngisdn_rcv_srv_cfm ( int16_t suId, Srv *srvEvnt, int16_t dChan, uint8_t ces);
303 void sngisdn_rcv_rst_cfm ( int16_t suId, Rst *rstEvnt, int16_t dChan, uint8_t ces, uint8_t evntType);
304 void sngisdn_rcv_rst_ind ( int16_t suId, Rst *rstEvnt, int16_t dChan, uint8_t ces, uint8_t evntType);
305
306 void sngisdn_process_con_ind (sngisdn_event_data_t *sngisdn_event);
307 void sngisdn_process_con_cfm (sngisdn_event_data_t *sngisdn_event);
308 void sngisdn_process_cnst_ind (sngisdn_event_data_t *sngisdn_event);
309 void sngisdn_process_disc_ind (sngisdn_event_data_t *sngisdn_event);
310 void sngisdn_process_rel_ind (sngisdn_event_data_t *sngisdn_event);
311 void sngisdn_process_dat_ind (sngisdn_event_data_t *sngisdn_event);
312 void sngisdn_process_sshl_ind (sngisdn_event_data_t *sngisdn_event);
313 void sngisdn_process_sshl_cfm (sngisdn_event_data_t *sngisdn_event);
314 void sngisdn_process_rmrt_ind (sngisdn_event_data_t *sngisdn_event);
315 void sngisdn_process_rmrt_cfm (sngisdn_event_data_t *sngisdn_event);
316 void sngisdn_process_flc_ind (sngisdn_event_data_t *sngisdn_event);
317 void sngisdn_process_fac_ind (sngisdn_event_data_t *sngisdn_event);
318 void sngisdn_process_sta_cfm (sngisdn_event_data_t *sngisdn_event);
319
320 void sngisdn_process_srv_ind (sngisdn_event_data_t *sngisdn_event);
321 void sngisdn_process_srv_cfm (sngisdn_event_data_t *sngisdn_event);
322 void sngisdn_process_rst_cfm (sngisdn_event_data_t *sngisdn_event);
323 void sngisdn_process_rst_ind (sngisdn_event_data_t *sngisdn_event);
324
325 void sngisdn_rcv_phy_ind(SuId suId, Reason reason);
326 void sngisdn_rcv_q921_ind(BdMngmt *status);
327 void sngisdn_rcv_q921_trace(BdMngmt *trc, Buffer *mBuf);
328 void sngisdn_rcv_q931_ind(InMngmt *status);
329 void sngisdn_rcv_q931_trace(InMngmt *trc, Buffer *mBuf);
330 void sngisdn_rcv_cc_ind(CcMngmt *status);
331 void sngisdn_rcv_sng_log(uint8_t level, char *fmt,...);
332 void sngisdn_rcv_sng_assert(char *message);
333
334 uint8_t sngisdn_get_infoTranCap_from_stack(ftdm_bearer_cap_t bearer_capability);
335 uint8_t sngisdn_get_usrInfoLyr1Prot_from_stack(ftdm_user_layer1_prot_t layer1_prot);
336 ftdm_bearer_cap_t sngisdn_get_infoTranCap_from_user(uint8_t bearer_capability);
337 ftdm_user_layer1_prot_t sngisdn_get_usrInfoLyr1Prot_from_user(uint8_t layer1_prot);
338
339 static __inline__ uint32_t sngisdn_test_flag(sngisdn_chan_data_t *sngisdn_info, sngisdn_flag_t flag)
340 {
341 return (uint32_t) sngisdn_info->flags & flag;
342 }
343 static __inline__ void sngisdn_clear_flag(sngisdn_chan_data_t *sngisdn_info, sngisdn_flag_t flag)
344 {
345 sngisdn_info->flags &= ~flag;
346 }
347
348 static __inline__ void sngisdn_set_flag(sngisdn_chan_data_t *sngisdn_info, sngisdn_flag_t flag)
349 {
350 sngisdn_info->flags |= flag;
351 }
352
353 #define sngisdn_set_trace_flag(obj, flag) ((obj)->trace_flags |= (flag))
354 #define sngisdn_clear_trace_flag(obj, flag) ((obj)->trace_flags &= ~(flag))
355 #define sngisdn_test_trace_flag(obj, flag) ((obj)->trace_flags & flag)
356
357
358 void handle_sng_log(uint8_t level, char *fmt,...);
359 void sngisdn_set_span_sig_status(ftdm_span_t *ftdmspan, ftdm_signaling_status_t status);
360 void sngisdn_delayed_release(void* p_sngisdn_info);
361 void sngisdn_delayed_connect(void* p_sngisdn_info);
362 void sngisdn_delayed_disconnect(void* p_sngisdn_info);
363 void sngisdn_facility_timeout(void* p_sngisdn_info);
364
365
366 ftdm_status_t sng_isdn_stack_cfg(ftdm_span_t *span);
367 ftdm_status_t sng_isdn_stack_start(ftdm_span_t *span);
368 ftdm_status_t sng_isdn_stack_stop(ftdm_span_t *span);
369
370 void sngisdn_print_phy_stats(ftdm_stream_handle_t *stream, ftdm_span_t *span);
371 void sngisdn_print_spans(ftdm_stream_handle_t *stream);
372 void sngisdn_print_span(ftdm_stream_handle_t *stream, ftdm_span_t *span);
373
374 #endif
375