Fix and cleanup of from/to uri generation for INVITE

If a remote peer registers to us, we can still use dialed number of an
outgoing call (INVITE) to replace the user of the to-line.

E.g. To: <user>@remote.host (if no dialed number is given)
     To: <number>@remote.host (if dialed number is given)
This commit is contained in:
Andreas Eversberg 2021-09-17 15:42:33 +02:00
parent 755bdb8505
commit a3d3f884cd
2 changed files with 26 additions and 13 deletions

View File

@ -472,6 +472,7 @@ static void setup_req(call_t *call, osmo_cc_msg_t *msg)
uint8_t type, plan, present, screen;
char callerid[256], dialing[256];
const char *sdp = sdp;
const char *user, *peer;
int rc;
if (!call->sip_ep->remote_peer || !call->sip_ep->remote_peer[0]) {
@ -494,25 +495,36 @@ static void setup_req(call_t *call, osmo_cc_msg_t *msg)
rc = osmo_cc_get_ie_calling(msg, 0, &type, &plan, &present, &screen, callerid, sizeof(callerid));
if (rc < 0)
callerid[0] = '\0';
if (callerid[0] || call->sip_ep->local_user) {
sprintf(from, "sip:%s@%s", (call->sip_ep->local_user) ? : callerid, call->sip_ep->local_peer);
if (call->sip_ep->public_ip[0])
sprintf(contact, "sip:%s@%s", (call->sip_ep->local_user) ? : callerid, call->sip_ep->public_ip);
} else {
sprintf(from, "sip:%s", call->sip_ep->local_peer);
if (call->sip_ep->public_ip[0])
sprintf(contact, "sip:%s", call->sip_ep->public_ip);
}
user = NULL;
if (call->sip_ep->local_user)
user = call->sip_ep->local_user; // high prio
else if (callerid[0])
user = callerid; // low prio
peer = call->sip_ep->local_peer;
if (call->sip_ep->public_ip)
peer = call->sip_ep->public_ip;
if (user)
sprintf(from, "sip:%s@%s", user, peer);
else
sprintf(from, "sip:%s", peer);
PDEBUG(DSIP, DEBUG_DEBUG, " -> From = %s\n", from);
/* dialing information */
rc = osmo_cc_get_ie_called(msg, 0, &type, &plan, dialing, sizeof(dialing));
if (rc < 0)
dialing[0] = '\0';
if (dialing[0] || call->sip_ep->remote_user) {
sprintf(to, "sip:%s@%s", (call->sip_ep->remote_user) ? : dialing, call->sip_ep->remote_peer);
user = NULL;
if (call->sip_ep->remote_user)
user = call->sip_ep->remote_user; // high prio
else if (dialing[0])
user = dialing; // mid prio
else if (call->sip_ep->registered_user)
user = call->sip_ep->registered_user;
peer = call->sip_ep->remote_peer;
if (user) {
sprintf(to, "sip:%s@%s", user, peer);
} else
sprintf(to, "sip:%s", call->sip_ep->remote_peer);
sprintf(to, "sip:%s", peer);
PDEBUG(DSIP, DEBUG_DEBUG, " -> To = %s\n", to);
/* asserted id */
@ -949,7 +961,7 @@ static void ep_i_register(sip_endpoint_t *sip_ep, int status, nua_t *nua, nua_ha
if (status == 200) {
strcpy(sip_ep->remote_contact_user, contact_user);
strcpy(sip_ep->remote_contact_peer, contact_peer);
sip_ep->remote_user = sip_ep->remote_contact_user;
sip_ep->registered_user = sip_ep->remote_contact_user;
sip_ep->remote_peer = sip_ep->remote_contact_peer;
sip_ep->register_nonce[0] = '\0';
}

View File

@ -47,6 +47,7 @@ typedef struct sip_endpoint {
const char *local_user;
const char *local_peer;
const char *remote_user;
const char *registered_user;
const char *remote_peer;
const char *asserted_id;
int local_register;