diff --git a/res/res_pjsip_session.c b/res/res_pjsip_session.c index b85b457c70..c26693f18d 100644 --- a/res/res_pjsip_session.c +++ b/res/res_pjsip_session.c @@ -51,9 +51,6 @@ #define MOD_DATA_ON_RESPONSE "on_response" #define MOD_DATA_NAT_HOOK "nat_hook" -/* Hostname used for origin line within SDP */ -static const pj_str_t *hostname; - /* Some forward declarations */ static void handle_incoming_request(struct ast_sip_session *session, pjsip_rx_data *rdata, pjsip_event_id_e type); static void handle_incoming_response(struct ast_sip_session *session, pjsip_rx_data *rdata, pjsip_event_id_e type); @@ -2094,9 +2091,6 @@ static struct pjmedia_sdp_session *create_local_sdp(pjsip_inv_session *inv, stru } pj_strdup2(inv->pool, &local->origin.user, session->endpoint->media.sdpowner); - local->origin.net_type = STR_IN; - local->origin.addr_type = session->endpoint->media.rtp.ipv6 ? STR_IP6 : STR_IP4; - local->origin.addr = *hostname; pj_strdup2(inv->pool, &local->name, session->endpoint->media.sdpsession); /* Now let the handlers add streams of various types, pjmedia will automatically reorder the media streams for us */ @@ -2109,6 +2103,23 @@ static struct pjmedia_sdp_session *create_local_sdp(pjsip_inv_session *inv, stru /* Use the connection details of the first media stream if possible for SDP level */ if (local->media_count) { local->conn = local->media[0]->conn; + pj_strassign(&local->origin.net_type, &local->conn->net_type); + pj_strassign(&local->origin.addr_type, &local->conn->addr_type); + pj_strassign(&local->origin.addr, &local->conn->addr); + } else { + local->origin.net_type = STR_IN; + local->origin.addr_type = session->endpoint->media.rtp.ipv6 ? STR_IP6 : STR_IP4; + + if (!ast_strlen_zero(session->endpoint->media.address)) { + pj_strdup2(inv->pool, &local->origin.addr, session->endpoint->media.address); + } else { + pj_sockaddr localaddr; + char our_ip[PJ_INET6_ADDRSTRLEN]; + + pj_gethostip(session->endpoint->media.rtp.ipv6 ? pj_AF_INET6() : pj_AF_INET(), &localaddr); + pj_sockaddr_print(&localaddr, our_ip, sizeof(our_ip), 0); + pj_strdup2(inv->pool, &local->origin.addr, our_ip); + } } return local; @@ -2258,6 +2269,7 @@ static void session_outgoing_nat_hook(pjsip_tx_data *tdata, struct ast_sip_trans static int load_module(void) { pjsip_endpoint *endpt; + if (!ast_sip_get_sorcery() || !ast_sip_get_pjsip_endpoint()) { return AST_MODULE_LOAD_DECLINE; } @@ -2275,7 +2287,6 @@ static int load_module(void) pjsip_inv_usage_init(endpt, &inv_callback); pjsip_100rel_init_module(endpt); pjsip_timer_init_module(endpt); - hostname = pj_gethostname(); if (ast_sip_register_service(&session_module)) { return AST_MODULE_LOAD_DECLINE; }