瀏覽代碼

qdevice: Fix set option and set option reply

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>
Jan Friesse 5 年之前
父節點
當前提交
71329dbceb

+ 6 - 4
qdevices/msg.c

@@ -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));

+ 3 - 2
qdevices/msg.h

@@ -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);

+ 4 - 8
qdevices/qdevice-net-msg-received.c

@@ -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);

+ 33 - 1
qdevices/qdevice-net-send.c

@@ -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);
+}

+ 4 - 1
qdevices/qdevice-net-send.h

@@ -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

+ 1 - 1
qdevices/qnetd-client-msg-received.c

@@ -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.");