summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--channels/chan_sip.c13
-rw-r--r--channels/sip/include/sip.h1
2 files changed, 14 insertions, 0 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index aaae83c6f..17083c6a0 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] */