diff --git a/channels/chan_sip.c b/channels/chan_sip.c index b4b391f7e2f26dc2385aebe316049a8de9903f45..35ae95ca775527db67d2e60f6faf55fb8c8f04bd 100755 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -351,6 +351,8 @@ static struct sip_registry *registrations; static int sipsock = -1; static int globalnat = 0; +static int globalcanreinvite = REINVITE_INVITE; + static struct sockaddr_in bindaddr; @@ -1288,7 +1290,7 @@ static struct sip_pvt *sip_alloc(char *callid, struct sockaddr_in *sin, int useg else strncpy(p->callid, callid, sizeof(p->callid) - 1); /* Assume reinvite OK and via INVITE */ - p->canreinvite = REINVITE_INVITE; + p->canreinvite = globalcanreinvite; p->dtmfmode = globaldtmfmode; if (p->dtmfmode & SIP_DTMF_RFC2833) p->noncodeccapability |= AST_RTP_DTMF; @@ -5059,6 +5061,7 @@ static int reload_config(void) strncpy(context, "default", sizeof(context) - 1); strcpy(language, ""); strcpy(fromdomain, ""); + globalcanreinvite = REINVITE_INVITE; v = ast_variable_browse(cfg, "general"); while(v) { /* Create the interface list */ @@ -5085,6 +5088,11 @@ static int reload_config(void) strncpy(fromdomain, v->value, sizeof(fromdomain)-1); } else if (!strcasecmp(v->name, "nat")) { globalnat = ast_true(v->value); + } else if (!strcasecmp(v->name, "canreinvite")) { + if (!strcasecmp(v->value, "update")) + globalcanreinvite = REINVITE_UPDATE; + else + globalcanreinvite = ast_true(v->value); } else if (!strcasecmp(v->name, "maxexpirey") || !strcasecmp(v->name, "maxexpiry")) { max_expiry = atoi(v->value); if (max_expiry < 1)