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).