From 172dee960aa7ad0bc1acae3e28f886781f65bce3 Mon Sep 17 00:00:00 2001 From: Andreas Eversberg Date: Tue, 28 Mar 2023 19:10:49 +0200 Subject: [PATCH] Send Contract when receving a call Contact with correct peer address must be included, so the call proceeds correctly. Only the host/port is used, no user. This seems to work. --- src/sip/sip.c | 41 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/src/sip/sip.c b/src/sip/sip.c index 7064f34..9754f88 100755 --- a/src/sip/sip.c +++ b/src/sip/sip.c @@ -586,8 +586,35 @@ static void setup_req(call_t *call, osmo_cc_msg_t *msg) osmo_cc_ll_msg(&call->sip_ep->cc_ep, call->cc_callref, msg); } +static const char *response_contact(call_t *call) +{ + static char contact[1024] = ""; + const char *peer, *p; + + /* provide contact with correct peer */ + if (call->sip_ep->public_ip[0]) + peer = call->sip_ep->public_ip; + else + peer = call->sip_ep->local_peer; + sprintf(contact, "sip:%s", peer); + /* if port is not set (maybe public IP), get it from local_peer */ + if (!strchr(peer, ':')) { + /* append port of local peer or use 5060, if not exits */ + p = osmo_cc_port_of_address(call->sip_ep->local_peer); + if (!p) + p = "5060"; + strcat(contact, ":"); + strcat(contact, p); + } + PDEBUG(DSIP, DEBUG_DEBUG, " -> Contact = %s\n", contact); + + return contact; +} + static void send_progress_sdp(call_t *call, const char *sdp) { + const char *contact; + if (call->sdp_sent) return; @@ -603,8 +630,11 @@ static void send_progress_sdp(call_t *call, const char *sdp) PDEBUG(DSIP, DEBUG_INFO, "Sending INVITE response: %d %s (callref %d)\n", SIP_183_SESSION_PROGRESS, call->cc_callref); + contact = response_contact(call); + nua_respond(call->nua_handle, SIP_183_SESSION_PROGRESS, NUTAG_MEDIA_ENABLE(0), + TAG_IF(contact[0], SIPTAG_CONTACT_STR(contact)), TAG_IF(sdp, SIPTAG_CONTENT_TYPE_STR("application/sdp")), TAG_IF(sdp, SIPTAG_PAYLOAD_STR(sdp)), TAG_END()); @@ -635,6 +665,7 @@ static void alert_req(call_t *call, osmo_cc_msg_t *msg) { char sdp[65536]; int rc; + const char *contact; rc = osmo_cc_get_ie_sdp(msg, 0, sdp, sizeof(sdp)); if (rc >= 0) @@ -645,9 +676,13 @@ static void alert_req(call_t *call, osmo_cc_msg_t *msg) return; } + contact = response_contact(call); + PDEBUG(DSIP, DEBUG_INFO, "Sending INVITE response: %d %s (callref %d)\n", SIP_180_RINGING, call->cc_callref); - nua_respond(call->nua_handle, SIP_180_RINGING, TAG_END()); + nua_respond(call->nua_handle, SIP_180_RINGING, + TAG_IF(contact[0], SIPTAG_CONTACT_STR(contact)), + TAG_END()); } static void setup_rsp(call_t *call, osmo_cc_msg_t *msg) @@ -655,6 +690,7 @@ static void setup_rsp(call_t *call, osmo_cc_msg_t *msg) char sdp_buffer[65536]; const char *sdp; int rc; + const char *contact; rc = osmo_cc_get_ie_sdp(msg, 0, sdp_buffer, sizeof(sdp_buffer)); if (rc < 0) { @@ -674,10 +710,13 @@ static void setup_rsp(call_t *call, osmo_cc_msg_t *msg) } else PDEBUG(DSIP, DEBUG_INFO, "There was no SDP received during PROC/ALERT/PROGRESS/SETUP-RSP from Osmo-CC. The call will fail due to missing SDP. (callref %d)\n", call->cc_callref); + contact = response_contact(call); + PDEBUG(DSIP, DEBUG_INFO, "Sending INVITE response: %d %s (callref %d)\n", SIP_200_OK, call->cc_callref); nua_respond(call->nua_handle, SIP_200_OK, NUTAG_MEDIA_ENABLE(0), + TAG_IF(contact[0], SIPTAG_CONTACT_STR(contact)), TAG_IF(sdp, SIPTAG_CONTENT_TYPE_STR("application/sdp")), TAG_IF(sdp, SIPTAG_PAYLOAD_STR(sdp)), TAG_END());