osmux: Add negotiation state so race conditions can't disable osmux

Without this commit it is possible that osmux is disabled again on links with
high jitter. This happens when an MGCP response without X-Osmux header is
received before the NAT receives an Osmux dummy frame from the other side.

Ticket: SYS#2628, SYS#2627
Sponsored-by: On-Waves ehf
Change-Id: Id624b0279aee5e2412059a10296ce7896e2d4628
This commit is contained in:
Daniel Willmann 2016-06-29 16:24:42 +02:00 committed by Harald Welte
parent 176b62a80c
commit 5754206379
3 changed files with 7 additions and 5 deletions

View File

@ -28,6 +28,7 @@ int osmux_used_cid(void);
enum osmux_state {
OSMUX_STATE_DISABLED = 0,
OSMUX_STATE_NEGOTIATING,
OSMUX_STATE_ACTIVATING,
OSMUX_STATE_ENABLED,
};

View File

@ -277,7 +277,7 @@ static struct msgb *create_response_with_sdp(struct mgcp_endpoint *endp,
if (!addr)
addr = mgcp_net_src_addr(endp);
if (endp->osmux.state == OSMUX_STATE_ACTIVATING)
if (endp->osmux.state == OSMUX_STATE_NEGOTIATING)
sprintf(osmux_extension, "\nX-Osmux: %u", endp->osmux.cid);
else
osmux_extension[0] = '\0';
@ -811,13 +811,13 @@ mgcp_header_done:
if (endp->ci == CI_UNUSED)
goto error2;
/* Annotate Osmux circuit ID and set it to activating state until this
/* Annotate Osmux circuit ID and set it to negotiating state until this
* is fully set up from the dummy load.
*/
endp->osmux.state = OSMUX_STATE_DISABLED;
if (osmux_cid >= 0) {
endp->osmux.cid = osmux_cid;
endp->osmux.state = OSMUX_STATE_ACTIVATING;
endp->osmux.state = OSMUX_STATE_NEGOTIATING;
} else if(endp->cfg->osmux == OSMUX_USAGE_ONLY) {
LOGP(DMGCP, LOGL_ERROR,
"Osmux only and no osmux offered on 0x%x\n", ENDPOINT_NUMBER(endp));

View File

@ -590,7 +590,7 @@ static int bsc_mgcp_policy_cb(struct mgcp_trunk_config *tcfg, int endpoint, int
*/
if (mgcp_endp->osmux.allocated_cid >= 0 &&
mgcp_endp->osmux.state != OSMUX_STATE_ENABLED) {
mgcp_endp->osmux.state = OSMUX_STATE_ACTIVATING;
mgcp_endp->osmux.state = OSMUX_STATE_NEGOTIATING;
mgcp_endp->osmux.cid = mgcp_endp->osmux.allocated_cid;
}
@ -680,6 +680,7 @@ static void bsc_mgcp_osmux_confirm(struct mgcp_endpoint *endp, const char *str)
LOGP(DMGCP, LOGL_NOTICE, "bsc accepted to use Osmux (cid=%u)\n",
osmux_cid);
endp->osmux.state = OSMUX_STATE_ACTIVATING;
return;
err:
osmux_release_cid(endp);
@ -747,7 +748,7 @@ void bsc_mgcp_forward(struct bsc_connection *bsc, struct msgb *msg)
return;
}
if (endp->osmux.state == OSMUX_STATE_ACTIVATING)
if (endp->osmux.state == OSMUX_STATE_NEGOTIATING)
bsc_mgcp_osmux_confirm(endp, (const char *) msg->l2h);
/* If we require osmux and it is disabled.. fail */