X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-relayd%2Fconnection.c;h=d657efb4f97eb5ec8fc75260505b6f40ae8f2eec;hp=e8c3d4bea5a50f2a28d69d88a94fb7b4744c168d;hb=3a5328d20432d9782b24ddeaaa093ac6219d6e29;hpb=ce4d40839ac3beef1a58730d3636a522497bc60f diff --git a/src/bin/lttng-relayd/connection.c b/src/bin/lttng-relayd/connection.c index e8c3d4bea..d657efb4f 100644 --- a/src/bin/lttng-relayd/connection.c +++ b/src/bin/lttng-relayd/connection.c @@ -1,20 +1,10 @@ /* - * Copyright (C) 2013 - Julien Desfossez - * David Goulet - * 2015 - Mathieu Desnoyers + * 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. */ #define _LGPL_SOURCE @@ -56,6 +46,45 @@ end: return conn; } +int connection_reset_protocol_state(struct relay_connection *connection) +{ + int ret = 0; + + switch (connection->type) { + case RELAY_DATA: + connection->protocol.data.state_id = + DATA_CONNECTION_STATE_RECEIVE_HEADER; + memset(&connection->protocol.data.state.receive_header, + 0, + sizeof(connection->protocol.data.state.receive_header)); + connection->protocol.data.state.receive_header.left_to_receive = + sizeof(struct lttcomm_relayd_data_hdr); + break; + case RELAY_CONTROL: + connection->protocol.ctrl.state_id = + CTRL_CONNECTION_STATE_RECEIVE_HEADER; + memset(&connection->protocol.ctrl.state.receive_header, + 0, + sizeof(connection->protocol.ctrl.state.receive_header)); + connection->protocol.data.state.receive_header.left_to_receive = + sizeof(struct lttcomm_relayd_hdr); + ret = lttng_dynamic_buffer_set_size( + &connection->protocol.ctrl.reception_buffer, + sizeof(struct lttcomm_relayd_hdr)); + if (ret) { + ERR("Failed to reinitialize control connection reception buffer size to %zu bytes.", sizeof(struct lttcomm_relayd_hdr)); + goto end; + } + break; + default: + goto end; + } + DBG("Reset communication state of relay connection (fd = %i)", + connection->sock->fd); +end: + return ret; +} + struct relay_connection *connection_create(struct lttcomm_sock *sock, enum connection_type type) { @@ -70,6 +99,10 @@ struct relay_connection *connection_create(struct lttcomm_sock *sock, conn->type = type; conn->sock = sock; lttng_ht_node_init_ulong(&conn->sock_n, (unsigned long) conn->sock->fd); + if (conn->type == RELAY_CONTROL) { + lttng_dynamic_buffer_init(&conn->protocol.ctrl.reception_buffer); + } + connection_reset_protocol_state(conn); end: return conn; } @@ -84,6 +117,10 @@ static void rcu_free_connection(struct rcu_head *head) viewer_session_destroy(conn->viewer_session); conn->viewer_session = NULL; } + if (conn->type == RELAY_CONTROL) { + lttng_dynamic_buffer_reset( + &conn->protocol.ctrl.reception_buffer); + } free(conn); } @@ -133,3 +170,27 @@ void connection_ht_add(struct lttng_ht *relay_connections_ht, conn->in_socket_ht = 1; conn->socket_ht = relay_connections_ht; } + +int connection_set_session(struct relay_connection *conn, + struct relay_session *session) +{ + int ret = 0; + + assert(conn); + assert(session); + assert(!conn->session); + + if (connection_get(conn)) { + if (session_get(session)) { + conn->session = session; + } else { + ERR("Failed to get session reference in connection_set_session()"); + ret = -1; + } + connection_put(conn); + } else { + ERR("Failed to get connection reference in connection_set_session()"); + ret = -1; + } + return ret; +}