config.c

来自「asterisk1.4.6版本下 7#信令驱动 源码」· C语言 代码 · 共 1,121 行 · 第 1/3 页

C
1,121
字号
  if (!has_subservice) {
    ast_log(LOG_ERROR, "Missing subservice entry for linkset '%s'\n", linkset_name);
    return -1;
  }
  linkset->context = strdup(context);
  linkset->language = strdup(language);
  if (!has_context)
    ast_log(LOG_NOTICE, "Using default context '%s' for linkset '%s'\n", linkset->context, linkset_name);
  if (!has_language)
    ast_log(LOG_NOTICE, "Using default language '%s' for linkset '%s'\n", linkset->language, linkset_name);

  linkset->name = strdup(linkset_name);
  linkset->n_links = 0;
  linkset->lsi = n_linksets;
  linkset->init_grs_done = 0;
  linkset->first_cic = MAX_CIC;
  linkset->last_cic = 0;
  linkset->init_grs_done = 0;
  linkset->idle_list = NULL;
  for (i = 0; i < MAX_CIC; i++)
    linkset->cic_list[i] = NULL;
  n_linksets++;
  return 0;
}


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[1000] = {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->dpc = 0;
  link->rxgain = 0.0;
  link->txgain = 0.0;
  *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, "rxgain")) {
        if (sscanf(v->value, "%f", &link->rxgain) != 1) {
            ast_log(LOG_WARNING, "Invalid rxgain: %s\n", v->value);
            link->rxgain = 0.0;
        }

    } else if(0 == strcasecmp(v->name, "txgain")) {
        if (sscanf(v->value, "%f", &link->txgain) != 1) {
            ast_log(LOG_WARNING, "Invalid txgain: %s\n", v->value);
            link->txgain = 0.0;
        }
    } 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[1000] = {0,};
      char linkset_name_buf[1000];
      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;
	struct link* link;
	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) {
	  link = lookup_link(linkset_name_buf);
	  if (!link) {
	    ast_log(LOG_ERROR, "Unknown link/linkset '%s' for host '%s'", linkset_name_buf, host_name);
	    return -1;
	  }
	  link->dpc = dpc;
	}
	else
	  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) {

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?