diff options
author | Sean Bright <sean.bright@gmail.com> | 2017-04-24 14:16:45 -0400 |
---|---|---|
committer | Sean Bright <sean.bright@gmail.com> | 2017-04-24 13:22:48 -0500 |
commit | 0611f2ca17515a58957b7b635429371a68858931 (patch) | |
tree | ec57810a45ff9c9d448a35a7ae8017b9c8a02fd6 /res | |
parent | dc6654d969224129bdd7b4080eda6e027c6454b9 (diff) |
res_hep: Add additional config initialization and validation
* Initialize hepv3_runtime_data.sockfd to -1 so that our ao2 destructor
does not close fd 0
* Add logging output when the required option - capture_address - is not
specified.
* Remove a no longer relevant #define and correct related documentation
* Pass appropriate flags to aco_option_register so that capture_address
cannot be the empty string.
ASTERISK-26953 #close
Change-Id: Ief08441bc6596d6f1718fa810e54a5048124f076
Diffstat (limited to 'res')
-rw-r--r-- | res/res_hep.c | 34 |
1 files changed, 29 insertions, 5 deletions
diff --git a/res/res_hep.c b/res/res_hep.c index 41a558141..25b4d13b1 100644 --- a/res/res_hep.c +++ b/res/res_hep.c @@ -69,7 +69,7 @@ </enumlist> </description> </configOption> - <configOption name="capture_address" default="192.168.1.1:9061"> + <configOption name="capture_address"> <synopsis>The address and port of the Homer server to send packets to.</synopsis> </configOption> <configOption name="capture_password"> @@ -96,8 +96,6 @@ #include <netinet/udp.h> #include <netinet/ip6.h> -#define DEFAULT_HEP_SERVER "" - /*! Generic vendor ID. Used for HEPv3 standard packets */ #define GENERIC_VENDOR_ID 0x0000 @@ -280,11 +278,13 @@ static AO2_GLOBAL_OBJ_STATIC(global_data); static struct ast_taskprocessor *hep_queue_tp; static void *module_config_alloc(void); +static int hepv3_config_pre_apply(void); static void hepv3_config_post_apply(void); /*! \brief Register information about the configs being processed by this module */ CONFIG_INFO_STANDARD(cfg_info, global_config, module_config_alloc, .files = ACO_FILES(&hepv3_conf), + .pre_apply_config = hepv3_config_pre_apply, .post_apply_config = hepv3_config_post_apply, ); @@ -377,6 +377,8 @@ static struct hepv3_runtime_data *hepv3_data_alloc(struct hepv3_global_config *c return NULL; } + data->sockfd = -1; + if (!ast_sockaddr_parse(&data->remote_addr, config->capture_address, PARSE_PORT_REQUIRE)) { ast_log(AST_LOG_WARNING, "Failed to create address from %s\n", config->capture_address); ao2_ref(data, -1); @@ -594,11 +596,33 @@ int hepv3_send_packet(struct hepv3_capture_info *capture_info) } /*! + * \brief Pre-apply callback for the config framework. + * + * This validates that required fields exist and are populated. + */ +static int hepv3_config_pre_apply(void) +{ + struct module_config *config = aco_pending_config(&cfg_info); + + if (!config->general->enabled) { + /* If we're not enabled, we don't care about anything else */ + return 0; + } + + if (ast_strlen_zero(config->general->capture_address)) { + ast_log(AST_LOG_ERROR, "Missing required configuration option 'capture_address'\n"); + return -1; + } + + return 0; +} + +/*! * \brief Post-apply callback for the config framework. * * This will create the run-time information from the supplied * configuration. -*/ + */ static void hepv3_config_post_apply(void) { RAII_VAR(struct module_config *, mod_cfg, ao2_global_obj_ref(global_config), ao2_cleanup); @@ -653,7 +677,7 @@ static int load_module(void) } aco_option_register(&cfg_info, "enabled", ACO_EXACT, global_options, "yes", OPT_BOOL_T, 1, FLDSET(struct hepv3_global_config, enabled)); - aco_option_register(&cfg_info, "capture_address", ACO_EXACT, global_options, DEFAULT_HEP_SERVER, OPT_STRINGFIELD_T, 0, STRFLDSET(struct hepv3_global_config, capture_address)); + aco_option_register(&cfg_info, "capture_address", ACO_EXACT, global_options, "", OPT_STRINGFIELD_T, 1, STRFLDSET(struct hepv3_global_config, capture_address)); aco_option_register(&cfg_info, "capture_password", ACO_EXACT, global_options, "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct hepv3_global_config, capture_password)); aco_option_register(&cfg_info, "capture_id", ACO_EXACT, global_options, "0", OPT_UINT_T, 0, STRFLDSET(struct hepv3_global_config, capture_id)); aco_option_register_custom(&cfg_info, "uuid_type", ACO_EXACT, global_options, "call-id", uuid_type_handler, 0); |