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>
This commit is contained in:
Jan Friesse 2020-10-26 12:05:18 +01:00
parent a371519328
commit 71329dbceb
6 changed files with 51 additions and 17 deletions

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

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

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

View 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);
}

View 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

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