📄 config.c
字号:
static int load_config_link(struct ast_config *cfg, char* cat){ struct ast_variable *v; char *p; char *spec; char *link_name = &cat[strlen("link-")]; char chan_spec_buf[100] = {0,}; struct linkset* linkset = NULL; struct link* link = &links[n_links]; int lastcic = 0; int has_linkset = 0, has_enabled = 0, has_firstcic = 0, has_channels = 0, has_schannel = 0; if (lookup_link(link_name)) { ast_log(LOG_ERROR, "Links '%s' defined twice.\n", link_name); return -1; } if (n_links == MAX_LINKS) { ast_log(LOG_ERROR, "Too many links defined while parsing config for link '%s' (max %d).\n", link_name, MAX_LINKS); return -1; } link->send_sltm = 1; link->auto_block = 0; /* Echo cancellation default values */ link->echocancel = EC_DISABLED; link->echocan_taps = 128; /* echo cancellation taps, 128 default */ link->echocan_train = 300; /* echo cancellation training, 300ms default */ link->mtp = NULL; link->initial_alignment = 1; *link->mtp3server_host = 0; *link->mtp3server_port = 0; link->mtp3fd = -1; v = ast_variable_browse(cfg, cat); while(v != NULL) { if(0 == strcasecmp(v->name, "linkset")) { linkset = lookup_linkset(v->value); if (!linkset) { ast_log(LOG_ERROR, "Linkset '%s' not found while parsing link '%s'.\n", v->value, link_name); return -1; } has_linkset = 1; } else if(0 == strcasecmp(v->name, "enabled")) { if ((strcasecmp(v->value, "yes") != 0) && (strcasecmp(v->value, "no") != 0)) { ast_log(LOG_ERROR, "Invalid value '%s' for enabled entry for link '%s'.\n", v->value, link_name); return -1; } link->enabled = strcasecmp(v->value, "yes") == 0; has_enabled = 1; } else if(0 == strcasecmp(v->name, "sltm")) { if ((strcasecmp(v->value, "yes") != 0) && (strcasecmp(v->value, "no") != 0)) { ast_log(LOG_ERROR, "Invalid value '%s' for sltm entry for link '%s'.\n", v->value, link_name); return -1; } link->send_sltm = strcasecmp(v->value, "yes") == 0; } else if(0 == strcasecmp(v->name, "auto_block")) { if ((strcasecmp(v->value, "yes") != 0) && (strcasecmp(v->value, "no") != 0)) { ast_log(LOG_ERROR, "Invalid value '%s' for auto_block entry for link '%s'.\n", v->value, link_name); return -1; } link->auto_block = strcasecmp(v->value, "yes") == 0; } else if(0 == strcasecmp(v->name, "firstcic")) { if(sscanf(v->value, "%d", &link->first_cic) != 1) { ast_log(LOG_ERROR, "Invalid firstcic entry '%s' for link '%s'.\n", v->value, link_name); return -1; } has_firstcic = 1; } else if(0 == strcasecmp(v->name, "channels")) { link->channelmask = 0; ast_copy_string(chan_spec_buf, v->value, sizeof(chan_spec_buf)); spec = &chan_spec_buf[0]; p = strsep(&spec, ","); while(p && *p) { int i, first, last; if(sscanf(p, "%d-%d", &first, &last) != 2 || first < 0 || first > last || last > 31) { ast_log(LOG_DEBUG, "Channel range '%s' is %d %d \n", p, first,last); ast_log(LOG_ERROR, "Illegal channel range '%s' for " "channel specification for link '%s'.\n", p, link_name); return -1; } for (i = first; i <= last; i++) link->channelmask |= 1 << (i-1); if (last > lastcic) lastcic = last; p = strsep(&spec, ","); } has_channels = 1; } else if(0 == strcasecmp(v->name, "schannel")) { link->schannel = -1; link->remote = 0; if (strcmp(v->value, "")) { char host[128]; char port[128]; if(sscanf(v->value, "%d,%[^:]:%s", &link->schannel, host, port) == 3) { if (!is_mtp3d) link->remote = 1; strcpy(link->mtp3server_host, host); strcpy(link->mtp3server_port, port); } else if(sscanf(v->value, "%d", &link->schannel) != 1) { ast_log(LOG_ERROR, "Invalid schannel entry '%s' for link '%s'.\n", v->value, link_name); return -1; } } has_schannel = 1; } else if(0 == strcasecmp(v->name, "echocancel")) { if (strcasecmp(v->value, "no") == 0) { link->echocancel = EC_DISABLED; } else if (strcasecmp(v->value, "31speech") == 0) { link->echocancel = EC_31SPEECH; } else if (strcasecmp(v->value, "allways") == 0) { link->echocancel = EC_ALLWAYS; } else { ast_log(LOG_ERROR, "Invalid value '%s' for echocancel entry for link '%s'.\n", v->value, link_name); return -1; } } else if(0 == strcasecmp(v->name, "echocan_train")) { if(sscanf(v->value, "%d", &link->echocan_train) != 1 || link->echocan_train < 10 || link->echocan_train > 1000) { ast_log(LOG_ERROR, "Invalid value '%s' for echocan_train entry for " "link '%s'. should be between 10 and 1000\n", v->value, link_name); return -1; } } else if(0 == strcasecmp(v->name, "echocan_taps")) { if(!(sscanf(v->value, "%d", &link->echocan_taps) == 1 && (link->echocan_taps == 32 || link->echocan_taps == 64 || link->echocan_taps == 128 || link->echocan_taps == 256))) { ast_log(LOG_ERROR, "Invalid value '%s' for echocan_taps entry for " "link '%s'. should be 32, 64, 128 or 256\n", v->value, link_name); return -1; } } else if(0 == strcasecmp(v->name, "initial_alignment")) { if ((strcasecmp(v->value, "yes") != 0) && (strcasecmp(v->value, "no") != 0)) { ast_log(LOG_ERROR, "Invalid value '%s' for initial_alignment entry for link '%s'.\n", v->value, link_name); return -1; } link->initial_alignment = strcasecmp(v->value, "yes") == 0; } else { ast_log(LOG_ERROR, "Unknown config option '%s', aborting.\n", v->name); return -1; } v = v->next; } if (!has_linkset) { ast_log(LOG_ERROR, "Missing linkset entry for link '%s'.\n", link_name); return -1; } if (!has_enabled) { ast_log(LOG_ERROR, "Missing enabled entry for link '%s'.\n", link_name); return -1; } if (!has_firstcic) { ast_log(LOG_ERROR, "Missing firstcic entry for link '%s'.\n", link_name); return -1; } if (!has_channels) { ast_log(LOG_ERROR, "Missing channels entry for link '%s'.\n", link_name); return -1; } if (!has_schannel) { ast_log(LOG_ERROR, "Missing schannel entry for link '%s'.\n", link_name); return -1; } if (linkset->n_links == MAX_LINKS_PER_LINKSET) { ast_log(LOG_ERROR, "Too many links defined for linkset '%s' for link '%s' (max %d).\n", linkset->name, link_name, MAX_LINKS_PER_LINKSET); return -1; } link->name = strdup(link_name); link->sls = linkset->n_schannels; link->linkset = linkset; link->on_host = NULL; link->receiver = NULL; link->first_zapid = -1; if (link->enabled) { if (linkset->enabled) { linkset->links[linkset->n_links++] = link; if (link->schannel != -1) { linkset->schannels[linkset->n_schannels++] = link; } } else { ast_log(LOG_NOTICE, "Disabling link '%s' on disabled linkset '%s'\n", link->name, linkset->name); link->enabled = 0; } } ast_log(LOG_NOTICE, "%s link '%s' on linkset '%s', firstcic=%d\n", link->enabled ? "Configured" : "Ignoring disabled", link->name, linkset->name, link->first_cic); if (linkset->first_cic > link->first_cic) linkset->first_cic = link->first_cic; lastcic = link->first_cic + lastcic -1; if (linkset->last_cic < lastcic) linkset->last_cic = lastcic; link->linkix = n_links; n_links++; return 0;}static int load_config_host(struct ast_config *cfg, char* cat){ struct ast_variable *v; char *p; char *spec; char *host_name = &cat[strlen("host-")]; struct host* host = &hosts[n_hosts]; char links_spec_buf[1000] = {0,}; int has_opc = 0, has_dpc = 0, has_links = 0, has_enabled = 0, has_if = 0; if (n_hosts == MAX_HOSTS) { ast_log(LOG_ERROR, "Too many hosts defined while parsing config for host '%s' (max %d).\n", host_name, MAX_HOSTS); return -1; } memset(host->dpc, 0, sizeof(host->dpc)); memset(host->receivers, 0, sizeof(host->receivers)); host->name = strdup(host_name); host->host_ix = n_hosts; host->default_linkset = NULL; host->n_schannels = 0; host->n_peers = 0; host->ssn = 0; host->n_routes = 0; memset(&host->global_title, 0, sizeof(host->global_title)); v = ast_variable_browse(cfg, cat); while(v != NULL) { if(0 == strcasecmp(v->name, "opc")) { char *endptr; host->opc = strtoul(v->value, &endptr, 0); if(endptr == v->value || *endptr != '\0') { ast_log(LOG_ERROR, "Error: Invalid number '%s' for " "config option own_pc.\n", v->value); return -1; } has_opc = 1; } else if(0 == strcasecmp(v->name, "dpc")) { char dpc_spec_buf[100] = {0,}; char linkset_name_buf[100]; char dpc_buf[20]; ast_copy_string(dpc_spec_buf, v->value, sizeof(dpc_spec_buf)); spec = &dpc_spec_buf[0]; p = strsep(&spec, ","); while(p && *p) { int dpc; struct linkset* linkset; if(sscanf(p, "%[^:]:%s", linkset_name_buf, dpc_buf) != 2) { ast_log(LOG_ERROR, "Invalid DPC specification '%s' for host '%s'", p, host_name); return -1; } if (strncmp(v->value, "0x", 2) == 0) dpc = strtol(dpc_buf+2, NULL, 16); else dpc = strtol(dpc_buf, NULL, 0); if (!dpc) { ast_log(LOG_ERROR, "Invalid DPC value '%s' for linkset '%s' for host '%s'", dpc_buf, linkset_name_buf, host_name); return -1; } linkset = lookup_linkset(linkset_name_buf); if (!linkset) { ast_log(LOG_ERROR, "Unknown linkset '%s' for host '%s'", linkset_name_buf, host_name); return -1; } host->dpc[linkset->lsi] = dpc; p = strsep(&spec, ","); } has_dpc = 1; } else if(0 == strcasecmp(v->name, "peers")) { char peer_spec_buf[500] = {0,}; ast_copy_string(peer_spec_buf, v->value, sizeof(peer_spec_buf)); ast_log(LOG_DEBUG, "peers '%s' \n", peer_spec_buf); spec = &peer_spec_buf[0]; p = strsep(&spec, ","); while(p && *p) { char link_buf[100]; char host_buf[100]; struct link* link; if (host->n_peers == MAX_LINKS_PER_HOST) { ast_log(LOG_ERROR, "Too many routes defined for host '%s' (max %d).\n", host->name, MAX_LINKS_PER_HOST); return -1; } while ((*p == ' ') || (*p == '\t')) p++; if(sscanf(p, "%[^:]:%s", link_buf, host_buf) != 2) { ast_log(LOG_ERROR, "Invalid peer specification '%s' for host '%s'.\n", p, host_name); return -1; } link = lookup_link(link_buf); if (!link) { ast_log(LOG_ERROR, "Unknown link '%s' for peers '%s' for host '%s'", link_buf, p, host_name); return -1; } host->peers[host->n_peers].link = link; host->peers[host->n_peers].hostname = strdup(host_buf); host->n_peers++; p = strsep(&spec, ","); } } else if(0 == strcasecmp(v->name, "enabled")) { if ((strcasecmp(v->value, "yes") != 0) && (strcasecmp(v->value, "no") != 0)) { ast_log(LOG_ERROR, "Invalid value '%s' for enabled entry for host '%s'.\n", v->value, host_name); return -1; } host->enabled = strcasecmp(v->value, "yes") == 0; has_enabled = 1; } else if(0 == strcasecmp(v->name, "default_linkset")) { host->default_linkset = lookup_linkset(v->value); if (!host->default_linkset) { ast_log(LOG_ERROR, "Unknown default_linkset '%s' for host '%s'.\n", v->value, host_name); return -1; } } else if(0 == strcasecmp(v->name, "links")) { ast_copy_string(links_spec_buf, v->value, sizeof(links_spec_buf)); ast_log(LOG_DEBUG, "links '%s' \n", links_spec_buf); spec = &links_spec_buf[0]; p = strsep(&spec, ","); while(p && *p) { char linkname_buf[100]; int i; if (host->n_spans == MAX_SPANS_PER_HOST) { ast_log(LOG_ERROR, "Too many links defined for host '%s' (max %d).\n", host->name, MAX_LINKS_PER_HOST); return -1; } if(sscanf(p, "%[^:]:%d", linkname_buf, &host->spans[host->n_spans].connector) != 2) { ast_log(LOG_DEBUG, "linkname '%s', no %d \n", linkname_buf, host->spans[host->n_spans].connector); ast_log(LOG_ERROR, "Invalid link specification '%s' for host '%s'.\n", p, host_name); return -1; } if ((host->spans[host->n_spans].connector < 1) || (host->spans[host->n_spans].connector > MAX_E1_CONNECTOR_NO)) { ast_log(LOG_ERROR, "Connector no. %d for link '%s' not in range 1..%d.\n", host->spans[host->n_spans].connector, v->value, MAX_E1_CONNECTOR_NO); return -1; } ast_log(LOG_DEBUG, "linkname '%s', no %d \n", linkname_buf, host->spans[host->n_spans].connector); for (i = 0; i < host->n_spans; i++) { if (host->spans[i].connector == host->spans[host->n_spans].connector) { ast_log(LOG_ERROR, "Connector no. %d specified twice for host '%s.'\n", host->spans[host->n_spans].connector, host->name); return -1; } } host->spans[host->n_spans].link = lookup_link(linkname_buf);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -