diff options
author | Andreas Eversberg <jolly@eversberg.eu> | 2021-09-17 15:42:33 +0200 |
---|---|---|
committer | Andreas Eversberg <jolly@eversberg.eu> | 2021-09-17 15:42:33 +0200 |
commit | a3d3f884cdfe5fc457428e66667839cd3ec67db1 (patch) | |
tree | 273cf5f4e330ca2f8a4540587c002cbcc9d5b39e | |
parent | 755bdb8505516c518bc131fa3a2b6f7a3a5eea27 (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.c | 38 | ||||
-rw-r--r-- | 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; |