]> git.proxmox.com Git - mirror_corosync-qdevice.git/commitdiff
qdevice: Fix set option and set option reply
authorJan Friesse <jfriesse@redhat.com>
Mon, 26 Oct 2020 11:05:18 +0000 (12:05 +0100)
committerJan Friesse <jfriesse@redhat.com>
Tue, 27 Oct 2020 16:22:46 +0000 (17:22 +0100)
To match the specification add heartbeat timeout only when requested.

Also add qdevice client method to send option message.

Signed-off-by: Jan Friesse <jfriesse@redhat.com>
qdevices/msg.c
qdevices/msg.h
qdevices/qdevice-net-msg-received.c
qdevices/qdevice-net-send.c
qdevices/qdevice-net-send.h
qdevices/qnetd-client-msg-received.c

index 8f2b13b125ec6d249cd5da63768ca1f657d449b7..4f53bc71d769f25fd071128ef0aab02eed51324a 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015-2017 Red Hat, Inc.
+ * Copyright (c) 2015-2020 Red Hat, Inc.
  *
  * All rights reserved.
  *
@@ -450,7 +450,7 @@ small_buf_err:
 
 size_t
 msg_create_set_option_reply(struct dynar *msg, int add_msg_seq_number, uint32_t msg_seq_number,
-    uint32_t heartbeat_interval)
+    int add_heartbeat_interval, uint32_t heartbeat_interval)
 {
 
        dynar_clean(msg);
@@ -464,8 +464,10 @@ msg_create_set_option_reply(struct dynar *msg, int add_msg_seq_number, uint32_t
                }
        }
 
-       if (tlv_add_heartbeat_interval(msg, heartbeat_interval) == -1) {
-               goto small_buf_err;
+       if (add_heartbeat_interval) {
+               if (tlv_add_heartbeat_interval(msg, heartbeat_interval) == -1) {
+                       goto small_buf_err;
+               }
        }
 
        msg_set_len(msg, dynar_size(msg) - (MSG_TYPE_LENGTH + MSG_LENGTH_LENGTH));
index bb2b390ada769414b75c4be0879583038f8b5bfd..cf9de8bb456e8e369a43fd47a9ad79f2ddf27ae1 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015-2017 Red Hat, Inc.
+ * Copyright (c) 2015-2020 Red Hat, Inc.
  *
  * All rights reserved.
  *
@@ -149,7 +149,8 @@ extern size_t               msg_create_set_option(struct dynar *msg,
     int add_heartbeat_interval, uint32_t heartbeat_interval);
 
 extern size_t          msg_create_set_option_reply(struct dynar *msg,
-    int add_msg_seq_number, uint32_t msg_seq_number, uint32_t heartbeat_interval);
+    int add_msg_seq_number, uint32_t msg_seq_number,
+    int add_heartbeat_interval, uint32_t heartbeat_interval);
 
 extern size_t          msg_create_echo_request(struct dynar *msg, int add_msg_seq_number,
     uint32_t msg_seq_number);
index ce0ceafdc81673a796e7b40538c9a76746521071..e856261e79612e0a682ffa91d96984898bce09b2 100644 (file)
@@ -451,14 +451,10 @@ qdevice_net_msg_received_set_option_reply(struct qdevice_net_instance *instance,
                return (-1);
        }
 
-       if (qdevice_net_msg_check_seq_number(instance, msg) != 0) {
-               instance->disconnect_reason = QDEVICE_NET_DISCONNECT_REASON_REQUIRED_OPTION_MISSING;
-
-               return (-1);
-       }
-
-       if (qdevice_net_echo_request_timer_schedule(instance) != 0) {
-               return (-1);
+       if (msg->heartbeat_interval_set) {
+               if (qdevice_net_echo_request_timer_schedule(instance) != 0) {
+                       return (-1);
+               }
        }
 
        return (0);
index 83d5c7b9a6667304ef77ccde8a606efbcd4c9207..d2cd0764f4f93bb193409a20ed40f278300e3cd6 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015-2019 Red Hat, Inc.
+ * Copyright (c) 2015-2020 Red Hat, Inc.
  *
  * All rights reserved.
  *
@@ -352,3 +352,35 @@ qdevice_net_send_quorum_node_list(struct qdevice_net_instance *instance,
 
        return (0);
 }
+
+int
+qdevice_net_send_set_option(struct qdevice_net_instance *instance,
+    int add_heartbeat_interval, uint32_t heartbeat_interval)
+{
+       struct send_buffer_list_entry *send_buffer;
+
+       send_buffer = send_buffer_list_get_new(&instance->send_buffer_list);
+       if (send_buffer == NULL) {
+               log(LOG_ERR, "Can't allocate send list buffer for ask for vote msg");
+
+               return (-1);
+       }
+
+       instance->last_msg_seq_num++;
+
+       log(LOG_DEBUG, "Sending set option seq = "UTILS_PRI_MSG_SEQ ", "
+           "hb(%u) = %" PRIu32,
+           instance->last_msg_seq_num, add_heartbeat_interval, heartbeat_interval);
+
+       if (msg_create_set_option(&send_buffer->buffer, 1, instance->last_msg_seq_num,
+           add_heartbeat_interval, heartbeat_interval) == 0) {
+               log(LOG_ERR, "Can't allocate send buffer for set option msg");
+
+               send_buffer_list_discard_new(&instance->send_buffer_list, send_buffer);
+               return (-1);
+       }
+
+       send_buffer_list_put(&instance->send_buffer_list, send_buffer);
+
+       return (0);
+}
index 08763da4ce3f99b48782da2a67e7b808fb5bf917..852da3926deabb669568182653942b324ce93614 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015-2016 Red Hat, Inc.
+ * Copyright (c) 2015-2020 Red Hat, Inc.
  *
  * All rights reserved.
  *
@@ -66,6 +66,9 @@ extern int            qdevice_net_send_quorum_node_list(
     struct qdevice_net_instance *instance, enum tlv_quorate quorate,
     uint32_t node_list_entries, votequorum_node_t node_list[]);
 
+extern int             qdevice_net_send_set_option(struct qdevice_net_instance *instance,
+    int add_heartbeat_interval, uint32_t heartbeat_interval);
+
 #ifdef __cplusplus
 }
 #endif
index 04db240f39dfb72b06c3400051fa54a9bc5ba1af..380c115c48866f7c0bb862edd46cdb81617e2cd3 100644 (file)
@@ -580,7 +580,7 @@ qnetd_client_msg_received_set_option(struct qnetd_instance *instance, struct qne
        }
 
        if (msg_create_set_option_reply(&send_buffer->buffer, msg->seq_number_set, msg->seq_number,
-           client->heartbeat_interval) == 0) {
+           msg->heartbeat_interval_set, client->heartbeat_interval) == 0) {
                log(LOG_ERR, "Can't alloc set option reply msg. "
                    "Disconnecting client connection.");