1 /*
2  * Copyright (c) 2015-2017 Red Hat, Inc.
3  *
4  * All rights reserved.
5  *
6  * Author: Jan Friesse (jfriesse@redhat.com)
7  *
8  * This software licensed under BSD license, the text of which follows:
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions are met:
12  *
13  * - Redistributions of source code must retain the above copyright notice,
14  *   this list of conditions and the following disclaimer.
15  * - Redistributions in binary form must reproduce the above copyright notice,
16  *   this list of conditions and the following disclaimer in the documentation
17  *   and/or other materials provided with the distribution.
18  * - Neither the name of the Red Hat, Inc. nor the names of its
19  *   contributors may be used to endorse or promote products derived from this
20  *   software without specific prior written permission.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
26  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
30  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
32  * THE POSSIBILITY OF SUCH DAMAGE.
33  */
34 
35 #ifndef _QDEVICE_NET_DISCONNECT_REASON_H_
36 #define _QDEVICE_NET_DISCONNECT_REASON_H_
37 
38 
39 #ifdef __cplusplus
40 extern "C" {
41 #endif
42 
43 enum qdevice_net_disconnect_reason {
44 	/* Undefined reason. If this error appears, it's error in source code */
45 	QDEVICE_NET_DISCONNECT_REASON_UNDEFINED,
46 
47 	/* Received known message, but it was not expected */
48 	QDEVICE_NET_DISCONNECT_REASON_UNEXPECTED_MSG,
49 	/* Received unknown message */
50 	QDEVICE_NET_DISCONNECT_REASON_UNSUPPORTED_MSG,
51 	/* TLS setting of server and client are incompatible */
52 	QDEVICE_NET_DISCONNECT_REASON_INCOMPATIBLE_TLS,
53 	/* MSG setting of server and client are incompatible */
54 	QDEVICE_NET_DISCONNECT_REASON_INCOMPATIBLE_MSG_SIZE,
55 	/* Message doesn't contain required option */
56 	QDEVICE_NET_DISCONNECT_REASON_REQUIRED_OPTION_MISSING,
57 
58 	/* Can't allocate send list item or message is too long to fit into send buffer */
59 	QDEVICE_NET_DISCONNECT_REASON_CANT_ALLOCATE_MSG_BUFFER,
60 	/* Impossible to create or update heartbeat sending timer */
61 	QDEVICE_NET_DISCONNECT_REASON_CANT_SCHEDULE_HB_TIMER,
62 	/* Impossible to create or update votequorum poll timer */
63 	QDEVICE_NET_DISCONNECT_REASON_CANT_SCHEDULE_VOTING_TIMER,
64 	/* Impossible to create or update regular heuristics timer */
65 	QDEVICE_NET_DISCONNECT_REASON_CANT_SCHEDULE_HEURISTICS_TIMER,
66 	/* Impossible to exec heuristics */
67 	QDEVICE_NET_DISCONNECT_REASON_CANT_START_HEURISTICS,
68 	/* Impossible to activate/deactive heuristics result notifier */
69 	QDEVICE_NET_DISCONNECT_REASON_CANT_ACTIVATE_HEURISTICS_RESULT_NOTIFIER,
70 	/* Impossible to register votequorum callback */
71 	QDEVICE_NET_DISCONNECT_REASON_CANT_REGISTER_VOTEQUORUM_CALLBACK,
72 	/* Impossible to register cmap callback */
73 	QDEVICE_NET_DISCONNECT_REASON_CANT_REGISTER_CMAP_CALLBACK,
74 	/* Impossible to start TLS session */
75 	QDEVICE_NET_DISCONNECT_REASON_CANT_START_TLS,
76 
77 	/* Received message with error field set to non TLV_REPLY_ERROR_CODE_NO_ERROR value */
78 	QDEVICE_NET_DISCONNECT_REASON_SERVER_SENT_ERROR,
79 	/* Received message with error field set to TLV_REPLY_ERROR_CODE_DUPLICATE_NODE_ID value */
80 	QDEVICE_NET_DISCONNECT_REASON_SERVER_SENT_DUPLICATE_NODE_ID_ERROR,
81 	/* Received message with error field set to TLV_REPLY_ERROR_CODE_TIE_BREAKER_DIFFERS_FROM_OTHER_NODES value */
82 	QDEVICE_NET_DISCONNECT_REASON_SERVER_SENT_TIE_BREAKER_DIFFERS_FROM_OTHER_NODES_ERROR,
83 	/* Received message with error field set to TLV_REPLY_ERROR_CODE_ALGORITHM_DIFFERS_FROM_OTHER_NODES value */
84 	QDEVICE_NET_DISCONNECT_REASON_SERVER_SENT_ALGORITHM_DIFFERS_FROM_OTHER_NODES_ERROR,
85 
86 	/* Server doesn't support client selected decision algorithm */
87 	QDEVICE_NET_DISCONNECT_REASON_SERVER_DOESNT_SUPPORT_REQUIRED_ALGORITHM,
88 	/* Server doesn't support client required option */
89 	QDEVICE_NET_DISCONNECT_REASON_SERVER_DOESNT_SUPPORT_REQUIRED_OPT,
90 
91 	/* Can't decode message sent by server */
92 	QDEVICE_NET_DISCONNECT_REASON_MSG_DECODE_ERROR,
93 	/* Server closed connection */
94 	QDEVICE_NET_DISCONNECT_REASON_SERVER_CLOSED_CONNECTION,
95 	/* Can't read or store message received from server */
96 	QDEVICE_NET_DISCONNECT_REASON_CANT_READ_MESSAGE,
97 	/* Can't send message to server */
98 	QDEVICE_NET_DISCONNECT_REASON_CANT_SEND_MESSAGE,
99 
100 	/* Can't dispatch cmap or votequroum. This cannot be overwritten and always means end of qdevice-net */
101 	QDEVICE_NET_DISCONNECT_REASON_COROSYNC_CONNECTION_CLOSED,
102 
103 	/* Local socket closed is reasult of sigint */
104 	QDEVICE_NET_DISCONNECT_REASON_LOCAL_SOCKET_CLOSED,
105 
106 	/* It was not possible to establish connection with qnetd */
107 	QDEVICE_NET_DISCONNECT_REASON_CANT_CONNECT_TO_THE_SERVER,
108 
109 	QDEVICE_NET_DISCONNECT_REASON_ALGO_CONNECTED_ERR,
110 	QDEVICE_NET_DISCONNECT_REASON_ALGO_CONFIG_NODE_LIST_CHANGED_ERR,
111 	QDEVICE_NET_DISCONNECT_REASON_ALGO_VOTEQUORUM_QUORUM_NOTIFY_ERR,
112 	QDEVICE_NET_DISCONNECT_REASON_ALGO_VOTEQUORUM_NODE_LIST_NOTIFY_ERR,
113 	QDEVICE_NET_DISCONNECT_REASON_ALGO_VOTEQUORUM_NODE_LIST_HEURISTICS_NOTIFY_ERR,
114 	QDEVICE_NET_DISCONNECT_REASON_ALGO_VOTEQUORUM_EXPECTED_VOTES_NOTIFY_ERR,
115 	QDEVICE_NET_DISCONNECT_REASON_ALGO_NODE_LIST_REPLY_ERR,
116 	QDEVICE_NET_DISCONNECT_REASON_ALGO_ASK_FOR_VOTE_REPLY_ERR,
117 	QDEVICE_NET_DISCONNECT_REASON_ALGO_VOTE_INFO_ERR,
118 	QDEVICE_NET_DISCONNECT_REASON_ALGO_ECHO_REPLY_RECEIVED_ERR,
119 	QDEVICE_NET_DISCONNECT_REASON_ALGO_ECHO_REPLY_NOT_RECEIVED_ERR,
120 	QDEVICE_NET_DISCONNECT_REASON_ALGO_HEURISTICS_CHANGE_ERR,
121 	QDEVICE_NET_DISCONNECT_REASON_ALGO_HEURISTICS_CHANGE_REPLY_ERR,
122 
123 	QDEVICE_NET_DISCONNECT_REASON_HEURISTICS_WORKER_CLOSED,
124 	QDEVICE_NET_DISCONNECT_REASON_HEURISTICS_CANT_SEND_RECEIVE_MSG,
125 };
126 
127 #define qdevice_net_disconnect_reason_try_reconnect(reason) (						\
128     reason == QDEVICE_NET_DISCONNECT_REASON_MSG_DECODE_ERROR ||						\
129     reason == QDEVICE_NET_DISCONNECT_REASON_SERVER_CLOSED_CONNECTION ||					\
130     reason == QDEVICE_NET_DISCONNECT_REASON_CANT_READ_MESSAGE ||					\
131     reason == QDEVICE_NET_DISCONNECT_REASON_CANT_SEND_MESSAGE ||					\
132     reason == QDEVICE_NET_DISCONNECT_REASON_CANT_CONNECT_TO_THE_SERVER ||				\
133     reason == QDEVICE_NET_DISCONNECT_REASON_ALGO_ECHO_REPLY_NOT_RECEIVED_ERR ||				\
134     reason == QDEVICE_NET_DISCONNECT_REASON_SERVER_SENT_DUPLICATE_NODE_ID_ERROR ||			\
135     reason == QDEVICE_NET_DISCONNECT_REASON_SERVER_SENT_TIE_BREAKER_DIFFERS_FROM_OTHER_NODES_ERROR ||	\
136     reason == QDEVICE_NET_DISCONNECT_REASON_SERVER_SENT_ALGORITHM_DIFFERS_FROM_OTHER_NODES_ERROR)
137 
138 
139 #define qdevice_net_disconnect_reason_force_disconnect(reason)	(			\
140     reason == QDEVICE_NET_DISCONNECT_REASON_COROSYNC_CONNECTION_CLOSED ||		\
141     reason == QDEVICE_NET_DISCONNECT_REASON_LOCAL_SOCKET_CLOSED ||			\
142     reason == QDEVICE_NET_DISCONNECT_REASON_CANT_SCHEDULE_VOTING_TIMER ||		\
143     reason == QDEVICE_NET_DISCONNECT_REASON_CANT_REGISTER_VOTEQUORUM_CALLBACK ||	\
144     reason == QDEVICE_NET_DISCONNECT_REASON_CANT_REGISTER_CMAP_CALLBACK ||		\
145     reason == QDEVICE_NET_DISCONNECT_REASON_HEURISTICS_WORKER_CLOSED ||			\
146     reason == QDEVICE_NET_DISCONNECT_REASON_HEURISTICS_CANT_SEND_RECEIVE_MSG)
147 
148 #ifdef __cplusplus
149 }
150 #endif
151 
152 #endif /* _QDEVICE_NET_DISCONNECT_REASON_H_ */
153