Author: mmichelson Date: Mon Apr 6 11:18:30 2015 New Revision: 434052 URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=434052 Log: Resolve conflicts and reset automerge.
Added: team/group/dns_naptr/tests/test_dns_srv.c - copied unchanged from r434047, trunk/tests/test_dns_srv.c Modified: team/group/dns_naptr/ (props changed) team/group/dns_naptr/apps/app_stasis.c team/group/dns_naptr/build_tools/cflags.xml team/group/dns_naptr/include/asterisk/dns_internal.h team/group/dns_naptr/include/asterisk/res_pjsip_session.h team/group/dns_naptr/main/dns_core.c team/group/dns_naptr/main/dns_srv.c team/group/dns_naptr/main/format.c team/group/dns_naptr/res/parking/parking_applications.c team/group/dns_naptr/res/res_pjsip_messaging.c team/group/dns_naptr/res/res_resolver_unbound.c Propchange: team/group/dns_naptr/ ------------------------------------------------------------------------------ automerge = * Propchange: team/group/dns_naptr/ ------------------------------------------------------------------------------ Binary property 'branch-13-merged' - no diff available. Propchange: team/group/dns_naptr/ ------------------------------------------------------------------------------ --- svnmerge-integrated (original) +++ svnmerge-integrated Mon Apr 6 11:18:30 2015 @@ -1,1 +1,1 @@ -/trunk:1-433868 +/trunk:1-434047 Modified: team/group/dns_naptr/apps/app_stasis.c URL: http://svnview.digium.com/svn/asterisk/team/group/dns_naptr/apps/app_stasis.c?view=diff&rev=434052&r1=434051&r2=434052 ============================================================================== --- team/group/dns_naptr/apps/app_stasis.c (original) +++ team/group/dns_naptr/apps/app_stasis.c Mon Apr 6 11:18:30 2015 @@ -51,29 +51,27 @@ </parameter> </syntax> <description> - <para> - Invoke a Stasis application. - </para> - </description> - <para>This application will set the following channel variable upon - completion:</para> + <para>Invoke a Stasis application.</para> + <para>This application will set the following channel variable upon + completion:</para> <variablelist> <variable name="STASISSTATUS"> <para>This indicates the status of the execution of the Stasis application.</para> <value name="SUCCESS"> - The channel has exited Stasis without any failures in Stasis + The channel has exited Stasis without any failures in + Stasis. </value> <value name="FAILED"> - A failure occurred when executing the Stasis application. - Some (not all) possible reasons for this: - <para>The app registry is not instantiated</para> - <para>The app requested is not registered</para> - <para>The app requested is not active</para> - <para>Stasis couldn't send a start message</para> + A failure occurred when executing the Stasis + The app registry is not instantiated; The app + application. Some (not all) possible reasons for this: + requested is not registered; The app requested is not + active; Stasis couldn't send a start message. </value> </variable> </variablelist> + </description> </application> ***/ Modified: team/group/dns_naptr/build_tools/cflags.xml URL: http://svnview.digium.com/svn/asterisk/team/group/dns_naptr/build_tools/cflags.xml?view=diff&rev=434052&r1=434051&r2=434052 ============================================================================== --- team/group/dns_naptr/build_tools/cflags.xml (original) +++ team/group/dns_naptr/build_tools/cflags.xml Mon Apr 6 11:18:30 2015 @@ -77,6 +77,7 @@ <support_level>extended</support_level> </member> <member name="MALLOC_DEBUG" displayname="Keep Track of Memory Allocations"> + <conflict>DEBUG_CHAOS</conflict> <support_level>core</support_level> </member> <member name="DEBUG_CHAOS" displayname="Randomly FAIL memory allocations or other operations"> Modified: team/group/dns_naptr/include/asterisk/dns_internal.h URL: http://svnview.digium.com/svn/asterisk/team/group/dns_naptr/include/asterisk/dns_internal.h?view=diff&rev=434052&r1=434051&r2=434052 ============================================================================== --- team/group/dns_naptr/include/asterisk/dns_internal.h (original) +++ team/group/dns_naptr/include/asterisk/dns_internal.h Mon Apr 6 11:18:30 2015 @@ -60,6 +60,10 @@ unsigned short weight; /*! \brief The port in the SRV record */ unsigned short port; + /*! \brief The running weight sum */ + unsigned int weight_sum; + /*! \brief Additional data */ + char data[0]; }; /*! \brief A NAPTR record */ @@ -96,7 +100,7 @@ /*! \brief Optional rcode, set if an error occurred */ unsigned int rcode; /*! \brief Records returned */ - AST_LIST_HEAD_NOLOCK(, ast_dns_record) records; + AST_LIST_HEAD_NOLOCK(dns_records, ast_dns_record) records; /*! \brief The canonical name */ const char *canonical; /*! \brief The raw DNS answer */ @@ -180,3 +184,23 @@ * \param result The DNS result */ void dns_naptr_sort(struct ast_dns_result *result); + +/*! + * \brief Allocate and parse a DNS SRV record + * + * \param query The DNS query + * \param data This specific SRV record + * \param size The size of the SRV record + * + * \retval non-NULL success + * \retval NULL failure + */ +struct ast_dns_record *ast_dns_srv_alloc(struct ast_dns_query *query, const char *data, const size_t size); + +/*! + * \brief Sort the SRV records on a result + * + * \param result The DNS result + */ +void ast_dns_srv_sort(struct ast_dns_result *result); + Modified: team/group/dns_naptr/include/asterisk/res_pjsip_session.h URL: http://svnview.digium.com/svn/asterisk/team/group/dns_naptr/include/asterisk/res_pjsip_session.h?view=diff&rev=434052&r1=434051&r2=434052 ============================================================================== --- team/group/dns_naptr/include/asterisk/res_pjsip_session.h (original) +++ team/group/dns_naptr/include/asterisk/res_pjsip_session.h Mon Apr 6 11:18:30 2015 @@ -107,8 +107,6 @@ char exten[AST_MAX_EXTENSION]; /*! The endpoint with which Asterisk is communicating */ struct ast_sip_endpoint *endpoint; - /*! The AOR associated with this session */ - struct ast_sip_aor *aor; /*! The contact associated with this session */ struct ast_sip_contact *contact; /*! The PJSIP details of the session, which includes the dialog */ @@ -147,6 +145,8 @@ pjsip_rx_data *deferred_reinvite; /*! Current T.38 state */ enum ast_sip_session_t38state t38state; + /*! The AOR associated with this session */ + struct ast_sip_aor *aor; }; typedef int (*ast_sip_session_request_creation_cb)(struct ast_sip_session *session, pjsip_tx_data *tdata); Modified: team/group/dns_naptr/main/dns_core.c URL: http://svnview.digium.com/svn/asterisk/team/group/dns_naptr/main/dns_core.c?view=diff&rev=434052&r1=434051&r2=434052 ============================================================================== --- team/group/dns_naptr/main/dns_core.c (original) +++ team/group/dns_naptr/main/dns_core.c Mon Apr 6 11:18:30 2015 @@ -462,6 +462,8 @@ if (rr_type == ns_t_naptr) { record = dns_naptr_alloc(query, data, size); + } else if (rr_type == ns_t_srv) { + record = ast_dns_srv_alloc(query, data, size); } else { record = generic_record_alloc(query, data, size); } @@ -485,7 +487,10 @@ { if (ast_dns_query_get_rr_type(query) == ns_t_naptr) { dns_naptr_sort(query->result); - } + } else if (ast_dns_query_get_rr_type(query) == ns_t_srv) { + ast_dns_srv_sort(query->result); + } + query->callback(query); } Modified: team/group/dns_naptr/main/dns_srv.c URL: http://svnview.digium.com/svn/asterisk/team/group/dns_naptr/main/dns_srv.c?view=diff&rev=434052&r1=434051&r2=434052 ============================================================================== --- team/group/dns_naptr/main/dns_srv.c (original) +++ team/group/dns_naptr/main/dns_srv.c Mon Apr 6 11:18:30 2015 @@ -31,25 +31,205 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") +#include <netinet/in.h> +#include <arpa/nameser.h> +#include <resolv.h> + #include "asterisk/dns_core.h" #include "asterisk/dns_srv.h" +#include "asterisk/linkedlists.h" +#include "asterisk/dns_internal.h" +#include "asterisk/utils.h" + +struct ast_dns_record *ast_dns_srv_alloc(struct ast_dns_query *query, const char *data, const size_t size) +{ + uint16_t priority; + uint16_t weight; + uint16_t port; + const char *ptr; + char *srv_offset; + char *srv_search_base = (char *)query->result->answer; + size_t remaining_size = query->result->answer_size; + const char *end_of_record; + struct ast_dns_srv_record *srv; + int host_size; + char host[NI_MAXHOST] = ""; + + while (1) { + srv_offset = memchr(srv_search_base, data[0], remaining_size); + + ast_assert(srv_offset != NULL); + ast_assert(srv_search_base + remaining_size - srv_offset >= size); + + if (!memcmp(srv_offset, data, size)) { + ptr = srv_offset; + break; + } + + remaining_size -= srv_offset - srv_search_base; + srv_search_base = srv_offset + 1; + } + + ast_assert(ptr != NULL); + + end_of_record = ptr + size; + + /* PRIORITY */ + priority = ((unsigned char)(ptr[1]) << 0) | ((unsigned char)(ptr[0]) << 8); + ptr += 2; + + if (ptr >= end_of_record) { + return NULL; + } + + /* WEIGHT */ + weight = ((unsigned char)(ptr[1]) << 0) | ((unsigned char)(ptr[0]) << 8); + ptr += 2; + + if (ptr >= end_of_record) { + return NULL; + } + + /* PORT */ + port = ((unsigned char)(ptr[1]) << 0) | ((unsigned char)(ptr[0]) << 8); + ptr += 2; + + if (ptr >= end_of_record) { + return NULL; + } + + host_size = dn_expand((unsigned char *)query->result->answer, (unsigned char *) end_of_record, (unsigned char *) ptr, host, sizeof(host) - 1); + if (host_size < 0) { + ast_log(LOG_ERROR, "Failed to expand domain name: %s\n", strerror(errno)); + return NULL; + } + + if (!strcmp(host, ".")) { + return NULL; + } + + srv = ast_calloc(1, sizeof(*srv) + size + host_size + 1); + if (!srv) { + return NULL; + } + + srv->priority = priority; + srv->weight = weight; + srv->port = port; + + srv->host = srv->data + size; + strcpy((char *)srv->host, host); /* SAFE */ + ((char *)srv->host)[host_size] = '\0'; + + srv->generic.data_ptr = srv->data; + + return (struct ast_dns_record *)srv; +} + +/* This implementation was taken from the existing srv.c which, after reading the RFC, implements it + * as it should. + */ +void ast_dns_srv_sort(struct ast_dns_result *result) +{ + struct ast_dns_record *current; + struct dns_records newlist = AST_LIST_HEAD_NOLOCK_INIT_VALUE; + + while (AST_LIST_FIRST(&result->records)) { + unsigned short cur_priority = 0; + struct dns_records temp_list = AST_LIST_HEAD_NOLOCK_INIT_VALUE; + + /* Find the lowest current priority to work on */ + AST_LIST_TRAVERSE(&result->records, current, list) { + if (!cur_priority || ((struct ast_dns_srv_record *)current)->priority < cur_priority) { + cur_priority = ((struct ast_dns_srv_record *)current)->priority; + } + } + + /* Find all records which match this priority */ + AST_LIST_TRAVERSE_SAFE_BEGIN(&result->records, current, list) { + if (((struct ast_dns_srv_record *)current)->priority != cur_priority) { + continue; + } + + AST_LIST_REMOVE_CURRENT(list); + + /* Records with a weight of zero must always be at the head */ + if (((struct ast_dns_srv_record *)current)->weight == 0) { + AST_LIST_INSERT_HEAD(&temp_list, current, list); + } else { + AST_LIST_INSERT_TAIL(&temp_list, current, list); + } + } + AST_LIST_TRAVERSE_SAFE_END; + + /* Apply weighting - as each record is passed the sum of all previous weights (plus its own) is stored away, and then a random weight + * is calculated. The first record with a weight sum greater than the random weight is put in the new list and the whole thing starts + * once again. + */ + while (AST_LIST_FIRST(&temp_list)) { + unsigned int weight_sum = 0; + unsigned int random_weight; + + AST_LIST_TRAVERSE(&temp_list, current, list) { + ((struct ast_dns_srv_record *)current)->weight_sum = weight_sum += ((struct ast_dns_srv_record *)current)->weight; + } + + /* if all the remaining entries have weight == 0, + then just append them to the result list and quit */ + if (weight_sum == 0) { + AST_LIST_APPEND_LIST(&newlist, &temp_list, list); + break; + } + + random_weight = 1 + (unsigned int) ((float) weight_sum * (ast_random() / ((float) RAND_MAX + 1.0))); + + AST_LIST_TRAVERSE_SAFE_BEGIN(&temp_list, current, list) { + if (((struct ast_dns_srv_record *)current)->weight_sum < random_weight) { + continue; + } + + AST_LIST_MOVE_CURRENT(&newlist, list); + break; + } + AST_LIST_TRAVERSE_SAFE_END; + } + + } + + /* now that the new list has been ordered, + put it in place */ + + AST_LIST_APPEND_LIST(&result->records, &newlist, list); +} const char *ast_dns_srv_get_host(const struct ast_dns_record *record) { - return NULL; + struct ast_dns_srv_record *srv = (struct ast_dns_srv_record *) record; + + ast_assert(ast_dns_record_get_rr_type(record) == ns_t_srv); + return srv->host; } unsigned short ast_dns_srv_get_priority(const struct ast_dns_record *record) { - return 0; + struct ast_dns_srv_record *srv = (struct ast_dns_srv_record *) record; + + ast_assert(ast_dns_record_get_rr_type(record) == ns_t_srv); + return srv->priority; } unsigned short ast_dns_srv_get_weight(const struct ast_dns_record *record) { - return 0; + struct ast_dns_srv_record *srv = (struct ast_dns_srv_record *) record; + + ast_assert(ast_dns_record_get_rr_type(record) == ns_t_srv); + return srv->weight; } unsigned short ast_dns_srv_get_port(const struct ast_dns_record *record) { - return 0; -} + struct ast_dns_srv_record *srv = (struct ast_dns_srv_record *) record; + + ast_assert(ast_dns_record_get_rr_type(record) == ns_t_srv); + return srv->port; +} Modified: team/group/dns_naptr/main/format.c URL: http://svnview.digium.com/svn/asterisk/team/group/dns_naptr/main/format.c?view=diff&rev=434052&r1=434051&r2=434052 ============================================================================== --- team/group/dns_naptr/main/format.c (original) +++ team/group/dns_naptr/main/format.c Mon Apr 6 11:18:30 2015 @@ -375,7 +375,7 @@ unsigned int ast_format_get_sample_rate(const struct ast_format *format) { - return format->codec->sample_rate; + return format->codec->sample_rate ?: 8000; } unsigned int ast_format_determine_length(const struct ast_format *format, unsigned int samples) Modified: team/group/dns_naptr/res/parking/parking_applications.c URL: http://svnview.digium.com/svn/asterisk/team/group/dns_naptr/res/parking/parking_applications.c?view=diff&rev=434052&r1=434051&r2=434052 ============================================================================== --- team/group/dns_naptr/res/parking/parking_applications.c (original) +++ team/group/dns_naptr/res/parking/parking_applications.c Mon Apr 6 11:18:30 2015 @@ -647,7 +647,10 @@ ast_bridge_features_cleanup(&chan_features); - return 0; + /* Return -1 so that call does not continue in the dialplan. This is to make + * behavior consistent with Asterisk versions prior to 12. + */ + return -1; } struct park_announce_subscription_data { Modified: team/group/dns_naptr/res/res_pjsip_messaging.c URL: http://svnview.digium.com/svn/asterisk/team/group/dns_naptr/res/res_pjsip_messaging.c?view=diff&rev=434052&r1=434051&r2=434052 ============================================================================== --- team/group/dns_naptr/res/res_pjsip_messaging.c (original) +++ team/group/dns_naptr/res/res_pjsip_messaging.c Mon Apr 6 11:18:30 2015 @@ -42,12 +42,15 @@ #include "asterisk/pbx.h" #include "asterisk/res_pjsip.h" #include "asterisk/res_pjsip_session.h" +#include "asterisk/taskprocessor.h" const pjsip_method pjsip_message_method = {PJSIP_OTHER_METHOD, {"MESSAGE", 7} }; #define MAX_HDR_SIZE 512 #define MAX_BODY_SIZE 1024 #define MAX_USER_SIZE 128 + +static struct ast_taskprocessor *message_serializer; /*! * \internal @@ -593,7 +596,7 @@ } if (!(mdata = msg_data_create(msg, to, from)) || - ast_sip_push_task(NULL, msg_send, mdata)) { + ast_sip_push_task(message_serializer, msg_send, mdata)) { ao2_ref(mdata, -1); return -1; } @@ -748,6 +751,13 @@ return AST_MODULE_LOAD_DECLINE; } + message_serializer = ast_sip_create_serializer(); + if (!message_serializer) { + ast_sip_unregister_service(&messaging_module); + ast_msg_tech_unregister(&msg_tech); + return AST_MODULE_LOAD_DECLINE; + } + ast_sip_session_register_supplement(&messaging_supplement); return AST_MODULE_LOAD_SUCCESS; } @@ -757,6 +767,7 @@ ast_sip_session_unregister_supplement(&messaging_supplement); ast_msg_tech_unregister(&msg_tech); ast_sip_unregister_service(&messaging_module); + ast_taskprocessor_unreference(message_serializer); return 0; } Modified: team/group/dns_naptr/res/res_resolver_unbound.c URL: http://svnview.digium.com/svn/asterisk/team/group/dns_naptr/res/res_resolver_unbound.c?view=diff&rev=434052&r1=434051&r2=434052 ============================================================================== --- team/group/dns_naptr/res/res_resolver_unbound.c (original) +++ team/group/dns_naptr/res/res_resolver_unbound.c Mon Apr 6 11:18:30 2015 @@ -35,6 +35,10 @@ #include "asterisk/config.h" #include "asterisk/config_options.h" #include "asterisk/test.h" + +#ifdef TEST_FRAMEWORK +#include "asterisk/dns_srv.h" +#endif /*** DOCUMENTATION <configInfo name="res_resolver_unbound" language="en_US"> @@ -1299,6 +1303,74 @@ return res; } + +AST_TEST_DEFINE(resolve_srv) +{ + RAII_VAR(struct unbound_resolver *, resolver, NULL, ao2_cleanup); + RAII_VAR(struct unbound_config *, cfg, NULL, ao2_cleanup); + RAII_VAR(struct ast_dns_result *, result, NULL, ast_dns_result_free); + const struct ast_dns_record *record; + static const char *DOMAIN1 = "taco.bananas"; + static const char *DOMAIN1_SRV = "taco.bananas 12345 IN SRV 10 20 5060 sip.taco.bananas"; + enum ast_test_result_state res = AST_TEST_PASS; + + switch (cmd) { + case TEST_INIT: + info->name = "resolve_srv"; + info->category = "/res/res_resolver_unbound/"; + info->summary = "Test synchronous SRV resolution using libunbound\n"; + info->description = "This test performs the following:\n" + "\t* Set one SRV record on one domain\n" + "\t* Perform an SRV lookup on the domain\n" + "\t* Ensure that the SRV record returned matches the expected value\n"; + return AST_TEST_NOT_RUN; + case TEST_EXECUTE: + break; + } + + cfg = ao2_global_obj_ref(globals); + resolver = ao2_bump(cfg->global->state->resolver); + + ub_ctx_zone_add(resolver->context, DOMAIN1, "static"); + ub_ctx_data_add(resolver->context, DOMAIN1_SRV); + + if (ast_dns_resolve(DOMAIN1, ns_t_srv, ns_c_in, &result)) { + ast_test_status_update(test, "Failed to synchronously resolve SRV for domain '%s'\n", DOMAIN1); + res = AST_TEST_FAIL; + goto cleanup; + } + + record = ast_dns_result_get_records(result); + if (ast_dns_srv_get_priority(record) != 10) { + ast_test_status_update(test, "SRV Record returned priority '%d' when we expected 10\n", ast_dns_srv_get_priority(record)); + res = AST_TEST_FAIL; + goto cleanup; + } + + if (ast_dns_srv_get_weight(record) != 20) { + ast_test_status_update(test, "SRV Record returned weight '%d' when we expected 20\n", ast_dns_srv_get_weight(record)); + res = AST_TEST_FAIL; + goto cleanup; + } + + if (ast_dns_srv_get_port(record) != 5060) { + ast_test_status_update(test, "SRV Record returned port '%d' when we expected 5060\n", ast_dns_srv_get_port(record)); + res = AST_TEST_FAIL; + goto cleanup; + } + + if (strcmp(ast_dns_srv_get_host(record), "sip.taco.bananas")) { + ast_test_status_update(test, "SRV Record returned host '%s' when we expected sip.taco.bananas\n", ast_dns_srv_get_host(record)); + res = AST_TEST_FAIL; + goto cleanup; + } + +cleanup: + ub_ctx_data_remove(resolver->context, DOMAIN1_SRV); + ub_ctx_zone_remove(resolver->context, DOMAIN1); + + return res; +} #endif static int reload_module(void) @@ -1321,6 +1393,7 @@ AST_TEST_UNREGISTER(resolve_sync_off_nominal); AST_TEST_UNREGISTER(resolve_cancel_off_nominal); AST_TEST_UNREGISTER(resolve_naptr); + AST_TEST_UNREGISTER(resolve_srv); return 0; } @@ -1378,6 +1451,7 @@ AST_TEST_REGISTER(resolve_async_off_nominal); AST_TEST_REGISTER(resolve_cancel_off_nominal); AST_TEST_REGISTER(resolve_naptr); + AST_TEST_REGISTER(resolve_srv); return AST_MODULE_LOAD_SUCCESS; } -- _____________________________________________________________________ -- Bandwidth and Colocation Provided by http://www.api-digital.com -- svn-commits mailing list To UNSUBSCRIBE or update options visit: http://lists.digium.com/mailman/listinfo/svn-commits