X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=src%2Fbin%2Flttng-relayd%2Fconnection.h;h=d0edf82146ba4de10826443c4c4e46d0fd9e1799;hb=a8cad46163850205f0dc2607e361a63b4fab3f7a;hp=44386381325e531fb45ea45f233e6f7f3a2ef946;hpb=c1591e37fbac83d8d12519b3c15e9ba13934b25a;p=lttng-tools.git diff --git a/src/bin/lttng-relayd/connection.h b/src/bin/lttng-relayd/connection.h index 443863813..d0edf8214 100644 --- a/src/bin/lttng-relayd/connection.h +++ b/src/bin/lttng-relayd/connection.h @@ -29,6 +29,8 @@ #include #include +#include +#include #include "session.h" @@ -40,6 +42,36 @@ enum connection_type { 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. @@ -88,15 +120,36 @@ struct relay_connection { bool in_socket_ht; struct lttng_ht *socket_ht; /* HACK: Contained within this hash table. */ struct rcu_head rcu_node; /* For call_rcu teardown. */ + + 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_create(struct lttcomm_sock *sock, enum connection_type type); struct relay_connection *connection_get_by_sock(struct lttng_ht *relay_connections_ht, int sock); +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 */