This source file includes following definitions.
- add_local_number
- parse_switchtype
- parse_signalling
- ftmod_isdn_parse_cfg
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 #include "ftmod_sangoma_isdn.h"
36
37 ftdm_status_t parse_switchtype(const char* switch_name, ftdm_span_t *span);
38 ftdm_status_t parse_signalling(const char* signalling, ftdm_span_t *span);
39 ftdm_status_t add_local_number(const char* val, ftdm_span_t *span);
40
41 extern ftdm_sngisdn_data_t g_sngisdn_data;
42
43 ftdm_status_t add_local_number(const char* val, ftdm_span_t *span)
44 {
45 sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*) span->signal_data;
46
47 if (signal_data->num_local_numbers >= SNGISDN_NUM_LOCAL_NUMBERS) {
48 ftdm_log(FTDM_LOG_ERROR, "%s: Maximum number of local-numbers exceeded (max:%d)\n", span->name, SNGISDN_NUM_LOCAL_NUMBERS);
49 return FTDM_FAIL;
50 }
51
52 signal_data->local_numbers[signal_data->num_local_numbers++] = ftdm_strdup(val);
53 return FTDM_SUCCESS;
54 }
55
56 ftdm_status_t parse_switchtype(const char* switch_name, ftdm_span_t *span)
57 {
58 unsigned i;
59
60 sngisdn_dchan_data_t *dchan_data;
61 sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*) span->signal_data;
62 switch(span->trunk_type) {
63 case FTDM_TRUNK_T1:
64 if (!strcasecmp(switch_name, "ni2") ||
65 !strcasecmp(switch_name, "national")) {
66 signal_data->switchtype = SNGISDN_SWITCH_NI2;
67 } else if (!strcasecmp(switch_name, "5ess")) {
68 signal_data->switchtype = SNGISDN_SWITCH_5ESS;
69 } else if (!strcasecmp(switch_name, "4ess")) {
70 signal_data->switchtype = SNGISDN_SWITCH_4ESS;
71 } else if (!strcasecmp(switch_name, "dms100")) {
72 signal_data->switchtype = SNGISDN_SWITCH_DMS100;
73 } else {
74 ftdm_log(FTDM_LOG_ERROR, "%s:Unsupported switchtype %s for trunktype:%s\n", span->name, switch_name, ftdm_trunk_type2str(span->trunk_type));
75 return FTDM_FAIL;
76 }
77 break;
78 case FTDM_TRUNK_E1:
79 if (!strcasecmp(switch_name, "euroisdn") ||
80 !strcasecmp(switch_name, "etsi")) {
81 signal_data->switchtype = SNGISDN_SWITCH_EUROISDN;
82 } else if (!strcasecmp(switch_name, "qsig")) {
83 signal_data->switchtype = SNGISDN_SWITCH_QSIG;
84 } else {
85 ftdm_log(FTDM_LOG_ERROR, "%s:Unsupported switchtype %s for trunktype:%s\n", span->name, switch_name, ftdm_trunk_type2str(span->trunk_type));
86 return FTDM_FAIL;
87 }
88 break;
89 case FTDM_TRUNK_BRI:
90 case FTDM_TRUNK_BRI_PTMP:
91 if (!strcasecmp(switch_name, "euroisdn") ||
92 !strcasecmp(switch_name, "etsi")) {
93 signal_data->switchtype = SNGISDN_SWITCH_EUROISDN;
94 } else if (!strcasecmp(switch_name, "insnet") ||
95 !strcasecmp(switch_name, "ntt")) {
96 signal_data->switchtype = SNGISDN_SWITCH_INSNET;
97 } else {
98 ftdm_log(FTDM_LOG_ERROR, "%s:Unsupported switchtype %s for trunktype:%s\n", span->name, switch_name, ftdm_trunk_type2str(span->trunk_type));
99 return FTDM_FAIL;
100 }
101
102 break;
103 default:
104 ftdm_log(FTDM_LOG_ERROR, "%s:Unsupported trunktype:%s\n", span->name, switch_name, ftdm_trunk_type2str(span->trunk_type));
105 return FTDM_FAIL;
106 }
107
108 for (i=1; i <= g_sngisdn_data.num_cc; i++) {
109 if (g_sngisdn_data.ccs[i].switchtype == signal_data->switchtype &&
110 g_sngisdn_data.ccs[i].trunktype == span->trunk_type) {
111 break;
112 }
113 }
114
115 if (i > g_sngisdn_data.num_cc) {
116 g_sngisdn_data.num_cc++;
117 g_sngisdn_data.ccs[i].switchtype = signal_data->switchtype;
118 g_sngisdn_data.ccs[i].trunktype = span->trunk_type;
119 ftdm_log(FTDM_LOG_DEBUG, "%s: New switchtype:%s cc_id:%u\n", span->name, switch_name, i);
120 }
121
122
123 signal_data->cc_id = i;
124
125
126 g_sngisdn_data.num_dchan++;
127 signal_data->dchan_id = g_sngisdn_data.num_dchan;
128
129 dchan_data = &g_sngisdn_data.dchans[signal_data->dchan_id];
130 dchan_data->num_spans++;
131
132 signal_data->span_id = dchan_data->num_spans;
133 dchan_data->spans[signal_data->span_id] = signal_data;
134
135 g_sngisdn_data.spans[signal_data->link_id] = signal_data;
136
137 ftdm_log(FTDM_LOG_DEBUG, "%s: cc_id:%d dchan_id:%d span_id:%d\n", span->name, signal_data->cc_id, signal_data->dchan_id, signal_data->span_id);
138
139
140 for (i=1;i<=span->chan_count;i++) {
141 unsigned chan_id;
142 ftdm_channel_t *ftdmchan = span->channels[i];
143
144 chan_id = ((signal_data->span_id-1)*NUM_T1_CHANNELS_PER_SPAN)+ftdmchan->physical_chan_id;
145 dchan_data->channels[chan_id] = (sngisdn_chan_data_t*)ftdmchan->call_data;
146 dchan_data->num_chans++;
147 }
148
149 return FTDM_SUCCESS;
150 }
151
152 ftdm_status_t parse_signalling(const char* signalling, ftdm_span_t *span)
153 {
154 sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*) span->signal_data;
155 if (!strcasecmp(signalling, "net") ||
156 !strcasecmp(signalling, "pri_net")||
157 !strcasecmp(signalling, "bri_net")) {
158
159 signal_data->signalling = SNGISDN_SIGNALING_NET;
160 } else if (!strcasecmp(signalling, "cpe") ||
161 !strcasecmp(signalling, "pri_cpe")||
162 !strcasecmp(signalling, "bri_cpe")) {
163
164 signal_data->signalling = SNGISDN_SIGNALING_CPE;
165 } else {
166 ftdm_log(FTDM_LOG_ERROR, "Unsupported signalling/interface %s\n", signalling);
167 return FTDM_FAIL;
168 }
169 return FTDM_SUCCESS;
170 }
171
172 ftdm_status_t ftmod_isdn_parse_cfg(ftdm_conf_parameter_t *ftdm_parameters, ftdm_span_t *span)
173 {
174 unsigned paramindex;
175 const char *var, *val;
176 sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*) span->signal_data;
177
178 signal_data->tei = 0;
179 signal_data->min_digits = 8;
180 signal_data->overlap_dial = SNGISDN_OPT_DEFAULT;
181 signal_data->setup_arb = SNGISDN_OPT_DEFAULT;
182
183 signal_data->link_id = span->span_id;
184 span->default_caller_data.bearer_capability = IN_ITC_SPEECH;
185
186
187 span->default_caller_data.bearer_layer1 = FTDM_INVALID_INT_PARM;
188
189 if (span->trunk_type == FTDM_TRUNK_BRI ||
190 span->trunk_type == FTDM_TRUNK_BRI_PTMP) {
191
192 ftdm_span_set_npi("unknown", &span->default_caller_data.dnis.plan);
193 ftdm_span_set_ton("unknown", &span->default_caller_data.dnis.type);
194 ftdm_span_set_npi("unknown", &span->default_caller_data.cid_num.plan);
195 ftdm_span_set_ton("unknown", &span->default_caller_data.cid_num.type);
196 ftdm_span_set_npi("unknown", &span->default_caller_data.rdnis.plan);
197 ftdm_span_set_ton("unknown", &span->default_caller_data.rdnis.type);
198 } else {
199 ftdm_span_set_npi("e164", &span->default_caller_data.dnis.plan);
200 ftdm_span_set_ton("national", &span->default_caller_data.dnis.type);
201 ftdm_span_set_npi("e164", &span->default_caller_data.cid_num.plan);
202 ftdm_span_set_ton("national", &span->default_caller_data.cid_num.type);
203 ftdm_span_set_npi("e164", &span->default_caller_data.rdnis.plan);
204 ftdm_span_set_ton("national", &span->default_caller_data.rdnis.type);
205 }
206
207 for (paramindex = 0; ftdm_parameters[paramindex].var; paramindex++) {
208 ftdm_log(FTDM_LOG_DEBUG, "Sangoma ISDN key=value, %s=%s\n", ftdm_parameters[paramindex].var, ftdm_parameters[paramindex].val);
209 var = ftdm_parameters[paramindex].var;
210 val = ftdm_parameters[paramindex].val;
211
212 if (!strcasecmp(var, "switchtype")) {
213 if (parse_switchtype(val, span) != FTDM_SUCCESS) {
214 return FTDM_FAIL;
215 }
216 } else if (!strcasecmp(var, "signalling") ||
217 !strcasecmp(var, "interface")) {
218 if (parse_signalling(val, span) != FTDM_SUCCESS) {
219 return FTDM_FAIL;
220 }
221 } else if (!strcasecmp(var, "tei")) {
222 uint8_t tei = atoi(val);
223 if (tei > 127) {
224 ftdm_log(FTDM_LOG_ERROR, "Invalid TEI %d, valid values are (0-127)", tei);
225 return FTDM_FAIL;
226 }
227 signal_data->tei = tei;
228 } else if (!strcasecmp(var, "overlap")) {
229 if (!strcasecmp(val, "yes")) {
230 signal_data->overlap_dial = SNGISDN_OPT_TRUE;
231 } else if (!strcasecmp(val, "no")) {
232 signal_data->overlap_dial = SNGISDN_OPT_FALSE;
233 } else {
234 ftdm_log(FTDM_LOG_ERROR, "Invalid value for parameter:%s:%s\n", var, val);
235 }
236 } else if (!strcasecmp(var, "setup arbitration")) {
237 if (!strcasecmp(val, "yes")) {
238 signal_data->setup_arb = SNGISDN_OPT_TRUE;
239 } else if (!strcasecmp(val, "no")) {
240 signal_data->setup_arb = SNGISDN_OPT_FALSE;
241 } else {
242 ftdm_log(FTDM_LOG_ERROR, "Invalid value for parameter:%s:%s\n", var, val);
243 }
244 } else if (!strcasecmp(var, "facility")) {
245 if (!strcasecmp(val, "yes")) {
246 signal_data->facility = SNGISDN_OPT_TRUE;
247 } else if (!strcasecmp(val, "no")) {
248 signal_data->facility = SNGISDN_OPT_FALSE;
249 } else {
250 ftdm_log(FTDM_LOG_ERROR, "Invalid value for parameter:%s:%s\n", var, val);
251 }
252 } else if (!strcasecmp(var, "min_digits")) {
253 signal_data->min_digits = atoi(val);
254 } else if (!strcasecmp(var, "outbound-called-ton")) {
255 ftdm_span_set_ton(val, &span->default_caller_data.dnis.type);
256 } else if (!strcasecmp(var, "outbound-called-npi")) {
257 ftdm_span_set_npi(val, &span->default_caller_data.dnis.plan);
258 } else if (!strcasecmp(var, "outbound-calling-ton")) {
259 ftdm_span_set_ton(val, &span->default_caller_data.cid_num.type);
260 } else if (!strcasecmp(var, "outbound-calling-npi")) {
261 ftdm_span_set_npi(val, &span->default_caller_data.cid_num.plan);
262 } else if (!strcasecmp(var, "outbound-rdnis-ton")) {
263 ftdm_span_set_ton(val, &span->default_caller_data.rdnis.type);
264 } else if (!strcasecmp(var, "outbound-rdnis-npi")) {
265 ftdm_span_set_npi(val, &span->default_caller_data.rdnis.plan);
266 } else if (!strcasecmp(var, "outbound-bearer_cap")) {
267 ftdm_span_set_bearer_capability(val, &span->default_caller_data.bearer_capability);
268 } else if (!strcasecmp(var, "outbound-bearer_layer1")) {
269 ftdm_span_set_bearer_layer1(val, &span->default_caller_data.bearer_layer1);
270 } else if (!strcasecmp(var, "local-number")) {
271 if (add_local_number(val, span) != FTDM_SUCCESS) {
272 return FTDM_FAIL;
273 }
274 } else if (!strcasecmp(var, "facility-timeout")) {
275 signal_data->facility_timeout = atoi(val);
276 if (signal_data->facility_timeout < 0) {
277 signal_data->facility_timeout = 0;
278 }
279 } else {
280 ftdm_log(FTDM_LOG_WARNING, "Ignoring unknown parameter %s\n", ftdm_parameters[paramindex].var);
281 }
282 }
283
284 if (signal_data->switchtype == SNGISDN_SWITCH_INVALID) {
285 ftdm_log(FTDM_LOG_ERROR, "%s: switchtype not specified", span->name);
286 return FTDM_FAIL;
287 }
288 if (signal_data->signalling == SNGISDN_SIGNALING_INVALID) {
289 ftdm_log(FTDM_LOG_ERROR, "%s: signalling not specified", span->name);
290 return FTDM_FAIL;
291 }
292
293 if (span->default_caller_data.bearer_layer1 == FTDM_INVALID_INT_PARM) {
294 if (signal_data->switchtype == SNGISDN_SWITCH_EUROISDN) {
295 span->default_caller_data.bearer_layer1 = IN_UIL1_G711ULAW;
296 } else {
297 span->default_caller_data.bearer_layer1 = IN_UIL1_G711ALAW;
298 }
299 }
300 return FTDM_SUCCESS;
301 }
302
303
304
305
306
307
308
309
310
311
312
313
314