This adds a per-interface config option to
adjust the TTL.
Signed-off-by: Angus Salkeld <[email protected]>
---
conf/corosync.conf.example | 1 +
conf/corosync.conf.example.udpu | 1 +
conf/lenses/corosync.aug | 1 +
conf/lenses/tests/test_corosync.aug | 2 ++
exec/totemconfig.c | 20 ++++++++++++++++++--
exec/totemudp.c | 15 ++++++++++-----
exec/totemudpu.c | 21 +++++++++++++++++++++
include/corosync/totem/totem.h | 1 +
man/corosync.conf.5 | 6 ++++++
9 files changed, 61 insertions(+), 7 deletions(-)
diff --git a/conf/corosync.conf.example b/conf/corosync.conf.example
index 3305366..9dfd873 100644
--- a/conf/corosync.conf.example
+++ b/conf/corosync.conf.example
@@ -10,6 +10,7 @@ totem {
bindnetaddr: 192.168.1.1
mcastaddr: 226.94.1.1
mcastport: 5405
+ ttl: 1
}
}
diff --git a/conf/corosync.conf.example.udpu b/conf/corosync.conf.example.udpu
index 8bfbc6e..45c24ca 100644
--- a/conf/corosync.conf.example.udpu
+++ b/conf/corosync.conf.example.udpu
@@ -56,6 +56,7 @@ totem {
ringnumber: 0
bindnetaddr: 10.16.35.0
mcastport: 5405
+ ttl: 1
}
transport: udpu
}
diff --git a/conf/lenses/corosync.aug b/conf/lenses/corosync.aug
index 46a474b..61ed46e 100644
--- a/conf/lenses/corosync.aug
+++ b/conf/lenses/corosync.aug
@@ -48,6 +48,7 @@ let interface =
let setting =
kv "ringnumber" Rx.integer
|kv "mcastport" Rx.integer
+ |kv "ttl" Rx.integer
|qstr /bindnetaddr|mcastaddr/
|member in
section "interface" setting
diff --git a/conf/lenses/tests/test_corosync.aug
b/conf/lenses/tests/test_corosync.aug
index b396fca..fe1cef0 100644
--- a/conf/lenses/tests/test_corosync.aug
+++ b/conf/lenses/tests/test_corosync.aug
@@ -18,6 +18,7 @@ totem {
bindnetaddr: 192.168.122.1
mcastaddr: 226.94.1.1
mcastport: 5405
+ ttl: 45
member {
memberaddr: 10.16.35.101
}
@@ -103,6 +104,7 @@ test Corosync.lns get conf =
{ "bindnetaddr" = "192.168.122.1" }
{ "mcastaddr" = "226.94.1.1" }
{ "mcastport" = "5405" }
+ { "ttl" = "45" }
{ "member"
{ "memberaddr" = "10.16.35.101" } }
{ "member"
diff --git a/exec/totemconfig.c b/exec/totemconfig.c
index 7a30afd..de1d1e4 100644
--- a/exec/totemconfig.c
+++ b/exec/totemconfig.c
@@ -370,8 +370,6 @@ printf ("couldn't find totem handle\n");
&totem_config->interfaces[ringnumber].mcast_addr,
"255.255.255.255", 0);
}
-
-
}
/*
@@ -389,6 +387,19 @@ printf ("couldn't find totem handle\n");
res = totemip_parse
(&totem_config->interfaces[ringnumber].bindnet, str,
totem_config->interfaces[ringnumber].mcast_addr.family);
}
+
+ /*
+ * Get the TTL
+ */
+ if (totem_config->interfaces[ringnumber].mcast_addr.family ==
AF_INET6) {
+ totem_config->interfaces[ringnumber].ttl = 255;
+ } else {
+ totem_config->interfaces[ringnumber].ttl = 1;
+ }
+ if (!objdb_get_string (objdb, object_interface_handle, "ttl",
&str)) {
+ totem_config->interfaces[ringnumber].ttl = atoi (str);
+ }
+
objdb->object_find_create (
object_interface_handle,
"member",
@@ -463,6 +474,11 @@ int totem_config_validate (
goto parse_error;
}
+ if (totem_config->interfaces[i].ttl > 255 ||
totem_config->interfaces[i].ttl < 1) {
+ error_reason = "Invalid TTL (should be 1..255)";
+ goto parse_error;
+ }
+
if (totem_config->interfaces[i].mcast_addr.family == AF_INET6 &&
totem_config->node_id == 0) {
diff --git a/exec/totemudp.c b/exec/totemudp.c
index 23d7efb..b96bdbd 100644
--- a/exec/totemudp.c
+++ b/exec/totemudp.c
@@ -1642,14 +1642,19 @@ static int totemudp_build_sockets_ip (
/*
* Set multicast packets TTL
*/
-
- if ( bindnet_address->family == AF_INET6 )
- {
- flag = 255;
+ flag = instance->totem_interface->ttl;
+ if (bindnet_address->family == AF_INET6) {
res = setsockopt (sockets->mcast_send, IPPROTO_IPV6,
IPV6_MULTICAST_HOPS,
&flag, sizeof (flag));
if (res == -1) {
- perror ("setp mcast hops");
+ perror ("set mcast v6 TTL");
+ return (-1);
+ }
+ } else {
+ res = setsockopt(sockets->mcast_send, IPPROTO_IP,
IP_MULTICAST_TTL,
+ &flag, sizeof(flag));
+ if (res == -1) {
+ perror ("set mcast v4 TTL");
return (-1);
}
}
diff --git a/exec/totemudpu.c b/exec/totemudpu.c
index dc30a12..dc74510 100644
--- a/exec/totemudpu.c
+++ b/exec/totemudpu.c
@@ -1316,6 +1316,7 @@ static int totemudpu_build_sockets_ip (
struct sockaddr_storage sockaddr;
int addrlen;
int res;
+ int flag;
/*
* Setup unicast socket
@@ -1337,6 +1338,26 @@ static int totemudpu_build_sockets_ip (
}
/*
+ * Set packets TTL
+ */
+ flag = instance->totem_interface->ttl;
+ if (bindnet_address->family == AF_INET6) {
+ res = setsockopt (instance->token_socket, IPPROTO_IPV6,
+ IPV6_UNICAST_HOPS, &flag, sizeof (flag));
+ if (res == -1) {
+ perror ("set udpu v6 TTL");
+ return (-1);
+ }
+ } else {
+ res = setsockopt(instance->token_socket, IPPROTO_IP, IP_TTL,
+ &flag, sizeof(flag));
+ if (res == -1) {
+ perror ("set udpu v4 TTL");
+ return (-1);
+ }
+ }
+
+ /*
* Bind to unicast socket used for token send/receives
* This has the side effect of binding to the correct interface
*/
diff --git a/include/corosync/totem/totem.h b/include/corosync/totem/totem.h
index b84d9ba..4e2e475 100644
--- a/include/corosync/totem/totem.h
+++ b/include/corosync/totem/totem.h
@@ -57,6 +57,7 @@ struct totem_interface {
struct totem_ip_address boundto;
struct totem_ip_address mcast_addr;
uint16_t ip_port;
+ uint16_t ttl;
int member_count;
struct totem_ip_address member_list[PROCESSOR_COUNT_MAX];
diff --git a/man/corosync.conf.5 b/man/corosync.conf.5
index 8fc3dc6..79fb5a2 100644
--- a/man/corosync.conf.5
+++ b/man/corosync.conf.5
@@ -128,6 +128,12 @@ If you have multiple clusters on the same network using
the same mcastaddr
please configure the mcastports with a gap.
.TP
+ttl
+This specifies the Time To Live (TTL). If you run your cluster on a routed
+network then the default of "1" will be too small. This option provides
+a way to increase this up to 255.
+
+.TP
member
This specifies a member on the interface and used with the udpu transport only.
Every node that should be a member of the membership should be specified as
--
1.7.3.1
_______________________________________________
Openais mailing list
[email protected]
https://lists.linux-foundation.org/mailman/listinfo/openais