30 #include "asterisk/res_pjsip.h"
33 static int get_endpoint_details(pjsip_rx_data *rdata,
char *domain,
size_t domain_size)
35 pjsip_uri *from = rdata->msg_info.from->uri;
36 if (!ast_sip_is_uri_sip_sips(from)) {
39 ast_copy_pj_str(domain, ast_sip_pjsip_uri_get_hostname(from), domain_size);
43 static int find_transport_state_in_use(
void *obj,
void *arg,
int flags)
46 pjsip_rx_data *rdata = arg;
48 if (transport_state->
transport == rdata->tp_info.transport
50 && !pj_strcmp(&transport_state->
factory->addr_name.host, &rdata->tp_info.transport->local_name.host)
51 && transport_state->
factory->addr_name.port == rdata->tp_info.transport->local_name.port)) {
58 #define DOMAIN_NAME_LEN 255
62 char domain_name[DOMAIN_NAME_LEN + 1];
65 if (get_endpoint_details(rdata, domain_name,
sizeof(domain_name))) {
69 if (!ast_sip_get_disable_multi_domain()) {
74 char id[
sizeof(
"anonymous@") + DOMAIN_NAME_LEN];
77 snprintf(
id,
sizeof(
id),
"anonymous@%s", domain_name);
87 snprintf(
id,
sizeof(
id),
"anonymous@%s", alias->
domain);
96 if ((transport_states = ast_sip_get_transport_states())
97 && (transport_state =
ao2_callback(transport_states, 0, find_transport_state_in_use, rdata))
99 && !ast_strlen_zero(transport->
domain)) {
100 snprintf(
id,
sizeof(
id),
"anonymous@%s", transport->
domain);
103 ao2_cleanup(transport);
104 ao2_cleanup(transport_state);
105 ao2_cleanup(transport_states);
125 static int load_module(
void)
127 ast_sip_register_endpoint_identifier_with_name(&anonymous_identifier,
"anonymous");
131 static int unload_module(
void)
133 ast_sip_unregister_endpoint_identifier(&anonymous_identifier);
137 AST_MODULE_INFO(
ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT,
"PJSIP Anonymous endpoint identifier",
138 .support_level = AST_MODULE_SUPPORT_CORE,
140 .unload = unload_module,
141 .requires =
"res_pjsip",
Asterisk main include file. File version handling, generic pbx functions.
#define ao2_callback(c, flags, cb_fn, arg)
ao2_callback() is a generic function that applies cb_fn() to all objects in a container, as described below.
struct ast_sip_endpoint *(* identify_endpoint)(pjsip_rx_data *rdata)
Callback used to identify the source of a message. See ast_sip_identify_endpoint for more details...
void * ast_sorcery_retrieve_by_id(const struct ast_sorcery *sorcery, const char *type, const char *id)
Retrieve an object using its unique identifier.
Structure for SIP transport information.
struct pjsip_transport * transport
Transport itself.
#define ao2_ref(o, delta)
Reference/unreference an object and return the old refcount.
const char * ast_sorcery_object_get_id(const void *object)
Get the unique identifier of a sorcery object.
#define ast_debug(level,...)
Log a DEBUG message.
An entity with which Asterisk communicates.
struct pjsip_tpfactory * factory
Transport factory.
const ast_string_field domain
An entity responsible for identifying the source of a SIP message.
const ast_string_field domain
#define ASTERISK_GPL_KEY
The text the key() function should return.
Asterisk module definitions.