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

Reply via email to