mgcp: Handle SDP in CRCX received by the MGW

So far the SDP part of the CRCX message has been ignored by the MGW.

This patch adds SDP parsing for this case, eventually updating the
net end's payload type and connection parameters.

Sponsored-by: On-Waves ehf
This commit is contained in:
Jacob Erlbeck 2013-11-29 13:43:49 +01:00 committed by Holger Hans Peter Freyther
parent 3dff27d38d
commit 78a9501cfd
2 changed files with 11 additions and 2 deletions

View File

@ -624,6 +624,7 @@ static struct msgb *handle_create_con(struct mgcp_parse_data *p)
const char *callid = NULL;
const char *mode = NULL;
char *line;
int have_sdp = 0;
if (p->found != 0)
return create_err_response(NULL, 510, "CRCX", p->trans);
@ -640,6 +641,9 @@ static struct msgb *handle_create_con(struct mgcp_parse_data *p)
case 'M':
mode = (const char *) line + 3;
break;
case '\0':
have_sdp = 1;
goto mgcp_header_done;
default:
LOGP(DMGCP, LOGL_NOTICE, "Unhandled option: '%c'/%d on 0x%x\n",
*line, *line, ENDPOINT_NUMBER(endp));
@ -647,6 +651,7 @@ static struct msgb *handle_create_con(struct mgcp_parse_data *p)
}
}
mgcp_header_done:
tcfg = p->endp->tcfg;
/* Check required data */
@ -697,9 +702,13 @@ static struct msgb *handle_create_con(struct mgcp_parse_data *p)
goto error2;
endp->allocated = 1;
/* set up RTP media parameters */
endp->bts_end.payload_type = tcfg->audio_payload;
endp->bts_end.fmtp_extra = talloc_strdup(tcfg->endpoints,
tcfg->audio_fmtp_extra);
if (have_sdp)
parse_sdp_data(&endp->net_end, p);
/* policy CB */
if (p->cfg->policy_cb) {

View File

@ -182,11 +182,11 @@ static const struct mgcp_test tests[] = {
{ "AUEP2", AUEP2, AUEP2_RET },
{ "MDCX1", MDCX_WRONG_EP, MDCX_ERR_RET },
{ "MDCX2", MDCX_UNALLOCATED, MDCX_RET },
{ "CRCX", CRCX, CRCX_RET, PTYPE_NYI, 126 },
{ "CRCX", CRCX, CRCX_RET, 97, 126 },
{ "MDCX3", MDCX3, MDCX3_RET, PTYPE_NONE, 126 },
{ "MDCX4", MDCX4, MDCX4_RET, 99, 126 },
{ "DLCX", DLCX, DLCX_RET, -1, -1 },
{ "CRCX_ZYN", CRCX_ZYN, CRCX_ZYN_RET, PTYPE_NYI, 126 },
{ "CRCX_ZYN", CRCX_ZYN, CRCX_ZYN_RET, 97, 126 },
{ "EMPTY", EMPTY, EMPTY_RET },
{ "SHORT1", SHORT, SHORT_RET },
{ "SHORT2", SHORT2, SHORT2_RET },