Jelajahi Sumber

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 11 tahun lalu
induk
melakukan
6449bea835
2 mengubah file dengan 22 tambahan dan 1 penghapusan
  1. 18 1
      exec/totemconfig.c
  2. 4 0
      man/corosync.conf.5

+ 18 - 1
exec/totemconfig.c

@@ -1022,8 +1022,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";
@@ -1083,6 +1084,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

@@ -213,6 +213,10 @@ be chosen.
 The maximum number of interface directives that is allowed for either 
 The maximum number of interface directives that is allowed for either 
 modes (active or passive) is 2.
 modes (active or passive) is 2.
 
 
+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