X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-relayd%2Fconnection.h;h=98ca9159051652925d1176ff6c00525744e269c8;hp=fc4a59075f3dabd4a88eab06f8eef06b58af53d2;hb=86eff0042bf0b9e6277b281c4f3a680d997790d2;hpb=cd2ef1ef1d54ced9e4d0d03b865bb7fc6a905f80 diff --git a/src/bin/lttng-relayd/connection.h b/src/bin/lttng-relayd/connection.h index fc4a59075..98ca91590 100644 --- a/src/bin/lttng-relayd/connection.h +++ b/src/bin/lttng-relayd/connection.h @@ -1,79 +1,144 @@ +#ifndef _CONNECTION_H +#define _CONNECTION_H + /* - * Copyright (C) 2013 - Julien Desfossez - * David Goulet + * Copyright (C) 2013 Julien Desfossez + * Copyright (C) 2013 David Goulet + * Copyright (C) 2015 Mathieu Desnoyers * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License, version 2 only, as - * published by the Free Software Foundation. + * SPDX-License-Identifier: GPL-2.0-only * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., 51 - * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef _CONNECTION_H -#define _CONNECTION_H - #include #include #include #include -#include +#include #include #include #include +#include +#include #include "session.h" enum connection_type { + RELAY_CONNECTION_UNKNOWN = 0, RELAY_DATA = 1, RELAY_CONTROL = 2, RELAY_VIEWER_COMMAND = 3, RELAY_VIEWER_NOTIFICATION = 4, }; +enum data_connection_state { + DATA_CONNECTION_STATE_RECEIVE_HEADER = 0, + DATA_CONNECTION_STATE_RECEIVE_PAYLOAD = 1, +}; + +enum ctrl_connection_state { + CTRL_CONNECTION_STATE_RECEIVE_HEADER = 0, + CTRL_CONNECTION_STATE_RECEIVE_PAYLOAD = 1, +}; + +struct data_connection_state_receive_header { + uint64_t received, left_to_receive; + char header_reception_buffer[sizeof(struct lttcomm_relayd_data_hdr)]; +}; + +struct data_connection_state_receive_payload { + uint64_t received, left_to_receive; + struct lttcomm_relayd_data_hdr header; + bool rotate_index; +}; + +struct ctrl_connection_state_receive_header { + uint64_t received, left_to_receive; +}; + +struct ctrl_connection_state_receive_payload { + uint64_t received, left_to_receive; + struct lttcomm_relayd_hdr header; +}; + /* * Internal structure to map a socket with the corresponding session. * A hashtable indexed on the socket FD is used for the lookups. + * + * Connections are assumed to be accessed from a single thread. Live + * connections between the relay and a live client are only accessed + * from the live worker thread. + * + * The connections between the consumerd/sessiond and the relayd are only + * handled by the "main" worker thread (as in, the worker thread in main.c). + * + * This is why there are no back references to connections from the + * sessions and session list. */ struct relay_connection { struct lttcomm_sock *sock; + struct cds_wfcq_node qnode; + + enum connection_type type; + /* + * session is only ever set for RELAY_CONTROL connection type. + */ struct relay_session *session; + /* + * viewer_session is only ever set for RELAY_VIEWER_COMMAND + * connection type. + */ struct relay_viewer_session *viewer_session; - struct cds_wfq_node qnode; - struct lttng_ht_node_ulong sock_n; - struct rcu_head rcu_node; - enum connection_type type; - /* Protocol version to use for this connection. */ + + /* + * Protocol version to use for this connection. Only valid for + * RELAY_CONTROL connection type. + */ uint32_t major; uint32_t minor; - uint64_t session_id; + + struct urcu_ref ref; + + bool version_check_done; /* - * This contains streams that are received on that connection. It's used to - * store them until we get the streams sent command where they are removed - * and flagged ready for the viewer. This is ONLY used by the control - * thread thus any action on it should happen in that thread. + * Node member of connection within global socket hash table. */ - struct cds_list_head recv_head; - unsigned int version_check_done:1; + struct lttng_ht_node_ulong sock_n; + bool in_socket_ht; + struct lttng_ht *socket_ht; /* HACK: Contained within this hash table. */ + struct rcu_head rcu_node; /* For call_rcu teardown. */ - /* Pointer to the sessions HT that this connection can use. */ - struct lttng_ht *sessions_ht; + union { + struct { + enum data_connection_state state_id; + union { + struct data_connection_state_receive_header receive_header; + struct data_connection_state_receive_payload receive_payload; + } state; + } data; + struct { + enum ctrl_connection_state state_id; + union { + struct ctrl_connection_state_receive_header receive_header; + struct ctrl_connection_state_receive_payload receive_payload; + } state; + struct lttng_dynamic_buffer reception_buffer; + } ctrl; + } protocol; }; -struct relay_connection *connection_find_by_sock(struct lttng_ht *ht, +struct relay_connection *connection_create(struct lttcomm_sock *sock, + enum connection_type type); +struct relay_connection *connection_get_by_sock(struct lttng_ht *relay_connections_ht, int sock); -struct relay_connection *connection_create(void); -void connection_init(struct relay_connection *conn); -void connection_delete(struct lttng_ht *ht, struct relay_connection *conn); -void connection_destroy(struct relay_connection *conn); -void connection_free(struct relay_connection *conn); +int connection_reset_protocol_state(struct relay_connection *connection); +bool connection_get(struct relay_connection *connection); +void connection_put(struct relay_connection *connection); +void connection_ht_add(struct lttng_ht *relay_connections_ht, + struct relay_connection *conn); +int connection_set_session(struct relay_connection *conn, + struct relay_session *session); #endif /* _CONNECTION_H */