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.
This commit is contained in:
Andreas Eversberg 2023-03-28 19:10:49 +02:00
parent 18af4626db
commit 172dee960a
1 changed files with 40 additions and 1 deletions

View File

@ -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());