[asterisk-commits] russell: branch russell/ais r78277 - in /team/russell/ais: include/asterisk/ ...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Mon Aug 6 16:45:10 CDT 2007


Author: russell
Date: Mon Aug  6 16:45:09 2007
New Revision: 78277

URL: http://svn.digium.com/view/asterisk?view=rev&rev=78277
Log:
Add an Entity ID (similar to DUNDi) to signify which server an event originated
from.  Also, modify res_ais such that it will only attempt to forward events to
the cluster that originated locally.

Modified:
    team/russell/ais/include/asterisk/dundi.h
    team/russell/ais/include/asterisk/event.h
    team/russell/ais/include/asterisk/event_defs.h
    team/russell/ais/include/asterisk/utils.h
    team/russell/ais/main/event.c
    team/russell/ais/main/utils.c
    team/russell/ais/pbx/dundi-parser.c
    team/russell/ais/pbx/pbx_dundi.c
    team/russell/ais/res/res_ais.c

Modified: team/russell/ais/include/asterisk/dundi.h
URL: http://svn.digium.com/view/asterisk/team/russell/ais/include/asterisk/dundi.h?view=diff&rev=78277&r1=78276&r2=78277
==============================================================================
--- team/russell/ais/include/asterisk/dundi.h (original)
+++ team/russell/ais/include/asterisk/dundi.h Mon Aug  6 16:45:09 2007
@@ -25,15 +25,11 @@
 #define _ASTERISK_DUNDI_H
 
 #include "asterisk/channel.h"
+#include "asterisk/utils.h"
 
 #define DUNDI_PORT 4520
 
-/*!\brief A DUNDi Entity ID is essentially a MAC address, brief and unique */
-struct _dundi_eid {
-	unsigned char eid[6];
-} __attribute__ ((__packed__));
-
-typedef struct _dundi_eid dundi_eid;
+typedef struct ast_eid dundi_eid;
 
 struct dundi_hdr {
 	unsigned short strans;			/*!< Source transaction */

Modified: team/russell/ais/include/asterisk/event.h
URL: http://svn.digium.com/view/asterisk/team/russell/ais/include/asterisk/event.h?view=diff&rev=78277&r1=78276&r2=78277
==============================================================================
--- team/russell/ais/include/asterisk/event.h (original)
+++ team/russell/ais/include/asterisk/event.h Mon Aug  6 16:45:09 2007
@@ -205,7 +205,20 @@
  * This creates a MWI event with 3 information elements, a mailbox which is
  * a string, and the number of new and old messages, specified as integers.
  */
-struct ast_event *ast_event_new(enum ast_event_type event_type, ...);
+#define ast_event_new(event_type, ...) \
+	__ast_event_new(0, event_type, __VA_ARGS__)
+
+/*!
+ * \brief Create a new event that came from a remote server
+ *
+ * This function is handled the same as ast_event_new(), except that it indicates
+ * that this event was received from a remote server, as opposed to being generated
+ * as the result of something happening on this one.
+ */
+#define ast_remote_event_new(event_type, ...) \
+	__ast_event_new(1, event_type, __VA_ARGS__)
+
+struct ast_event *__ast_event_new(int remote, enum ast_event_type event_type, ...);
 
 /*!
  * \brief Destroy an event

Modified: team/russell/ais/include/asterisk/event_defs.h
URL: http://svn.digium.com/view/asterisk/team/russell/ais/include/asterisk/event_defs.h?view=diff&rev=78277&r1=78276&r2=78277
==============================================================================
--- team/russell/ais/include/asterisk/event_defs.h (original)
+++ team/russell/ais/include/asterisk/event_defs.h Mon Aug  6 16:45:09 2007
@@ -103,6 +103,13 @@
 	 * this IE is a part of.
 	 */
 	 AST_EVENT_IE_STATE    = 0x08,
+	 /*!
+	  * \brief Entity ID
+	  * Used by All events
+	  * Payload type: STR
+	  * This IE indicates which server the event originated from
+	  */
+	 AST_EVENT_IE_EID      = 0x09,
 };
 
 /*!

Modified: team/russell/ais/include/asterisk/utils.h
URL: http://svn.digium.com/view/asterisk/team/russell/ais/include/asterisk/utils.h?view=diff&rev=78277&r1=78276&r2=78277
==============================================================================
--- team/russell/ais/include/asterisk/utils.h (original)
+++ team/russell/ais/include/asterisk/utils.h Mon Aug  6 16:45:09 2007
@@ -667,4 +667,18 @@
 
 #include "asterisk/strings.h"
 
+/*!
+ * \brief An Entity ID is essentially a MAC address, brief and unique 
+ */
+struct ast_eid {
+	unsigned char eid[6];
+} __attribute__ ((__packed__));
+
+/*!
+ * \brief Fill in an ast_eid with the default eid of this machine
+ */
+void ast_set_eid(struct ast_eid *eid);
+
+char *ast_eid_to_str(char *s, int maxlen, struct ast_eid *eid);
+
 #endif /* _ASTERISK_UTILS_H */

Modified: team/russell/ais/main/event.c
URL: http://svn.digium.com/view/asterisk/team/russell/ais/main/event.c?view=diff&rev=78277&r1=78276&r2=78277
==============================================================================
--- team/russell/ais/main/event.c (original)
+++ team/russell/ais/main/event.c Mon Aug  6 16:45:09 2007
@@ -106,6 +106,9 @@
  * needs to know this state, it can get the last known state from the cache. */
 static AST_RWLIST_HEAD(ast_event_ref_list, ast_event_ref) ast_event_cache[AST_EVENT_TOTAL];
 
+/*! \brief The server EID */
+static struct ast_eid g_eid;
+
 size_t ast_event_get_size(const struct ast_event *event)
 {
 	size_t res;
@@ -437,7 +440,7 @@
 	return 0;
 }
 
-struct ast_event *ast_event_new(enum ast_event_type type, ...)
+struct ast_event *__ast_event_new(int remote, enum ast_event_type type, ...)
 {
 	va_list ap;
 	struct ast_event *event;
@@ -474,6 +477,14 @@
 
 	event->type = htons(type);
 	event->event_len = htons(sizeof(*event));
+
+	if (!remote) {
+		char buf[32] = "";
+		/* If the event is originating on this server, add the server's
+		 * entity ID to the event. */
+		ast_eid_to_str(buf, sizeof(buf), &g_eid);
+		ast_event_append_ie_str(&event, AST_EVENT_IE_EID, buf);
+	}
 
 	AST_LIST_TRAVERSE(&ie_vals, ie_val, entry) {
 		if (ie_val->ie_pltype == AST_EVENT_IE_PLTYPE_STR)
@@ -768,6 +779,8 @@
 {
 	int i;
 
+	ast_set_eid(&g_eid);
+
 	for (i = 0; i < AST_EVENT_TOTAL; i++)
 		AST_RWLIST_HEAD_INIT(&ast_event_subs[i]);
 

Modified: team/russell/ais/main/utils.c
URL: http://svn.digium.com/view/asterisk/team/russell/ais/main/utils.c?view=diff&rev=78277&r1=78276&r2=78277
==============================================================================
--- team/russell/ais/main/utils.c (original)
+++ team/russell/ais/main/utils.c Mon Aug  6 16:45:09 2007
@@ -1377,6 +1377,72 @@
 	return 0;
 }
 
+char *ast_eid_to_str(char *s, int maxlen, struct ast_eid *eid)
+{
+	int x;
+	char *os = s;
+	if (maxlen < 18) {
+		if (s && (maxlen > 0))
+			*s = '\0';
+	} else {
+		for (x=0;x<5;x++) {
+			sprintf(s, "%02x:", eid->eid[x]);
+			s += 3;
+		}
+		sprintf(s, "%02x", eid->eid[5]);
+	}
+	return os;
+}
+
+void ast_set_eid(struct ast_eid *eid)
+{
+#if defined(SIOCGIFHWADDR)
+	int s, x = 0;
+	char eid_str[20];
+	struct ifreq ifr;
+
+	s = socket(AF_INET, SOCK_STREAM, 0);
+	if (s < 0)
+		return;
+	for (x = 0; x < 10; x++) {
+		memset(&ifr, 0, sizeof(ifr));
+		snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "eth%d", x);
+		if (ioctl(s, SIOCGIFHWADDR, &ifr))
+			continue;
+		memcpy(&global_eid, ((unsigned char *)&ifr.ifr_hwaddr) + 2, sizeof(*eid));
+		if (option_debug) {
+			ast_log(LOG_DEBUG, "Seeding global EID '%s' from '%s'\n", 
+				ast_eid_to_str(eid_str, sizeof(eid_str), eid), ifr.ifr_name);
+		}
+		break;
+	}
+	close(s);
+#else
+#if defined(ifa_broadaddr) && !defined(SOLARIS)
+	char eid_str[20];
+	struct ifaddrs *ifap;
+	
+	if (getifaddrs(&ifap) == 0) {
+		struct ifaddrs *p;
+		for (p = ifap; p; p = p->ifa_next) {
+			if (p->ifa_addr->sa_family == AF_LINK) {
+				struct sockaddr_dl* sdp = (struct sockaddr_dl*) p->ifa_addr;
+				memcpy(
+					&(eid->eid),
+					sdp->sdl_data + sdp->sdl_nlen, 6);
+				if (option_debug)
+					ast_log(LOG_DEBUG, "Seeding global EID '%s' from '%s'\n", ast_eid_to_str(eid_str, sizeof(eid_str), eid), ifap->ifa_name);
+				freeifaddrs(ifap);
+				return;
+			}
+		}
+		freeifaddrs(ifap);
+	}
+#endif
+#endif
+	ast_log(LOG_ERROR, "No ethernet interface found for seeding default EID.  You will have to set it manually.\n");
+}
+
 int ast_utils_init(void)
 {
 #ifdef HAVE_DEV_URANDOM

Modified: team/russell/ais/pbx/dundi-parser.c
URL: http://svn.digium.com/view/asterisk/team/russell/ais/pbx/dundi-parser.c?view=diff&rev=78277&r1=78276&r2=78277
==============================================================================
--- team/russell/ais/pbx/dundi-parser.c (original)
+++ team/russell/ais/pbx/dundi-parser.c Mon Aug  6 16:45:09 2007
@@ -54,38 +54,7 @@
 static void (*outputf)(const char *str) = internaloutput;
 static void (*errorf)(const char *str) = internalerror;
 
-char *dundi_eid_to_str(char *s, int maxlen, dundi_eid *eid)
-{
-	int x;
-	char *os = s;
-	if (maxlen < 18) {
-		if (s && (maxlen > 0))
-			*s = '\0';
-	} else {
-		for (x=0;x<5;x++) {
-			sprintf(s, "%02x:", eid->eid[x]);
-			s += 3;
-		}
-		sprintf(s, "%02x", eid->eid[5]);
-	}
-	return os;
-}
-
-char *dundi_eid_to_str_short(char *s, int maxlen, dundi_eid *eid)
-{
-	int x;
-	char *os = s;
-	if (maxlen < 13) {
-		if (s && (maxlen > 0))
-			*s = '\0';
-	} else {
-		for (x=0;x<6;x++) {
-			sprintf(s, "%02X", eid->eid[x]);
-			s += 2;
-		}
-	}
-	return os;
-}
+#define dundi_eid_to_str(a,b,c) ast_eid_to_str(a,b,c)
 
 int dundi_str_to_eid(dundi_eid *eid, char *s)
 {

Modified: team/russell/ais/pbx/pbx_dundi.c
URL: http://svn.digium.com/view/asterisk/team/russell/ais/pbx/pbx_dundi.c?view=diff&rev=78277&r1=78276&r2=78277
==============================================================================
--- team/russell/ais/pbx/pbx_dundi.c (original)
+++ team/russell/ais/pbx/pbx_dundi.c Mon Aug  6 16:45:09 2007
@@ -397,51 +397,7 @@
 
 static void reset_global_eid(void)
 {
-#if defined(SIOCGIFHWADDR)
-	int s, x = 0;
-	char eid_str[20];
-	struct ifreq ifr;
-
-	s = socket(AF_INET, SOCK_STREAM, 0);
-	if (s < 0)
-		return;
-	for (x = 0; x < 10; x++) {
-		memset(&ifr, 0, sizeof(ifr));
-		snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "eth%d", x);
-		if (ioctl(s, SIOCGIFHWADDR, &ifr))
-			continue;
-		memcpy(&global_eid, ((unsigned char *)&ifr.ifr_hwaddr) + 2, sizeof(global_eid));
-		if (option_debug) {
-			ast_log(LOG_DEBUG, "Seeding global EID '%s' from '%s'\n", 
-				dundi_eid_to_str(eid_str, sizeof(eid_str), &global_eid), ifr.ifr_name);
-		}
-		break;
-	}
-	close(s);
-#else
-#if defined(ifa_broadaddr) && !defined(SOLARIS)
-	char eid_str[20];
-	struct ifaddrs *ifap;
-	
-	if (getifaddrs(&ifap) == 0) {
-		struct ifaddrs *p;
-		for (p = ifap; p; p = p->ifa_next) {
-			if (p->ifa_addr->sa_family == AF_LINK) {
-				struct sockaddr_dl* sdp = (struct sockaddr_dl*) p->ifa_addr;
-				memcpy(
-					&(global_eid.eid),
-					sdp->sdl_data + sdp->sdl_nlen, 6);
-				if (option_debug)
-					ast_log(LOG_DEBUG, "Seeding global EID '%s' from '%s'\n", dundi_eid_to_str(eid_str, sizeof(eid_str), &global_eid), ifap->ifa_name);
-				freeifaddrs(ifap);
-				return;
-			}
-		}
-		freeifaddrs(ifap);
-	}
-#endif
-#endif
-	ast_log(LOG_NOTICE, "No ethernet interface found for seeding global EID  You will have to set it manually.\n");
+	ast_set_eid(&global_eid);
 }
 
 static int get_trans_id(void)

Modified: team/russell/ais/res/res_ais.c
URL: http://svn.digium.com/view/asterisk/team/russell/ais/res/res_ais.c?view=diff&rev=78277&r1=78276&r2=78277
==============================================================================
--- team/russell/ais/res/res_ais.c (original)
+++ team/russell/ais/res/res_ais.c Mon Aug  6 16:45:09 2007
@@ -63,6 +63,10 @@
 
 /*! Used to provide unique id's to egress subscriptions */
 static int unique_id;
+
+/*! \brief This server's unique entity ID */
+static struct ast_eid g_eid;
+static char g_eid_str[32];
 
 struct subscribe_event {
 	AST_LIST_ENTRY(subscribe_event) entry;
@@ -213,6 +217,11 @@
 	const char *filter_str;
 	SaEvtEventIdT event_id;
 
+	if (strcasecmp(g_eid_str, ast_event_get_ie_str(ast_event, AST_EVENT_IE_EID))) {
+		/* If the event didn't originate from this server, don't send it back out. */
+		return;
+	}
+
 	res = saEvtEventAllocate(event_channel->handle, &event_handle);
 	if (res != SA_AIS_OK) {
 		ast_log(LOG_ERROR, "Error allocating event: %s\n", ais_err2str(res));
@@ -374,8 +383,8 @@
 	
 	publish_event->type = type;
 
-	publish_event->sub = ast_event_subscribe(type, ast_event_cb, 
-		event_channel, NULL);
+	publish_event->sub = ast_event_subscribe(type, ast_event_cb, event_channel,
+		AST_EVENT_IE_END);
 
 	AST_LIST_INSERT_TAIL(&event_channel->publish_events, publish_event, entry);
 }
@@ -578,6 +587,9 @@
 {
 	int res;
 
+	ast_set_eid(&g_eid);
+	ast_eid_to_str(g_eid_str, sizeof(g_eid_str), &g_eid);
+
 	res = saClmInitialize(&clm_handle, &clm_callbacks, &version);
 	if (res != SA_AIS_OK) {
 		ast_log(LOG_ERROR, "Could not initialize cluster membership service: %s\n",




More information about the asterisk-commits mailing list