Initial OpenECOMP Demo commit
[demo.git] / vnfs / VES / code / evel_library / evel.h
diff --git a/vnfs/VES/code/evel_library/evel.h b/vnfs/VES/code/evel_library/evel.h
new file mode 100644 (file)
index 0000000..a97dadc
--- /dev/null
@@ -0,0 +1,3677 @@
+#ifndef EVEL_INCLUDED
+#define EVEL_INCLUDED
+/**************************************************************************//**
+ * @file
+ * Header for EVEL library
+ *
+ * This file implements the EVEL library which is intended to provide a
+ * simple wrapper around the complexity of AT&T's Vendor Event Listener API so
+ * that VNFs can use it without worrying about details of the API transport.
+ *
+ * Zero return value is success (::EVEL_SUCCESS), non-zero is failure and will
+ * be one of ::EVEL_ERR_CODES.
+ *
+ * License
+ * -------
+ *
+ * Copyright(c) <2016>, AT&T Intellectual Property.  All other rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions and the following disclaimer in the documentation
+ *    and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:  This product includes
+ *    software developed by the AT&T.
+ * 4. Neither the name of AT&T nor the names of its contributors may be used to
+ *    endorse or promote products derived from this software without specific
+ *    prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY AT&T INTELLECTUAL PROPERTY ''AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL AT&T INTELLECTUAL PROPERTY BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *****************************************************************************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <time.h>
+
+#include "double_list.h"
+
+/*****************************************************************************/
+/* Supported API version.                                                    */
+/*****************************************************************************/
+#define EVEL_API_MAJOR_VERSION 3
+#define EVEL_API_MINOR_VERSION 0
+
+/**************************************************************************//**
+ * Error codes
+ *
+ * Error codes for EVEL low level interface
+ *****************************************************************************/
+typedef enum {
+  EVEL_SUCCESS,                   /** The operation was successful.          */
+  EVEL_ERR_GEN_FAIL,              /** Non-specific failure.                  */
+  EVEL_CURL_LIBRARY_FAIL,         /** A cURL library operation failed.       */
+  EVEL_PTHREAD_LIBRARY_FAIL,      /** A Posix threads operation failed.      */
+  EVEL_OUT_OF_MEMORY,             /** A memory allocation failure occurred.  */
+  EVEL_EVENT_BUFFER_FULL,         /** Too many events in the ring-buffer.    */
+  EVEL_EVENT_HANDLER_INACTIVE,    /** Attempt to raise event when inactive.  */
+  EVEL_NO_METADATA,               /** Failed to retrieve OpenStack metadata. */
+  EVEL_BAD_METADATA,              /** OpenStack metadata invalid format.     */
+  EVEL_BAD_JSON_FORMAT,           /** JSON failed to parse correctly.        */
+  EVEL_JSON_KEY_NOT_FOUND,        /** Failed to find the specified JSON key. */
+  EVEL_MAX_ERROR_CODES            /** Maximum number of valid error codes.   */
+} EVEL_ERR_CODES;
+
+/**************************************************************************//**
+ * Logging levels
+ *
+ * Variable levels of verbosity in the logging functions.
+ *****************************************************************************/
+typedef enum {
+  EVEL_LOG_MIN               = 0,
+  EVEL_LOG_SPAMMY            = 30,
+  EVEL_LOG_DEBUG             = 40,
+  EVEL_LOG_INFO              = 50,
+  EVEL_LOG_ERROR             = 60,
+  EVEL_LOG_MAX               = 101
+} EVEL_LOG_LEVELS;
+
+/*****************************************************************************/
+/* Maximum string lengths.                                                   */
+/*****************************************************************************/
+#define EVEL_MAX_STRING_LEN          4096
+#define EVEL_MAX_JSON_BODY           16000
+#define EVEL_MAX_ERROR_STRING_LEN    255
+#define EVEL_MAX_URL_LEN             511
+
+/**************************************************************************//**
+ * This value represents there being no restriction on the reporting interval.
+ *****************************************************************************/
+static const int EVEL_MEASUREMENT_INTERVAL_UKNOWN = 0;
+
+/**************************************************************************//**
+ * How many events can be backed-up before we start dropping events on the
+ * floor.
+ *
+ * @note  This value should be tuned in accordance with expected burstiness of
+ *        the event load and the expected response time of the ECOMP event
+ *        listener so that the probability of the buffer filling is suitably
+ *        low.
+ *****************************************************************************/
+static const int EVEL_EVENT_BUFFER_DEPTH = 100;
+
+/*****************************************************************************/
+/* How many different IP Types-of-Service are supported.                     */
+/*****************************************************************************/
+#define EVEL_TOS_SUPPORTED      256
+
+/**************************************************************************//**
+ * Event domains for the various events we support.
+ * JSON equivalent field: domain
+ *****************************************************************************/
+typedef enum {
+  EVEL_DOMAIN_INTERNAL,       /** Internal event, not for external routing.  */
+  EVEL_DOMAIN_HEARTBEAT,      /** A Heartbeat event (event header only).     */
+  EVEL_DOMAIN_FAULT,          /** A Fault event.                             */
+  EVEL_DOMAIN_MEASUREMENT,    /** A Measurement for VF Scaling event.        */
+  EVEL_DOMAIN_MOBILE_FLOW,    /** A Mobile Flow event.                       */
+  EVEL_DOMAIN_REPORT,         /** A Measurement for VF Reporting event.      */
+  EVEL_DOMAIN_SERVICE,        /** A Service event.                           */
+  EVEL_DOMAIN_SIGNALING,      /** A Signaling event.                         */
+  EVEL_DOMAIN_STATE_CHANGE,   /** A State Change event.                      */
+  EVEL_DOMAIN_SYSLOG,         /** A Syslog event.                            */
+  EVEL_DOMAIN_OTHER,          /** Another event.                             */
+  EVEL_MAX_DOMAINS            /** Maximum number of recognized Event types.  */
+} EVEL_EVENT_DOMAINS;
+
+/**************************************************************************//**
+ * Event priorities.
+ * JSON equivalent field: priority
+ *****************************************************************************/
+typedef enum {
+  EVEL_PRIORITY_HIGH,
+  EVEL_PRIORITY_MEDIUM,
+  EVEL_PRIORITY_NORMAL,
+  EVEL_PRIORITY_LOW,
+  EVEL_MAX_PRIORITIES
+} EVEL_EVENT_PRIORITIES;
+
+/**************************************************************************//**
+ * Fault / Threshold severities.
+ * JSON equivalent field: eventSeverity
+ *****************************************************************************/
+typedef enum {
+  EVEL_SEVERITY_CRITICAL,
+  EVEL_SEVERITY_MAJOR,
+  EVEL_SEVERITY_MINOR,
+  EVEL_SEVERITY_WARNING,
+  EVEL_SEVERITY_NORMAL,
+  EVEL_MAX_SEVERITIES
+} EVEL_SEVERITIES;
+
+/**************************************************************************//**
+ * Fault source types.
+ * JSON equivalent field: eventSourceType
+ *****************************************************************************/
+typedef enum {
+  EVEL_SOURCE_OTHER,
+  EVEL_SOURCE_ROUTER,
+  EVEL_SOURCE_SWITCH,
+  EVEL_SOURCE_HOST,
+  EVEL_SOURCE_CARD,
+  EVEL_SOURCE_PORT,
+  EVEL_SOURCE_SLOT_THRESHOLD,
+  EVEL_SOURCE_PORT_THRESHOLD,
+  EVEL_SOURCE_VIRTUAL_MACHINE,
+  EVEL_SOURCE_VIRTUAL_NETWORK_FUNCTION,
+  /***************************************************************************/
+  /* START OF VENDOR-SPECIFIC VALUES                                         */
+  /*                                                                         */
+  /* Vendor-specific values should be added here, and handled appropriately  */
+  /* in evel_event.c.                                                        */
+  /***************************************************************************/
+
+  /***************************************************************************/
+  /* END OF VENDOR-SPECIFIC VALUES                                           */
+  /***************************************************************************/
+  EVEL_MAX_SOURCE_TYPES
+} EVEL_SOURCE_TYPES;
+
+/**************************************************************************//**
+ * Fault VNF Status.
+ * JSON equivalent field: vfStatus
+ *****************************************************************************/
+typedef enum {
+  EVEL_VF_STATUS_ACTIVE,
+  EVEL_VF_STATUS_IDLE,
+  EVEL_VF_STATUS_PREP_TERMINATE,
+  EVEL_VF_STATUS_READY_TERMINATE,
+  EVEL_VF_STATUS_REQ_TERMINATE,
+  EVEL_MAX_VF_STATUSES
+} EVEL_VF_STATUSES;
+
+/**************************************************************************//**
+ * Counter criticalities.
+ * JSON equivalent field: criticality
+ *****************************************************************************/
+typedef enum {
+  EVEL_COUNTER_CRITICALITY_CRIT,
+  EVEL_COUNTER_CRITICALITY_MAJ,
+  EVEL_MAX_COUNTER_CRITICALITIES
+} EVEL_COUNTER_CRITICALITIES;
+
+/**************************************************************************//**
+ * Alert actions.
+ * JSON equivalent field: alertAction
+ *****************************************************************************/
+typedef enum {
+  EVEL_ALERT_ACTION_CLEAR,
+  EVEL_ALERT_ACTION_CONT,
+  EVEL_ALERT_ACTION_SET,
+  EVEL_MAX_ALERT_ACTIONS
+} EVEL_ALERT_ACTIONS;
+
+/**************************************************************************//**
+ * Alert types.
+ * JSON equivalent field: alertType
+ *****************************************************************************/
+typedef enum {
+  EVEL_ALERT_TYPE_CARD,
+  EVEL_ALERT_TYPE_ELEMENT,
+  EVEL_ALERT_TYPE_INTERFACE,
+  EVEL_ALERT_TYPE_SERVICE,
+  EVEL_MAX_ALERT_TYPES
+} EVEL_ALERT_TYPES;
+
+/**************************************************************************//**
+ * Alert types.
+ * JSON equivalent fields: newState, oldState
+ *****************************************************************************/
+typedef enum {
+  EVEL_ENTITY_STATE_IN_SERVICE,
+  EVEL_ENTITY_STATE_MAINTENANCE,
+  EVEL_ENTITY_STATE_OUT_OF_SERVICE,
+  EVEL_MAX_ENTITY_STATES
+} EVEL_ENTITY_STATE;
+
+/**************************************************************************//**
+ * Syslog facilities.
+ * JSON equivalent field: syslogFacility
+ *****************************************************************************/
+typedef enum {
+  EVEL_SYSLOG_FACILITY_KERNEL,
+  EVEL_SYSLOG_FACILITY_USER,
+  EVEL_SYSLOG_FACILITY_MAIL,
+  EVEL_SYSLOG_FACILITY_SYSTEM_DAEMON,
+  EVEL_SYSLOG_FACILITY_SECURITY_AUTH,
+  EVEL_SYSLOG_FACILITY_INTERNAL,
+  EVEL_SYSLOG_FACILITY_LINE_PRINTER,
+  EVEL_SYSLOG_FACILITY_NETWORK_NEWS,
+  EVEL_SYSLOG_FACILITY_UUCP,
+  EVEL_SYSLOG_FACILITY_CLOCK_DAEMON,
+  EVEL_SYSLOG_FACILITY_SECURITY_AUTH2,
+  EVEL_SYSLOG_FACILITY_FTP_DAEMON,
+  EVEL_SYSLOG_FACILITY_NTP,
+  EVEL_SYSLOG_FACILITY_LOG_AUDIT,
+  EVEL_SYSLOG_FACILITY_LOG_ALERT,
+  EVEL_SYSLOG_FACILITY_CLOCK_DAEMON2,
+  EVEL_SYSLOG_FACILITY_LOCAL0,
+  EVEL_SYSLOG_FACILITY_LOCAL1,
+  EVEL_SYSLOG_FACILITY_LOCAL2,
+  EVEL_SYSLOG_FACILITY_LOCAL3,
+  EVEL_SYSLOG_FACILITY_LOCAL4,
+  EVEL_SYSLOG_FACILITY_LOCAL5,
+  EVEL_SYSLOG_FACILITY_LOCAL6,
+  EVEL_SYSLOG_FACILITY_LOCAL7,
+  EVEL_MAX_SYSLOG_FACILITIES
+} EVEL_SYSLOG_FACILITIES;
+
+/**************************************************************************//**
+ * TCP flags.
+ * JSON equivalent fields: tcpFlagCountList, tcpFlagList
+ *****************************************************************************/
+typedef enum {
+  EVEL_TCP_NS,
+  EVEL_TCP_CWR,
+  EVEL_TCP_ECE,
+  EVEL_TCP_URG,
+  EVEL_TCP_ACK,
+  EVEL_TCP_PSH,
+  EVEL_TCP_RST,
+  EVEL_TCP_SYN,
+  EVEL_TCP_FIN,
+  EVEL_MAX_TCP_FLAGS
+} EVEL_TCP_FLAGS;
+
+/**************************************************************************//**
+ * Mobile QCI Classes of Service.
+ * JSON equivalent fields: mobileQciCosCountList, mobileQciCosList
+ *****************************************************************************/
+typedef enum {
+
+  /***************************************************************************/
+  /* UMTS Classes of Service.                                                */
+  /***************************************************************************/
+  EVEL_QCI_COS_UMTS_CONVERSATIONAL,
+  EVEL_QCI_COS_UMTS_STREAMING,
+  EVEL_QCI_COS_UMTS_INTERACTIVE,
+  EVEL_QCI_COS_UMTS_BACKGROUND,
+
+  /***************************************************************************/
+  /* LTE Classes of Service.                                                 */
+  /***************************************************************************/
+  EVEL_QCI_COS_LTE_1,
+  EVEL_QCI_COS_LTE_2,
+  EVEL_QCI_COS_LTE_3,
+  EVEL_QCI_COS_LTE_4,
+  EVEL_QCI_COS_LTE_65,
+  EVEL_QCI_COS_LTE_66,
+  EVEL_QCI_COS_LTE_5,
+  EVEL_QCI_COS_LTE_6,
+  EVEL_QCI_COS_LTE_7,
+  EVEL_QCI_COS_LTE_8,
+  EVEL_QCI_COS_LTE_9,
+  EVEL_QCI_COS_LTE_69,
+  EVEL_QCI_COS_LTE_70,
+  EVEL_MAX_QCI_COS_TYPES
+} EVEL_QCI_COS_TYPES;
+
+/**************************************************************************//**
+ * Service Event endpoint description
+ * JSON equivalent field: endpointDesc
+ *****************************************************************************/
+typedef enum {
+  EVEL_SERVICE_ENDPOINT_CALLEE,
+  EVEL_SERVICE_ENDPOINT_CALLER,
+  EVEL_MAX_SERVICE_ENDPOINT_DESC
+} EVEL_SERVICE_ENDPOINT_DESC;
+
+/**************************************************************************//**
+ * Boolean type for EVEL library.
+ *****************************************************************************/
+typedef enum {
+  EVEL_FALSE,
+  EVEL_TRUE
+} EVEL_BOOLEAN;
+
+/**************************************************************************//**
+ * Optional parameter holder for double.
+ *****************************************************************************/
+typedef struct evel_option_double
+{
+  double value;
+  EVEL_BOOLEAN is_set;
+} EVEL_OPTION_DOUBLE;
+
+/**************************************************************************//**
+ * Optional parameter holder for string.
+ *****************************************************************************/
+typedef struct evel_option_string
+{
+  char * value;
+  EVEL_BOOLEAN is_set;
+} EVEL_OPTION_STRING;
+
+/**************************************************************************//**
+ * Optional parameter holder for int.
+ *****************************************************************************/
+typedef struct evel_option_int
+{
+  int value;
+  EVEL_BOOLEAN is_set;
+} EVEL_OPTION_INT;
+
+/**************************************************************************//**
+ * Optional parameter holder for unsigned long long.
+ *****************************************************************************/
+typedef struct evel_option_ull
+{
+  unsigned long long value;
+  EVEL_BOOLEAN is_set;
+} EVEL_OPTION_ULL;
+
+/**************************************************************************//**
+ * Optional parameter holder for time_t.
+ *****************************************************************************/
+typedef struct evel_option_time
+{
+  time_t value;
+  EVEL_BOOLEAN is_set;
+} EVEL_OPTION_TIME;
+
+/*****************************************************************************/
+/* Supported Common Event Header version.                                    */
+/*****************************************************************************/
+#define EVEL_HEADER_MAJOR_VERSION 1
+#define EVEL_HEADER_MINOR_VERSION 2
+
+/**************************************************************************//**
+ * Event header.
+ * JSON equivalent field: commonEventHeader
+ *****************************************************************************/
+typedef struct event_header {
+  /***************************************************************************/
+  /* Version                                                                 */
+  /***************************************************************************/
+  int major_version;
+  int minor_version;
+
+  /***************************************************************************/
+  /* Mandatory fields                                                        */
+  /***************************************************************************/
+  EVEL_EVENT_DOMAINS event_domain;
+  char * event_id;
+  char * source_name;
+  char * functional_role;
+  char * reporting_entity_name;
+  EVEL_EVENT_PRIORITIES priority;
+  unsigned long long start_epoch_microsec;
+  unsigned long long last_epoch_microsec;
+  int sequence;
+
+  /***************************************************************************/
+  /* Optional fields                                                         */
+  /***************************************************************************/
+  EVEL_OPTION_STRING event_type;
+  EVEL_OPTION_STRING source_id;
+  EVEL_OPTION_STRING reporting_entity_id;
+
+} EVENT_HEADER;
+
+/*****************************************************************************/
+/* Supported Fault version.                                                  */
+/*****************************************************************************/
+#define EVEL_FAULT_MAJOR_VERSION 1
+#define EVEL_FAULT_MINOR_VERSION 1
+
+/**************************************************************************//**
+ * Fault.
+ * JSON equivalent field: faultFields
+ *****************************************************************************/
+typedef struct event_fault {
+  /***************************************************************************/
+  /* Header and version                                                      */
+  /***************************************************************************/
+  EVENT_HEADER header;
+  int major_version;
+  int minor_version;
+
+  /***************************************************************************/
+  /* Mandatory fields                                                        */
+  /***************************************************************************/
+  EVEL_SEVERITIES event_severity;
+  EVEL_SOURCE_TYPES event_source_type;
+  char * alarm_condition;
+  char * specific_problem;
+  EVEL_VF_STATUSES vf_status;
+
+  /***************************************************************************/
+  /* Optional fields                                                         */
+  /***************************************************************************/
+  EVEL_OPTION_STRING alarm_interface_a;
+  DLIST additional_info;
+
+} EVENT_FAULT;
+
+/**************************************************************************//**
+ * Fault Additional Info.
+ * JSON equivalent field: alarmAdditionalInformation
+ *****************************************************************************/
+typedef struct fault_additional_info {
+  char * name;
+  char * value;
+} FAULT_ADDL_INFO;
+
+/*****************************************************************************/
+/* Supported Measurement version.                                            */
+/*****************************************************************************/
+#define EVEL_MEASUREMENT_MAJOR_VERSION 1
+#define EVEL_MEASUREMENT_MINOR_VERSION 1
+
+/**************************************************************************//**
+ * Errors.
+ * JSON equivalent field: errors
+ *****************************************************************************/
+typedef struct measurement_errors {
+  int receive_discards;
+  int receive_errors;
+  int transmit_discards;
+  int transmit_errors;
+} MEASUREMENT_ERRORS;
+
+/**************************************************************************//**
+ * Measurement.
+ * JSON equivalent field: measurementsForVfScalingFields
+ *****************************************************************************/
+typedef struct event_measurement {
+  /***************************************************************************/
+  /* Header and version                                                      */
+  /***************************************************************************/
+  EVENT_HEADER header;
+  int major_version;
+  int minor_version;
+
+  /***************************************************************************/
+  /* Mandatory fields                                                        */
+  /***************************************************************************/
+  double measurement_interval;
+
+  /***************************************************************************/
+  /* Optional fields                                                         */
+  /***************************************************************************/
+  DLIST additional_measurements;
+  EVEL_OPTION_DOUBLE aggregate_cpu_usage;
+  DLIST codec_usage;
+  EVEL_OPTION_INT concurrent_sessions;
+  EVEL_OPTION_INT configured_entities;
+  DLIST cpu_usage;
+  MEASUREMENT_ERRORS * errors;
+  DLIST feature_usage;
+  DLIST filesystem_usage;
+  DLIST latency_distribution;
+  EVEL_OPTION_DOUBLE mean_request_latency;
+  EVEL_OPTION_DOUBLE memory_configured;
+  EVEL_OPTION_DOUBLE memory_used;
+  EVEL_OPTION_INT media_ports_in_use;
+  EVEL_OPTION_INT request_rate;
+  EVEL_OPTION_DOUBLE vnfc_scaling_metric;
+  DLIST vnic_usage;
+
+} EVENT_MEASUREMENT;
+
+/**************************************************************************//**
+ * CPU Usage.
+ * JSON equivalent field: cpuUsage
+ *****************************************************************************/
+typedef struct measurement_cpu_use {
+  char * id;
+  double usage;
+} MEASUREMENT_CPU_USE;
+
+/**************************************************************************//**
+ * Filesystem Usage.
+ * JSON equivalent field: filesystemUsage
+ *****************************************************************************/
+typedef struct measurement_fsys_use {
+  char * filesystem_name;
+  double block_configured;
+  int block_iops;
+  double block_used;
+  double ephemeral_configured;
+  int ephemeral_iops;
+  double ephemeral_used;
+} MEASUREMENT_FSYS_USE;
+
+/**************************************************************************//**
+ * Latency Bucket.
+ * JSON equivalent field: latencyBucketMeasure
+ *****************************************************************************/
+typedef struct measurement_latency_bucket {
+  int count;
+
+  /***************************************************************************/
+  /* Optional fields                                                         */
+  /***************************************************************************/
+  EVEL_OPTION_DOUBLE high_end;
+  EVEL_OPTION_DOUBLE low_end;
+
+} MEASUREMENT_LATENCY_BUCKET;
+
+/**************************************************************************//**
+ * Virtual NIC usage.
+ * JSON equivalent field: vNicUsage
+ *****************************************************************************/
+typedef struct measurement_vnic_use {
+  int bytes_in;
+  int bytes_out;
+  int packets_in;
+  int packets_out;
+  char * vnic_id;
+
+  /***************************************************************************/
+  /* Optional fields                                                         */
+  /***************************************************************************/
+  EVEL_OPTION_INT broadcast_packets_in;
+  EVEL_OPTION_INT broadcast_packets_out;
+  EVEL_OPTION_INT multicast_packets_in;
+  EVEL_OPTION_INT multicast_packets_out;
+  EVEL_OPTION_INT unicast_packets_in;
+  EVEL_OPTION_INT unicast_packets_out;
+
+} MEASUREMENT_VNIC_USE;
+
+/**************************************************************************//**
+ * Codec Usage.
+ * JSON equivalent field: codecsInUse
+ *****************************************************************************/
+typedef struct measurement_codec_use {
+  char * codec_id;
+  int number_in_use;
+} MEASUREMENT_CODEC_USE;
+
+/**************************************************************************//**
+ * Feature Usage.
+ * JSON equivalent field: featuresInUse
+ *****************************************************************************/
+typedef struct measurement_feature_use {
+  char * feature_id;
+  int feature_utilization;
+} MEASUREMENT_FEATURE_USE;
+
+/**************************************************************************//**
+ * Measurement Group.
+ * JSON equivalent field: additionalMeasurements
+ *****************************************************************************/
+typedef struct measurement_group {
+  char * name;
+  DLIST measurements;
+} MEASUREMENT_GROUP;
+
+/**************************************************************************//**
+ * Custom Defined Measurement.
+ * JSON equivalent field: measurements
+ *****************************************************************************/
+typedef struct custom_measurement {
+  char * name;
+  char * value;
+} CUSTOM_MEASUREMENT;
+
+/*****************************************************************************/
+/* Supported Report version.                                                 */
+/*****************************************************************************/
+#define EVEL_REPORT_MAJOR_VERSION 1
+#define EVEL_REPORT_MINOR_VERSION 1
+
+/**************************************************************************//**
+ * Report.
+ * JSON equivalent field: measurementsForVfReportingFields
+ *
+ * @note  This is an experimental event type and is not currently a formal part
+ *        of AT&T's specification.
+ *****************************************************************************/
+typedef struct event_report {
+  /***************************************************************************/
+  /* Header and version                                                      */
+  /***************************************************************************/
+  EVENT_HEADER header;
+  int major_version;
+  int minor_version;
+
+  /***************************************************************************/
+  /* Mandatory fields                                                        */
+  /***************************************************************************/
+  double measurement_interval;
+
+  /***************************************************************************/
+  /* Optional fields                                                         */
+  /***************************************************************************/
+  DLIST feature_usage;
+  DLIST measurement_groups;
+
+} EVENT_REPORT;
+
+/**************************************************************************//**
+ * Mobile GTP Per Flow Metrics.
+ * JSON equivalent field: gtpPerFlowMetrics
+ *****************************************************************************/
+typedef struct mobile_gtp_per_flow_metrics {
+  double avg_bit_error_rate;
+  double avg_packet_delay_variation;
+  int avg_packet_latency;
+  int avg_receive_throughput;
+  int avg_transmit_throughput;
+  int flow_activation_epoch;
+  int flow_activation_microsec;
+  int flow_deactivation_epoch;
+  int flow_deactivation_microsec;
+  time_t flow_deactivation_time;
+  char * flow_status;
+  int max_packet_delay_variation;
+  int num_activation_failures;
+  int num_bit_errors;
+  int num_bytes_received;
+  int num_bytes_transmitted;
+  int num_dropped_packets;
+  int num_l7_bytes_received;
+  int num_l7_bytes_transmitted;
+  int num_lost_packets;
+  int num_out_of_order_packets;
+  int num_packet_errors;
+  int num_packets_received_excl_retrans;
+  int num_packets_received_incl_retrans;
+  int num_packets_transmitted_incl_retrans;
+  int num_retries;
+  int num_timeouts;
+  int num_tunneled_l7_bytes_received;
+  int round_trip_time;
+  int time_to_first_byte;
+
+  /***************************************************************************/
+  /* Optional fields                                                         */
+  /***************************************************************************/
+  EVEL_OPTION_INT ip_tos_counts[EVEL_TOS_SUPPORTED];
+  EVEL_OPTION_INT tcp_flag_counts[EVEL_MAX_TCP_FLAGS];
+  EVEL_OPTION_INT qci_cos_counts[EVEL_MAX_QCI_COS_TYPES];
+  EVEL_OPTION_INT dur_connection_failed_status;
+  EVEL_OPTION_INT dur_tunnel_failed_status;
+  EVEL_OPTION_STRING flow_activated_by;
+  EVEL_OPTION_TIME flow_activation_time;
+  EVEL_OPTION_STRING flow_deactivated_by;
+  EVEL_OPTION_STRING gtp_connection_status;
+  EVEL_OPTION_STRING gtp_tunnel_status;
+  EVEL_OPTION_INT large_packet_rtt;
+  EVEL_OPTION_DOUBLE large_packet_threshold;
+  EVEL_OPTION_INT max_receive_bit_rate;
+  EVEL_OPTION_INT max_transmit_bit_rate;
+  EVEL_OPTION_INT num_gtp_echo_failures;
+  EVEL_OPTION_INT num_gtp_tunnel_errors;
+  EVEL_OPTION_INT num_http_errors;
+
+} MOBILE_GTP_PER_FLOW_METRICS;
+
+/*****************************************************************************/
+/* Supported Mobile Flow version.                                            */
+/*****************************************************************************/
+#define EVEL_MOBILE_FLOW_MAJOR_VERSION 1
+#define EVEL_MOBILE_FLOW_MINOR_VERSION 1
+
+/**************************************************************************//**
+ * Mobile Flow.
+ * JSON equivalent field: mobileFlow
+ *****************************************************************************/
+typedef struct event_mobile_flow {
+  /***************************************************************************/
+  /* Header and version                                                      */
+  /***************************************************************************/
+  EVENT_HEADER header;
+  int major_version;
+  int minor_version;
+
+  /***************************************************************************/
+  /* Mandatory fields                                                        */
+  /***************************************************************************/
+  char * flow_direction;
+  MOBILE_GTP_PER_FLOW_METRICS * gtp_per_flow_metrics;
+  char * ip_protocol_type;
+  char * ip_version;
+  char * other_endpoint_ip_address;
+  int other_endpoint_port;
+  char * reporting_endpoint_ip_addr;
+  int reporting_endpoint_port;
+
+  /***************************************************************************/
+  /* Optional fields                                                         */
+  /***************************************************************************/
+  EVEL_OPTION_STRING application_type;
+  EVEL_OPTION_STRING app_protocol_type;
+  EVEL_OPTION_STRING app_protocol_version;
+  EVEL_OPTION_STRING cid;
+  EVEL_OPTION_STRING connection_type;
+  EVEL_OPTION_STRING ecgi;
+  EVEL_OPTION_STRING gtp_protocol_type;
+  EVEL_OPTION_STRING gtp_version;
+  EVEL_OPTION_STRING http_header;
+  EVEL_OPTION_STRING imei;
+  EVEL_OPTION_STRING imsi;
+  EVEL_OPTION_STRING lac;
+  EVEL_OPTION_STRING mcc;
+  EVEL_OPTION_STRING mnc;
+  EVEL_OPTION_STRING msisdn;
+  EVEL_OPTION_STRING other_functional_role;
+  EVEL_OPTION_STRING rac;
+  EVEL_OPTION_STRING radio_access_technology;
+  EVEL_OPTION_STRING sac;
+  EVEL_OPTION_INT sampling_algorithm;
+  EVEL_OPTION_STRING tac;
+  EVEL_OPTION_STRING tunnel_id;
+  EVEL_OPTION_STRING vlan_id;
+
+} EVENT_MOBILE_FLOW;
+
+/**************************************************************************//**
+ * Other.
+ * JSON equivalent field: otherFields
+ *****************************************************************************/
+typedef struct event_other {
+  EVENT_HEADER header;
+  DLIST other_fields;
+
+} EVENT_OTHER;
+
+/**************************************************************************//**
+ * Other Field.
+ * JSON equivalent field: otherFields
+ *****************************************************************************/
+typedef struct other_field {
+  char * name;
+  char * value;
+} OTHER_FIELD;
+
+/**************************************************************************//**
+ * Event Instance Identifier
+ * JSON equivalent field: eventInstanceIdentifier
+ *****************************************************************************/
+typedef struct evel_event_instance_id {
+
+  /***************************************************************************/
+  /* Mandatory fields                                                        */
+  /***************************************************************************/
+  char * vendor_id;                                        /* JSON: vendorId */
+  char * event_id;                                          /* JSON: eventId */
+
+  /***************************************************************************/
+  /* Optional fields                                                         */
+  /***************************************************************************/
+  EVEL_OPTION_STRING product_id;                          /* JSON: productId */
+  EVEL_OPTION_STRING subsystem_id;                      /* JSON: subsystemId */
+  EVEL_OPTION_STRING event_friendly_name;         /* JSON: eventFriendlyName */
+
+} EVEL_EVENT_INSTANCE_ID;
+
+/*****************************************************************************/
+/* Supported Service Events version.                                         */
+/*****************************************************************************/
+#define EVEL_SERVICE_MAJOR_VERSION 1
+#define EVEL_SERVICE_MINOR_VERSION 1
+
+/**************************************************************************//**
+ * Service Events.
+ * JSON equivalent field: serviceEventsFields
+ *****************************************************************************/
+typedef struct event_service {
+  /***************************************************************************/
+  /* Header and version                                                      */
+  /***************************************************************************/
+  EVENT_HEADER header;
+  int major_version;
+  int minor_version;
+
+  /***************************************************************************/
+  /* Mandatory fields                                                        */
+  /***************************************************************************/
+  EVEL_EVENT_INSTANCE_ID instance_id;       /* JSON: eventInstanceIdentifier */
+
+  /***************************************************************************/
+  /* Optional fields.                                                        */
+  /***************************************************************************/
+  EVEL_OPTION_STRING correlator;                         /* JSON: correlator */
+  DLIST additional_fields;                         /* JSON: additionalFields */
+
+  /***************************************************************************/
+  /* Optional fields within JSON equivalent object: codecSelected            */
+  /***************************************************************************/
+  EVEL_OPTION_STRING codec;                                   /* JSON: codec */
+
+  /***************************************************************************/
+  /* Optional fields within JSON equivalent object: codecSelectedTranscoding */
+  /***************************************************************************/
+  EVEL_OPTION_STRING callee_side_codec;             /* JSON: calleeSideCodec */
+  EVEL_OPTION_STRING caller_side_codec;             /* JSON: callerSideCodec */
+
+  /***************************************************************************/
+  /* Optional fields within JSON equivalent object: midCallRtcp              */
+  /***************************************************************************/
+  EVEL_OPTION_STRING rtcp_data;                            /* JSON: rtcpData */
+
+  /***************************************************************************/
+  /* Optional fields within JSON equivalent object: endOfCallVqmSummaries    */
+  /***************************************************************************/
+  EVEL_OPTION_STRING adjacency_name;                  /* JSON: adjacencyName */
+  EVEL_OPTION_STRING endpoint_description;      /* JSON: endpointDescription */
+  EVEL_OPTION_INT endpoint_jitter;                   /* JSON: endpointJitter */
+  EVEL_OPTION_INT endpoint_rtp_oct_disc; /* JSON: endpointRtpOctetsDiscarded */
+  EVEL_OPTION_INT endpoint_rtp_oct_recv;  /* JSON: endpointRtpOctetsReceived */
+  EVEL_OPTION_INT endpoint_rtp_oct_sent;      /* JSON: endpointRtpOctetsSent */
+  EVEL_OPTION_INT endpoint_rtp_pkt_disc;/* JSON: endpointRtpPacketsDiscarded */
+  EVEL_OPTION_INT endpoint_rtp_pkt_recv; /* JSON: endpointRtpPacketsReceived */
+  EVEL_OPTION_INT endpoint_rtp_pkt_sent;     /* JSON: endpointRtpPacketsSent */
+  EVEL_OPTION_INT local_jitter;                         /* JSON: localJitter */
+  EVEL_OPTION_INT local_rtp_oct_disc;       /* JSON: localRtpOctetsDiscarded */
+  EVEL_OPTION_INT local_rtp_oct_recv;        /* JSON: localRtpOctetsReceived */
+  EVEL_OPTION_INT local_rtp_oct_sent;            /* JSON: localRtpOctetsSent */
+  EVEL_OPTION_INT local_rtp_pkt_disc;      /* JSON: localRtpPacketsDiscarded */
+  EVEL_OPTION_INT local_rtp_pkt_recv;       /* JSON: localRtpPacketsReceived */
+  EVEL_OPTION_INT local_rtp_pkt_sent;           /* JSON: localRtpPacketsSent */
+  EVEL_OPTION_DOUBLE mos_cqe;                                /* JSON: mosCqe */
+  EVEL_OPTION_INT packets_lost;                         /* JSON: packetsLost */
+  EVEL_OPTION_DOUBLE packet_loss_percent;         /* JSON: packetLossPercent */
+  EVEL_OPTION_INT r_factor;                                 /* JSON: rFactor */
+  EVEL_OPTION_INT round_trip_delay;                  /* JSON: roundTripDelay */
+
+  /***************************************************************************/
+  /* Optional fields within JSON equivalent object: marker                   */
+  /***************************************************************************/
+  EVEL_OPTION_STRING phone_number;                      /* JSON: phoneNumber */
+
+} EVENT_SERVICE;
+
+/*****************************************************************************/
+/* Supported Signaling version.                                              */
+/*****************************************************************************/
+#define EVEL_SIGNALING_MAJOR_VERSION 1
+#define EVEL_SIGNALING_MINOR_VERSION 1
+
+/**************************************************************************//**
+ * Signaling.
+ * JSON equivalent field: signalingFields
+ *****************************************************************************/
+typedef struct event_signaling {
+  /***************************************************************************/
+  /* Header and version                                                      */
+  /***************************************************************************/
+  EVENT_HEADER header;
+  int major_version;
+  int minor_version;
+
+  /***************************************************************************/
+  /* Mandatory fields                                                        */
+  /***************************************************************************/
+  EVEL_EVENT_INSTANCE_ID instance_id;       /* JSON: eventInstanceIdentifier */
+
+  /***************************************************************************/
+  /* Optional fields                                                         */
+  /***************************************************************************/
+  EVEL_OPTION_STRING correlator;                         /* JSON: correlator */
+  EVEL_OPTION_STRING local_ip_address;               /* JSON: localIpAddress */
+  EVEL_OPTION_STRING local_port;                          /* JSON: localPort */
+  EVEL_OPTION_STRING remote_ip_address;             /* JSON: remoteIpAddress */
+  EVEL_OPTION_STRING remote_port;                        /* JSON: remotePort */
+  EVEL_OPTION_STRING compressed_sip;                  /* JSON: compressedSip */
+  EVEL_OPTION_STRING summary_sip;                        /* JSON: summarySip */
+
+} EVENT_SIGNALING;
+
+/*****************************************************************************/
+/* Supported State Change version.                                           */
+/*****************************************************************************/
+#define EVEL_STATE_CHANGE_MAJOR_VERSION 1
+#define EVEL_STATE_CHANGE_MINOR_VERSION 1
+
+/**************************************************************************//**
+ * State Change.
+ * JSON equivalent field: stateChangeFields
+ *****************************************************************************/
+typedef struct event_state_change {
+  /***************************************************************************/
+  /* Header and version                                                      */
+  /***************************************************************************/
+  EVENT_HEADER header;
+  int major_version;
+  int minor_version;
+
+  /***************************************************************************/
+  /* Mandatory fields                                                        */
+  /***************************************************************************/
+  EVEL_ENTITY_STATE new_state;
+  EVEL_ENTITY_STATE old_state;
+  char * state_interface;
+
+  /***************************************************************************/
+  /* Optional fields                                                         */
+  /***************************************************************************/
+  DLIST additional_fields;
+
+} EVENT_STATE_CHANGE;
+
+/**************************************************************************//**
+ * State Change Additional Field.
+ * JSON equivalent field: additionalFields
+ *****************************************************************************/
+typedef struct state_change_additional_field {
+  char * name;
+  char * value;
+} STATE_CHANGE_ADDL_FIELD;
+
+/*****************************************************************************/
+/* Supported Syslog version.                                                 */
+/*****************************************************************************/
+#define EVEL_SYSLOG_MAJOR_VERSION 1
+#define EVEL_SYSLOG_MINOR_VERSION 1
+
+/**************************************************************************//**
+ * Syslog.
+ * JSON equivalent field: syslogFields
+ *****************************************************************************/
+typedef struct event_syslog {
+  /***************************************************************************/
+  /* Header and version                                                      */
+  /***************************************************************************/
+  EVENT_HEADER header;
+  int major_version;
+  int minor_version;
+
+  /***************************************************************************/
+  /* Mandatory fields                                                        */
+  /***************************************************************************/
+  EVEL_SOURCE_TYPES event_source_type;
+  char * syslog_msg;
+  char * syslog_tag;
+
+  /***************************************************************************/
+  /* Optional fields                                                         */
+  /***************************************************************************/
+  DLIST additional_fields;
+  EVEL_OPTION_STRING event_source_host;
+  EVEL_OPTION_INT syslog_facility;
+  EVEL_OPTION_STRING syslog_proc;
+  EVEL_OPTION_INT syslog_proc_id;
+  EVEL_OPTION_STRING syslog_s_data;
+  EVEL_OPTION_INT syslog_ver;
+
+} EVENT_SYSLOG;
+
+/**************************************************************************//**
+ * Syslog Additional Field.
+ * JSON equivalent field: additionalFields
+ *****************************************************************************/
+typedef struct syslog_additional_field {
+  char * name;
+  char * value;
+} SYSLOG_ADDL_FIELD;
+
+/**************************************************************************//**
+ * Copyright.
+ * JSON equivalent object: attCopyrightNotice
+ *****************************************************************************/
+typedef struct copyright {
+  char * useAndRedistribution;
+  char * condition1;
+  char * condition2;
+  char * condition3;
+  char * condition4;
+  char * disclaimerLine1;
+  char * disclaimerLine2;
+  char * disclaimerLine3;
+  char * disclaimerLine4;
+} COPYRIGHT;
+
+/**************************************************************************//**
+ * Library initialization.
+ *
+ * Initialize the EVEL library.
+ *
+ * @note  This function initializes the cURL library.  Applications making use
+ *        of libcurl may need to pull the initialization out of here.  Note
+ *        also that this function is not threadsafe as a result - refer to
+ *        libcurl's API documentation for relevant warnings.
+ *
+ * @sa  Matching Term function.
+ *
+ * @param   fqdn    The API's FQDN or IP address.
+ * @param   port    The API's port.
+ * @param   path    The optional path (may be NULL).
+ * @param   topic   The optional topic part of the URL (may be NULL).
+ * @param   secure  Whether to use HTTPS (0=HTTP, 1=HTTPS).
+ * @param   username  Username for Basic Authentication of requests.
+ * @param   password  Password for Basic Authentication of requests.
+ * @param   source_type The kind of node we represent.
+ * @param   role    The role this node undertakes.
+ * @param   verbosity  0 for normal operation, positive values for chattier
+ *                     logs.
+ *
+ * @returns Status code
+ * @retval  EVEL_SUCCESS      On success
+ * @retval  ::EVEL_ERR_CODES  On failure.
+ *****************************************************************************/
+EVEL_ERR_CODES evel_initialize(const char * const fqdn,
+                               int port,
+                               const char * const path,
+                               const char * const topic,
+                               int secure,
+                               const char * const username,
+                               const char * const password,
+                               EVEL_SOURCE_TYPES source_type,
+                               const char * const role,
+                               int verbosity
+                               );
+
+/**************************************************************************//**
+ * Clean up the EVEL library.
+ *
+ * @note that at present don't expect Init/Term cycling not to leak memory!
+ *
+ * @returns Status code
+ * @retval  EVEL_SUCCESS On success
+ * @retval  "One of ::EVEL_ERR_CODES" On failure.
+ *****************************************************************************/
+EVEL_ERR_CODES evel_terminate(void);
+
+EVEL_ERR_CODES evel_post_event(EVENT_HEADER * event);
+const char * evel_error_string(void);
+
+
+/**************************************************************************//**
+ * Free an event.
+ *
+ * Free off the event supplied.  Will free all the contained allocated memory.
+ *
+ * @note  It is safe to free a NULL pointer.
+ *****************************************************************************/
+void evel_free_event(void * event);
+
+/**************************************************************************//**
+ * Encode the event as a JSON event object according to AT&T's schema.
+ *
+ * @param json      Pointer to where to store the JSON encoded data.
+ * @param max_size  Size of storage available in json_body.
+ * @param event     Pointer to the ::EVENT_HEADER to encode.
+ * @returns Number of bytes actually written.
+ *****************************************************************************/
+int evel_json_encode_event(char * json,
+                           int max_size,
+                           EVENT_HEADER * event);
+
+/**************************************************************************//**
+ * Callback function to provide returned data.
+ *
+ * Copy data into the supplied buffer, write_callback::ptr, checking size
+ * limits.
+ *
+ * @returns   Number of bytes placed into write_callback::ptr. 0 for EOF.
+ *****************************************************************************/
+size_t evel_write_callback(void *contents,
+                           size_t size,
+                           size_t nmemb,
+                           void *userp);
+
+/*****************************************************************************/
+/*****************************************************************************/
+/*                                                                           */
+/*   HEARTBEAT - (includes common header, too)                               */
+/*                                                                           */
+/*****************************************************************************/
+/*****************************************************************************/
+
+/**************************************************************************//**
+ * Create a new heartbeat event.
+ *
+ * @note that the heartbeat is just a "naked" commonEventHeader!
+ *
+ * @returns pointer to the newly manufactured ::EVENT_HEADER.  If the event is
+ *          not used it must be released using ::evel_free_event
+ * @retval  NULL  Failed to create the event.
+ *****************************************************************************/
+EVENT_HEADER * evel_new_heartbeat(void);
+
+/**************************************************************************//**
+ * Free an event header.
+ *
+ * Free off the event header supplied.  Will free all the contained allocated
+ * memory.
+ *
+ * @note It does not free the header itself, since that may be part of a
+ * larger structure.
+ *****************************************************************************/
+void evel_free_header(EVENT_HEADER * const event);
+
+/**************************************************************************//**
+ * Initialize a newly created event header.
+ *
+ * @param header  Pointer to the header being initialized.
+ *****************************************************************************/
+void evel_init_header(EVENT_HEADER * const header);
+
+/**************************************************************************//**
+ * Set the Event Type property of the event header.
+ *
+ * @param header        Pointer to the ::EVENT_HEADER.
+ * @param type          The Event Type to be set. ASCIIZ string. The caller
+ *                      does not need to preserve the value once the function
+ *                      returns.
+ *****************************************************************************/
+void evel_header_type_set(EVENT_HEADER * const header,
+                          const char * const type);
+
+/**************************************************************************//**
+ * Set the Start Epoch property of the event header.
+ *
+ * @note The Start Epoch defaults to the time of event creation.
+ *
+ * @param header        Pointer to the ::EVENT_HEADER.
+ * @param start_epoch_microsec
+ *                      The start epoch to set, in microseconds.
+ *****************************************************************************/
+void evel_start_epoch_set(EVENT_HEADER * const header,
+                          const unsigned long long start_epoch_microsec);
+
+/**************************************************************************//**
+ * Set the Last Epoch property of the event header.
+ *
+ * @note The Last Epoch defaults to the time of event creation.
+ *
+ * @param header        Pointer to the ::EVENT_HEADER.
+ * @param last_epoch_microsec
+ *                      The last epoch to set, in microseconds.
+ *****************************************************************************/
+void evel_last_epoch_set(EVENT_HEADER * const header,
+                         const unsigned long long last_epoch_microsec);
+
+/**************************************************************************//**
+ * Set the Reporting Entity Name property of the event header.
+ *
+ * @note The Reporting Entity Name defaults to the OpenStack VM Name.
+ *
+ * @param header        Pointer to the ::EVENT_HEADER.
+ * @param entity_name   The entity name to set.
+ *****************************************************************************/
+void evel_reporting_entity_name_set(EVENT_HEADER * const header,
+                                    const char * const entity_name);
+
+/**************************************************************************//**
+ * Set the Reporting Entity Id property of the event header.
+ *
+ * @note The Reporting Entity Id defaults to the OpenStack VM UUID.
+ *
+ * @param header        Pointer to the ::EVENT_HEADER.
+ * @param entity_id     The entity id to set.
+ *****************************************************************************/
+void evel_reporting_entity_id_set(EVENT_HEADER * const header,
+                                  const char * const entity_id);
+
+/*****************************************************************************/
+/*****************************************************************************/
+/*                                                                           */
+/*   FAULT                                                                   */
+/*                                                                           */
+/*****************************************************************************/
+/*****************************************************************************/
+
+/**************************************************************************//**
+ * Create a new fault event.
+ *
+ *
+ * @returns pointer to the newly manufactured ::EVENT_FAULT.  If the event is
+ *          not used it must be released using ::evel_free_fault
+ * @retval  NULL  Failed to create the event.
+ *****************************************************************************/
+EVENT_FAULT * evel_new_fault(const char * const condition,
+                             const char * const specific_problem,
+                             EVEL_EVENT_PRIORITIES priority,
+                             EVEL_SEVERITIES severity);
+
+/**************************************************************************//**
+ * Free a Fault.
+ *
+ * Free off the Fault supplied.  Will free all the contained allocated memory.
+ *
+ * @note It does not free the Fault itself, since that may be part of a
+ * larger structure.
+ *****************************************************************************/
+void evel_free_fault(EVENT_FAULT * event);
+
+
+/**************************************************************************//**
+ * Set the Alarm Interface A property of the Fault.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param fault      Pointer to the fault.
+ * @param interface  The Alarm Interface A to be set. ASCIIZ string. The caller
+ *                   does not need to preserve the value once the function
+ *                   returns.
+ *****************************************************************************/
+void evel_fault_interface_set(EVENT_FAULT * fault,
+                              const char * const interface);
+
+/**************************************************************************//**
+ * Add an additional value name/value pair to the Fault.
+ *
+ * The name and value are null delimited ASCII strings.  The library takes
+ * a copy so the caller does not have to preserve values after the function
+ * returns.
+ *
+ * @param fault     Pointer to the fault.
+ * @param name      ASCIIZ string with the attribute's name.
+ * @param value     ASCIIZ string with the attribute's value.
+ *****************************************************************************/
+void evel_fault_addl_info_add(EVENT_FAULT * fault, char * name, char * value);
+
+/**************************************************************************//**
+ * Set the Event Type property of the Fault.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param fault      Pointer to the fault.
+ * @param type       The Event Type to be set. ASCIIZ string. The caller
+ *                   does not need to preserve the value once the function
+ *                   returns.
+ *****************************************************************************/
+void evel_fault_type_set(EVENT_FAULT * fault, const char * const type);
+
+/*****************************************************************************/
+/*****************************************************************************/
+/*                                                                           */
+/*   MEASUREMENT                                                             */
+/*                                                                           */
+/*****************************************************************************/
+/*****************************************************************************/
+
+/**************************************************************************//**
+ * Create a new Measurement event.
+ *
+ * @note    The mandatory fields on the Measurement must be supplied to this
+ *          factory function and are immutable once set.  Optional fields have
+ *          explicit setter functions, but again values may only be set once so
+ *          that the Measurement has immutable properties.
+ *
+ * @param   measurement_interval
+ *
+ * @returns pointer to the newly manufactured ::EVENT_MEASUREMENT.  If the
+ *          event is not used (i.e. posted) it must be released using
+ *          ::evel_free_event.
+ * @retval  NULL  Failed to create the event.
+ *****************************************************************************/
+EVENT_MEASUREMENT * evel_new_measurement(double measurement_interval);
+
+/**************************************************************************//**
+ * Free a Measurement.
+ *
+ * Free off the Measurement supplied.  Will free all the contained allocated
+ * memory.
+ *
+ * @note It does not free the Measurement itself, since that may be part of a
+ * larger structure.
+ *****************************************************************************/
+void evel_free_measurement(EVENT_MEASUREMENT * event);
+
+/**************************************************************************//**
+ * Set the Event Type property of the Measurement.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param measurement Pointer to the Measurement.
+ * @param type        The Event Type to be set. ASCIIZ string. The caller
+ *                    does not need to preserve the value once the function
+ *                    returns.
+ *****************************************************************************/
+void evel_measurement_type_set(EVENT_MEASUREMENT * measurement,
+                               const char * const type);
+
+/**************************************************************************//**
+ * Set the Concurrent Sessions property of the Measurement.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param measurement         Pointer to the Measurement.
+ * @param concurrent_sessions The Concurrent Sessions to be set.
+ *****************************************************************************/
+void evel_measurement_conc_sess_set(EVENT_MEASUREMENT * measurement,
+                                    int concurrent_sessions);
+
+/**************************************************************************//**
+ * Set the Configured Entities property of the Measurement.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param measurement         Pointer to the Measurement.
+ * @param configured_entities The Configured Entities to be set.
+ *****************************************************************************/
+void evel_measurement_cfg_ents_set(EVENT_MEASUREMENT * measurement,
+                                   int configured_entities);
+
+/**************************************************************************//**
+ * Add an additional set of Errors to the Measurement.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param measurement       Pointer to the measurement.
+ * @param receive_discards  The number of receive discards.
+ * @param receive_errors    The number of receive errors.
+ * @param transmit_discards The number of transmit discards.
+ * @param transmit_errors   The number of transmit errors.
+ *****************************************************************************/
+void evel_measurement_errors_set(EVENT_MEASUREMENT * measurement,
+                                 int receive_discards,
+                                 int receive_errors,
+                                 int transmit_discards,
+                                 int transmit_errors);
+
+/**************************************************************************//**
+ * Set the Mean Request Latency property of the Measurement.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param measurement          Pointer to the Measurement.
+ * @param mean_request_latency The Mean Request Latency to be set.
+ *****************************************************************************/
+void evel_measurement_mean_req_lat_set(EVENT_MEASUREMENT * measurement,
+                                       double mean_request_latency);
+
+/**************************************************************************//**
+ * Set the Memory Configured property of the Measurement.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param measurement       Pointer to the Measurement.
+ * @param memory_configured The Memory Configured to be set.
+ *****************************************************************************/
+void evel_measurement_mem_cfg_set(EVENT_MEASUREMENT * measurement,
+                                  double memory_configured);
+
+/**************************************************************************//**
+ * Set the Memory Used property of the Measurement.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param measurement       Pointer to the Measurement.
+ * @param memory_used The Memory Used to be set.
+ *****************************************************************************/
+void evel_measurement_mem_used_set(EVENT_MEASUREMENT * measurement,
+                                   double memory_used);
+
+/**************************************************************************//**
+ * Set the Request Rate property of the Measurement.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param measurement  Pointer to the Measurement.
+ * @param request_rate The Request Rate to be set.
+ *****************************************************************************/
+void evel_measurement_request_rate_set(EVENT_MEASUREMENT * measurement,
+                                       int request_rate);
+
+/**************************************************************************//**
+ * Add an additional CPU usage value name/value pair to the Measurement.
+ *
+ * The name and value are null delimited ASCII strings.  The library takes
+ * a copy so the caller does not have to preserve values after the function
+ * returns.
+ *
+ * @param measurement   Pointer to the measurement.
+ * @param id            ASCIIZ string with the CPU's identifier.
+ * @param usage         CPU utilization.
+ *****************************************************************************/
+void evel_measurement_cpu_use_add(EVENT_MEASUREMENT * measurement,
+                                  char * id, double usage);
+
+/**************************************************************************//**
+ * Add an additional File System usage value name/value pair to the
+ * Measurement.
+ *
+ * The filesystem_name is null delimited ASCII string.  The library takes a
+ * copy so the caller does not have to preserve values after the function
+ * returns.
+ *
+ * @param measurement     Pointer to the measurement.
+ * @param filesystem_name   ASCIIZ string with the file-system's UUID.
+ * @param block_configured  Block storage configured.
+ * @param block_used        Block storage in use.
+ * @param block_iops        Block storage IOPS.
+ * @param ephemeral_configured  Ephemeral storage configured.
+ * @param ephemeral_used        Ephemeral storage in use.
+ * @param ephemeral_iops        Ephemeral storage IOPS.
+ *****************************************************************************/
+void evel_measurement_fsys_use_add(EVENT_MEASUREMENT * measurement,
+                                   char * filesystem_name,
+                                   double block_configured,
+                                   double block_used,
+                                   int block_iops,
+                                   double ephemeral_configured,
+                                   double ephemeral_used,
+                                   int ephemeral_iops);
+
+/**************************************************************************//**
+ * Add a Feature usage value name/value pair to the Measurement.
+ *
+ * The name is null delimited ASCII string.  The library takes
+ * a copy so the caller does not have to preserve values after the function
+ * returns.
+ *
+ * @param measurement     Pointer to the measurement.
+ * @param feature         ASCIIZ string with the feature's name.
+ * @param utilization     Utilization of the feature.
+ *****************************************************************************/
+void evel_measurement_feature_use_add(EVENT_MEASUREMENT * measurement,
+                                      char * feature,
+                                      int utilization);
+
+/**************************************************************************//**
+ * Add a Additional Measurement value name/value pair to the Measurement.
+ *
+ * The name is null delimited ASCII string.  The library takes
+ * a copy so the caller does not have to preserve values after the function
+ * returns.
+ *
+ * @param measurement   Pointer to the Measurement.
+ * @param group    ASCIIZ string with the measurement group's name.
+ * @param name     ASCIIZ string containing the measurement's name.
+ * @param name     ASCIIZ string containing the measurement's value.
+ *****************************************************************************/
+void evel_measurement_custom_measurement_add(EVENT_MEASUREMENT * measurement,
+                                             const char * const group,
+                                             const char * const name,
+                                             const char * const value);
+
+/**************************************************************************//**
+ * Add a Codec usage value name/value pair to the Measurement.
+ *
+ * The name is null delimited ASCII string.  The library takes
+ * a copy so the caller does not have to preserve values after the function
+ * returns.
+ *
+ * @param measurement     Pointer to the measurement.
+ * @param codec           ASCIIZ string with the codec's name.
+ * @param utilization     Utilization of the feature.
+ *****************************************************************************/
+void evel_measurement_codec_use_add(EVENT_MEASUREMENT * measurement,
+                                    char * codec,
+                                    int utilization);
+
+/**************************************************************************//**
+}
+ * Set the Aggregate CPU Use property of the Measurement.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param measurement   Pointer to the measurement.
+ * @param cpu_use       The CPU use to set.
+ *****************************************************************************/
+void evel_measurement_agg_cpu_use_set(EVENT_MEASUREMENT * measurement,
+                                      double cpu_use);
+
+/**************************************************************************//**
+ * Set the Media Ports in Use property of the Measurement.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param measurement         Pointer to the measurement.
+ * @param media_ports_in_use  The media port usage to set.
+ *****************************************************************************/
+void evel_measurement_media_port_use_set(EVENT_MEASUREMENT * measurement,
+                                         int media_ports_in_use);
+
+/**************************************************************************//**
+ * Set the VNFC Scaling Metric property of the Measurement.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param measurement     Pointer to the measurement.
+ * @param scaling_metric  The scaling metric to set.
+ *****************************************************************************/
+void evel_measurement_vnfc_scaling_metric_set(EVENT_MEASUREMENT * measurement,
+                                              double scaling_metric);
+
+/**************************************************************************//**
+ * Create a new Latency Bucket to be added to a Measurement event.
+ *
+ * @note    The mandatory fields on the ::MEASUREMENT_LATENCY_BUCKET must be
+ *          supplied to this factory function and are immutable once set.
+ *          Optional fields have explicit setter functions, but again values
+ *          may only be set once so that the ::MEASUREMENT_LATENCY_BUCKET has
+ *          immutable properties.
+ *
+ * @param count         Count of events in this bucket.
+ *
+ * @returns pointer to the newly manufactured ::MEASUREMENT_LATENCY_BUCKET.
+ * @retval  NULL  Failed to create the Latency Bucket.
+ *****************************************************************************/
+MEASUREMENT_LATENCY_BUCKET * evel_new_meas_latency_bucket(const int count);
+
+/**************************************************************************//**
+ * Set the High End property of the Measurement Latency Bucket.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param bucket        Pointer to the Measurement Latency Bucket.
+ * @param high_end      High end of the bucket's range.
+ *****************************************************************************/
+void evel_meas_latency_bucket_high_end_set(
+                                     MEASUREMENT_LATENCY_BUCKET * const bucket,
+                                     const double high_end);
+
+/**************************************************************************//**
+ * Set the Low End property of the Measurement Latency Bucket.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param bucket        Pointer to the Measurement Latency Bucket.
+ * @param low_end       Low end of the bucket's range.
+ *****************************************************************************/
+void evel_meas_latency_bucket_low_end_set(
+                                     MEASUREMENT_LATENCY_BUCKET * const bucket,
+                                     const double low_end);
+
+/**************************************************************************//**
+ * Add an additional Measurement Latency Bucket to the specified event.
+ *
+ * @param measurement   Pointer to the Measurement event.
+ * @param bucket        Pointer to the Measurement Latency Bucket to add.
+ *****************************************************************************/
+void evel_meas_latency_bucket_add(EVENT_MEASUREMENT * const measurement,
+                                  MEASUREMENT_LATENCY_BUCKET * const bucket);
+
+/**************************************************************************//**
+ * Add an additional Latency Distribution bucket to the Measurement.
+ *
+ * This function implements the previous API, purely for convenience.
+ *
+ * @param measurement   Pointer to the measurement.
+ * @param low_end       Low end of the bucket's range.
+ * @param high_end      High end of the bucket's range.
+ * @param count         Count of events in this bucket.
+ *****************************************************************************/
+void evel_measurement_latency_add(EVENT_MEASUREMENT * const measurement,
+                                  const double low_end,
+                                  const double high_end,
+                                  const int count);
+
+/**************************************************************************//**
+ * Create a new vNIC Use to be added to a Measurement event.
+ *
+ * @note    The mandatory fields on the ::MEASUREMENT_VNIC_USE must be supplied
+ *          to this factory function and are immutable once set. Optional
+ *          fields have explicit setter functions, but again values may only be
+ *          set once so that the ::MEASUREMENT_VNIC_USE has immutable
+ *          properties.
+ *
+ * @param vnic_id               ASCIIZ string with the vNIC's ID.
+ * @param packets_in            Total packets received.
+ * @param packets_out           Total packets transmitted.
+ * @param bytes_in              Total bytes received.
+ * @param bytes_out             Total bytes transmitted.
+ *
+ * @returns pointer to the newly manufactured ::MEASUREMENT_VNIC_USE.
+ *          If the structure is not used it must be released using
+ *          ::evel_free_measurement_vnic_use.
+ * @retval  NULL  Failed to create the vNIC Use.
+ *****************************************************************************/
+MEASUREMENT_VNIC_USE * evel_new_measurement_vnic_use(char * const vnic_id,
+                                                     const int packets_in,
+                                                     const int packets_out,
+                                                     const int bytes_in,
+                                                     const int bytes_out);
+
+/**************************************************************************//**
+ * Free a vNIC Use.
+ *
+ * Free off the ::MEASUREMENT_VNIC_USE supplied.  Will free all the contained
+ * allocated memory.
+ *
+ * @note It does not free the vNIC Use itself, since that may be part of a
+ * larger structure.
+ *****************************************************************************/
+void evel_free_measurement_vnic_use(MEASUREMENT_VNIC_USE * const vnic_use);
+
+/**************************************************************************//**
+ * Set the Broadcast Packets Received property of the vNIC Use.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param vnic_use      Pointer to the vNIC Use.
+ * @param broadcast_packets_in
+ *                      Broadcast packets received.
+ *****************************************************************************/
+void evel_vnic_use_bcast_pkt_in_set(MEASUREMENT_VNIC_USE * const vnic_use,
+                                    const int broadcast_packets_in);
+
+/**************************************************************************//**
+ * Set the Broadcast Packets Transmitted property of the vNIC Use.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param vnic_use      Pointer to the vNIC Use.
+ * @param broadcast_packets_out
+ *                      Broadcast packets transmitted.
+ *****************************************************************************/
+void evel_vnic_use_bcast_pkt_out_set(MEASUREMENT_VNIC_USE * const vnic_use,
+                                     const int broadcast_packets_out);
+
+/**************************************************************************//**
+ * Set the Multicast Packets Received property of the vNIC Use.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param vnic_use      Pointer to the vNIC Use.
+ * @param multicast_packets_in
+ *                      Multicast packets received.
+ *****************************************************************************/
+void evel_vnic_use_mcast_pkt_in_set(MEASUREMENT_VNIC_USE * const vnic_use,
+                                    const int multicast_packets_in);
+
+/**************************************************************************//**
+ * Set the Multicast Packets Transmitted property of the vNIC Use.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param vnic_use      Pointer to the vNIC Use.
+ * @param multicast_packets_out
+ *                      Multicast packets transmitted.
+ *****************************************************************************/
+void evel_vnic_use_mcast_pkt_out_set(MEASUREMENT_VNIC_USE * const vnic_use,
+                                     const int multicast_packets_out);
+
+/**************************************************************************//**
+ * Set the Unicast Packets Received property of the vNIC Use.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param vnic_use      Pointer to the vNIC Use.
+ * @param unicast_packets_in
+ *                      Unicast packets received.
+ *****************************************************************************/
+void evel_vnic_use_ucast_pkt_in_set(MEASUREMENT_VNIC_USE * const vnic_use,
+                                    const int unicast_packets_in);
+
+/**************************************************************************//**
+ * Set the Unicast Packets Transmitted property of the vNIC Use.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param vnic_use      Pointer to the vNIC Use.
+ * @param unicast_packets_out
+ *                      Unicast packets transmitted.
+ *****************************************************************************/
+void evel_vnic_use_ucast_pkt_out_set(MEASUREMENT_VNIC_USE * const vnic_use,
+                                     const int unicast_packets_out);
+
+/**************************************************************************//**
+ * Add an additional vNIC Use to the specified Measurement event.
+ *
+ * @param measurement   Pointer to the measurement.
+ * @param vnic_use      Pointer to the vNIC Use to add.
+ *****************************************************************************/
+void evel_meas_vnic_use_add(EVENT_MEASUREMENT * const measurement,
+                            MEASUREMENT_VNIC_USE * const vnic_use);
+
+/**************************************************************************//**
+ * Add an additional vNIC usage record Measurement.
+ *
+ * This function implements the previous API, purely for convenience.
+ *
+ * The ID is null delimited ASCII string.  The library takes a copy so the
+ * caller does not have to preserve values after the function returns.
+ *
+ * @param measurement           Pointer to the measurement.
+ * @param vnic_id               ASCIIZ string with the vNIC's ID.
+ * @param packets_in            Total packets received.
+ * @param packets_out           Total packets transmitted.
+ * @param broadcast_packets_in  Broadcast packets received.
+ * @param broadcast_packets_out Broadcast packets transmitted.
+ * @param bytes_in              Total bytes received.
+ * @param bytes_out             Total bytes transmitted.
+ * @param multicast_packets_in  Multicast packets received.
+ * @param multicast_packets_out Multicast packets transmitted.
+ * @param unicast_packets_in    Unicast packets received.
+ * @param unicast_packets_out   Unicast packets transmitted.
+ *****************************************************************************/
+void evel_measurement_vnic_use_add(EVENT_MEASUREMENT * const measurement,
+                                   char * const vnic_id,
+                                   const int packets_in,
+                                   const int packets_out,
+                                   const int broadcast_packets_in,
+                                   const int broadcast_packets_out,
+                                   const int bytes_in,
+                                   const int bytes_out,
+                                   const int multicast_packets_in,
+                                   const int multicast_packets_out,
+                                   const int unicast_packets_in,
+                                   const int unicast_packets_out);
+
+/*****************************************************************************/
+/*****************************************************************************/
+/*                                                                           */
+/*   REPORT                                                                  */
+/*                                                                           */
+/*****************************************************************************/
+/*****************************************************************************/
+
+/**************************************************************************//**
+ * Create a new Report event.
+ *
+ * @note    The mandatory fields on the Report must be supplied to this
+ *          factory function and are immutable once set.  Optional fields have
+ *          explicit setter functions, but again values may only be set once so
+ *          that the Report has immutable properties.
+ *
+ * @param   measurement_interval
+ *
+ * @returns pointer to the newly manufactured ::EVENT_REPORT.  If the event is
+ *          not used (i.e. posted) it must be released using
+ *          ::evel_free_report.
+ * @retval  NULL  Failed to create the event.
+ *****************************************************************************/
+EVENT_REPORT * evel_new_report(double measurement_interval);
+
+/**************************************************************************//**
+ * Free a Report.
+ *
+ * Free off the Report supplied.  Will free all the contained allocated memory.
+ *
+ * @note It does not free the Report itself, since that may be part of a
+ * larger structure.
+ *****************************************************************************/
+void evel_free_report(EVENT_REPORT * event);
+
+/**************************************************************************//**
+ * Set the Event Type property of the Report.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param report Pointer to the Report.
+ * @param type        The Event Type to be set. ASCIIZ string. The caller
+ *                    does not need to preserve the value once the function
+ *                    returns.
+ *****************************************************************************/
+void evel_report_type_set(EVENT_REPORT * report, const char * const type);
+
+/**************************************************************************//**
+ * Add a Feature usage value name/value pair to the Report.
+ *
+ * The name is null delimited ASCII string.  The library takes
+ * a copy so the caller does not have to preserve values after the function
+ * returns.
+ *
+ * @param report          Pointer to the report.
+ * @param feature         ASCIIZ string with the feature's name.
+ * @param utilization     Utilization of the feature.
+ *****************************************************************************/
+void evel_report_feature_use_add(EVENT_REPORT * report,
+                                 char * feature,
+                                 int utilization);
+
+/**************************************************************************//**
+ * Add a Additional Measurement value name/value pair to the Report.
+ *
+ * The name is null delimited ASCII string.  The library takes
+ * a copy so the caller does not have to preserve values after the function
+ * returns.
+ *
+ * @param report   Pointer to the report.
+ * @param group    ASCIIZ string with the measurement group's name.
+ * @param name     ASCIIZ string containing the measurement's name.
+ * @param value    ASCIIZ string containing the measurement's value.
+ *****************************************************************************/
+void evel_report_custom_measurement_add(EVENT_REPORT * report,
+                                        const char * const group,
+                                        const char * const name,
+                                        const char * const value);
+
+/*****************************************************************************/
+/*****************************************************************************/
+/*                                                                           */
+/*   MOBILE_FLOW                                                             */
+/*                                                                           */
+/*****************************************************************************/
+/*****************************************************************************/
+
+/**************************************************************************//**
+ * Create a new Mobile Flow event.
+ *
+ * @note    The mandatory fields on the Mobile Flow must be supplied to this
+ *          factory function and are immutable once set.  Optional fields have
+ *          explicit setter functions, but again values may only be set once so
+ *          that the Mobile Flow has immutable properties.
+ *
+ * @param   flow_direction
+ * @param   gtp_per_flow_metrics
+ * @param   ip_protocol_type
+ * @param   ip_version
+ * @param   other_endpoint_ip_address
+ * @param   other_endpoint_port
+ * @param   reporting_endpoint_ip_addr
+ * @param   reporting_endpoint_port
+ *
+ * @returns pointer to the newly manufactured ::EVENT_MOBILE_FLOW.  If the
+ *          event is not used (i.e. posted) it must be released using
+ *          ::evel_free_mobile_flow.
+ * @retval  NULL  Failed to create the event.
+ *****************************************************************************/
+EVENT_MOBILE_FLOW * evel_new_mobile_flow(
+                      const char * const flow_direction,
+                      MOBILE_GTP_PER_FLOW_METRICS * gtp_per_flow_metrics,
+                      const char * const ip_protocol_type,
+                      const char * const ip_version,
+                      const char * const other_endpoint_ip_address,
+                      int other_endpoint_port,
+                      const char * const reporting_endpoint_ip_addr,
+                      int reporting_endpoint_port);
+
+/**************************************************************************//**
+ * Free a Mobile Flow.
+ *
+ * Free off the Mobile Flow supplied.  Will free all the contained allocated
+ * memory.
+ *
+ * @note It does not free the Mobile Flow itself, since that may be part of a
+ * larger structure.
+ *****************************************************************************/
+void evel_free_mobile_flow(EVENT_MOBILE_FLOW * event);
+
+/**************************************************************************//**
+ * Set the Event Type property of the Mobile Flow.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param mobile_flow Pointer to the Mobile Flow.
+ * @param type        The Event Type to be set. ASCIIZ string. The caller
+ *                    does not need to preserve the value once the function
+ *                    returns.
+ *****************************************************************************/
+void evel_mobile_flow_type_set(EVENT_MOBILE_FLOW * mobile_flow,
+                               const char * const type);
+
+/**************************************************************************//**
+ * Set the Application Type property of the Mobile Flow.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param mobile_flow Pointer to the Mobile Flow.
+ * @param type        The Application Type to be set. ASCIIZ string. The caller
+ *                    does not need to preserve the value once the function
+ *                    returns.
+ *****************************************************************************/
+void evel_mobile_flow_app_type_set(EVENT_MOBILE_FLOW * mobile_flow,
+                                   const char * const type);
+
+/**************************************************************************//**
+ * Set the Application Protocol Type property of the Mobile Flow.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param mobile_flow Pointer to the Mobile Flow.
+ * @param type        The Application Protocol Type to be set. ASCIIZ string.
+ *                    The caller does not need to preserve the value once the
+ *                    function returns.
+ *****************************************************************************/
+void evel_mobile_flow_app_prot_type_set(EVENT_MOBILE_FLOW * mobile_flow,
+                                        const char * const type);
+
+/**************************************************************************//**
+ * Set the Application Protocol Version property of the Mobile Flow.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param mobile_flow Pointer to the Mobile Flow.
+ * @param version     The Application Protocol Version to be set. ASCIIZ
+ *                    string.  The caller does not need to preserve the value
+ *                    once the function returns.
+ *****************************************************************************/
+void evel_mobile_flow_app_prot_ver_set(EVENT_MOBILE_FLOW * mobile_flow,
+                                       const char * const version);
+
+/**************************************************************************//**
+ * Set the CID property of the Mobile Flow.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param mobile_flow Pointer to the Mobile Flow.
+ * @param cid         The CID to be set. ASCIIZ string.  The caller does not
+ *                    need to preserve the value once the function returns.
+ *****************************************************************************/
+void evel_mobile_flow_cid_set(EVENT_MOBILE_FLOW * mobile_flow,
+                              const char * const cid);
+
+/**************************************************************************//**
+ * Set the Connection Type property of the Mobile Flow.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param mobile_flow Pointer to the Mobile Flow.
+ * @param type        The Connection Type to be set. ASCIIZ string. The caller
+ *                    does not need to preserve the value once the function
+ *                    returns.
+ *****************************************************************************/
+void evel_mobile_flow_con_type_set(EVENT_MOBILE_FLOW * mobile_flow,
+                                   const char * const type);
+
+/**************************************************************************//**
+ * Set the ECGI property of the Mobile Flow.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param mobile_flow Pointer to the Mobile Flow.
+ * @param ecgi        The ECGI to be set. ASCIIZ string.  The caller does not
+ *                    need to preserve the value once the function returns.
+ *****************************************************************************/
+void evel_mobile_flow_ecgi_set(EVENT_MOBILE_FLOW * mobile_flow,
+                               const char * const ecgi);
+
+/**************************************************************************//**
+ * Set the GTP Protocol Type property of the Mobile Flow.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param mobile_flow Pointer to the Mobile Flow.
+ * @param type        The GTP Protocol Type to be set. ASCIIZ string.  The
+ *                    caller does not need to preserve the value once the
+ *                    function returns.
+ *****************************************************************************/
+void evel_mobile_flow_gtp_prot_type_set(EVENT_MOBILE_FLOW * mobile_flow,
+                                        const char * const type);
+
+/**************************************************************************//**
+ * Set the GTP Protocol Version property of the Mobile Flow.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param mobile_flow Pointer to the Mobile Flow.
+ * @param version     The GTP Protocol Version to be set. ASCIIZ string.  The
+ *                    caller does not need to preserve the value once the
+ *                    function returns.
+ *****************************************************************************/
+void evel_mobile_flow_gtp_prot_ver_set(EVENT_MOBILE_FLOW * mobile_flow,
+                                       const char * const version);
+
+/**************************************************************************//**
+ * Set the HTTP Header property of the Mobile Flow.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param mobile_flow Pointer to the Mobile Flow.
+ * @param header      The HTTP header to be set. ASCIIZ string. The caller does
+ *                    not need to preserve the value once the function returns.
+ *****************************************************************************/
+void evel_mobile_flow_http_header_set(EVENT_MOBILE_FLOW * mobile_flow,
+                                      const char * const header);
+
+/**************************************************************************//**
+ * Set the IMEI property of the Mobile Flow.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param mobile_flow Pointer to the Mobile Flow.
+ * @param imei        The IMEI to be set. ASCIIZ string.  The caller does not
+ *                    need to preserve the value once the function returns.
+ *****************************************************************************/
+void evel_mobile_flow_imei_set(EVENT_MOBILE_FLOW * mobile_flow,
+                               const char * const imei);
+
+/**************************************************************************//**
+ * Set the IMSI property of the Mobile Flow.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param mobile_flow Pointer to the Mobile Flow.
+ * @param imsi        The IMSI to be set. ASCIIZ string.  The caller does not
+ *                    need to preserve the value once the function returns.
+ *****************************************************************************/
+void evel_mobile_flow_imsi_set(EVENT_MOBILE_FLOW * mobile_flow,
+                               const char * const imsi);
+
+/**************************************************************************//**
+ * Set the LAC property of the Mobile Flow.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param mobile_flow Pointer to the Mobile Flow.
+ * @param lac         The LAC to be set. ASCIIZ string.  The caller does not
+ *                    need to preserve the value once the function returns.
+ *****************************************************************************/
+void evel_mobile_flow_lac_set(EVENT_MOBILE_FLOW * mobile_flow,
+                              const char * const lac);
+
+/**************************************************************************//**
+ * Set the MCC property of the Mobile Flow.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param mobile_flow Pointer to the Mobile Flow.
+ * @param mcc         The MCC to be set. ASCIIZ string.  The caller does not
+ *                    need to preserve the value once the function returns.
+ *****************************************************************************/
+void evel_mobile_flow_mcc_set(EVENT_MOBILE_FLOW * mobile_flow,
+                              const char * const mcc);
+
+/**************************************************************************//**
+ * Set the MNC property of the Mobile Flow.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param mobile_flow Pointer to the Mobile Flow.
+ * @param mnc         The MNC to be set. ASCIIZ string.  The caller does not
+ *                    need to preserve the value once the function returns.
+ *****************************************************************************/
+void evel_mobile_flow_mnc_set(EVENT_MOBILE_FLOW * mobile_flow,
+                              const char * const mnc);
+
+/**************************************************************************//**
+ * Set the MSISDN property of the Mobile Flow.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param mobile_flow Pointer to the Mobile Flow.
+ * @param msisdn      The MSISDN to be set. ASCIIZ string.  The caller does not
+ *                    need to preserve the value once the function returns.
+ *****************************************************************************/
+void evel_mobile_flow_msisdn_set(EVENT_MOBILE_FLOW * mobile_flow,
+                                 const char * const msisdn);
+
+/**************************************************************************//**
+ * Set the Other Functional Role property of the Mobile Flow.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param mobile_flow Pointer to the Mobile Flow.
+ * @param role        The Other Functional Role to be set. ASCIIZ string. The
+ *                    caller does not need to preserve the value once the
+ *                    function returns.
+ *****************************************************************************/
+void evel_mobile_flow_other_func_role_set(EVENT_MOBILE_FLOW * mobile_flow,
+                                          const char * const role);
+
+/**************************************************************************//**
+ * Set the RAC property of the Mobile Flow.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param mobile_flow Pointer to the Mobile Flow.
+ * @param rac         The RAC to be set. ASCIIZ string.  The caller does not
+ *                    need to preserve the value once the function returns.
+ *****************************************************************************/
+void evel_mobile_flow_rac_set(EVENT_MOBILE_FLOW * mobile_flow,
+                              const char * const rac);
+
+/**************************************************************************//**
+ * Set the Radio Access Technology property of the Mobile Flow.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param mobile_flow Pointer to the Mobile Flow.
+ * @param tech        The Radio Access Technology to be set. ASCIIZ string. The
+ *                    caller does not need to preserve the value once the
+ *                    function returns.
+ *****************************************************************************/
+void evel_mobile_flow_radio_acc_tech_set(EVENT_MOBILE_FLOW * mobile_flow,
+                                         const char * const tech);
+
+/**************************************************************************//**
+ * Set the SAC property of the Mobile Flow.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param mobile_flow Pointer to the Mobile Flow.
+ * @param sac         The SAC to be set. ASCIIZ string.  The caller does not
+ *                    need to preserve the value once the function returns.
+ *****************************************************************************/
+void evel_mobile_flow_sac_set(EVENT_MOBILE_FLOW * mobile_flow,
+                              const char * const sac);
+
+/**************************************************************************//**
+ * Set the Sampling Algorithm property of the Mobile Flow.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param mobile_flow Pointer to the Mobile Flow.
+ * @param algorithm   The Sampling Algorithm to be set.
+ *****************************************************************************/
+void evel_mobile_flow_samp_alg_set(EVENT_MOBILE_FLOW * mobile_flow,
+                                   int algorithm);
+
+/**************************************************************************//**
+ * Set the TAC property of the Mobile Flow.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param mobile_flow Pointer to the Mobile Flow.
+ * @param tac         The TAC to be set. ASCIIZ string.  The caller does not
+ *                    need to preserve the value once the function returns.
+ *****************************************************************************/
+void evel_mobile_flow_tac_set(EVENT_MOBILE_FLOW * mobile_flow,
+                              const char * const tac);
+
+/**************************************************************************//**
+ * Set the Tunnel ID property of the Mobile Flow.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param mobile_flow Pointer to the Mobile Flow.
+ * @param tunnel_id   The Tunnel ID to be set. ASCIIZ string.  The caller does
+ *                    not need to preserve the value once the function returns.
+ *****************************************************************************/
+void evel_mobile_flow_tunnel_id_set(EVENT_MOBILE_FLOW * mobile_flow,
+                                    const char * const tunnel_id);
+
+/**************************************************************************//**
+ * Set the VLAN ID property of the Mobile Flow.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param mobile_flow Pointer to the Mobile Flow.
+ * @param vlan_id     The VLAN ID to be set. ASCIIZ string.  The caller does
+ *                    not need to preserve the value once the function returns.
+ *****************************************************************************/
+void evel_mobile_flow_vlan_id_set(EVENT_MOBILE_FLOW * mobile_flow,
+                                  const char * const vlan_id);
+
+/**************************************************************************//**
+ * Create a new Mobile GTP Per Flow Metrics.
+ *
+ * @note    The mandatory fields on the Mobile GTP Per Flow Metrics must be
+ *          supplied to this factory function and are immutable once set.
+ *          Optional fields have explicit setter functions, but again values
+ *          may only be set once so that the Mobile GTP Per Flow Metrics has
+ *          immutable properties.
+ *
+ * @param   avg_bit_error_rate
+ * @param   avg_packet_delay_variation
+ * @param   avg_packet_latency
+ * @param   avg_receive_throughput
+ * @param   avg_transmit_throughput
+ * @param   flow_activation_epoch
+ * @param   flow_activation_microsec
+ * @param   flow_deactivation_epoch
+ * @param   flow_deactivation_microsec
+ * @param   flow_deactivation_time
+ * @param   flow_status
+ * @param   max_packet_delay_variation
+ * @param   num_activation_failures
+ * @param   num_bit_errors
+ * @param   num_bytes_received
+ * @param   num_bytes_transmitted
+ * @param   num_dropped_packets
+ * @param   num_l7_bytes_received
+ * @param   num_l7_bytes_transmitted
+ * @param   num_lost_packets
+ * @param   num_out_of_order_packets
+ * @param   num_packet_errors
+ * @param   num_packets_received_excl_retrans
+ * @param   num_packets_received_incl_retrans
+ * @param   num_packets_transmitted_incl_retrans
+ * @param   num_retries
+ * @param   num_timeouts
+ * @param   num_tunneled_l7_bytes_received
+ * @param   round_trip_time
+ * @param   time_to_first_byte
+ *
+ * @returns pointer to the newly manufactured ::MOBILE_GTP_PER_FLOW_METRICS.
+ *          If the structure is not used it must be released using
+ *          ::evel_free_mobile_gtp_flow_metrics.
+ * @retval  NULL  Failed to create the event.
+ *****************************************************************************/
+MOBILE_GTP_PER_FLOW_METRICS * evel_new_mobile_gtp_flow_metrics(
+                                      double avg_bit_error_rate,
+                                      double avg_packet_delay_variation,
+                                      int avg_packet_latency,
+                                      int avg_receive_throughput,
+                                      int avg_transmit_throughput,
+                                      int flow_activation_epoch,
+                                      int flow_activation_microsec,
+                                      int flow_deactivation_epoch,
+                                      int flow_deactivation_microsec,
+                                      time_t flow_deactivation_time,
+                                      const char * const flow_status,
+                                      int max_packet_delay_variation,
+                                      int num_activation_failures,
+                                      int num_bit_errors,
+                                      int num_bytes_received,
+                                      int num_bytes_transmitted,
+                                      int num_dropped_packets,
+                                      int num_l7_bytes_received,
+                                      int num_l7_bytes_transmitted,
+                                      int num_lost_packets,
+                                      int num_out_of_order_packets,
+                                      int num_packet_errors,
+                                      int num_packets_received_excl_retrans,
+                                      int num_packets_received_incl_retrans,
+                                      int num_packets_transmitted_incl_retrans,
+                                      int num_retries,
+                                      int num_timeouts,
+                                      int num_tunneled_l7_bytes_received,
+                                      int round_trip_time,
+                                      int time_to_first_byte);
+
+/**************************************************************************//**
+ * Free a Mobile GTP Per Flow Metrics.
+ *
+ * Free off the Mobile GTP Per Flow Metrics supplied.  Will free all the
+ * contained allocated memory.
+ *
+ * @note It does not free the Mobile GTP Per Flow Metrics itself, since that
+ * may be part of a larger structure.
+ *****************************************************************************/
+void evel_free_mobile_gtp_flow_metrics(MOBILE_GTP_PER_FLOW_METRICS * metrics);
+
+/**************************************************************************//**
+ * Set the Duration of Connection Failed Status property of the Mobile GTP Per
+ * Flow Metrics.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param metrics     Pointer to the Mobile GTP Per Flow Metrics.
+ * @param duration    The Duration of Connection Failed Status to be set.
+ *****************************************************************************/
+void evel_mobile_gtp_metrics_dur_con_fail_set(
+                                         MOBILE_GTP_PER_FLOW_METRICS * metrics,
+                                         int duration);
+
+/**************************************************************************//**
+ * Set the Duration of Tunnel Failed Status property of the Mobile GTP Per Flow
+ * Metrics.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param metrics     Pointer to the Mobile GTP Per Flow Metrics.
+ * @param duration    The Duration of Tunnel Failed Status to be set.
+ *****************************************************************************/
+void evel_mobile_gtp_metrics_dur_tun_fail_set(
+                                         MOBILE_GTP_PER_FLOW_METRICS * metrics,
+                                         int duration);
+
+/**************************************************************************//**
+ * Set the Activated By property of the Mobile GTP Per Flow metrics.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param metrics     Pointer to the Mobile GTP Per Flow Metrics.
+ * @param act_by      The Activated By to be set.  ASCIIZ string. The caller
+ *                    does not need to preserve the value once the function
+ *                    returns.
+ *****************************************************************************/
+void evel_mobile_gtp_metrics_act_by_set(MOBILE_GTP_PER_FLOW_METRICS * metrics,
+                                        const char * const act_by);
+
+/**************************************************************************//**
+ * Set the Activation Time property of the Mobile GTP Per Flow metrics.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param metrics     Pointer to the Mobile GTP Per Flow Metrics.
+ * @param act_time    The Activation Time to be set.  ASCIIZ string. The caller
+ *                    does not need to preserve the value once the function
+ *                    returns.
+ *****************************************************************************/
+void evel_mobile_gtp_metrics_act_time_set(
+                                         MOBILE_GTP_PER_FLOW_METRICS * metrics,
+                                         time_t act_time);
+
+/**************************************************************************//**
+ * Set the Deactivated By property of the Mobile GTP Per Flow metrics.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param metrics     Pointer to the Mobile GTP Per Flow Metrics.
+ * @param deact_by    The Deactivated By to be set.  ASCIIZ string. The caller
+ *                    does not need to preserve the value once the function
+ *                    returns.
+ *****************************************************************************/
+void evel_mobile_gtp_metrics_deact_by_set(
+                                         MOBILE_GTP_PER_FLOW_METRICS * metrics,
+                                         const char * const deact_by);
+
+/**************************************************************************//**
+ * Set the GTP Connection Status property of the Mobile GTP Per Flow metrics.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param metrics     Pointer to the Mobile GTP Per Flow Metrics.
+ * @param status      The GTP Connection Status to be set.  ASCIIZ string. The
+ *                    caller does not need to preserve the value once the
+ *                    function returns.
+ *****************************************************************************/
+void evel_mobile_gtp_metrics_con_status_set(
+                                         MOBILE_GTP_PER_FLOW_METRICS * metrics,
+                                         const char * const status);
+
+/**************************************************************************//**
+ * Set the GTP Tunnel Status property of the Mobile GTP Per Flow metrics.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param metrics     Pointer to the Mobile GTP Per Flow Metrics.
+ * @param status      The GTP Tunnel Status to be set.  ASCIIZ string. The
+ *                    caller does not need to preserve the value once the
+ *                    function returns.
+ *****************************************************************************/
+void evel_mobile_gtp_metrics_tun_status_set(
+                                         MOBILE_GTP_PER_FLOW_METRICS * metrics,
+                                         const char * const status);
+
+/**************************************************************************//**
+ * Set an IP Type-of-Service count property of the Mobile GTP Per Flow metrics.
+ *
+ * @param metrics     Pointer to the Mobile GTP Per Flow Metrics.
+ * @param index       The index of the IP Type-of-Service.
+ * @param count       The count.
+ *****************************************************************************/
+void evel_mobile_gtp_metrics_iptos_set(MOBILE_GTP_PER_FLOW_METRICS * metrics,
+                                       int index,
+                                       int count);
+
+/**************************************************************************//**
+ * Set the Large Packet Round-Trip Time property of the Mobile GTP Per Flow
+ * Metrics.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param metrics     Pointer to the Mobile GTP Per Flow Metrics.
+ * @param rtt         The Large Packet Round-Trip Time to be set.
+ *****************************************************************************/
+void evel_mobile_gtp_metrics_large_pkt_rtt_set(
+                                         MOBILE_GTP_PER_FLOW_METRICS * metrics,
+                                         int rtt);
+
+/**************************************************************************//**
+ * Set the Large Packet Threshold property of the Mobile GTP Per Flow Metrics.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param metrics     Pointer to the Mobile GTP Per Flow Metrics.
+ * @param threshold   The Large Packet Threshold to be set.
+ *****************************************************************************/
+void evel_mobile_gtp_metrics_large_pkt_thresh_set(
+                                         MOBILE_GTP_PER_FLOW_METRICS * metrics,
+                                         double threshold);
+
+/**************************************************************************//**
+ * Set the Max Receive Bit Rate property of the Mobile GTP Per Flow Metrics.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param metrics     Pointer to the Mobile GTP Per Flow Metrics.
+ * @param rate        The Max Receive Bit Rate to be set.
+ *****************************************************************************/
+void evel_mobile_gtp_metrics_max_rcv_bit_rate_set(
+                                         MOBILE_GTP_PER_FLOW_METRICS * metrics,
+                                         int rate);
+
+/**************************************************************************//**
+ * Set the Max Transmit Bit Rate property of the Mobile GTP Per Flow Metrics.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param metrics     Pointer to the Mobile GTP Per Flow Metrics.
+ * @param rate        The Max Transmit Bit Rate to be set.
+ *****************************************************************************/
+void evel_mobile_gtp_metrics_max_trx_bit_rate_set(
+                                         MOBILE_GTP_PER_FLOW_METRICS * metrics,
+                                         int rate);
+
+/**************************************************************************//**
+ * Set the Number of GTP Echo Failures property of the Mobile GTP Per Flow
+ * Metrics.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param metrics     Pointer to the Mobile GTP Per Flow Metrics.
+ * @param num         The Number of GTP Echo Failures to be set.
+ *****************************************************************************/
+void evel_mobile_gtp_metrics_num_echo_fail_set(
+                                         MOBILE_GTP_PER_FLOW_METRICS * metrics,
+                                         int num);
+
+/**************************************************************************//**
+ * Set the Number of GTP Tunnel Errors property of the Mobile GTP Per Flow
+ * Metrics.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param metrics     Pointer to the Mobile GTP Per Flow Metrics.
+ * @param num         The Number of GTP Tunnel Errors to be set.
+ *****************************************************************************/
+void evel_mobile_gtp_metrics_num_tun_fail_set(
+                                         MOBILE_GTP_PER_FLOW_METRICS * metrics,
+                                         int num);
+
+/**************************************************************************//**
+ * Set the Number of HTTP Errors property of the Mobile GTP Per Flow Metrics.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param metrics     Pointer to the Mobile GTP Per Flow Metrics.
+ * @param num         The Number of HTTP Errors to be set.
+ *****************************************************************************/
+void evel_mobile_gtp_metrics_num_http_errors_set(
+                                         MOBILE_GTP_PER_FLOW_METRICS * metrics,
+                                         int num);
+
+/**************************************************************************//**
+ * Add a TCP flag count to the metrics.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param metrics       Pointer to the Mobile GTP Per Flow Metrics.
+ * @param tcp_flag      The TCP flag count to be updated.
+ * @param count         The associated flag count.
+ *****************************************************************************/
+void evel_mobile_gtp_metrics_tcp_flag_count_add(
+                                         MOBILE_GTP_PER_FLOW_METRICS * metrics,
+                                         const EVEL_TCP_FLAGS tcp_flag,
+                                         const int count);
+
+/**************************************************************************//**
+ * Add a QCI COS count to the metrics.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param metrics       Pointer to the Mobile GTP Per Flow Metrics.
+ * @param qci_cos       The QCI COS count to be updated.
+ * @param count         The associated QCI COS count.
+ *****************************************************************************/
+void evel_mobile_gtp_metrics_qci_cos_count_add(
+                                         MOBILE_GTP_PER_FLOW_METRICS * metrics,
+                                         const EVEL_QCI_COS_TYPES qci_cos,
+                                         const int count);
+
+/*****************************************************************************/
+/*****************************************************************************/
+/*                                                                           */
+/*   SERVICE EVENTS                                                          */
+/*                                                                           */
+/*****************************************************************************/
+/*****************************************************************************/
+
+/**************************************************************************//**
+ * Create a new Service event.
+ *
+ * @note    The mandatory fields on the Service must be supplied to
+ *          this factory function and are immutable once set.  Optional fields
+ *          have explicit setter functions, but again values may only be set
+ *          once so that the event has immutable properties.
+ * @param vendor_id     The vendor id to encode in the event instance id.
+ * @param event_id      The vendor event id to encode in the event instance id.
+ * @returns pointer to the newly manufactured ::EVENT_SERVICE.  If the event
+ *          is not used (i.e. posted) it must be released using
+ *          ::evel_free_service.
+ * @retval  NULL  Failed to create the event.
+ *****************************************************************************/
+EVENT_SERVICE * evel_new_service(const char * const vendor_id,
+                                 const char * const event_id);
+
+/**************************************************************************//**
+ * Free a Service Events event.
+ *
+ * Free off the event supplied.  Will free all the contained allocated memory.
+ *
+ * @note It does not free the event itself, since that may be part of a larger
+ * structure.
+ *****************************************************************************/
+void evel_free_service(EVENT_SERVICE * const event);
+
+/**************************************************************************//**
+ * Set the Event Type property of the Service event.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param event         Pointer to the Service event.
+ * @param type          The Event Type to be set. ASCIIZ string. The caller
+ *                      does not need to preserve the value once the function
+ *                      returns.
+ *****************************************************************************/
+void evel_service_type_set(EVENT_SERVICE * const event,
+                           const char * const type);
+
+/**************************************************************************//**
+ * Set the Product Id property of the Service event.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param event         Pointer to the Service event.
+ * @param product_id    The vendor product id to be set. ASCIIZ string. The
+ *                      caller does not need to preserve the value once the
+ *                      function returns.
+ *****************************************************************************/
+void evel_service_product_id_set(EVENT_SERVICE * const event,
+                                 const char * const product_id);
+
+/**************************************************************************//**
+ * Set the Subsystem Id property of the Service event.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param event         Pointer to the Service event.
+ * @param subsystem_id  The vendor subsystem id to be set. ASCIIZ string. The
+ *                      caller does not need to preserve the value once the
+ *                      function returns.
+ *****************************************************************************/
+void evel_service_subsystem_id_set(EVENT_SERVICE * const event,
+                                   const char * const subsystem_id);
+
+/**************************************************************************//**
+ * Set the Friendly Name property of the Service event.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param event         Pointer to the Service event.
+ * @param friendly_name The vendor friendly name to be set. ASCIIZ string. The
+ *                      caller does not need to preserve the value once the
+ *                      function returns.
+ *****************************************************************************/
+void evel_service_friendly_name_set(EVENT_SERVICE * const event,
+                                    const char * const friendly_name);
+
+/**************************************************************************//**
+ * Set the correlator property of the Service event.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param event         Pointer to the Service event.
+ * @param correlator    The correlator to be set. ASCIIZ string. The caller
+ *                      does not need to preserve the value once the function
+ *                      returns.
+ *****************************************************************************/
+void evel_service_correlator_set(EVENT_SERVICE * const event,
+                                 const char * const correlator);
+
+/**************************************************************************//**
+ * Set the Codec property of the Service event.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param event         Pointer to the Service event.
+ * @param codec         The codec to be set. ASCIIZ string. The caller does not
+ *                      need to preserve the value once the function returns.
+ *****************************************************************************/
+void evel_service_codec_set(EVENT_SERVICE * const event,
+                            const char * const codec);
+
+/**************************************************************************//**
+ * Set the Callee Side Codec property of the Service event.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param event         Pointer to the Service event.
+ * @param codec         The codec to be set. ASCIIZ string. The caller does not
+ *                      need to preserve the value once the function returns.
+ *****************************************************************************/
+void evel_service_callee_codec_set(EVENT_SERVICE * const event,
+                                   const char * const codec);
+
+/**************************************************************************//**
+ * Set the Caller Side Codec property of the Service event.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param event         Pointer to the Service event.
+ * @param codec         The codec to be set. ASCIIZ string. The caller does not
+ *                      need to preserve the value once the function returns.
+ *****************************************************************************/
+void evel_service_caller_codec_set(EVENT_SERVICE * const event,
+                                   const char * const codec);
+
+/**************************************************************************//**
+ * Set the RTCP Data property of the Service event.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param event         Pointer to the Service event.
+ * @param rtcp_data     The RTCP Data to be set. ASCIIZ string. The caller
+ *                      does not need to preserve the value once the function
+ *                      returns.
+ *****************************************************************************/
+void evel_service_rtcp_data_set(EVENT_SERVICE * const event,
+                                const char * const rtcp_data);
+
+/**************************************************************************//**
+ * Set the Adjacency Name property of the Service event.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param event         Pointer to the Service event.
+ * @param adjacency_name
+ *                      The adjacency name to be set. ASCIIZ string. The caller
+ *                      does not need to preserve the value once the function
+ *                      returns.
+ *****************************************************************************/
+void evel_service_adjacency_name_set(EVENT_SERVICE * const event,
+                                     const char * const adjacency_name);
+
+/**************************************************************************//**
+ * Set the Endpoint Descriptor property of the Service event.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param event         Pointer to the Service event.
+ * @param endpoint_desc The endpoint descriptor to be set.
+ *****************************************************************************/
+void evel_service_endpoint_desc_set(
+                                EVENT_SERVICE * const event,
+                                const EVEL_SERVICE_ENDPOINT_DESC endpoint_desc);
+
+/**************************************************************************//**
+ * Set the Endpoint Jitter property of the Service event.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param event         Pointer to the Service event.
+ * @param jitter        The jitter to be set.
+ *****************************************************************************/
+void evel_service_endpoint_jitter_set(EVENT_SERVICE * const event,
+                                      const int jitter);
+
+/**************************************************************************//**
+ * Set the Endpoint Rtp Octets Discarded property of the Service event.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param event         Pointer to the Service event.
+ * @param rtp_oct_disc  The discard count.
+ *****************************************************************************/
+void evel_service_endpoint_rtp_oct_disc_set(EVENT_SERVICE * const event,
+                                            const int rtp_oct_disc);
+
+/**************************************************************************//**
+ * Set the Endpoint Rtp Octets Received property of the Service event.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param event         Pointer to the Service event.
+ * @param rtp_oct_recv  The receive count.
+ *****************************************************************************/
+void evel_service_endpoint_rtp_oct_recv_set(EVENT_SERVICE * const event,
+                                            const int rtp_oct_recv);
+
+/**************************************************************************//**
+ * Set the Endpoint Rtp Octets Sent property of the Service event.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param event         Pointer to the Service event.
+ * @param rtp_oct_sent  The send count.
+ *****************************************************************************/
+void evel_service_endpoint_rtp_oct_sent_set(EVENT_SERVICE * const event,
+                                            const int rtp_oct_sent);
+
+/**************************************************************************//**
+ * Set the Endpoint Rtp Packets Discarded property of the Service event.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param event         Pointer to the Service event.
+ * @param rtp_pkt_disc  The discard count.
+ *****************************************************************************/
+void evel_service_endpoint_rtp_pkt_disc_set(EVENT_SERVICE * const event,
+                                            const int rtp_pkt_disc);
+
+/**************************************************************************//**
+ * Set the Endpoint Rtp Packets Received property of the Service event.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param event         Pointer to the Service event.
+ * @param rtp_pkt_recv  The receive count.
+ *****************************************************************************/
+void evel_service_endpoint_rtp_pkt_recv_set(EVENT_SERVICE * const event,
+                                            const int rtp_pkt_recv);
+
+/**************************************************************************//**
+ * Set the Endpoint Rtp Packets Sent property of the Service event.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param event         Pointer to the Service event.
+ * @param rtp_pkt_sent  The send count.
+ *****************************************************************************/
+void evel_service_endpoint_rtp_pkt_sent_set(EVENT_SERVICE * const event,
+                                            const int rtp_pkt_sent);
+
+/**************************************************************************//**
+ * Set the Local Jitter property of the Service event.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param event         Pointer to the Service event.
+ * @param jitter        The jitter to be set.
+ *****************************************************************************/
+void evel_service_local_jitter_set(EVENT_SERVICE * const event,
+                                   const int jitter);
+
+/**************************************************************************//**
+ * Set the Local Rtp Octets Discarded property of the Service event.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param event         Pointer to the Service event.
+ * @param rtp_oct_disc  The discard count.
+ *****************************************************************************/
+void evel_service_local_rtp_oct_disc_set(EVENT_SERVICE * const event,
+                                         const int rtp_oct_disc);
+
+/**************************************************************************//**
+ * Set the Local Rtp Octets Received property of the Service event.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param event         Pointer to the Service event.
+ * @param rtp_oct_recv  The receive count.
+ *****************************************************************************/
+void evel_service_local_rtp_oct_recv_set(EVENT_SERVICE * const event,
+                                         const int rtp_oct_recv);
+
+/**************************************************************************//**
+ * Set the Local Rtp Octets Sent property of the Service event.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param event         Pointer to the Service event.
+ * @param rtp_oct_sent  The send count.
+ *****************************************************************************/
+void evel_service_local_rtp_oct_sent_set(EVENT_SERVICE * const event,
+                                         const int rtp_oct_sent);
+
+/**************************************************************************//**
+ * Set the Local Rtp Packets Discarded property of the Service event.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param event         Pointer to the Service event.
+ * @param rtp_pkt_disc  The discard count.
+ *****************************************************************************/
+void evel_service_local_rtp_pkt_disc_set(EVENT_SERVICE * const event,
+                                         const int rtp_pkt_disc);
+
+/**************************************************************************//**
+ * Set the Local Rtp Packets Received property of the Service event.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param event         Pointer to the Service event.
+ * @param rtp_pkt_recv  The receive count.
+ *****************************************************************************/
+void evel_service_local_rtp_pkt_recv_set(EVENT_SERVICE * const event,
+                                         const int rtp_pkt_recv);
+
+/**************************************************************************//**
+ * Set the Local Rtp Packets Sent property of the Service event.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param event         Pointer to the Service event.
+ * @param rtp_pkt_sent  The send count.
+ *****************************************************************************/
+void evel_service_local_rtp_pkt_sent_set(EVENT_SERVICE * const event,
+                                         const int rtp_pkt_sent);
+
+/**************************************************************************//**
+ * Set the Mos Cqe property of the Service event.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param event         Pointer to the Service event.
+ * @param mos_cqe       The mosCqe to be set.
+ *****************************************************************************/
+void evel_service_mos_cqe_set(EVENT_SERVICE * const event,
+                              const double mos_cqe);
+
+/**************************************************************************//**
+ * Set the Packets Lost property of the Service event.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param event         Pointer to the Service event.
+ * @param packets_lost  The number of packets lost to be set.
+ *****************************************************************************/
+void evel_service_packets_lost_set(EVENT_SERVICE * const event,
+                                   const int packets_lost);
+
+/**************************************************************************//**
+ * Set the packet Loss Percent property of the Service event.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param event         Pointer to the Service event.
+ * @param packet_loss_percent
+ *                      The packet loss in percent.
+ *****************************************************************************/
+void evel_service_packet_loss_percent_set(EVENT_SERVICE * const event,
+                                          const double packet_loss_percent);
+
+/**************************************************************************//**
+ * Set the R Factor property of the Service event.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param event         Pointer to the Service event.
+ * @param r_factor      The R Factor to be set.
+ *****************************************************************************/
+void evel_service_r_factor_set(EVENT_SERVICE * const event,
+                               const int r_factor);
+
+/**************************************************************************//**
+ * Set the Round Trip Delay property of the Service event.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param event         Pointer to the Service event.
+ * @param round_trip_delay
+ *                      The Round trip delay to be set.
+ *****************************************************************************/
+void evel_service_round_trip_delay_set(EVENT_SERVICE * const event,
+                                       const int round_trip_delay);
+
+/**************************************************************************//**
+ * Set the Phone Number property of the Service event.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param event         Pointer to the Service event.
+ * @param phone_number  The Phone Number to be set. ASCIIZ string. The caller
+ *                      does not need to preserve the value once the function
+ *                      returns.
+ *****************************************************************************/
+void evel_service_phone_number_set(EVENT_SERVICE * const event,
+                                   const char * const phone_number);
+
+/**************************************************************************//**
+ * Add a name/value pair to the Service, under the additionalFields array.
+ *
+ * The name and value are null delimited ASCII strings.  The library takes
+ * a copy so the caller does not have to preserve values after the function
+ * returns.
+ *
+ * @param event     Pointer to the Service event.
+ * @param name      ASCIIZ string with the field's name.  The caller does not
+ *                  need to preserve the value once the function returns.
+ * @param value     ASCIIZ string with the field's value.  The caller does not
+ *                  need to preserve the value once the function returns.
+ *****************************************************************************/
+void evel_service_addl_field_add(EVENT_SERVICE * const event,
+                                 const char * const name,
+                                 const char * const value);
+
+/*****************************************************************************/
+/*****************************************************************************/
+/*                                                                           */
+/*   SIGNALING                                                               */
+/*                                                                           */
+/*****************************************************************************/
+/*****************************************************************************/
+
+/**************************************************************************//**
+ * Create a new Signaling event.
+ *
+ * @note    The mandatory fields on the Signaling must be supplied to
+ *          this factory function and are immutable once set.  Optional fields
+ *          have explicit setter functions, but again values may only be set
+ *          once so that the event has immutable properties.
+ * @param vendor_id     The vendor id to encode in the event instance id.
+ * @param event_id      The vendor event id to encode in the event instance id.
+ * @returns pointer to the newly manufactured ::EVENT_SIGNALING.  If the event
+ *          is not used (i.e. posted) it must be released using
+ *          ::evel_free_signaling.
+ * @retval  NULL  Failed to create the event.
+ *****************************************************************************/
+EVENT_SIGNALING * evel_new_signaling(const char * const vendor_id,
+                                     const char * const event_id);
+
+/**************************************************************************//**
+ * Free a Signaling event.
+ *
+ * Free off the event supplied.  Will free all the contained allocated memory.
+ *
+ * @note It does not free the event itself, since that may be part of a larger
+ * structure.
+ *****************************************************************************/
+void evel_free_signaling(EVENT_SIGNALING * const event);
+
+/**************************************************************************//**
+ * Set the Event Type property of the Signaling event.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param event         Pointer to the Signaling event.
+ * @param type          The Event Type to be set. ASCIIZ string. The caller
+ *                      does not need to preserve the value once the function
+ *                      returns.
+ *****************************************************************************/
+void evel_signaling_type_set(EVENT_SIGNALING * const event,
+                             const char * const type);
+
+/**************************************************************************//**
+ * Set the Product Id property of the Signaling event.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param event         Pointer to the Signaling event.
+ * @param product_id    The vendor product id to be set. ASCIIZ string. The
+ *                      caller does not need to preserve the value once the
+ *                      function returns.
+ *****************************************************************************/
+void evel_signaling_product_id_set(EVENT_SIGNALING * const event,
+                                   const char * const product_id);
+
+/**************************************************************************//**
+ * Set the Subsystem Id property of the Signaling event.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param event         Pointer to the Signaling event.
+ * @param subsystem_id  The vendor subsystem id to be set. ASCIIZ string. The
+ *                      caller does not need to preserve the value once the
+ *                      function returns.
+ *****************************************************************************/
+void evel_signaling_subsystem_id_set(EVENT_SIGNALING * const event,
+                                     const char * const subsystem_id);
+
+/**************************************************************************//**
+ * Set the Friendly Name property of the Signaling event.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param event         Pointer to the Signaling event.
+ * @param friendly_name The vendor friendly name to be set. ASCIIZ string. The
+ *                      caller does not need to preserve the value once the
+ *                      function returns.
+ *****************************************************************************/
+void evel_signaling_friendly_name_set(EVENT_SIGNALING * const event,
+                                      const char * const friendly_name);
+
+/**************************************************************************//**
+ * Set the Correlator property of the Signaling event.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param event         Pointer to the Signaling event.
+ * @param correlator    The correlator to be set. ASCIIZ string. The caller
+ *                      does not need to preserve the value once the function
+ *                      returns.
+ *****************************************************************************/
+void evel_signaling_correlator_set(EVENT_SIGNALING * const event,
+                                   const char * const correlator);
+
+/**************************************************************************//**
+ * Set the Local Ip Address property of the Signaling event.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param event         Pointer to the Signaling event.
+ * @param local_ip_address
+ *                      The Local Ip Address to be set. ASCIIZ string. The
+ *                      caller does not need to preserve the value once the
+ *                      function returns.
+ *****************************************************************************/
+void evel_signaling_local_ip_address_set(EVENT_SIGNALING * const event,
+                                         const char * const local_ip_address);
+
+/**************************************************************************//**
+ * Set the Local Port property of the Signaling event.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param event         Pointer to the Signaling event.
+ * @param local_port    The Local Port to be set. ASCIIZ string. The caller
+ *                      does not need to preserve the value once the function
+ *                      returns.
+ *****************************************************************************/
+void evel_signaling_local_port_set(EVENT_SIGNALING * const event,
+                                   const char * const local_port);
+
+/**************************************************************************//**
+ * Set the Remote Ip Address property of the Signaling event.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param event         Pointer to the Signaling event.
+ * @param remote_ip_address
+ *                      The Remote Ip Address to be set. ASCIIZ string. The
+ *                      caller does not need to preserve the value once the
+ *                      function returns.
+ *****************************************************************************/
+void evel_signaling_remote_ip_address_set(EVENT_SIGNALING * const event,
+                                         const char * const remote_ip_address);
+
+/**************************************************************************//**
+ * Set the Remote Port property of the Signaling event.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param event         Pointer to the Signaling event.
+ * @param remote_port   The Remote Port to be set. ASCIIZ string. The caller
+ *                      does not need to preserve the value once the function
+ *                      returns.
+ *****************************************************************************/
+void evel_signaling_remote_port_set(EVENT_SIGNALING * const event,
+                                    const char * const remote_port);
+
+/**************************************************************************//**
+ * Set the Compressed SIP property of the Signaling event.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param event         Pointer to the Signaling event.
+ * @param compressed_sip
+ *                      The Compressed SIP to be set. ASCIIZ string. The caller
+ *                      does not need to preserve the value once the function
+ *                      returns.
+ *****************************************************************************/
+void evel_signaling_compressed_sip_set(EVENT_SIGNALING * const event,
+                                       const char * const compressed_sip);
+
+/**************************************************************************//**
+ * Set the Summary SIP property of the Signaling event.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param event         Pointer to the Signaling event.
+ * @param summary_sip   The Summary SIP to be set. ASCIIZ string. The caller
+ *                      does not need to preserve the value once the function
+ *                      returns.
+ *****************************************************************************/
+void evel_signaling_summary_sip_set(EVENT_SIGNALING * const event,
+                                    const char * const summary_sip);
+
+/*****************************************************************************/
+/*****************************************************************************/
+/*                                                                           */
+/*   STATE CHANGE                                                            */
+/*                                                                           */
+/*****************************************************************************/
+/*****************************************************************************/
+
+/**************************************************************************//**
+ * Create a new State Change event.
+ *
+ * @note    The mandatory fields on the Syslog must be supplied to this factory
+ *          function and are immutable once set.  Optional fields have explicit
+ *          setter functions, but again values may only be set once so that the
+ *          Syslog has immutable properties.
+ *
+ * @param new_state     The new state of the reporting entity.
+ * @param old_state     The old state of the reporting entity.
+ * @param interface     The card or port name of the reporting entity.
+ *
+ * @returns pointer to the newly manufactured ::EVENT_STATE_CHANGE.  If the
+ *          event is not used it must be released using
+ *          ::evel_free_state_change
+ * @retval  NULL  Failed to create the event.
+ *****************************************************************************/
+EVENT_STATE_CHANGE * evel_new_state_change(const EVEL_ENTITY_STATE new_state,
+                                           const EVEL_ENTITY_STATE old_state,
+                                           const char * const interface);
+
+/**************************************************************************//**
+ * Free a State Change.
+ *
+ * Free off the State Change supplied.  Will free all the contained allocated
+ * memory.
+ *
+ * @note It does not free the State Change itself, since that may be part of a
+ * larger structure.
+ *****************************************************************************/
+void evel_free_state_change(EVENT_STATE_CHANGE * const state_change);
+
+/**************************************************************************//**
+ * Set the Event Type property of the State Change.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param state_change  Pointer to the ::EVENT_STATE_CHANGE.
+ * @param type          The Event Type to be set. ASCIIZ string. The caller
+ *                      does not need to preserve the value once the function
+ *                      returns.
+ *****************************************************************************/
+void evel_state_change_type_set(EVENT_STATE_CHANGE * const state_change,
+                                const char * const type);
+
+/**************************************************************************//**
+ * Add an additional field name/value pair to the State Change.
+ *
+ * The name and value are null delimited ASCII strings.  The library takes
+ * a copy so the caller does not have to preserve values after the function
+ * returns.
+ *
+ * @param state_change  Pointer to the ::EVENT_STATE_CHANGE.
+ * @param name          ASCIIZ string with the attribute's name.  The caller
+ *                      does not need to preserve the value once the function
+ *                      returns.
+ * @param value         ASCIIZ string with the attribute's value.  The caller
+ *                      does not need to preserve the value once the function
+ *                      returns.
+ *****************************************************************************/
+void evel_state_change_addl_field_add(EVENT_STATE_CHANGE * const state_change,
+                                      const char * const name,
+                                      const char * const value);
+
+/*****************************************************************************/
+/*****************************************************************************/
+/*                                                                           */
+/*   SYSLOG                                                                  */
+/*                                                                           */
+/*****************************************************************************/
+/*****************************************************************************/
+
+/**************************************************************************//**
+ * Create a new syslog event.
+ *
+ * @note    The mandatory fields on the Syslog must be supplied to this factory
+ *          function and are immutable once set.  Optional fields have explicit
+ *          setter functions, but again values may only be set once so that the
+ *          Syslog has immutable properties.
+ *
+ * @param   event_source_type
+ * @param   syslog_msg
+ * @param   syslog_tag
+ *
+ * @returns pointer to the newly manufactured ::EVENT_SYSLOG.  If the event is
+ *          not used it must be released using ::evel_free_syslog
+ * @retval  NULL  Failed to create the event.
+ *****************************************************************************/
+EVENT_SYSLOG * evel_new_syslog(EVEL_SOURCE_TYPES event_source_type,
+                               const char * const syslog_msg,
+                               const char * const syslog_tag);
+
+/**************************************************************************//**
+ * Set the Event Type property of the Syslog.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param syslog      Pointer to the syslog.
+ * @param type        The Event Type to be set. ASCIIZ string. The caller
+ *                    does not need to preserve the value once the function
+ *                    returns.
+ *****************************************************************************/
+void evel_syslog_type_set(EVENT_SYSLOG * syslog,
+                          const char * const type);
+
+/**************************************************************************//**
+ * Free a Syslog.
+ *
+ * Free off the Syslog supplied.  Will free all the contained allocated memory.
+ *
+ * @note It does not free the Syslog itself, since that may be part of a
+ * larger structure.
+ *****************************************************************************/
+void evel_free_syslog(EVENT_SYSLOG * event);
+
+/**************************************************************************//**
+ * Add an additional field name/value pair to the Syslog.
+ *
+ * The name and value are null delimited ASCII strings.  The library takes
+ * a copy so the caller does not have to preserve values after the function
+ * returns.
+ *
+ * @param syslog    Pointer to the syslog.
+ * @param name      ASCIIZ string with the attribute's name.  The caller
+ *                  does not need to preserve the value once the function
+ *                  returns.
+ * @param value     ASCIIZ string with the attribute's value.  The caller
+ *                  does not need to preserve the value once the function
+ *                  returns.
+ *****************************************************************************/
+void evel_syslog_addl_field_add(EVENT_SYSLOG * syslog,
+                                char * name,
+                                char * value);
+
+/**************************************************************************//**
+ * Set the Event Source Host property of the Syslog.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param syslog      Pointer to the Syslog.
+ * @param host        The Event Source Host to be set.  ASCIIZ string. The
+ *                    caller does not need to preserve the value once the
+ *                    function returns.
+ *****************************************************************************/
+void evel_syslog_event_source_host_set(EVENT_SYSLOG * syslog,
+                                       const char * const host);
+
+/**************************************************************************//**
+ * Set the Syslog Facility property of the Syslog.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param syslog      Pointer to the Syslog.
+ * @param facility    The Syslog Facility to be set.  ASCIIZ string. The caller
+ *                    does not need to preserve the value once the function
+ *                    returns.
+ *****************************************************************************/
+void evel_syslog_facility_set(EVENT_SYSLOG * syslog,
+                              EVEL_SYSLOG_FACILITIES facility);
+
+/**************************************************************************//**
+ * Set the Process property of the Syslog.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param syslog      Pointer to the Syslog.
+ * @param proc        The Process to be set.  ASCIIZ string. The caller does
+ *                    not need to preserve the value once the function returns.
+ *****************************************************************************/
+void evel_syslog_proc_set(EVENT_SYSLOG * syslog, const char * const proc);
+
+/**************************************************************************//**
+ * Set the Process ID property of the Syslog.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param syslog      Pointer to the Syslog.
+ * @param proc_id     The Process ID to be set.
+ *****************************************************************************/
+void evel_syslog_proc_id_set(EVENT_SYSLOG * syslog, int proc_id);
+
+/**************************************************************************//**
+ * Set the Version property of the Syslog.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param syslog      Pointer to the Syslog.
+ * @param version     The Version to be set.
+ *****************************************************************************/
+void evel_syslog_version_set(EVENT_SYSLOG * syslog, int version);
+
+/**************************************************************************//**
+ * Set the Structured Data property of the Syslog.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param syslog      Pointer to the Syslog.
+ * @param s_data      The Structured Data to be set.  ASCIIZ string. The caller
+ *                    does not need to preserve the value once the function
+ *                    returns.
+ *****************************************************************************/
+void evel_syslog_s_data_set(EVENT_SYSLOG * syslog, const char * const s_data);
+
+/*****************************************************************************/
+/*****************************************************************************/
+/*                                                                           */
+/*   OTHER                                                                   */
+/*                                                                           */
+/*****************************************************************************/
+/*****************************************************************************/
+
+/**************************************************************************//**
+ * Create a new other event.
+ *
+ *
+ * @returns pointer to the newly manufactured ::EVENT_OTHER.  If the event is
+ *          not used it must be released using ::evel_free_other.
+ * @retval  NULL  Failed to create the event.
+ *****************************************************************************/
+EVENT_OTHER * evel_new_other(void);
+
+/**************************************************************************//**
+ * Free an Other.
+ *
+ * Free off the Other supplied.  Will free all the contained allocated memory.
+ *
+ * @note It does not free the Other itself, since that may be part of a
+ * larger structure.
+ *****************************************************************************/
+void evel_free_other(EVENT_OTHER * event);
+
+/**************************************************************************//**
+ * Set the Event Type property of the Other.
+ *
+ * @note  The property is treated as immutable: it is only valid to call
+ *        the setter once.  However, we don't assert if the caller tries to
+ *        overwrite, just ignoring the update instead.
+ *
+ * @param other       Pointer to the Other.
+ * @param type        The Event Type to be set. ASCIIZ string. The caller
+ *                    does not need to preserve the value once the function
+ *                    returns.
+ *****************************************************************************/
+void evel_other_type_set(EVENT_OTHER * other,
+                         const char * const type);
+
+/**************************************************************************//**
+ * Add a value name/value pair to the Other.
+ *
+ * The name and value are null delimited ASCII strings.  The library takes
+ * a copy so the caller does not have to preserve values after the function
+ * returns.
+ *
+ * @param other     Pointer to the Other.
+ * @param name      ASCIIZ string with the attribute's name.
+ * @param value     ASCIIZ string with the attribute's value.
+ *****************************************************************************/
+void evel_other_field_add(EVENT_OTHER * other,
+                          char * name,
+                          char * value);
+
+/*****************************************************************************/
+/*****************************************************************************/
+/*                                                                           */
+/*   THROTTLING                                                              */
+/*                                                                           */
+/*****************************************************************************/
+/*****************************************************************************/
+
+/**************************************************************************//**
+ * Return the current measurement interval provided by the Event Listener.
+ *
+ * @returns The current measurement interval
+ * @retval  EVEL_MEASUREMENT_INTERVAL_UKNOWN (0) - interval has not been
+ *          specified
+ *****************************************************************************/
+int evel_get_measurement_interval();
+
+/*****************************************************************************/
+/*****************************************************************************/
+/*                                                                           */
+/*   LOGGING                                                                 */
+/*                                                                           */
+/*****************************************************************************/
+/*****************************************************************************/
+
+/*****************************************************************************/
+/* Debug macros.                                                             */
+/*****************************************************************************/
+#define EVEL_DEBUG(FMT, ...)   log_debug(EVEL_LOG_DEBUG, (FMT), ##__VA_ARGS__)
+#define EVEL_INFO(FMT, ...)    log_debug(EVEL_LOG_INFO, (FMT), ##__VA_ARGS__)
+#define EVEL_SPAMMY(FMT, ...)  log_debug(EVEL_LOG_SPAMMY, (FMT), ##__VA_ARGS__)
+#define EVEL_ERROR(FMT, ...)   log_debug(EVEL_LOG_ERROR, "ERROR: " FMT, \
+                                         ##__VA_ARGS__)
+#define EVEL_ENTER()                                                          \
+        {                                                                     \
+          log_debug(EVEL_LOG_DEBUG, "Enter %s {", __FUNCTION__);              \
+          debug_indent += 2;                                                  \
+        }
+#define EVEL_EXIT()                                                           \
+        {                                                                     \
+          debug_indent -= 2;                                                  \
+          log_debug(EVEL_LOG_DEBUG, "Exit %s }", __FUNCTION__);               \
+        }
+
+#define INDENT_SEPARATORS                                                     \
+        "| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | "
+
+extern EVEL_LOG_LEVELS debug_level;
+extern int debug_indent;
+extern FILE * fout;
+
+#define EVEL_DEBUG_ON() ((debug_level) >= EVEL_LOG_DEBUG)
+
+/**************************************************************************//**
+ * Initialize logging
+ *
+ * @param[in] level  The debugging level - one of ::EVEL_LOG_LEVELS.
+ * @param[in] ident  The identifier for our logs.
+ *****************************************************************************/
+void log_initialize(EVEL_LOG_LEVELS level, const char * ident);
+
+/**************************************************************************//**
+ * Log debug information
+ *
+ * Logs debugging information in a platform independent manner.
+ *
+ * @param[in] level   The debugging level - one of ::EVEL_LOG_LEVELS.
+ * @param[in] format  Log formatting string in printf format.
+ * @param[in] ...     Variable argument list.
+ *****************************************************************************/
+void log_debug(EVEL_LOG_LEVELS level, char * format, ...);
+
+/***************************************************************************//*
+ * Store the formatted string into the static error string and log the error.
+ *
+ * @param format  Error string in standard printf format.
+ * @param ...     Variable parameters to be substituted into the format string.
+ *****************************************************************************/
+void log_error_state(char * format, ...);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif