root/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_cfg.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. add_local_number
  2. parse_switchtype
  3. parse_signalling
  4. ftmod_isdn_parse_cfg

   1 /*
   2  * Copyright (c) 2010, Sangoma Technologies
   3  * David Yat Sin <davidy@sangoma.com>
   4  * All rights reserved.
   5  *
   6  * Redistribution and use in source and binary forms, with or without
   7  * modification, are permitted provided that the following conditions
   8  * are met:
   9  *
  10  * * Redistributions of source code must retain the above copyright
  11  * notice, this list of conditions and the following disclaimer.
  12  *
  13  * * Redistributions in binary form must reproduce the above copyright
  14  * notice, this list of conditions and the following disclaimer in the
  15  * documentation and/or other materials provided with the distribution.
  16  *
  17  * * Neither the name of the original author; nor the names of any contributors
  18  * may be used to endorse or promote products derived from this software
  19  * without specific prior written permission.
  20  *
  21  *
  22  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  23  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  24  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  25  * A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER
  26  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  27  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  28  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  29  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  30  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  31  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  32  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  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                          /* can be > 1 for some BRI variants */
 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         /* see if we have profile with this switch_type already */
 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         /* need to create a new switch_type */
 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         /* add this span to its ent_cc */
 123         signal_data->cc_id = i;
 124 
 125         /* create a new dchan */ /* for NFAS - no-dchan on b-channels only links */
 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         /* Add the channels to the span */
 140         for (i=1;i<=span->chan_count;i++) {
 141                 unsigned chan_id;
 142                 ftdm_channel_t *ftdmchan = span->channels[i];
 143                 /* NFAS is not supported on E1, so span_id will always be 1 for E1 so this will work for E1 as well */
 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         /* Set defaults here */
 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         /* Cannot set default bearer_layer1 yet, as we do not know the switchtype */
 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 /* For Emacs:
 306  * Local Variables:
 307  * mode:c
 308  * indent-tabs-mode:t
 309  * tab-width:4
 310  * c-basic-offset:4
 311  * End:
 312  * For VIM:
 313  * vim:set softtabstop=4 shiftwidth=4 tabstop=4:
 314  */

/* [<][>][^][v][top][bottom][index][help] */