Explorar el Código

config: Ensure mcast address/port differs for rrp

When using multiple interfaces, it's necessary to use different
multicast address/port pair for each interface to make
rrp work correctly. This is now checked in parser.

Signed-off-by: Jan Friesse <jfriesse@redhat.com>
Reviewed-by: Christine Caulfield <ccaulfie@redhat.com>
Jan Friesse hace 11 años
padre
commit
6f74374d3f
Se han modificado 2 ficheros con 22 adiciones y 1 borrados
  1. 18 1
      exec/totemconfig.c
  2. 4 0
      man/corosync.conf.5

+ 18 - 1
exec/totemconfig.c

@@ -474,8 +474,9 @@ int totem_config_validate (
 	static char local_error_reason[512];
 	static char local_error_reason[512];
 	char parse_error[512];
 	char parse_error[512];
 	const char *error_reason = local_error_reason;
 	const char *error_reason = local_error_reason;
-	int i;
+	int i, j;
 	unsigned int interface_max = INTERFACE_MAX;
 	unsigned int interface_max = INTERFACE_MAX;
+	unsigned int port1, port2;
 
 
 	if (totem_config->interface_count == 0) {
 	if (totem_config->interface_count == 0) {
 		error_reason = "No interfaces defined";
 		error_reason = "No interfaces defined";
@@ -535,6 +536,22 @@ int totem_config_validate (
 			error_reason =  "Not all bind address belong to the same IP family";
 			error_reason =  "Not all bind address belong to the same IP family";
 			goto parse_error;
 			goto parse_error;
 		}
 		}
+
+		/*
+		 * Ensure mcast address/port differs
+		 */
+		if (totem_config->transport_number == TOTEM_TRANSPORT_UDP) {
+			for (j = i + 1; j < totem_config->interface_count; j++) {
+				port1 = totem_config->interfaces[i].ip_port;
+				port2 = totem_config->interfaces[j].ip_port;
+				if (totemip_equal(&totem_config->interfaces[i].mcast_addr,
+				    &totem_config->interfaces[j].mcast_addr) &&
+				    (((port1 > port2 ? port1 : port2)  - (port1 < port2 ? port1 : port2)) <= 1)) {
+					error_reason = "Interfaces multicast address/port pair must differ";
+					goto parse_error;
+				}
+			}
+		}
 	}
 	}
 
 
 	if (totem_config->version != 2) {
 	if (totem_config->version != 2) {

+ 4 - 0
man/corosync.conf.5

@@ -218,6 +218,10 @@ If only one interface directive is specified, none is automatically chosen.
 If multiple interface directives are specified, only active or passive may
 If multiple interface directives are specified, only active or passive may
 be chosen.
 be chosen.
 
 
+When using multiple interfaces, make sure to use different multicast
+address/port (port for same address must differ by at least two) pair
+for each interface (this is checked by parser) to make rrp works.
+
 .TP
 .TP
 netmtu
 netmtu
 This specifies the network maximum transmit unit.  To set this value beyond
 This specifies the network maximum transmit unit.  To set this value beyond