[asterisk-commits] mjordan: branch mjordan/12-corosync r413031 - in /team/mjordan/12-corosync: ....
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Sat Apr 26 16:04:10 CDT 2014
Author: mjordan
Date: Sat Apr 26 16:04:04 2014
New Revision: 413031
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=413031
Log:
res_corosync: get it compiling
Untested, but things should at least not crash and attempt to consume state
from Stasis/publish state to Stasis.
Modified:
team/mjordan/12-corosync/ (props changed)
team/mjordan/12-corosync/include/asterisk/devicestate.h
team/mjordan/12-corosync/include/asterisk/event.h
team/mjordan/12-corosync/include/asterisk/event_defs.h
team/mjordan/12-corosync/include/asterisk/stasis.h
team/mjordan/12-corosync/main/app.c
team/mjordan/12-corosync/main/devicestate.c
team/mjordan/12-corosync/main/event.c
team/mjordan/12-corosync/main/stasis.c
team/mjordan/12-corosync/main/stasis_message.c
team/mjordan/12-corosync/main/stasis_message_router.c
team/mjordan/12-corosync/res/res_corosync.c
Propchange: team/mjordan/12-corosync/
------------------------------------------------------------------------------
automerge = *
Propchange: team/mjordan/12-corosync/
------------------------------------------------------------------------------
automerge-email = mjordan at digium.com
Modified: team/mjordan/12-corosync/include/asterisk/devicestate.h
URL: http://svnview.digium.com/svn/asterisk/team/mjordan/12-corosync/include/asterisk/devicestate.h?view=diff&rev=413031&r1=413030&r2=413031
==============================================================================
--- team/mjordan/12-corosync/include/asterisk/devicestate.h (original)
+++ team/mjordan/12-corosync/include/asterisk/devicestate.h Sat Apr 26 16:04:04 2014
@@ -59,7 +59,7 @@
AST_DEVICE_RINGING, /*!< Device is ringing */
AST_DEVICE_RINGINUSE, /*!< Device is ringing *and* in use */
AST_DEVICE_ONHOLD, /*!< Device is on hold */
- AST_DEVICE_TOTAL, /*/ Total num of device states, used for testing */
+ AST_DEVICE_TOTAL, /*!< Total num of device states, used for testing */
};
/*! \brief Device State Cachability
Modified: team/mjordan/12-corosync/include/asterisk/event.h
URL: http://svnview.digium.com/svn/asterisk/team/mjordan/12-corosync/include/asterisk/event.h?view=diff&rev=413031&r1=413030&r2=413031
==============================================================================
--- team/mjordan/12-corosync/include/asterisk/event.h (original)
+++ team/mjordan/12-corosync/include/asterisk/event.h Sat Apr 26 16:04:04 2014
@@ -150,6 +150,55 @@
uint32_t data);
/*!
+ * \brief Append an information element that has a bitflags payload
+ *
+ * \param event the event that the IE will be appended to
+ * \param ie_type the type of IE to append
+ * \param bitflags the flags that are the payload of the IE
+ *
+ * \retval 0 success
+ * \retval -1 failure
+ * \since 1.8
+ *
+ * The pointer to the event will get updated with the new location for the event
+ * that now contains the appended information element. If the re-allocation of
+ * the memory for this event fails, it will be set to NULL.
+ */
+int ast_event_append_ie_bitflags(struct ast_event **event, enum ast_event_ie_type ie_type,
+ uint32_t bitflags);
+
+/*!
+ * \brief Append an information element that has a raw payload
+ *
+ * \param event the event that the IE will be appended to
+ * \param ie_type the type of IE to append
+ * \param data A pointer to the raw data for the payload of the IE
+ * \param data_len The amount of data to copy into the payload
+ *
+ * \retval 0 success
+ * \retval -1 failure
+ *
+ * The pointer to the event will get updated with the new location for the event
+ * that now contains the appended information element. If the re-allocation of
+ * the memory for this event fails, it will be set to NULL.
+ */
+int ast_event_append_ie_raw(struct ast_event **event, enum ast_event_ie_type ie_type,
+ const void *data, size_t data_len);
+
+/*!
+ * \brief Append the global EID IE
+ *
+ * \param event the event to append IE to
+ *
+ * \note For ast_event_new() that includes IEs, this is done automatically
+ * for you.
+ *
+ * \retval 0 success
+ * \retval -1 failure
+ */
+int ast_event_append_eid(struct ast_event **event);
+
+/*!
* \brief Get the value of an information element that has an integer payload
*
* \param event The event to get the IE from
@@ -173,6 +222,28 @@
const char *ast_event_get_ie_str(const struct ast_event *event, enum ast_event_ie_type ie_type);
/*!
+ * \brief Get the value of an information element that has a raw payload
+ *
+ * \param event The event to get the IE from
+ * \param ie_type the type of information element to retrieve
+ *
+ * \return This returns the payload of the information element with the given type.
+ * If the information element isn't found, NULL will be returned.
+ */
+const void *ast_event_get_ie_raw(const struct ast_event *event, enum ast_event_ie_type ie_type);
+
+/*!
+ * \brief Get the length of the raw payload for a particular IE
+ *
+ * \param event The event to get the IE payload length from
+ * \param ie_type the type of information element to get the length of
+ *
+ * \return If an IE of type ie_type is found, its payload length is returned.
+ * Otherwise, 0 is returned.
+ */
+uint16_t ast_event_get_ie_raw_payload_len(const struct ast_event *event, enum ast_event_ie_type ie_type);
+
+/*!
* \brief Get the string representation of an information element type
*
* \param ie_type the information element type to get the string representation of
@@ -272,6 +343,13 @@
* \return This returns the payload of the information element as a string.
*/
const char *ast_event_iterator_get_ie_str(struct ast_event_iterator *iterator);
+
+/*!
+ * \brief Get the minimum length of an ast_event.
+ *
+ * \return minimum amount of memory that will be consumed by any ast_event.
+ */
+size_t ast_event_minimum_length(void);
#if defined(__cplusplus) || defined(c_plusplus)
}
Modified: team/mjordan/12-corosync/include/asterisk/event_defs.h
URL: http://svnview.digium.com/svn/asterisk/team/mjordan/12-corosync/include/asterisk/event_defs.h?view=diff&rev=413031&r1=413030&r2=413031
==============================================================================
--- team/mjordan/12-corosync/include/asterisk/event_defs.h (original)
+++ team/mjordan/12-corosync/include/asterisk/event_defs.h Sat Apr 26 16:04:04 2014
@@ -25,8 +25,6 @@
#ifndef AST_EVENT_DEFS_H
#define AST_EVENT_DEFS_H
-/*! \brief Event types
- * \note These values no longer go over the wire and can change when items are removed. */
enum ast_event_type {
/*! Reserved to provide the ability to subscribe to all events. A specific
* event should never have a payload of 0. */
@@ -36,12 +34,32 @@
* \note There are no "custom" IE types, because IEs only have to be
* unique to the event itself, not necessarily across all events. */
AST_EVENT_CUSTOM = 0x01,
+ /*! Voicemail message waiting indication */
+ AST_EVENT_MWI = 0x02,
/*! Someone has subscribed to events */
- AST_EVENT_SUB = 0x02,
+ AST_EVENT_SUB = 0x03,
+ /*! Someone has unsubscribed from events */
+ AST_EVENT_UNSUB = 0x04,
+ /*! The aggregate state of a device across all servers configured to be
+ * a part of a device state cluster has changed. */
+ AST_EVENT_DEVICE_STATE = 0x05,
+ /*! The state of a device has changed on _one_ server. This should not be used
+ * directly, in general. Use AST_EVENT_DEVICE_STATE instead. */
+ AST_EVENT_DEVICE_STATE_CHANGE = 0x06,
/*! Channel Event Logging events */
- AST_EVENT_CEL = 0x03,
+ AST_EVENT_CEL = 0x07,
+ /*! A report of a security related event (see security_events.h) */
+ AST_EVENT_SECURITY = 0x08,
+ /*! Used by res_stun_monitor to alert listeners to an exernal network address change. */
+ AST_EVENT_NETWORK_CHANGE = 0x09,
+ /*! The presence state for a presence provider */
+ AST_EVENT_PRESENCE_STATE = 0x0a,
+ /*! Used to alert listeners when a named ACL has changed. */
+ AST_EVENT_ACL_CHANGE = 0x0b,
+ /*! Send out a ping for debugging distributed events */
+ AST_EVENT_PING = 0x0c,
/*! Number of event types. This should be the last event type + 1 */
- AST_EVENT_TOTAL = 0x04,
+ AST_EVENT_TOTAL = 0x0d,
};
/*! \brief Event Information Element types */
@@ -50,211 +68,256 @@
AST_EVENT_IE_END = -1,
/*!
+ * \brief Number of new messages
+ * Used by: AST_EVENT_MWI
+ * Payload type: UINT
+ */
+ AST_EVENT_IE_NEWMSGS = 0x0001,
+ /*!
+ * \brief Number of
+ * Used by: AST_EVENT_MWI
+ * Payload type: UINT
+ */
+ AST_EVENT_IE_OLDMSGS = 0x0002,
+ /*!
+ * \brief Mailbox name \verbatim (mailbox[@context]) \endverbatim
+ * Used by: AST_EVENT_MWI
+ * Payload type: STR
+ */
+ AST_EVENT_IE_MAILBOX = 0x0003,
+ /*!
* \brief Unique ID
* Used by: AST_EVENT_SUB, AST_EVENT_UNSUB
* Payload type: UINT
*/
- AST_EVENT_IE_UNIQUEID = 0x0001,
+ AST_EVENT_IE_UNIQUEID = 0x0004,
/*!
* \brief Event type
* Used by: AST_EVENT_SUB, AST_EVENT_UNSUB
* Payload type: UINT
*/
- AST_EVENT_IE_EVENTTYPE = 0x0002,
+ AST_EVENT_IE_EVENTTYPE = 0x0005,
/*!
* \brief Hint that someone cares that an IE exists
* Used by: AST_EVENT_SUB
* Payload type: UINT (ast_event_ie_type)
*/
- AST_EVENT_IE_EXISTS = 0x0003,
+ AST_EVENT_IE_EXISTS = 0x0006,
+ /*!
+ * \brief Device Name
+ * Used by AST_EVENT_DEVICE_STATE_CHANGE
+ * Payload type: STR
+ */
+ AST_EVENT_IE_DEVICE = 0x0007,
+ /*!
+ * \brief Generic State IE
+ * Used by AST_EVENT_DEVICE_STATE_CHANGE
+ * Payload type: UINT
+ * The actual state values depend on the event which
+ * this IE is a part of.
+ */
+ AST_EVENT_IE_STATE = 0x0008,
/*!
* \brief Context IE
* Used by AST_EVENT_MWI
* Payload type: str
*/
- AST_EVENT_IE_CONTEXT = 0x0004,
+ AST_EVENT_IE_CONTEXT = 0x0009,
/*!
* \brief Channel Event Type
* Used by: AST_EVENT_CEL
* Payload type: UINT
*/
- AST_EVENT_IE_CEL_EVENT_TYPE = 0x0005,
+ AST_EVENT_IE_CEL_EVENT_TYPE = 0x000a,
/*!
* \brief Channel Event Time (seconds)
* Used by: AST_EVENT_CEL
* Payload type: UINT
*/
- AST_EVENT_IE_CEL_EVENT_TIME = 0x0006,
+ AST_EVENT_IE_CEL_EVENT_TIME = 0x000b,
/*!
* \brief Channel Event Time (micro-seconds)
* Used by: AST_EVENT_CEL
* Payload type: UINT
*/
- AST_EVENT_IE_CEL_EVENT_TIME_USEC = 0x0007,
+ AST_EVENT_IE_CEL_EVENT_TIME_USEC = 0x000c,
/*!
* \brief Channel Event User Event Name
* Used by: AST_EVENT_CEL
* Payload type: STR
*/
- AST_EVENT_IE_CEL_USEREVENT_NAME = 0x0008,
+ AST_EVENT_IE_CEL_USEREVENT_NAME = 0x000d,
/*!
* \brief Channel Event CID name
* Used by: AST_EVENT_CEL
* Payload type: STR
*/
- AST_EVENT_IE_CEL_CIDNAME = 0x0009,
+ AST_EVENT_IE_CEL_CIDNAME = 0x000e,
/*!
* \brief Channel Event CID num
* Used by: AST_EVENT_CEL
* Payload type: STR
*/
- AST_EVENT_IE_CEL_CIDNUM = 0x000a,
+ AST_EVENT_IE_CEL_CIDNUM = 0x000f,
/*!
* \brief Channel Event extension name
* Used by: AST_EVENT_CEL
* Payload type: STR
*/
- AST_EVENT_IE_CEL_EXTEN = 0x000b,
+ AST_EVENT_IE_CEL_EXTEN = 0x0010,
/*!
* \brief Channel Event context name
* Used by: AST_EVENT_CEL
* Payload type: STR
*/
- AST_EVENT_IE_CEL_CONTEXT = 0x000c,
+ AST_EVENT_IE_CEL_CONTEXT = 0x0011,
/*!
* \brief Channel Event channel name
* Used by: AST_EVENT_CEL
* Payload type: STR
*/
- AST_EVENT_IE_CEL_CHANNAME = 0x000d,
+ AST_EVENT_IE_CEL_CHANNAME = 0x0012,
/*!
* \brief Channel Event app name
* Used by: AST_EVENT_CEL
* Payload type: STR
*/
- AST_EVENT_IE_CEL_APPNAME = 0x000e,
+ AST_EVENT_IE_CEL_APPNAME = 0x0013,
/*!
* \brief Channel Event app args/data
* Used by: AST_EVENT_CEL
* Payload type: STR
*/
- AST_EVENT_IE_CEL_APPDATA = 0x000f,
+ AST_EVENT_IE_CEL_APPDATA = 0x0014,
/*!
* \brief Channel Event AMA flags
* Used by: AST_EVENT_CEL
* Payload type: UINT
*/
- AST_EVENT_IE_CEL_AMAFLAGS = 0x0010,
+ AST_EVENT_IE_CEL_AMAFLAGS = 0x0015,
/*!
* \brief Channel Event AccountCode
* Used by: AST_EVENT_CEL
* Payload type: STR
*/
- AST_EVENT_IE_CEL_ACCTCODE = 0x0011,
+ AST_EVENT_IE_CEL_ACCTCODE = 0x0016,
/*!
* \brief Channel Event UniqueID
* Used by: AST_EVENT_CEL
* Payload type: STR
*/
- AST_EVENT_IE_CEL_UNIQUEID = 0x0012,
+ AST_EVENT_IE_CEL_UNIQUEID = 0x0017,
/*!
* \brief Channel Event Userfield
* Used by: AST_EVENT_CEL
* Payload type: STR
*/
- AST_EVENT_IE_CEL_USERFIELD = 0x0013,
+ AST_EVENT_IE_CEL_USERFIELD = 0x0018,
/*!
* \brief Channel Event CID ANI field
* Used by: AST_EVENT_CEL
* Payload type: STR
*/
- AST_EVENT_IE_CEL_CIDANI = 0x0014,
+ AST_EVENT_IE_CEL_CIDANI = 0x0019,
/*!
* \brief Channel Event CID RDNIS field
* Used by: AST_EVENT_CEL
* Payload type: STR
*/
- AST_EVENT_IE_CEL_CIDRDNIS = 0x0015,
+ AST_EVENT_IE_CEL_CIDRDNIS = 0x001a,
/*!
* \brief Channel Event CID dnid
* Used by: AST_EVENT_CEL
* Payload type: STR
*/
- AST_EVENT_IE_CEL_CIDDNID = 0x0016,
+ AST_EVENT_IE_CEL_CIDDNID = 0x001b,
/*!
* \brief Channel Event Peer -- for Things involving multiple channels, like BRIDGE
* Used by: AST_EVENT_CEL
* Payload type: STR
*/
- AST_EVENT_IE_CEL_PEER = 0x0017,
+ AST_EVENT_IE_CEL_PEER = 0x001c,
/*!
* \brief Channel Event LinkedID
* Used by: AST_EVENT_CEL
* Payload type: STR
*/
- AST_EVENT_IE_CEL_LINKEDID = 0x0018,
+ AST_EVENT_IE_CEL_LINKEDID = 0x001d,
/*!
* \brief Channel Event peeraccount
* Used by: AST_EVENT_CEL
* Payload type: STR
*/
- AST_EVENT_IE_CEL_PEERACCT = 0x0019,
+ AST_EVENT_IE_CEL_PEERACCT = 0x001e,
/*!
* \brief Channel Event extra data
* Used by: AST_EVENT_CEL
* Payload type: STR
*/
- AST_EVENT_IE_CEL_EXTRA = 0x001a,
+ AST_EVENT_IE_CEL_EXTRA = 0x001f,
/*!
* \brief Description
* Used by: AST_EVENT_SUB, AST_EVENT_UNSUB
* Payload type: STR
*/
- AST_EVENT_IE_DESCRIPTION = 0x001b,
+ AST_EVENT_IE_DESCRIPTION = 0x0020,
/*!
* \brief Entity ID
* Used by All events
* Payload type: RAW
* This IE indicates which server the event originated from
*/
- AST_EVENT_IE_EVENT_VERSION = 0x001c,
- AST_EVENT_IE_SERVICE = 0x001d,
- AST_EVENT_IE_MODULE = 0x001e,
- AST_EVENT_IE_ACCOUNT_ID = 0x001f,
- AST_EVENT_IE_SESSION_ID = 0x0020,
- AST_EVENT_IE_SESSION_TV = 0x0021,
- AST_EVENT_IE_ACL_NAME = 0x0022,
- AST_EVENT_IE_LOCAL_ADDR = 0x0023,
- AST_EVENT_IE_REMOTE_ADDR = 0x0024,
- AST_EVENT_IE_EVENT_TV = 0x0025,
- AST_EVENT_IE_REQUEST_TYPE = 0x0026,
- AST_EVENT_IE_REQUEST_PARAMS = 0x0027,
- AST_EVENT_IE_AUTH_METHOD = 0x0028,
- AST_EVENT_IE_SEVERITY = 0x0029,
- AST_EVENT_IE_EXPECTED_ADDR = 0x002a,
- AST_EVENT_IE_CHALLENGE = 0x002b,
- AST_EVENT_IE_RESPONSE = 0x002c,
- AST_EVENT_IE_EXPECTED_RESPONSE = 0x002e,
- AST_EVENT_IE_RECEIVED_CHALLENGE = 0x002f,
- AST_EVENT_IE_RECEIVED_HASH = 0x0030,
- AST_EVENT_IE_USING_PASSWORD = 0x0031,
- AST_EVENT_IE_ATTEMPTED_TRANSPORT = 0x0032,
-
+ AST_EVENT_IE_EID = 0x0021,
+ AST_EVENT_IE_SECURITY_EVENT = 0x0022,
+ AST_EVENT_IE_EVENT_VERSION = 0x0023,
+ AST_EVENT_IE_SERVICE = 0x0024,
+ AST_EVENT_IE_MODULE = 0x0025,
+ AST_EVENT_IE_ACCOUNT_ID = 0x0026,
+ AST_EVENT_IE_SESSION_ID = 0x0027,
+ AST_EVENT_IE_SESSION_TV = 0x0028,
+ AST_EVENT_IE_ACL_NAME = 0x0029,
+ AST_EVENT_IE_LOCAL_ADDR = 0x002a,
+ AST_EVENT_IE_REMOTE_ADDR = 0x002b,
+ AST_EVENT_IE_EVENT_TV = 0x002c,
+ AST_EVENT_IE_REQUEST_TYPE = 0x002d,
+ AST_EVENT_IE_REQUEST_PARAMS = 0x002e,
+ AST_EVENT_IE_AUTH_METHOD = 0x002f,
+ AST_EVENT_IE_SEVERITY = 0x0030,
+ AST_EVENT_IE_EXPECTED_ADDR = 0x0031,
+ AST_EVENT_IE_CHALLENGE = 0x0032,
+ AST_EVENT_IE_RESPONSE = 0x0033,
+ AST_EVENT_IE_EXPECTED_RESPONSE = 0x0034,
+ AST_EVENT_IE_RECEIVED_CHALLENGE = 0x0035,
+ AST_EVENT_IE_RECEIVED_HASH = 0x0036,
+ AST_EVENT_IE_USING_PASSWORD = 0x0037,
+ AST_EVENT_IE_ATTEMPTED_TRANSPORT = 0x0038,
+ AST_EVENT_IE_PRESENCE_PROVIDER = 0x0039,
+ AST_EVENT_IE_PRESENCE_STATE = 0x003a,
+ AST_EVENT_IE_PRESENCE_SUBTYPE = 0x003b,
+ AST_EVENT_IE_PRESENCE_MESSAGE = 0x003c,
+
+ /*!
+ * \brief Event non-cachability flag
+ * Used by: All events
+ * Payload type: UINT
+ */
+ AST_EVENT_IE_CACHABLE = 0x003d,
/*! \brief Must be the last IE value +1 */
- AST_EVENT_IE_TOTAL = 0x0033,
-};
-
-/*!
- * \brief Payload types for event information elements
- */
+ AST_EVENT_IE_TOTAL = 0x003e,
+};
+
enum ast_event_ie_pltype {
AST_EVENT_IE_PLTYPE_UNKNOWN = -1,
+ /*! Just check if it exists, not the value */
+ AST_EVENT_IE_PLTYPE_EXISTS,
/*! Unsigned Integer (Can be used for signed, too ...) */
AST_EVENT_IE_PLTYPE_UINT,
/*! String */
AST_EVENT_IE_PLTYPE_STR,
/*! Raw data, compared with memcmp */
AST_EVENT_IE_PLTYPE_RAW,
+ /*! Bit flags (unsigned integer, compared using boolean logic) */
+ AST_EVENT_IE_PLTYPE_BITFLAGS,
};
/*!
Modified: team/mjordan/12-corosync/include/asterisk/stasis.h
URL: http://svnview.digium.com/svn/asterisk/team/mjordan/12-corosync/include/asterisk/stasis.h?view=diff&rev=413031&r1=413030&r2=413031
==============================================================================
--- team/mjordan/12-corosync/include/asterisk/stasis.h (original)
+++ team/mjordan/12-corosync/include/asterisk/stasis.h Sat Apr 26 16:04:04 2014
@@ -171,6 +171,7 @@
#include "asterisk/json.h"
#include "asterisk/manager.h"
#include "asterisk/utils.h"
+#include "asterisk/event.h"
/*! @{ */
@@ -255,6 +256,21 @@
*/
struct ast_manager_event_blob *(*to_ami)(
struct stasis_message *message);
+
+ /*!
+ * \since 12.4.0
+ * \brief Build the \ref ast_event representation of the message.
+ *
+ * May be \c NULL, or may return \c NULL, to indicate no representation.
+ * The returned object should be free'd.
+ *
+ * \param message Message to convert to an \ref ast_event.
+ * \return Newly allocated \ref ast_event.
+ * \return \c NULL on error.
+ * \return \c NULL if AMI format is not supported.
+ */
+ struct ast_event *(*to_event)(
+ struct stasis_message *message);
};
/*!
@@ -387,6 +403,9 @@
* \return \c NULL if AMI format is not supported.
*/
struct ast_manager_event_blob *stasis_message_to_ami(
+ struct stasis_message *message);
+
+struct ast_event *stasis_message_to_event(
struct stasis_message *message);
/*! @} */
@@ -1020,6 +1039,7 @@
* STASIS_MESSAGE_TYPE_DEFN(ast_foo_type,
* .to_ami = foo_to_ami,
* .to_json = foo_to_json,
+ * .to_event = foo_to_event,
* );
* \endcode
*
@@ -1046,6 +1066,7 @@
* STASIS_MESSAGE_TYPE_DEFN_LOCAL(ast_foo_type,
* .to_ami = foo_to_ami,
* .to_json = foo_to_json,
+ * .to_event = foo_to_event,
* );
* \endcode
*
Modified: team/mjordan/12-corosync/main/app.c
URL: http://svnview.digium.com/svn/asterisk/team/mjordan/12-corosync/main/app.c?view=diff&rev=413031&r1=413030&r2=413031
==============================================================================
--- team/mjordan/12-corosync/main/app.c (original)
+++ team/mjordan/12-corosync/main/app.c Sat Apr 26 16:04:04 2014
@@ -96,10 +96,43 @@
static struct stasis_topic_pool *queue_topic_pool;
/* @} */
+/*! \brief Convert a MWI \ref stasis_message to a \ref ast_event */
+static struct ast_event *mwi_to_event(struct stasis_message *message)
+{
+ struct ast_event *event;
+ struct ast_mwi_state *mwi_state;
+ char *mailbox;
+ char *context;
+
+ if (!message) {
+ return NULL;
+ }
+
+ mwi_state = stasis_message_data(message);
+
+ /* Strip off @context */
+ context = mailbox = ast_strdupa(mwi_state->uniqueid);
+ strsep(&context, "@");
+ if (ast_strlen_zero(context)) {
+ context = "default";
+ }
+
+ event = ast_event_new(AST_EVENT_MWI,
+ AST_EVENT_IE_MAILBOX, AST_EVENT_IE_PLTYPE_STR, mailbox,
+ AST_EVENT_IE_CONTEXT, AST_EVENT_IE_PLTYPE_STR, context,
+ AST_EVENT_IE_NEWMSGS, AST_EVENT_IE_PLTYPE_UINT, mwi_state->new_msgs,
+ AST_EVENT_IE_OLDMSGS, AST_EVENT_IE_PLTYPE_UINT, mwi_state->old_msgs,
+ AST_EVENT_IE_EID, AST_EVENT_IE_EID, mwi_state->eid, sizeof(mwi_state->eid),
+ AST_EVENT_IE_END);
+
+ return event;
+}
+
/*
* @{ \brief Define \ref stasis message types for MWI
*/
-STASIS_MESSAGE_TYPE_DEFN(ast_mwi_state_type);
+STASIS_MESSAGE_TYPE_DEFN(ast_mwi_state_type,
+ .to_event = mwi_to_event, );
STASIS_MESSAGE_TYPE_DEFN(ast_mwi_vm_app_type);
/* @} */
Modified: team/mjordan/12-corosync/main/devicestate.c
URL: http://svnview.digium.com/svn/asterisk/team/mjordan/12-corosync/main/devicestate.c?view=diff&rev=413031&r1=413030&r2=413031
==============================================================================
--- team/mjordan/12-corosync/main/devicestate.c (original)
+++ team/mjordan/12-corosync/main/devicestate.c Sat Apr 26 16:04:04 2014
@@ -199,7 +199,38 @@
static struct stasis_caching_topic *device_state_topic_cached;
static struct stasis_topic_pool *device_state_topic_pool;
-STASIS_MESSAGE_TYPE_DEFN(ast_device_state_message_type);
+/*! \brief Convert a \ref stasis_message to a \ref ast_event */
+static struct ast_event *device_state_to_event(struct stasis_message *message)
+{
+ struct ast_event *event;
+ struct ast_device_state_message *device_state;
+
+ if (!message) {
+ return NULL;
+ }
+
+ device_state = stasis_message_data(message);
+
+ if (device_state->eid) {
+ event = ast_event_new(AST_EVENT_DEVICE_STATE_CHANGE,
+ AST_EVENT_IE_DEVICE, AST_EVENT_IE_PLTYPE_STR, device_state->device,
+ AST_EVENT_IE_STATE, AST_EVENT_IE_PLTYPE_UINT, device_state->state,
+ AST_EVENT_IE_CACHABLE, AST_EVENT_IE_PLTYPE_UINT, device_state->cachable,
+ AST_EVENT_IE_EID, AST_EVENT_IE_PLTYPE_RAW, device_state->eid, sizeof(*device_state->eid),
+ AST_EVENT_IE_END);
+ } else {
+ event = ast_event_new(AST_EVENT_DEVICE_STATE,
+ AST_EVENT_IE_DEVICE, AST_EVENT_IE_PLTYPE_STR, device_state->device,
+ AST_EVENT_IE_STATE, AST_EVENT_IE_PLTYPE_UINT, device_state->state,
+ AST_EVENT_IE_CACHABLE, AST_EVENT_IE_PLTYPE_UINT, device_state->cachable,
+ AST_EVENT_IE_END);
+ }
+
+ return event;
+}
+
+STASIS_MESSAGE_TYPE_DEFN(ast_device_state_message_type,
+ .to_event = device_state_to_event);
/* Forward declarations */
static int getproviderstate(const char *provider, const char *address);
Modified: team/mjordan/12-corosync/main/event.c
URL: http://svnview.digium.com/svn/asterisk/team/mjordan/12-corosync/main/event.c?view=diff&rev=413031&r1=413030&r2=413031
==============================================================================
--- team/mjordan/12-corosync/main/event.c (original)
+++ team/mjordan/12-corosync/main/event.c Sat Apr 26 16:04:04 2014
@@ -43,10 +43,6 @@
#include "asterisk/taskprocessor.h"
#include "asterisk/astobj2.h"
#include "asterisk/cli.h"
-
-static int event_append_ie_raw(struct ast_event **event, enum ast_event_ie_type ie_type,
- const void *data, size_t data_len);
-static const void *event_get_ie_raw(const struct ast_event *event, enum ast_event_ie_type ie_type);
/*!
* \brief An event information element
@@ -257,7 +253,7 @@
{
const uint32_t *ie_val;
- ie_val = event_get_ie_raw(event, ie_type);
+ ie_val = ast_event_get_ie_raw(event, ie_type);
return ie_val ? ntohl(get_unaligned_uint32(ie_val)) : 0;
}
@@ -266,12 +262,12 @@
{
const struct ast_event_ie_str_payload *str_payload;
- str_payload = event_get_ie_raw(event, ie_type);
+ str_payload = ast_event_get_ie_raw(event, ie_type);
return str_payload ? str_payload->str : NULL;
}
-static const void *event_get_ie_raw(const struct ast_event *event, enum ast_event_ie_type ie_type)
+const void *ast_event_get_ie_raw(const struct ast_event *event, enum ast_event_ie_type ie_type)
{
struct ast_event_iterator iterator;
int res;
@@ -285,6 +281,26 @@
return NULL;
}
+static uint16_t event_iterator_get_ie_raw_payload_len(struct ast_event_iterator *iterator)
+{
+ return ntohs(iterator->ie->ie_payload_len);
+}
+
+uint16_t ast_event_get_ie_raw_payload_len(const struct ast_event *event, enum ast_event_ie_type ie_type)
+{
+ struct ast_event_iterator iterator;
+ int res;
+
+ for (res = ast_event_iterator_init(&iterator, event); !res; res = ast_event_iterator_next(&iterator)) {
+ if (ast_event_iterator_get_ie_type(&iterator) == ie_type) {
+ return event_iterator_get_ie_raw_payload_len(&iterator);
+ }
+ }
+
+ return 0;
+}
+
+
int ast_event_append_ie_str(struct ast_event **event, enum ast_event_ie_type ie_type,
const char *str)
{
@@ -297,17 +313,24 @@
strcpy(str_payload->str, str);
str_payload->hash = ast_str_hash(str);
- return event_append_ie_raw(event, ie_type, str_payload, payload_len);
+ return ast_event_append_ie_raw(event, ie_type, str_payload, payload_len);
}
int ast_event_append_ie_uint(struct ast_event **event, enum ast_event_ie_type ie_type,
uint32_t data)
{
data = htonl(data);
- return event_append_ie_raw(event, ie_type, &data, sizeof(data));
-}
-
-static int event_append_ie_raw(struct ast_event **event, enum ast_event_ie_type ie_type,
+ return ast_event_append_ie_raw(event, ie_type, &data, sizeof(data));
+}
+
+int ast_event_append_ie_bitflags(struct ast_event **event, enum ast_event_ie_type ie_type,
+ uint32_t flags)
+{
+ flags = htonl(flags);
+ return ast_event_append_ie_raw(event, ie_type, &flags, sizeof(flags));
+}
+
+int ast_event_append_ie_raw(struct ast_event **event, enum ast_event_ie_type ie_type,
const void *data, size_t data_len)
{
struct ast_event_ie *ie;
@@ -361,8 +384,13 @@
memset(ie_value, 0, sizeof(*ie_value));
ie_value->ie_type = ie_type;
ie_value->ie_pltype = va_arg(ap, enum ast_event_ie_pltype);
+
switch (ie_value->ie_pltype) {
case AST_EVENT_IE_PLTYPE_UINT:
+ ie_value->payload.uint = va_arg(ap, uint32_t);
+ insert = 1;
+ break;
+ case AST_EVENT_IE_PLTYPE_BITFLAGS:
ie_value->payload.uint = va_arg(ap, uint32_t);
insert = 1;
break;
@@ -381,6 +409,7 @@
break;
}
case AST_EVENT_IE_PLTYPE_UNKNOWN:
+ case AST_EVENT_IE_PLTYPE_EXISTS:
break;
}
@@ -407,10 +436,14 @@
case AST_EVENT_IE_PLTYPE_UINT:
ast_event_append_ie_uint(&event, ie_val->ie_type, ie_val->payload.uint);
break;
+ case AST_EVENT_IE_PLTYPE_BITFLAGS:
+ ast_event_append_ie_bitflags(&event, ie_val->ie_type, ie_val->payload.uint);
+ break;
case AST_EVENT_IE_PLTYPE_RAW:
- event_append_ie_raw(&event, ie_val->ie_type,
+ ast_event_append_ie_raw(&event, ie_val->ie_type,
ie_val->payload.raw, ie_val->raw_datalen);
break;
+ case AST_EVENT_IE_PLTYPE_EXISTS:
case AST_EVENT_IE_PLTYPE_UNKNOWN:
break;
}
@@ -421,10 +454,27 @@
}
}
+ if (!ast_event_get_ie_raw(event, AST_EVENT_IE_EID)) {
+ /* If the event is originating on this server, add the server's
+ * entity ID to the event. */
+ ast_event_append_eid(&event);
+ }
+
return event;
}
+int ast_event_append_eid(struct ast_event **event)
+{
+ return ast_event_append_ie_raw(event, AST_EVENT_IE_EID,
+ &ast_eid_default, sizeof(ast_eid_default));
+}
+
void ast_event_destroy(struct ast_event *event)
{
ast_free(event);
}
+
+size_t ast_event_minimum_length(void)
+{
+ return sizeof(struct ast_event);
+}
Modified: team/mjordan/12-corosync/main/stasis.c
URL: http://svnview.digium.com/svn/asterisk/team/mjordan/12-corosync/main/stasis.c?view=diff&rev=413031&r1=413030&r2=413031
==============================================================================
--- team/mjordan/12-corosync/main/stasis.c (original)
+++ team/mjordan/12-corosync/main/stasis.c Sat Apr 26 16:04:04 2014
@@ -686,15 +686,17 @@
from = forward->from_topic;
to = forward->to_topic;
- topic_lock_both(to, from);
- AST_VECTOR_REMOVE_ELEM_UNORDERED(&to->upstream_topics, from,
- AST_VECTOR_ELEM_CLEANUP_NOOP);
-
- for (idx = 0; idx < AST_VECTOR_SIZE(&to->subscribers); ++idx) {
- topic_remove_subscription(from, AST_VECTOR_GET(&to->subscribers, idx));
- }
- ao2_unlock(from);
- ao2_unlock(to);
+ if (from && to) {
+ topic_lock_both(to, from);
+ AST_VECTOR_REMOVE_ELEM_UNORDERED(&to->upstream_topics, from,
+ AST_VECTOR_ELEM_CLEANUP_NOOP);
+
+ for (idx = 0; idx < AST_VECTOR_SIZE(&to->subscribers); ++idx) {
+ topic_remove_subscription(from, AST_VECTOR_GET(&to->subscribers, idx));
+ }
+ ao2_unlock(from);
+ ao2_unlock(to);
+ }
ao2_cleanup(forward);
@@ -715,6 +717,11 @@
forward = ao2_alloc_options(sizeof(*forward), forward_dtor, AO2_ALLOC_OPT_LOCK_NOLOCK);
if (!forward) {
return NULL;
+ }
+
+ /* Forwards to ourselves are implicit. */
+ if (to_topic == from_topic) {
+ return forward;
}
forward->from_topic = ao2_bump(from_topic);
Modified: team/mjordan/12-corosync/main/stasis_message.c
URL: http://svnview.digium.com/svn/asterisk/team/mjordan/12-corosync/main/stasis_message.c?view=diff&rev=413031&r1=413030&r2=413031
==============================================================================
--- team/mjordan/12-corosync/main/stasis_message.c (original)
+++ team/mjordan/12-corosync/main/stasis_message.c Sat Apr 26 16:04:04 2014
@@ -187,3 +187,8 @@
{
return INVOKE_VIRTUAL(to_json, msg, sanitize);
}
+
+struct ast_event *stasis_message_to_event(struct stasis_message *msg)
+{
+ return INVOKE_VIRTUAL(to_event, msg);
+}
Modified: team/mjordan/12-corosync/main/stasis_message_router.c
URL: http://svnview.digium.com/svn/asterisk/team/mjordan/12-corosync/main/stasis_message_router.c?view=diff&rev=413031&r1=413030&r2=413031
==============================================================================
--- team/mjordan/12-corosync/main/stasis_message_router.c (original)
+++ team/mjordan/12-corosync/main/stasis_message_router.c Sat Apr 26 16:04:04 2014
@@ -175,7 +175,7 @@
if (route == NULL) {
/* Find a regular route */
route = route_table_find(&router->routes, type);
- }
+ }
if (route == NULL && router->default_route.callback) {
/* Maybe the default route, then? */
@@ -282,7 +282,7 @@
if (!message_type) {
/* Cannot route to NULL type. */
return -1;
- }
+ }
ao2_lock(router);
res = route_table_add(&router->routes, message_type, callback, data);
ao2_unlock(router);
Modified: team/mjordan/12-corosync/res/res_corosync.c
URL: http://svnview.digium.com/svn/asterisk/team/mjordan/12-corosync/res/res_corosync.c?view=diff&rev=413031&r1=413030&r2=413031
==============================================================================
--- team/mjordan/12-corosync/res/res_corosync.c (original)
+++ team/mjordan/12-corosync/res/res_corosync.c Sat Apr 26 16:04:04 2014
@@ -44,20 +44,125 @@
#include "asterisk/event.h"
#include "asterisk/cli.h"
#include "asterisk/devicestate.h"
+#include "asterisk/app.h"
+#include "asterisk/stasis.h"
+#include "asterisk/stasis_message_router.h"
AST_RWLOCK_DEFINE_STATIC(event_types_lock);
+
+static void publish_mwi_to_stasis(struct ast_event *event);
+static void publish_device_state_to_stasis(struct ast_event *event);
+
+/*! \brief The internal topic used for message forwarding and pings */
+static struct stasis_topic *corosync_aggregate_topic;
+
+/*! \brief Our \ref stasis message router */
+static struct stasis_message_router *stasis_router;
+
+/*! \brief Internal accessor for our topic */
+static struct stasis_topic *corosync_topic(void)
+{
+ return corosync_aggregate_topic;
+}
+
+/*! \brief A payload wrapper around a corosync ping event */
+struct corosync_ping_payload {
+ /*! The corosync ping event being passed over \ref stasis */
+ struct ast_event *event;
+};
+
+/*! \brief Destructor for the \ref corosync_ping_payload wrapper object */
+static void corosync_ping_payload_dtor(void *obj)
+{
+ struct corosync_ping_payload *payload = obj;
+
+ ast_free(payload->event);
+}
+
+/*! \brief Convert a Corosync PING to a \ref ast_event */
+static struct ast_event *corosync_ping_to_event(struct stasis_message *message)
+{
+ struct corosync_ping_payload *payload;
+ struct ast_event *event;
+ struct ast_eid *event_eid;
+
+ if (!message) {
+ return NULL;
+ }
+
+ payload = stasis_message_data(message);
+
+ if (!payload->event) {
+ return NULL;
+ }
+
+ event_eid = (struct ast_eid *)ast_event_get_ie_raw(payload->event, AST_EVENT_IE_EID);
+
+ event = ast_event_new(AST_EVENT_PING,
+ AST_EVENT_IE_EID, AST_EVENT_IE_PLTYPE_RAW, event_eid, sizeof(*event_eid),
+ AST_EVENT_IE_END);
+
+ return event;
+}
+
+STASIS_MESSAGE_TYPE_DEFN_LOCAL(corosync_ping_message_type,
+ .to_event = corosync_ping_to_event, );
+
+/*! \brief Publish a Corosync ping to \ref stasis */
+static void publish_corosync_ping_to_stasis(struct ast_event *event)
+{
+ struct corosync_ping_payload *payload;
+ struct stasis_message *message;
+
+ ast_assert(ast_event_get_type(event) == AST_EVENT_PING);
+ ast_assert(event != NULL);
+
+ payload = ao2_t_alloc(sizeof(*payload), corosync_ping_payload_dtor, "Create ping payload");
+ if (!payload) {
+ return;
+ }
+ payload->event = event;
+
+ message = stasis_message_create(corosync_ping_message_type(), payload);
+ if (!message) {
+ ao2_t_ref(payload, -1, "Destroy payload on off nominal");
+ return;
+ }
+
+ stasis_publish(corosync_topic(), message);
+
+ ao2_t_ref(payload, -1, "Hand ref to stasis");
+ ao2_t_ref(message, -1, "Hand ref to stasis");
+}
static struct {
const char *name;
- struct ast_event_sub *sub;
+ struct stasis_forward *sub;
unsigned char publish;
unsigned char publish_default;
unsigned char subscribe;
unsigned char subscribe_default;
+ struct stasis_topic *(* topic_fn)(void);
+ struct stasis_cache *(* cache_fn)(void);
+ struct stasis_message_type *(* message_type_fn)(void);
+ void (* publish_to_stasis)(struct ast_event *);
} event_types[] = {
- [AST_EVENT_MWI] = { .name = "mwi", },
- [AST_EVENT_DEVICE_STATE_CHANGE] = { .name = "device_state", },
- [AST_EVENT_PING] = { .name = "ping", .publish_default = 1, .subscribe_default = 1 },
+ [AST_EVENT_MWI] = { .name = "mwi",
+ .topic_fn = ast_mwi_topic_all,
+ .cache_fn = ast_mwi_state_cache,
+ .message_type_fn = ast_mwi_state_type,
+ .publish_to_stasis = publish_mwi_to_stasis, },
+ [AST_EVENT_DEVICE_STATE_CHANGE] = { .name = "device_state",
+ .topic_fn = ast_device_state_topic_all,
+ .cache_fn = ast_device_state_cache,
+ .message_type_fn = ast_device_state_message_type,
+ .publish_to_stasis = publish_device_state_to_stasis, },
+ [AST_EVENT_PING] = { .name = "ping",
+ .publish_default = 1,
+ .subscribe_default = 1,
+ .topic_fn = corosync_topic,
+ .message_type_fn = corosync_ping_message_type,
+ .publish_to_stasis = publish_corosync_ping_to_stasis, },
};
static struct {
@@ -88,6 +193,73 @@
.corosync_cfg_shutdown_callback = cfg_shutdown_cb,
};
+/*! \brief Publish a received MWI \ref ast_event to \ref stasis */
+static void publish_mwi_to_stasis(struct ast_event *event)
+{
+ const char *mailbox;
+ const char *context;
+ unsigned int new_msgs;
+ unsigned int old_msgs;
+ struct ast_eid *event_eid;
+
+ ast_assert(ast_event_get_type(event) == AST_EVENT_MWI);
+
+ mailbox = ast_event_get_ie_str(event, AST_EVENT_IE_MAILBOX);
+ context = ast_event_get_ie_str(event, AST_EVENT_IE_CONTEXT);
+ new_msgs = ast_event_get_ie_uint(event, AST_EVENT_IE_NEWMSGS);
+ old_msgs = ast_event_get_ie_uint(event, AST_EVENT_IE_OLDMSGS);
+ event_eid = (struct ast_eid *)ast_event_get_ie_raw(event, AST_EVENT_IE_EID);
+
+ if (ast_strlen_zero(mailbox) || ast_strlen_zero(context)) {
+ return;
+ }
+
+ if (new_msgs > INT_MAX) {
+ new_msgs = INT_MAX;
+ }
+
+ if (old_msgs > INT_MAX) {
+ old_msgs = INT_MAX;
+ }
+
+ if (ast_publish_mwi_state_full(mailbox,
+ context, (int)new_msgs, (int)old_msgs,
+ NULL, event_eid)) {
+ char eid[16];
+ ast_eid_to_str(eid, sizeof(eid), event_eid);
+ ast_log(AST_LOG_WARNING, "Failed to publish MWI message for %s@%s from %s\n",
+ mailbox, context, eid);
+ }
+}
+
+/*! \brief Publish a received device state \ref ast_event to \ref stasis */
+static void publish_device_state_to_stasis(struct ast_event *event)
+{
+ const char *device;
+ enum ast_device_state state;
+ unsigned int cachable;
+ struct ast_eid *event_eid;
+
+ ast_assert(ast_event_get_type(event) == AST_EVENT_DEVICE_STATE_CHANGE);
+
+ device = ast_event_get_ie_str(event, AST_EVENT_IE_DEVICE);
+ state = ast_event_get_ie_uint(event, AST_EVENT_IE_STATE);
+ cachable = ast_event_get_ie_uint(event, AST_EVENT_IE_CACHABLE);
+ event_eid = (struct ast_eid *)ast_event_get_ie_raw(event, AST_EVENT_IE_EID);
+
+ if (ast_strlen_zero(device)) {
+ return;
+ }
+
+ if (ast_publish_device_state_full(device,
+ state, cachable, event_eid)) {
+ char eid[16];
+ ast_eid_to_str(eid, sizeof(eid), event_eid);
+ ast_log(AST_LOG_WARNING, "Failed to publish device state message for %s from %s\n",
+ device, eid);
+ }
+}
+
static void cpg_deliver_cb(cpg_handle_t handle, const struct cpg_name *group_name,
uint32_t nodeid, uint32_t pid, void *msg, size_t msg_len);
@@ -101,7 +273,7 @@
.cpg_confchg_fn = cpg_confchg_cb,
};
-static void ast_event_cb(const struct ast_event *event, void *data);
+/*static void ast_event_cb(const struct ast_event *event, void *data);*/
#ifdef HAVE_COROSYNC_CFG_STATE_TRACK
static void cfg_state_track_cb(
@@ -120,6 +292,8 @@
uint32_t nodeid, uint32_t pid, void *msg, size_t msg_len)
{
struct ast_event *event;
+ void (*publish_handler)(struct ast_event *) = NULL;
+ enum ast_event_type event_type;
if (msg_len < ast_event_minimum_length()) {
ast_debug(1, "Ignoring event that's too small. %u < %u\n",
@@ -133,9 +307,19 @@
return;
}
+ event_type = ast_event_get_type(msg);
+ if (event_type > AST_EVENT_TOTAL) {
+ /* Egads, we don't support this */
+ return;
+ }
+
ast_rwlock_rdlock(&event_types_lock);
- if (!event_types[ast_event_get_type(msg)].subscribe) {
- /* We are not configured to subscribe to these events. */
+ ast_log(AST_LOG_NOTICE, "GOT EVENT TYPE %d\n", event_type);
+ publish_handler = event_types[event_type].publish_to_stasis;
+ if (!event_types[event_type].subscribe ||
+ !publish_handler) {
+ /* We are not configured to subscribe to these events or
+ we have no way to publish it internally. */
ast_rwlock_unlock(&event_types_lock);
return;
}
@@ -154,11 +338,67 @@
eid = ast_event_get_ie_raw(event, AST_EVENT_IE_EID);
ast_eid_to_str(buf, sizeof(buf), (struct ast_eid *) eid);
ast_log(LOG_NOTICE, "(cpg_deliver_cb) Got event PING from server with EID: '%s'\n", buf);
-
- ast_event_queue(event);
- } else {
- ast_event_queue_and_cache(event);
- }
+ }
+ publish_handler(event);
+}
+
+static void publish_to_corosync(struct stasis_message *message)
+{
+ cs_error_t cs_err;
+ struct iovec iov;
+ struct ast_event *event;
+
+ event = stasis_message_to_event(message);
+ if (!event) {
+ return;
+ }
+
+ if (ast_event_get_type(event) == AST_EVENT_PING) {
+ const struct ast_eid *eid;
+ char buf[128] = "";
+
+ eid = ast_event_get_ie_raw(event, AST_EVENT_IE_EID);
+ ast_eid_to_str(buf, sizeof(buf), (struct ast_eid *) eid);
+ ast_log(LOG_NOTICE, "(ast_event_cb) Got event PING from server with EID: '%s'\n", buf);
+ }
+
+ if (ast_eid_cmp(&ast_eid_default,
+ ast_event_get_ie_raw(event, AST_EVENT_IE_EID))) {
+ /* If the event didn't originate from this server, don't send it back out. */
+ ast_free(event);
+ return;
+ }
+
[... 222 lines stripped ...]
More information about the asterisk-commits
mailing list