diff --git a/res/res_pjsip_session.c b/res/res_pjsip_session.c index 7dca1af41def5e2396721ead3e35b2e55e80394b..1414869e125462cf5f82d9a623560ef44e0b7d77 100644 --- a/res/res_pjsip_session.c +++ b/res/res_pjsip_session.c @@ -2609,6 +2609,7 @@ void ast_sip_session_send_response(struct ast_sip_session *session, pjsip_tx_dat static pj_bool_t session_on_rx_request(pjsip_rx_data *rdata); static pj_bool_t session_on_rx_response(pjsip_rx_data *rdata); static void session_on_tsx_state(pjsip_transaction *tsx, pjsip_event *e); +static pj_status_t session_on_tx_request(pjsip_tx_data *tdata); static pjsip_module session_module = { .name = {"Session Module", 14}, @@ -2616,6 +2617,7 @@ static pjsip_module session_module = { .on_rx_request = session_on_rx_request, .on_rx_response = session_on_rx_response, .on_tsx_state = session_on_tsx_state, + .on_tx_request = session_on_tx_request, }; /*! \brief Determine whether the SDP provided requires deferral of negotiating or not @@ -4289,6 +4291,38 @@ static void session_on_tsx_state(pjsip_transaction *tsx, pjsip_event *e) SCOPE_EXIT_RTN(); } +/*! + * \internal + * Added for setting the CallLog.{i}.X_Vendor_SIPIPAddress of outgoing INVITE + */ +static pj_status_t session_on_tx_request(pjsip_tx_data *tdata) +{ + SCOPE_ENTER(1, "session_on_tx_request, update SIPIPAddress\n"); + pjsip_dialog *dlg = tdata ? pjsip_tdata_get_dlg(tdata) : NULL; + pjsip_inv_session *inv_session = dlg ? pjsip_dlg_get_inv_session(dlg) : NULL; + struct ast_sip_session *session = (inv_session ? inv_session->mod_data[session_module.id] : NULL); + + if (inv_session && inv_session->invite_tsx) { + ast_debug(3, "%s: TSX State: %s Inv State: %s\n", ast_sip_session_get_name(session), + pjsip_tsx_state_str(inv_session->invite_tsx->state), pjsip_inv_state_name(inv_session->state)); + + if (inv_session->state == PJSIP_INV_STATE_CALLING && inv_session->invite_tsx->state == PJSIP_TSX_STATE_CALLING + && ast_strlen_zero(ast_channel_sipIpAddress(session->channel)) ) { + /* Log the IP that the INVITE been sent as CallLog.{i}.X_Vendor_SIPIPAddress */ + /* With condition, tsx_state is calling && inv_state is calling && SIPIPAddress has no value */ + const char *addr_buf; + char tempaddr[AST_SOCKADDR_BUFLEN]; + + addr_buf = pj_sockaddr_print(&tdata->tp_info.dst_addr, tempaddr, sizeof(tempaddr), 0); + ast_channel_sipIpAddress_set(session->channel, addr_buf, strlen(addr_buf)); + + ast_debug(3, "%s:SIPIPAddress has been set to: %s\n", + ast_sip_session_get_name(session), ast_channel_sipIpAddress(session->channel)); + } + } + SCOPE_EXIT_RTN_VALUE(PJ_SUCCESS); +} + /*! * \internal * Added for debugging purposes @@ -5051,15 +5085,6 @@ static void session_inv_on_tsx_state_changed(pjsip_inv_session *inv, pjsip_trans break; } - if (inv->state == PJSIP_INV_STATE_CALLING && tsx->state == PJSIP_TSX_STATE_CALLING ) { - /* Log the IP that the INVITE been sent as CallLog.{i}.X_Vendor_SIPIPAddress */ - const char *addr_buf; - char tempaddr[AST_SOCKADDR_BUFLEN]; - addr_buf = pj_sockaddr_print(&tsx->addr, tempaddr, sizeof(tempaddr), 0); - ast_debug(3, "%s: INVITE sent to IP: %s \n", ast_sip_session_get_name(session), addr_buf ); - ast_channel_sipIpAddress_set(session->channel, addr_buf, strlen(addr_buf)); - } - if (AST_LIST_EMPTY(&session->delayed_requests)) { /* No delayed request pending, so just return */ SCOPE_EXIT_RTN("Nothing delayed\n");