From a3d3f884cdfe5fc457428e66667839cd3ec67db1 Mon Sep 17 00:00:00 2001 From: Andreas Eversberg Date: Fri, 17 Sep 2021 15:42:33 +0200 Subject: 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: @remote.host (if no dialed number is given) To: @remote.host (if dialed number is given) --- src/sip/sip.c | 38 +++++++++++++++++++++++++------------- src/sip/sip.h | 1 + 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/src/sip/sip.c b/src/sip/sip.c index d1f40c7..fe65fd7 100644 --- a/src/sip/sip.c +++ b/src/sip/sip.c @@ -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'; } diff --git a/src/sip/sip.h b/src/sip/sip.h index da39cd3..753e466 100644 --- a/src/sip/sip.h +++ b/src/sip/sip.h @@ -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; -- cgit v1.2.3