aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mgcp/mgcp_protocol.c4
-rw-r--r--src/mgcp_ss7.c89
-rw-r--r--src/mgcp_ss7_vty.c45
3 files changed, 89 insertions, 49 deletions
diff --git a/src/mgcp/mgcp_protocol.c b/src/mgcp/mgcp_protocol.c
index cae05da..19e9d4f 100644
--- a/src/mgcp/mgcp_protocol.c
+++ b/src/mgcp/mgcp_protocol.c
@@ -932,7 +932,7 @@ struct mgcp_trunk_config *mgcp_trunk_alloc(struct mgcp_config *cfg, int nr)
trunk->trunk_type = MGCP_TRUNK_E1;
trunk->trunk_nr = nr;
trunk_init(trunk);
- trunk->number_endpoints = 33;
+ trunk->number_endpoints = 32;
llist_add_tail(&trunk->entry, &cfg->trunks);
return trunk;
}
@@ -986,6 +986,8 @@ int mgcp_endpoints_allocate(struct mgcp_trunk_config *tcfg)
if (!tcfg->endpoints)
return -1;
+ tcfg->endpoints[0].blocked = 1;
+
for (i = 0; i < tcfg->number_endpoints; ++i) {
tcfg->endpoints[i].ci = CI_UNUSED;
tcfg->endpoints[i].cfg = tcfg->cfg;
diff --git a/src/mgcp_ss7.c b/src/mgcp_ss7.c
index 30bde3a..4e2b803 100644
--- a/src/mgcp_ss7.c
+++ b/src/mgcp_ss7.c
@@ -662,6 +662,41 @@ static int realloc_cb(struct mgcp_trunk_config *tcfg, int endp_no)
return 0;
}
+static int configure_trunk(struct mgcp_trunk_config *tcfg, int *dsp_resource)
+{
+ int i, start;
+
+ start = tcfg->trunk_type == MGCP_TRUNK_VIRTUAL ?
+ tcfg->target_trunk_start : tcfg->trunk_nr;
+
+ for (i = 1; i < tcfg->number_endpoints; ++i) {
+ if (tcfg->endpoints[i].blocked)
+ continue;
+
+ *dsp_resource += 1;
+ tcfg->endpoints[i].hw_snmp_port = *dsp_resource;
+
+ if (tcfg->cfg->configure_trunks) {
+ int multiplex, timeslot, res;
+
+ mgcp_endpoint_to_timeslot(i, &multiplex, &timeslot);
+ res = mgcp_snmp_connect(*dsp_resource,
+ start + multiplex,
+ timeslot);
+
+ if (res != 0) {
+ LOGP(DMGCP, LOGL_ERROR,
+ "Failed to configure trunk Type: %s Trunk: %d\n",
+ tcfg->trunk_type == MGCP_TRUNK_VIRTUAL ?
+ "virtual" : "trunk", start);
+ return -1;
+ }
+ }
+ }
+
+ return 0;
+}
+
static struct mgcp_ss7 *mgcp_ss7_init(struct mgcp_config *cfg)
{
struct mgcp_trunk_config *trunk;
@@ -697,58 +732,16 @@ static struct mgcp_ss7 *mgcp_ss7_init(struct mgcp_config *cfg)
/* Now do the init of the trunks */
dsp_resource = 0;
for (i = 1; i < cfg->trunk.number_endpoints; ++i) {
- int multiplex, timeslot;
- mgcp_endpoint_to_timeslot(i, &multiplex, &timeslot);
- if (timeslot == 0x0 || timeslot == 0x1F) {
- cfg->trunk.endpoints[i].blocked = 1;
- continue;
- }
-
- dsp_resource += 1;
- cfg->trunk.endpoints[i].hw_snmp_port = dsp_resource;
-
- if (cfg->configure_trunks) {
- int res;
-
- res = mgcp_snmp_connect(dsp_resource,
- cfg->trunk.target_trunk_start + multiplex,
- timeslot);
-
- if (res != 0) {
- LOGP(DMGCP, LOGL_ERROR, "Failed to configure virtual trunk.\n");
- talloc_free(conf);
- return NULL;
- }
+ if (configure_trunk(&cfg->trunk, &dsp_resource) != 0) {
+ talloc_free(conf);
+ return NULL;
}
}
llist_for_each_entry(trunk, &cfg->trunks, entry) {
-
- for (i = 1; i < trunk->number_endpoints; ++i) {
- int multiplex, timeslot;
- mgcp_endpoint_to_timeslot(i, &multiplex, &timeslot);
- if (timeslot == 0x0 || timeslot == 0x1) {
- trunk->endpoints[i].blocked = 1;
- continue;
- }
-
- dsp_resource += 1;
- trunk->endpoints[i].hw_snmp_port = dsp_resource;
-
- if (cfg->configure_trunks) {
- int res;
-
- res = mgcp_snmp_connect(dsp_resource,
- trunk->trunk_nr + multiplex,
- timeslot);
-
- if (res != 0) {
- LOGP(DMGCP, LOGL_ERROR,
- "Failed to configure virtual trunk.\n");
- talloc_free(conf);
- return NULL;
- }
- }
+ if (configure_trunk(trunk, &dsp_resource) != 0) {
+ talloc_free(conf);
+ return NULL;
}
}
diff --git a/src/mgcp_ss7_vty.c b/src/mgcp_ss7_vty.c
index d145777..a1fa86e 100644
--- a/src/mgcp_ss7_vty.c
+++ b/src/mgcp_ss7_vty.c
@@ -23,6 +23,7 @@
#include <ss7_vty.h>
#include <mgcp/mgcp.h>
+#include <mgcp/mgcp_internal.h>
#include <stdlib.h>
@@ -172,6 +173,24 @@ DEFUN(cfg_mgcp_target_trunk, cfg_mgcp_target_trunk_cmd,
return CMD_SUCCESS;
}
+#define ENDP_BLOCK_STR "Block the Endpoint/Timeslot for Audio\n"
+
+DEFUN(cfg_mgcp_timeslot_block, cfg_mgcp_timeslot_block_cmd,
+ "block-endpoint <1-65534>",
+ ENDP_BLOCK_STR "Endpoint number\n")
+{
+ int nr = atoi(argv[0]);
+
+ if (g_cfg->trunk.number_endpoints <= nr) {
+ vty_out(vty, "%%Endpoint %d too big. Current size: %d%s",
+ nr, g_cfg->trunk.number_endpoints, VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ g_cfg->trunk.endpoints[nr].blocked = 1;
+ return CMD_SUCCESS;
+}
+
DEFUN(cfg_trunk_vad, cfg_trunk_vad_cmd,
"vad (enabled|disabled)",
"Enable the Voice Activity Detection\n"
@@ -315,6 +334,28 @@ DEFUN_DEPRECATED(cfg_trunk_endp_offset, cfg_trunk_endp_offset_cmd,
return CMD_WARNING;
}
+DEFUN(cfg_trunk_timeslot_block, cfg_trunk_timeslot_block_cmd,
+ "block-endpoint <1-31>",
+ ENDP_BLOCK_STR "Endpoint number\n")
+{
+ struct mgcp_trunk_config *trunk = vty->index;
+ trunk->endpoints[atoi(argv[0])].blocked = 1;
+ return CMD_SUCCESS;
+}
+
+static void write_blocked_endpoints(struct vty *vty,
+ struct mgcp_trunk_config *tcfg)
+{
+ int i;
+
+ for (i = 1; i < tcfg->number_endpoints; ++i) {
+ if (!tcfg->endpoints[i].blocked)
+ continue;
+
+ vty_out(vty, "block-endpoint %d%s", i, VTY_NEWLINE);
+ }
+}
+
void mgcp_write_extra(struct vty *vty, struct mgcp_config *cfg)
{
vty_out(vty, " configure-trunks %d%s",
@@ -345,6 +386,7 @@ void mgcp_write_extra(struct vty *vty, struct mgcp_config *cfg)
cfg->trunk.dwnstr_target_lvl, VTY_NEWLINE);
vty_out(vty, " target-trunk-start %d%s",
cfg->trunk.target_trunk_start, VTY_NEWLINE);
+ write_blocked_endpoints(vty, &cfg->trunk);
}
void mgcp_write_trunk_extra(struct vty *vty, struct mgcp_trunk_config *trunk)
@@ -373,6 +415,7 @@ void mgcp_write_trunk_extra(struct vty *vty, struct mgcp_trunk_config *trunk)
trunk->dwnstr_max_gain, VTY_NEWLINE);
vty_out(vty, " downstream-target-level %d%s",
trunk->dwnstr_target_lvl, VTY_NEWLINE);
+ write_blocked_endpoints(vty, trunk);
}
@@ -398,6 +441,7 @@ void mgcp_mgw_vty_init(void)
install_element(MGCP_NODE, &cfg_mgcp_dwnstr_target_cmd);
install_element(MGCP_NODE, &cfg_mgcp_endp_offset_cmd);
install_element(MGCP_NODE, &cfg_mgcp_target_trunk_cmd);
+ install_element(MGCP_NODE, &cfg_mgcp_timeslot_block_cmd);
install_element(TRUNK_NODE, &cfg_trunk_vad_cmd);
install_element(TRUNK_NODE, &cfg_trunk_realloc_cmd);
@@ -412,6 +456,7 @@ void mgcp_mgw_vty_init(void)
install_element(TRUNK_NODE, &cfg_trunk_dwnstr_max_gain_cmd);
install_element(TRUNK_NODE, &cfg_trunk_dwnstr_target_cmd);
install_element(TRUNK_NODE, &cfg_trunk_endp_offset_cmd);
+ install_element(TRUNK_NODE, &cfg_trunk_timeslot_block_cmd);
}