From 2bb1f893a958aff97ba32c97db36a7e5732b9ff9 Mon Sep 17 00:00:00 2001 From: Andreas Eversberg Date: Fri, 25 Feb 2022 06:57:08 +0100 Subject: Fixed broken Contact line --- src/sip/sip.c | 56 +++++++++++++++++++++++++++++++++----------------------- 1 file changed, 33 insertions(+), 23 deletions(-) diff --git a/src/sip/sip.c b/src/sip/sip.c index cb9cc41..6be8ea8 100755 --- a/src/sip/sip.c +++ b/src/sip/sip.c @@ -472,7 +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; + const char *user, *peer, *p; int rc; if (!call->sip_ep->remote_peer || !call->sip_ep->remote_peer[0]) { @@ -491,7 +491,7 @@ static void setup_req(call_t *call, osmo_cc_msg_t *msg) } PDEBUG(DSIP, DEBUG_DEBUG, " -> new nua_handle %p\n", call->nua_handle); - /* caller information */ + /* caller information (also used for contact) */ rc = osmo_cc_get_ie_calling(msg, 0, &type, &plan, &present, &screen, callerid, sizeof(callerid)); if (rc < 0) callerid[0] = '\0'; @@ -500,15 +500,29 @@ static void setup_req(call_t *call, osmo_cc_msg_t *msg) 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[0]) peer = call->sip_ep->public_ip; + else + peer = call->sip_ep->local_peer; if (user) sprintf(from, "sip:%s@%s", user, peer); else sprintf(from, "sip:%s", peer); PDEBUG(DSIP, DEBUG_DEBUG, " -> From = %s\n", from); + /* contact information, equal to 'from', but with port number added, if not already exists */ + strcpy(contact, from); + /* 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); + /* dialing information */ rc = osmo_cc_get_ie_called(msg, 0, &type, &plan, dialing, sizeof(dialing)); if (rc < 0) @@ -534,19 +548,6 @@ static void setup_req(call_t *call, osmo_cc_msg_t *msg) PDEBUG(DSIP, DEBUG_DEBUG, " -> Asserted ID = %s\n", asserted_id); } - /* public (or stun) ip */ - if (call->sip_ep->public_ip[0]) { - const char *p; - // contact is set above - /* append port of local peer */ - p = osmo_cc_port_of_address(call->sip_ep->local_peer); - if (p) { - strcat(contact, ":"); - strcat(contact, p); - } - PDEBUG(DSIP, DEBUG_DEBUG, " -> Contact = %s\n", contact); - } - /* SDP */ char sdp_buffer[65536]; rc = osmo_cc_get_ie_sdp(msg, 0, sdp_buffer, sizeof(sdp_buffer)); @@ -1929,6 +1930,7 @@ static void sip_handle_register(sip_endpoint_t *sip_ep) char to[256] = ""; char contact[256+10] = ""; char expires[256] = ""; + const char *peer, *p; switch (sip_ep->register_state) { case REGISTER_STATE_UNREGISTERED: @@ -1950,15 +1952,23 @@ static void sip_handle_register(sip_endpoint_t *sip_ep) PDEBUG(DSIP, DEBUG_DEBUG, " -> From = %s\n", from); sprintf(to, "sip:%s@%s", sip_ep->register_user, sip_ep->register_peer); PDEBUG(DSIP, DEBUG_DEBUG, " -> To = %s\n", to); - if (sip_ep->public_ip[0]) { - const char *p; - sprintf(contact, "sip:%s@%s", sip_ep->register_user, sip_ep->public_ip); - /* append port of local peer */ + + /* use public_ip if set, otherwise use local_peer */ + if (sip_ep->public_ip[0]) + peer = sip_ep->public_ip; + else + peer = sip_ep->local_peer; + sprintf(contact, "sip:%s@%s", sip_ep->register_user, 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(sip_ep->local_peer); - if (p) - strcat(contact, p); - PDEBUG(DSIP, DEBUG_DEBUG, " -> Contact = %s\n", contact); + if (!p) + p = "5060"; + strcat(contact, ":"); + strcat(contact, p); } + PDEBUG(DSIP, DEBUG_DEBUG, " -> Contact = %s\n", contact); if (sip_ep->register_interval) { sprintf(expires, "%d", sip_ep->register_interval + 60); -- cgit v1.2.3