diff --git a/daemon/src/sip/sipvoiplink.cpp b/daemon/src/sip/sipvoiplink.cpp index e40b404d1da6b6465537796de70b0b9104bcb96c..a5fbbc6248fc3f6f540869355edbd6fbe91245f8 100644 --- a/daemon/src/sip/sipvoiplink.cpp +++ b/daemon/src/sip/sipvoiplink.cpp @@ -202,6 +202,24 @@ updateSDPFromSTUN(SIPCall &call, SIPAccount &account, const SipTransport &transp } } +static pj_status_t +try_respond_stateless(pjsip_endpoint *endpt, pjsip_rx_data *rdata, int st_code, + const pj_str_t *st_text, const pjsip_hdr *hdr_list, + const pjsip_msg_body *body) +{ + /* Check that no UAS transaction has been created for this request. + * If UAS transaction has been created for this request, application + * MUST send the response statefully using that transaction. + */ + if (!pjsip_rdata_get_tsx(rdata)) + return pjsip_endpt_respond_stateless(endpt, rdata, st_code, st_text, hdr_list, body); + else + ERROR("Transaction has been created for this request, send response " + "statefully instead"); + + return !PJ_SUCCESS; +} + static pj_bool_t transaction_request_cb(pjsip_rx_data *rdata) { @@ -254,22 +272,14 @@ transaction_request_cb(pjsip_rx_data *rdata) } } - /* Check that no UAS transaction has been created for this request. - * If UAS transaction has been created for this request, application - * MUST send the response statefully using that transaction. - */ - - if (!pjsip_rdata_get_tsx(rdata)) - pjsip_endpt_respond_stateless(endpt_, rdata, PJSIP_SC_OK, NULL, NULL, NULL); - else - ERROR("Transaction has been created for this request, send response statefully instead"); + try_respond_stateless(endpt_, rdata, PJSIP_SC_OK, NULL, NULL, NULL); return PJ_FALSE; } else if (method->id == PJSIP_OPTIONS_METHOD) { handleIncomingOptions(rdata); return PJ_FALSE; } else if (method->id != PJSIP_INVITE_METHOD && method->id != PJSIP_ACK_METHOD) { - pjsip_endpt_respond_stateless(endpt_, rdata, PJSIP_SC_METHOD_NOT_ALLOWED, NULL, NULL, NULL); + try_respond_stateless(endpt_, rdata, PJSIP_SC_METHOD_NOT_ALLOWED, NULL, NULL, NULL); return PJ_FALSE; } @@ -286,9 +296,8 @@ transaction_request_cb(pjsip_rx_data *rdata) r_sdp = NULL; if (account->getActiveAudioCodecs().empty()) { - pjsip_endpt_respond_stateless(endpt_, rdata, - PJSIP_SC_NOT_ACCEPTABLE_HERE, NULL, NULL, - NULL); + try_respond_stateless(endpt_, rdata, PJSIP_SC_NOT_ACCEPTABLE_HERE, NULL, NULL, NULL); + return PJ_FALSE; } @@ -296,7 +305,7 @@ transaction_request_cb(pjsip_rx_data *rdata) unsigned options = 0; if (pjsip_inv_verify_request(rdata, &options, NULL, NULL, endpt_, NULL) != PJ_SUCCESS) { - pjsip_endpt_respond_stateless(endpt_, rdata, PJSIP_SC_METHOD_NOT_ALLOWED, NULL, NULL, NULL); + try_respond_stateless(endpt_, rdata, PJSIP_SC_METHOD_NOT_ALLOWED, NULL, NULL, NULL); return PJ_FALSE; } @@ -398,7 +407,7 @@ transaction_request_cb(pjsip_rx_data *rdata) if (pjsip_dlg_create_uas(pjsip_ua_instance(), rdata, nullptr, &dialog) != PJ_SUCCESS) { call.reset(); - pjsip_endpt_respond_stateless(endpt_, rdata, PJSIP_SC_INTERNAL_SERVER_ERROR, nullptr, nullptr, nullptr); + try_respond_stateless(endpt_, rdata, PJSIP_SC_INTERNAL_SERVER_ERROR, nullptr, nullptr, nullptr); return PJ_FALSE; } @@ -431,8 +440,7 @@ transaction_request_cb(pjsip_rx_data *rdata) pjsip_endpt_send_response(endpt_, &res_addr, response, NULL, NULL); } else { - pjsip_endpt_respond_stateless(endpt_, rdata, - PJSIP_SC_INTERNAL_SERVER_ERROR, NULL, NULL, NULL); + try_respond_stateless(endpt_, rdata, PJSIP_SC_INTERNAL_SERVER_ERROR, NULL, NULL, NULL); } return PJ_FALSE;