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@xxxxxxxxxx> --- exec/totemconfig.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++ man/corosync.conf.5 | 8 ++++++ 2 files changed, 71 insertions(+), 0 deletions(-) diff --git a/exec/totemconfig.c b/exec/totemconfig.c index 3a043c5..1f76413 100644 --- a/exec/totemconfig.c +++ b/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 ( struct totem_config *totem_config, const char **error_string) @@ -172,6 +221,7 @@ extern int totem_config_read ( char ringnumber_key[ICMAP_KEYNAME_MAXLEN]; char tmp_key[ICMAP_KEYNAME_MAXLEN]; uint8_t u8; + char *cluster_name = NULL; memset (totem_config, 0, sizeof (struct totem_config)); 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_string("totem.cluster_name", &cluster_name); + /* * 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) { res = totemip_parse (&totem_config->interfaces[ringnumber].mcast_addr, str, 0); 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; @@ -319,6 +380,8 @@ extern int totem_config_read ( free(str); } + free(cluster_name); + add_totem_config_notification(totem_config); return 0; diff --git a/man/corosync.conf.5 b/man/corosync.conf.5 index ec50c9b..c7c87bf 100644 --- a/man/corosync.conf.5 +++ b/man/corosync.conf.5 @@ -117,6 +117,9 @@ multicast address. 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. +It's not needed to use this option if cluster_name option is used. If both options +are used, mcastaddr has higher priority. + .TP mcastport 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. +.TP +cluster_name +This specifies the name of cluster and it's used for automatic generating +of multicast address. + Within the .B totem directive, there are several configuration options which are used to control -- 1.7.1 _______________________________________________ discuss mailing list discuss@xxxxxxxxxxxx http://lists.corosync.org/mailman/listinfo/discuss