diff --git a/qdevices/msg.c b/qdevices/msg.c index 8f2b13b..4f53bc7 100644 --- a/qdevices/msg.c +++ b/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)); diff --git a/qdevices/msg.h b/qdevices/msg.h index bb2b390..cf9de8b 100644 --- a/qdevices/msg.h +++ b/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); diff --git a/qdevices/qdevice-net-msg-received.c b/qdevices/qdevice-net-msg-received.c index ce0ceaf..e856261 100644 --- a/qdevices/qdevice-net-msg-received.c +++ b/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); diff --git a/qdevices/qdevice-net-send.c b/qdevices/qdevice-net-send.c index 83d5c7b..d2cd076 100644 --- a/qdevices/qdevice-net-send.c +++ b/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); +} diff --git a/qdevices/qdevice-net-send.h b/qdevices/qdevice-net-send.h index 08763da..852da39 100644 --- a/qdevices/qdevice-net-send.h +++ b/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 diff --git a/qdevices/qnetd-client-msg-received.c b/qdevices/qnetd-client-msg-received.c index 04db240..380c115 100644 --- a/qdevices/qnetd-client-msg-received.c +++ b/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.");