X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fcommon%2Fsessiond-comm%2Frelayd.h;h=36a91070cbfd0cf6a587d238f6712912b9b78de0;hb=4878de5c7deb512bbdac4fdfc498907efa06fb7c;hp=492f3efae5ee722cc17bb3fb649028c1af06e136;hpb=8614e600d7a8dc653c473254fc302870d73f32ae;p=lttng-tools.git diff --git a/src/common/sessiond-comm/relayd.h b/src/common/sessiond-comm/relayd.h index 492f3efae..36a91070c 100644 --- a/src/common/sessiond-comm/relayd.h +++ b/src/common/sessiond-comm/relayd.h @@ -1,19 +1,9 @@ /* - * Copyright (C) 2012 - David Goulet - * Julien Desfossez + * Copyright (C) 2012 David Goulet + * Copyright (C) 2012 Julien Desfossez * - * 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 _RELAYD_COMM @@ -214,7 +204,7 @@ struct lttcomm_relayd_create_session_2_11 { /* Sessiond instance UUID */ lttng_uuid sessiond_uuid; /* Sessiond session id */ - uint64_t session_id; + uint64_t session_id; /* Session creation time, in seconds since UNIX Epoch. */ uint64_t creation_time; LTTNG_OPTIONAL_COMM(uint64_t) LTTNG_PACKED current_chunk_id; @@ -249,17 +239,70 @@ struct lttcomm_relayd_stream_rotation_position { uint64_t rotate_at_seq_num; } LTTNG_PACKED; +/* + * For certain releases, the LTTNG_PACKED annotation was missing on the + * `new_chunk_id` field which causes padding to be added between the + * "optional" structure's `is_set` and `value` fields. + * + * Three alignment cases are handled: + * - `value` is aligned to the next byte boundary after `is_set` + * no padding is produced, see + * `struct lttcomm_relayd_rotate_streams_packed`, + * - `value` is aligned to the next 4-byte boundary after `is_set` + * (e.g. x86), 3 bytes of padding are produced, see + * `struct lttcomm_relayd_rotate_streams_3_bytes_padding`, + * - `value` is aligned to the next 8-byte boundary after `is_set` + * (e.g. x86-64), 7 bytes of padding are produced, see + * `struct lttcomm_relayd_rotate_streams_7_bytes_padding`. + * + * Note that since this structure's advertised size is used to determine + * the size of the padding it includes, it can't be extended with new + * optional fields. A new command would be needed. + */ struct lttcomm_relayd_rotate_streams { uint32_t stream_count; /* * Streams can be rotated outside of a chunk but not be parented to * a new chunk. + * + * Improperly packed, but left as-is for backwards compatibility + * with unpatched relay daemons. */ LTTNG_OPTIONAL_COMM(uint64_t) new_chunk_id; /* `stream_count` positions follow. */ struct lttcomm_relayd_stream_rotation_position rotation_positions[]; } LTTNG_PACKED; +struct lttcomm_relayd_rotate_streams_packed { + uint32_t stream_count; + LTTNG_OPTIONAL_COMM(uint64_t) LTTNG_PACKED new_chunk_id; + struct lttcomm_relayd_stream_rotation_position rotation_positions[]; +} LTTNG_PACKED; + +struct lttcomm_relayd_rotate_streams_3_bytes_padding { + uint32_t stream_count; + struct { + union { + uint8_t is_set; + uint32_t padding; + }; + uint64_t value; + } LTTNG_PACKED new_chunk_id; + struct lttcomm_relayd_stream_rotation_position rotation_positions[]; +} LTTNG_PACKED; + +struct lttcomm_relayd_rotate_streams_7_bytes_padding { + uint32_t stream_count; + struct { + union { + uint8_t is_set; + uint64_t padding; + }; + uint64_t value; + } LTTNG_PACKED new_chunk_id; + struct lttcomm_relayd_stream_rotation_position rotation_positions[]; +} LTTNG_PACKED; + struct lttcomm_relayd_create_trace_chunk { uint64_t chunk_id; /* Seconds since EPOCH. */