summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Eversberg <jolly@eversberg.eu>2022-02-25 06:57:08 +0100
committerAndreas Eversberg <jolly@eversberg.eu>2022-02-25 07:00:35 +0100
commit2bb1f893a958aff97ba32c97db36a7e5732b9ff9 (patch)
tree151a70a2e43a25ce30a953b705169e87a19a81ef
parent0ad29dcc63b579c2d454cc3218ae5742eb96f788 (diff)
Fixed broken Contact lineHEADmaster
-rwxr-xr-xsrc/sip/sip.c56
1 files 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);