Просмотр исходного кода

Add cluster_name option

Option is used for automatic generating of multicast address. If both
cluster_name and mcastaddr options are specified, mcastaddr takes
precedence.

Signed-off-by: Jan Friesse <jfriesse@redhat.com>
Reviewed-by: Steven Dake <sdake@redhat.com>
Jan Friesse 14 лет назад
Родитель
Сommit
07e58e111a
2 измененных файлов с 71 добавлено и 0 удалено
  1. 63 0
      exec/totemconfig.c
  2. 8 0
      man/corosync.conf.5

+ 63 - 0
exec/totemconfig.c

@@ -158,6 +158,55 @@ static void totem_get_crypto_type(struct totem_config *totem_config)
 	}
 	}
 }
 }
 
 
+static uint16_t generate_cluster_id (const char *cluster_name)
+{
+	int i;
+	int value = 0;
+
+	for (i = 0; i < strlen(cluster_name); i++) {
+		value <<= 1;
+		value += cluster_name[i];
+	}
+
+	return (value & 0xFFFF);
+}
+
+static int get_cluster_mcast_addr (
+		const char *cluster_name,
+		const struct totem_ip_address *bindnet,
+		unsigned int ringnumber,
+		struct totem_ip_address *res)
+{
+	uint16_t clusterid;
+	char addr[INET6_ADDRSTRLEN + 1];
+	int err;
+
+	if (cluster_name == NULL) {
+		return (-1);
+	}
+
+	clusterid = generate_cluster_id(cluster_name) + ringnumber;
+	memset (res, 0, sizeof(res));
+
+	switch (bindnet->family) {
+	case AF_INET:
+		snprintf(addr, sizeof(addr), "239.192.%d.%d", clusterid >> 8, clusterid % 0xFF);
+		break;
+	case AF_INET6:
+		snprintf(addr, sizeof(addr), "ff15::%x", clusterid);
+		break;
+	default:
+		/*
+		 * Unknown family
+		 */
+		return (-1);
+	}
+
+	err = totemip_parse (res, addr, 0);
+
+	return (err);
+}
+
 extern int totem_config_read (
 extern int totem_config_read (
 	struct totem_config *totem_config,
 	struct totem_config *totem_config,
 	const char **error_string)
 	const char **error_string)
@@ -172,6 +221,7 @@ extern int totem_config_read (
 	char ringnumber_key[ICMAP_KEYNAME_MAXLEN];
 	char ringnumber_key[ICMAP_KEYNAME_MAXLEN];
 	char tmp_key[ICMAP_KEYNAME_MAXLEN];
 	char tmp_key[ICMAP_KEYNAME_MAXLEN];
 	uint8_t u8;
 	uint8_t u8;
+	char *cluster_name = NULL;
 
 
 	memset (totem_config, 0, sizeof (struct totem_config));
 	memset (totem_config, 0, sizeof (struct totem_config));
 	totem_config->interfaces = malloc (sizeof (struct totem_interface) * INTERFACE_MAX);
 	totem_config->interfaces = malloc (sizeof (struct totem_interface) * INTERFACE_MAX);
@@ -225,6 +275,8 @@ extern int totem_config_read (
 
 
 	icmap_get_uint32("totem.netmtu", &totem_config->net_mtu);
 	icmap_get_uint32("totem.netmtu", &totem_config->net_mtu);
 
 
+	icmap_get_string("totem.cluster_name", &cluster_name);
+
 	/*
 	/*
 	 * Get things that might change in the future
 	 * Get things that might change in the future
 	 */
 	 */
@@ -261,6 +313,15 @@ extern int totem_config_read (
 		if (icmap_get_string(tmp_key, &str) == CS_OK) {
 		if (icmap_get_string(tmp_key, &str) == CS_OK) {
 			res = totemip_parse (&totem_config->interfaces[ringnumber].mcast_addr, str, 0);
 			res = totemip_parse (&totem_config->interfaces[ringnumber].mcast_addr, str, 0);
 			free(str);
 			free(str);
+		} else {
+			/*
+			 * User not specified address -> autogenerate one from cluster_name key
+			 * (if available)
+			 */
+			res = get_cluster_mcast_addr (cluster_name,
+					&totem_config->interfaces[ringnumber].bindnet,
+					ringnumber,
+					&totem_config->interfaces[ringnumber].mcast_addr);
 		}
 		}
 
 
 		totem_config->broadcast_use = 0;
 		totem_config->broadcast_use = 0;
@@ -319,6 +380,8 @@ extern int totem_config_read (
 		free(str);
 		free(str);
 	}
 	}
 
 
+	free(cluster_name);
+
 	add_totem_config_notification(totem_config);
 	add_totem_config_notification(totem_config);
 
 
 	return 0;
 	return 0;

+ 8 - 0
man/corosync.conf.5

@@ -117,6 +117,9 @@ multicast address.
 This may also be an IPV6 multicast address, in which case IPV6 networking
 This may also be an IPV6 multicast address, in which case IPV6 networking
 will be used.  If IPv6 networking is used, the nodeid field must be specified.
 will be used.  If IPv6 networking is used, the nodeid field must be specified.
 
 
+It's not needed to use this option if cluster_name option is used. If both options
+are used, mcastaddr has higher priority.
+
 .TP
 .TP
 mcastport
 mcastport
 This specifies the UDP port number.  It is possible to use the same multicast
 This specifies the UDP port number.  It is possible to use the same multicast
@@ -269,6 +272,11 @@ deployment.
 
 
 The default is udp.  The transport type can also be set to udpu or iba.
 The default is udp.  The transport type can also be set to udpu or iba.
 
 
+.TP
+cluster_name
+This specifies the name of cluster and it's used for automatic generating
+of multicast address.
+
 Within the
 Within the
 .B totem
 .B totem
 directive, there are several configuration options which are used to control
 directive, there are several configuration options which are used to control