wip: mgcp: Implement an even more specific RSIP handling.
Using spec-extended RSIP one can reset a single endpoint or a range of endpoints.
This commit is contained in:
parent
b2fb37751d
commit
0206643a59
|
@ -82,7 +82,7 @@ struct mgcp_trunk_config;
|
|||
typedef int (*mgcp_realloc)(struct mgcp_trunk_config *cfg, int endpoint);
|
||||
typedef int (*mgcp_change)(struct mgcp_trunk_config *cfg, int endpoint, int state);
|
||||
typedef int (*mgcp_policy)(struct mgcp_trunk_config *cfg, int endpoint, int state, const char *transactio_id);
|
||||
typedef int (*mgcp_reset)(struct mgcp_trunk_config *cfg);
|
||||
typedef int (*mgcp_reset)(struct mgcp_trunk_config *cfg, int endpoint, int range);
|
||||
typedef int (*mgcp_rqnt)(struct mgcp_endpoint *endp, char tone);
|
||||
|
||||
#define PORT_ALLOC_STATIC 0
|
||||
|
|
|
@ -860,13 +860,29 @@ out_silent:
|
|||
|
||||
static struct msgb *handle_rsip(struct mgcp_parse_data *p)
|
||||
{
|
||||
int range = -1;
|
||||
const char *line;
|
||||
|
||||
if (p->found != 0) {
|
||||
LOGP(DMGCP, LOGL_ERROR, "Failed to find the endpoint.\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
for_each_line(line, p->save) {
|
||||
if (strlen(line) < 4)
|
||||
continue;
|
||||
|
||||
switch (line[0]) {
|
||||
case 'R':
|
||||
range = atoi(line + 3);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (p->cfg->reset_cb)
|
||||
p->cfg->reset_cb(p->endp->tcfg);
|
||||
p->cfg->reset_cb(p->endp->tcfg,
|
||||
ENDPOINT_NUMBER(p->endp), range);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
|
@ -60,7 +60,7 @@ static int exit_on_failure = 0;
|
|||
|
||||
extern struct mgcp_config *g_cfg;
|
||||
|
||||
static void mgcp_ss7_reset(struct mgcp_trunk_config *tcfg);
|
||||
static void mgcp_ss7_reset(struct mgcp_trunk_config *tcfg, int endpoint, int range);
|
||||
static void mgcp_ss7_endp_free(struct mgcp_endpoint *endp);
|
||||
|
||||
|
||||
|
@ -766,9 +766,21 @@ static void mgcp_ss7_endp_free(struct mgcp_endpoint *endp)
|
|||
mgcp_ss7_exec(endp, MGCP_SS7_DELETE, 0);
|
||||
}
|
||||
|
||||
static int reset_cb(struct mgcp_trunk_config *trunk)
|
||||
static int reset_cb(struct mgcp_trunk_config *trunk, int _endpoint, int _range)
|
||||
{
|
||||
mgcp_ss7_reset(trunk);
|
||||
int endpoint, range;
|
||||
|
||||
if (_range == -1) {
|
||||
endpoint = 1;
|
||||
range = trunk->number_endpoints;
|
||||
} else {
|
||||
endpoint = _endpoint;
|
||||
range = OSMO_MIN(_range, trunk->number_endpoints);
|
||||
#error "Check +1, -1... here continue next week"
|
||||
}
|
||||
|
||||
|
||||
mgcp_ss7_reset(trunk, endpoint, range);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -880,24 +892,28 @@ static struct mgcp_ss7 *mgcp_ss7_init(struct mgcp_config *cfg)
|
|||
return conf;
|
||||
}
|
||||
|
||||
static void free_trunk(struct mgcp_trunk_config *trunk)
|
||||
/* range must be <= number_endpoints */
|
||||
static void free_trunk(struct mgcp_trunk_config *trunk,
|
||||
const int start, const int range)
|
||||
{
|
||||
int i;
|
||||
for (i = 1; i < trunk->number_endpoints; ++i) {
|
||||
for (i = start; i < range; ++i) {
|
||||
struct mgcp_endpoint *endp = &trunk->endpoints[i];
|
||||
mgcp_ss7_endp_free(endp);
|
||||
mgcp_free_endp(endp);
|
||||
}
|
||||
}
|
||||
|
||||
static void mgcp_ss7_reset(struct mgcp_trunk_config *tcfg)
|
||||
static void mgcp_ss7_reset(struct mgcp_trunk_config *tcfg, int start, int range)
|
||||
{
|
||||
LOGP(DMGCP, LOGL_INFO, "Resetting endpoint on trunk type %s %s/%d\n",
|
||||
tcfg->trunk_type == MGCP_TRUNK_VIRTUAL ? "virtual" : "e1",
|
||||
tcfg->virtual_domain, tcfg->trunk_nr);
|
||||
LOGP(DMGCP, LOGL_INFO,
|
||||
"Resetting endpoints(%d+%d) on trunk type %s %s/%d\n",
|
||||
start, range,
|
||||
tcfg->trunk_type == MGCP_TRUNK_VIRTUAL ? "virtual" : "e1",
|
||||
tcfg->virtual_domain, tcfg->trunk_nr);
|
||||
|
||||
/* free UniPorte and MGCP data */
|
||||
free_trunk(tcfg);
|
||||
free_trunk(tcfg, start, range);
|
||||
}
|
||||
|
||||
static void print_help()
|
||||
|
|
Reference in New Issue