diff --git a/channels/chan_pjsip.c b/channels/chan_pjsip.c index d823e284800f1530d4dae4ca26ef74a02072e20a..c10369635bcc91e739496bbaee7afe13014822f1 100644 --- a/channels/chan_pjsip.c +++ b/channels/chan_pjsip.c @@ -3152,6 +3152,39 @@ static void set_sipdomain_variable(struct ast_sip_session *session) return; } +static int find_contact(void *obj, void *arg, int flags) +{ + struct ast_sip_contact *contact = obj; + char *contact_url = arg; + + return !!strstr(contact->uri, contact_url); +} + +static struct ast_sip_contact *contact_user_find_by_addr(char *contact_user, const pj_sockaddr *src_addr) +{ + RAII_VAR(struct ast_sip_aor *, aor_obj, NULL, ao2_cleanup); + RAII_VAR(struct ast_sip_contact *, contact, NULL, ao2_cleanup); + struct ast_sorcery *pjsip_sorcery; + struct ao2_container *contacts; + char contact_url[PJ_INET6_ADDRSTRLEN]; + + pjsip_sorcery = ast_sip_get_sorcery(); + if (!pjsip_sorcery) + return 0; + + aor_obj = ast_sorcery_retrieve_by_id(pjsip_sorcery, "aor", contact_user); + if (!aor_obj) + return 0; + + contacts = ast_sip_location_retrieve_aor_contacts_nolock(aor_obj); + if (!contacts) + return 0; + + pj_sockaddr_print(src_addr, contact_url, sizeof(contact_url), 3); + return ao2_callback(contacts, OBJ_UNLINK, find_contact, contact_url); +} + + /*! \brief Function called when a request is received on the session */ static int chan_pjsip_incoming_request(struct ast_sip_session *session, struct pjsip_rx_data *rdata) { @@ -3174,8 +3207,11 @@ static int chan_pjsip_incoming_request(struct ast_sip_session *session, struct p ast_log(LOG_DEBUG, "Request received from address: <%s>\n", buf); pj_cstr(&proxy_config_val, session->endpoint->fromdomain); + if (contact_user_find_by_addr(session->endpoint->contact_user, &rdata->pkt_info.src_addr)) { + ast_log(LOG_DEBUG, "Request from known contact %s\n", ast_sip_session_get_name(session)); + } // 'fromdomain' is not an IPv4 or IPv6 address - if (pj_sockaddr_parse(pj_AF_UNSPEC(), 0, &proxy_config_val, &proxy_address) != PJ_SUCCESS) { + else if (pj_sockaddr_parse(pj_AF_UNSPEC(), 0, &proxy_config_val, &proxy_address) != PJ_SUCCESS) { if (!ast_sip_is_address_in_dns_records(&rdata->pkt_info.src_addr)) { SCOPE_EXIT_RTN_VALUE(-1, "%s: Request not from DNS resolutions\n", ast_sip_session_get_name(session)); }