summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Eversberg <jolly@eversberg.eu>2021-09-17 15:42:33 +0200
committerAndreas Eversberg <jolly@eversberg.eu>2021-09-17 15:42:33 +0200
commita3d3f884cdfe5fc457428e66667839cd3ec67db1 (patch)
tree273cf5f4e330ca2f8a4540587c002cbcc9d5b39e
parent755bdb8505516c518bc131fa3a2b6f7a3a5eea27 (diff)
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)
-rw-r--r--src/sip/sip.c38
-rw-r--r--src/sip/sip.h1
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;