diff options
-rw-r--r-- | channels/chan_sip.c | 13 | ||||
-rw-r--r-- | channels/sip/include/sip.h | 1 |
2 files changed, 14 insertions, 0 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c index bec53b776..4210322c6 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -23250,6 +23250,15 @@ static void handle_response_invite(struct sip_pvt *p, int resp, const char *rest ast_set_flag(&p->flags[0], SIP_PENDINGBYE); } ast_rtp_instance_activate(p->rtp); + } else if (!reinvite) { + struct ast_sockaddr remote_address = {{0,}}; + + ast_rtp_instance_get_remote_address(p->rtp, &remote_address); + if (ast_sockaddr_isnull(&remote_address) || (!ast_strlen_zero(p->theirprovtag) && strcmp(p->theirtag, p->theirprovtag))) { + ast_log(LOG_WARNING, "Received response: \"200 OK\" from '%s' without SDP\n", p->relatedpeer->name); + ast_set_flag(&p->flags[0], SIP_PENDINGBYE); + ast_rtp_instance_activate(p->rtp); + } } if (!req->ignore && p->owner) { @@ -24200,7 +24209,11 @@ static void handle_response(struct sip_pvt *p, int resp, const char *rest, struc gettag(req, "To", tag, sizeof(tag)); ast_string_field_set(p, theirtag, tag); + } else { + /* Store theirtag to track for changes when 200 responses to invites are received without SDP */ + ast_string_field_set(p, theirprovtag, p->theirtag); } + /* This needs to be configurable on a channel/peer level, not mandatory for all communication. Sadly enough, NAT implementations are not so stable so we can always rely on these headers. diff --git a/channels/sip/include/sip.h b/channels/sip/include/sip.h index c0704ec79..342c87b36 100644 --- a/channels/sip/include/sip.h +++ b/channels/sip/include/sip.h @@ -1019,6 +1019,7 @@ struct sip_pvt { AST_STRING_FIELD(rdnis); /*!< Referring DNIS */ AST_STRING_FIELD(redircause); /*!< Referring cause */ AST_STRING_FIELD(theirtag); /*!< Their tag */ + AST_STRING_FIELD(theirprovtag); /*!< Provisional their tag, used when evaluating responses to invites */ AST_STRING_FIELD(tag); /*!< Our tag for this session */ AST_STRING_FIELD(username); /*!< [user] name */ AST_STRING_FIELD(peername); /*!< [peer] name, not set if [user] */ |