9
0
Fork 0

mgcp: Generate the ConnId per trunk base

MGCP RFC 3435 does not specify that the Connection Id must be
generated with any kind of random. It must uniquely identify
the connection of an endpoint. So we can make it per trunk group
or could even have it per endpoint.

The code does not support multiple connections on the same endpoint
right now but the spec allows it.
This commit is contained in:
Holger Hans Peter Freyther 2011-09-14 16:11:08 +02:00
parent 42e44a9e5e
commit 96cc57af80
2 changed files with 10 additions and 11 deletions

View File

@ -109,6 +109,7 @@ struct mgcp_trunk_config {
int trunk_nr;
int trunk_type;
uint32_t last_call_id;
char *audio_name;
int audio_payload;
@ -163,8 +164,6 @@ struct mgcp_config {
mgcp_realloc realloc_cb;
void *data;
uint32_t last_call_id;
/* trunk handling */
struct mgcp_trunk_config trunk;
struct llist_head trunks;

View File

@ -91,24 +91,24 @@ static struct msgb *handle_noti_req(struct mgcp_config *cfg, struct msgb *msg);
static void create_transcoder(struct mgcp_endpoint *endp);
static void delete_transcoder(struct mgcp_endpoint *endp);
static uint32_t generate_call_id(struct mgcp_config *cfg)
static uint32_t generate_call_id(struct mgcp_trunk_config *tcfg)
{
int i;
/* use the call id */
++cfg->last_call_id;
++tcfg->last_call_id;
/* handle wrap around */
if (cfg->last_call_id == CI_UNUSED)
++cfg->last_call_id;
if (tcfg->last_call_id == CI_UNUSED)
++tcfg->last_call_id;
/* callstack can only be of size number_of_endpoints */
/* verify that the call id is free, e.g. in case of overrun */
for (i = 1; i < cfg->trunk.number_endpoints; ++i)
if (cfg->trunk.endpoints[i].ci == cfg->last_call_id)
return generate_call_id(cfg);
for (i = 1; i < tcfg->number_endpoints; ++i)
if (tcfg->endpoints[i].ci == tcfg->last_call_id)
return generate_call_id(tcfg);
return cfg->last_call_id;
return tcfg->last_call_id;
}
/*
@ -577,7 +577,7 @@ static struct msgb *handle_create_con(struct mgcp_config *cfg, struct msgb *msg)
goto error2;
/* assign a local call identifier or fail */
endp->ci = generate_call_id(cfg);
endp->ci = generate_call_id(tcfg);
if (endp->ci == CI_UNUSED)
goto error2;