public inbox for cluster-cvs@sourceware.org
help / color / mirror / Atom feed
* cluster: master - cman: add cman_get_node_addrs to libcman
@ 2009-01-12 11:47 Christine Caulfield
  0 siblings, 0 replies; only message in thread
From: Christine Caulfield @ 2009-01-12 11:47 UTC (permalink / raw)
  To: cluster-cvs-relay

Gitweb:        http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=2310c8acb1669d159457cd57f17036823cd80000
Commit:        2310c8acb1669d159457cd57f17036823cd80000
Parent:        30fbdec207f6fd8ab4bfc980b2cace969f3b5a3b
Author:        Christine Caulfield <ccaulfie@redhat.com>
AuthorDate:    Mon Jan 12 11:45:01 2009 +0000
Committer:     Christine Caulfield <ccaulfie@redhat.com>
CommitterDate: Mon Jan 12 11:45:01 2009 +0000

cman: add cman_get_node_addrs to libcman

This allows cman_tool nodes -a to work but also, more importantly,
dlm_controld!

Signed-off-by: Christine Caulfield <ccaulfie@redhat.com>
---
 cman/cman_tool/main.c                          |    4 --
 cman/services/cman/include/corosync/ipc_cman.h |   16 ++++++
 cman/services/cman/lib/libcman.c               |   70 ++++++++++++++++++++++++
 cman/services/cman/services/cman.c             |   46 +++++++++++++++-
 4 files changed, 129 insertions(+), 7 deletions(-)

diff --git a/cman/cman_tool/main.c b/cman/cman_tool/main.c
index 376d095..be9af74 100644
--- a/cman/cman_tool/main.c
+++ b/cman/cman_tool/main.c
@@ -344,7 +344,6 @@ static void print_node(commandline_t *comline, cman_handle_t h, int *format, str
 		       node->cn_nodeid, member_type,
 		       node->cn_incarnation, jstring, node->cn_name);
 	}
-#if 0
 	int numaddrs;
 	struct cman_node_address addrs[MAX_INTERFACES];
 
@@ -363,7 +362,6 @@ static void print_node(commandline_t *comline, cman_handle_t h, int *format, str
 			}
 		}
 	}
-#endif
 	if (comline->format_opts) {
 		for (j = 0; j < MAX_FORMAT_OPTS; j++) {
 			switch (format[j]) {
@@ -378,7 +376,6 @@ static void print_node(commandline_t *comline, cman_handle_t h, int *format, str
 			case FMT_TYPE:
 				printf("%c ", member_type);
 				break;
-#if 0
 			case FMT_ADDR:
 				for (k = 0; k < numaddrs; k++) {
 					print_address(addrs[k].cna_address);
@@ -387,7 +384,6 @@ static void print_node(commandline_t *comline, cman_handle_t h, int *format, str
 					}
 				}
 				printf(" ");
-#endif
 				break;
 			default:
 				break;
diff --git a/cman/services/cman/include/corosync/ipc_cman.h b/cman/services/cman/include/corosync/ipc_cman.h
index 52ad84a..5946987 100644
--- a/cman/services/cman/include/corosync/ipc_cman.h
+++ b/cman/services/cman/include/corosync/ipc_cman.h
@@ -12,6 +12,7 @@ enum req_cman_types {
 	MESSAGE_REQ_CMAN_IS_LISTENING,
 	MESSAGE_REQ_CMAN_BIND,
 	MESSAGE_REQ_CMAN_UNBIND,
+	MESSAGE_REQ_CMAN_GET_NODE_ADDRS,
 };
 
 enum res_cman_types {
@@ -19,8 +20,11 @@ enum res_cman_types {
 	MESSAGE_RES_CMAN_IS_LISTENING,
 	MESSAGE_RES_CMAN_BIND,
 	MESSAGE_RES_CMAN_UNBIND,
+	MESSAGE_RES_CMAN_GET_NODE_ADDRS,
 };
 
+#define TOTEMIP_ADDRLEN (sizeof(struct in6_addr))
+
 struct req_lib_cman_bind {
         mar_req_header_t header __attribute__((aligned(8)));
 	unsigned int port;
@@ -53,5 +57,17 @@ struct res_lib_cman_is_listening {
 	unsigned int status;
 };
 
+struct req_lib_cman_get_node_addrs {
+        mar_req_header_t header __attribute__((aligned(8)));
+	unsigned int nodeid;
+};
+
+struct res_lib_cman_get_node_addrs {
+        mar_res_header_t header __attribute__((aligned(8)));
+	unsigned int family;
+	unsigned int num_addrs;
+	char addrs[TOTEMIP_ADDRLEN][0];
+};
+
 
 #endif
diff --git a/cman/services/cman/lib/libcman.c b/cman/services/cman/lib/libcman.c
index ab8acb3..b3e1131 100644
--- a/cman/services/cman/lib/libcman.c
+++ b/cman/services/cman/lib/libcman.c
@@ -311,6 +311,76 @@ error_exit:
 	return (error?-1:0);
 }
 
+int cman_get_node_addrs (
+	cman_handle_t handle,
+	int nodeid,
+	int max_addrs,
+	int *num_addrs,
+	struct cman_node_address *addrs)
+{
+	int error;
+	char buf[PIPE_BUF];
+	struct req_lib_cman_get_node_addrs req_lib_cman_get_node_addrs;
+	struct res_lib_cman_get_node_addrs * res_lib_cman_get_node_addrs = (struct res_lib_cman_get_node_addrs *)buf;
+	struct cman_inst *cman_inst;
+	int addrlen;
+	int i;
+	struct iovec iov[2];
+
+	cman_inst = (struct cman_inst *)handle;
+	VALIDATE_HANDLE(cman_inst);
+
+	pthread_mutex_lock (&cman_inst->response_mutex);
+
+	req_lib_cman_get_node_addrs.header.size = sizeof (req_lib_cman_get_node_addrs);
+	req_lib_cman_get_node_addrs.header.id = MESSAGE_REQ_CMAN_GET_NODE_ADDRS;
+	req_lib_cman_get_node_addrs.nodeid = nodeid;
+
+	iov[0].iov_base = (char *)&req_lib_cman_get_node_addrs;
+	iov[0].iov_len = sizeof (req_lib_cman_get_node_addrs);
+
+	error = saSendMsgReceiveReply (cman_inst->response_fd, iov, 1,
+				       res_lib_cman_get_node_addrs, sizeof (mar_res_header_t));
+
+	if (error == CS_OK && res_lib_cman_get_node_addrs->header.size > sizeof(mar_res_header_t)) {
+		error = saRecvRetry (cman_inst->response_fd, (char *)res_lib_cman_get_node_addrs + sizeof (mar_res_header_t),
+				     res_lib_cman_get_node_addrs->header.size - sizeof (mar_res_header_t));
+	}
+	pthread_mutex_unlock (&cman_inst->response_mutex);
+
+	if (error != CS_OK) {
+		goto error_exit;
+	}
+
+	if (res_lib_cman_get_node_addrs->family == AF_INET)
+		addrlen = sizeof(struct sockaddr_in);
+	if (res_lib_cman_get_node_addrs->family == AF_INET6)
+		addrlen = sizeof(struct sockaddr_in6);
+
+	for (i=0; i<max_addrs && i<res_lib_cman_get_node_addrs->num_addrs; i++) {
+		addrs[i].cna_addrlen = addrlen;
+		struct sockaddr_in *in;
+		struct sockaddr_in6 *in6;
+
+		if (res_lib_cman_get_node_addrs->family == AF_INET) {
+			in = (struct sockaddr_in *)addrs[i].cna_address;
+			in->sin_family = AF_INET;
+			memcpy(&in->sin_addr, &res_lib_cman_get_node_addrs->addrs[i][0], sizeof(struct in_addr));
+		}
+		if (res_lib_cman_get_node_addrs->family == AF_INET6) {
+			in6 = (struct sockaddr_in6 *)addrs[i].cna_address;
+			in6->sin6_family = AF_INET6;
+			memcpy(&in6->sin6_addr, &res_lib_cman_get_node_addrs->addrs[i][0], sizeof(struct in6_addr));
+		}
+	}
+	*num_addrs = res_lib_cman_get_node_addrs->num_addrs;
+	errno = error = res_lib_cman_get_node_addrs->header.error;
+
+error_exit:
+
+	return (error?-1:0);
+}
+
 int cman_send_data(cman_handle_t handle, const void *message, int len, int flags, uint8_t port, int nodeid)
 {
 	int error;
diff --git a/cman/services/cman/services/cman.c b/cman/services/cman/services/cman.c
index 2b0bd73..c5e081b 100644
--- a/cman/services/cman/services/cman.c
+++ b/cman/services/cman/services/cman.c
@@ -14,6 +14,7 @@
 #include <stdio.h>
 #include <errno.h>
 #include <signal.h>
+#include <limits.h>
 #include <time.h>
 #include <unistd.h>
 #include <netinet/in.h>
@@ -33,6 +34,8 @@
 #define CMAN_MINOR_VERSION 3
 #define CMAN_PATCH_VERSION 0
 
+#define MAX_INTERFACES 4
+
 LOGSYS_DECLARE_SUBSYS ("CMAN", LOG_INFO);
 
 /* Messages we send on port 0 */
@@ -107,7 +110,7 @@ static void message_handler_req_lib_cman_is_listening (void *conn, void *msg);
 static void message_handler_req_lib_cman_sendmsg (void *conn, void *msg);
 static void message_handler_req_lib_cman_unbind (void *conn, void *msg);
 static void message_handler_req_lib_cman_bind (void *conn, void *msg);
-
+static void message_handler_req_lib_cman_get_node_addrs (void *conn, void *msg);
 
 /*
  * Library Handler Definition
@@ -132,12 +135,17 @@ static struct corosync_lib_handler cman_lib_service[] =
 		.response_id				= MESSAGE_RES_CMAN_BIND,
 		.flow_control				= COROSYNC_LIB_FLOW_CONTROL_NOT_REQUIRED
 	},
-
 	{ /* 3 */
 		.lib_handler_fn				= message_handler_req_lib_cman_unbind,
 		.response_size				= sizeof (mar_res_header_t),
 		.response_id				= MESSAGE_RES_CMAN_UNBIND,
 		.flow_control				= COROSYNC_LIB_FLOW_CONTROL_NOT_REQUIRED
+	},
+	{ /* 4 */
+		.lib_handler_fn				= message_handler_req_lib_cman_get_node_addrs,
+		.response_size				= sizeof (mar_res_header_t),
+		.response_id				= MESSAGE_RES_CMAN_GET_NODE_ADDRS,
+		.flow_control				= COROSYNC_LIB_FLOW_CONTROL_NOT_REQUIRED
 	}
 };
 
@@ -536,7 +544,7 @@ static void message_handler_req_lib_cman_sendmsg (void *conn, void *msg)
 static void message_handler_req_lib_cman_is_listening (void *conn, void *msg)
 {
 	struct req_lib_cman_is_listening *req_lib_cman_is_listening = (struct req_lib_cman_is_listening *)msg;
-	struct res_lib_cman_is_listening res_lib_cman_is_listening;;
+	struct res_lib_cman_is_listening res_lib_cman_is_listening;
 	int error = CS_OK;
 	struct cluster_node *node;
 
@@ -571,3 +579,35 @@ static void message_handler_req_lib_cman_is_listening (void *conn, void *msg)
 	corosync_api->ipc_conn_send_response(conn, &res_lib_cman_is_listening, sizeof(res_lib_cman_is_listening));
 }
 
+
+static void message_handler_req_lib_cman_get_node_addrs (void *conn, void *msg)
+{
+	struct totem_ip_address node_ifs[MAX_INTERFACES];
+	char buf[PIPE_BUF];
+	char **status;
+	unsigned int num_interfaces = 0;
+	int ret = 0;
+	int i;
+	struct req_lib_cman_get_node_addrs *req_lib_cman_get_node_addrs = (struct req_lib_cman_get_node_addrs *)msg;
+	struct res_lib_cman_get_node_addrs *res_lib_cman_get_node_addrs = (struct res_lib_cman_get_node_addrs *)buf;
+
+	if (req_lib_cman_get_node_addrs->nodeid == 0)
+		req_lib_cman_get_node_addrs->nodeid = our_node.nodeid;
+
+	corosync_api->totem_ifaces_get(req_lib_cman_get_node_addrs->nodeid, node_ifs, &status, &num_interfaces);
+
+	res_lib_cman_get_node_addrs->header.size = sizeof(struct res_lib_cman_get_node_addrs) + (num_interfaces * TOTEMIP_ADDRLEN);
+	res_lib_cman_get_node_addrs->header.id = MESSAGE_RES_CMAN_GET_NODE_ADDRS;
+	res_lib_cman_get_node_addrs->header.error = ret;
+	res_lib_cman_get_node_addrs->num_addrs = num_interfaces;
+	if (num_interfaces) {
+		res_lib_cman_get_node_addrs->family = node_ifs[0].family;
+		for (i = 0; i<num_interfaces; i++) {
+			memcpy(&res_lib_cman_get_node_addrs->addrs[i][0], node_ifs[i].addr, TOTEMIP_ADDRLEN);
+		}
+	}
+	else {
+		res_lib_cman_get_node_addrs->header.error = EINVAL;
+	}
+	corosync_api->ipc_conn_send_response(conn, res_lib_cman_get_node_addrs, res_lib_cman_get_node_addrs->header.size);
+}


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2009-01-12 11:47 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-01-12 11:47 cluster: master - cman: add cman_get_node_addrs to libcman Christine Caulfield

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).