1/*
2 * Copyright (c) Huawei Technologies Co., Ltd. 2023. All rights reserved.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15#ifndef PBREADER_FILE_HEADER_H
16#define PBREADER_FILE_HEADER_H
17namespace SysTuning {
18namespace TraceStreamer {
19struct ProfilerTraceFileHeader {
20    // Some space is reserved to facilitate the subsequent addition of fields in the header
21    static constexpr uint32_t HEADER_SIZE = 1024;
22    static constexpr uint32_t SHA256_SIZE = 256 / 8;
23    static constexpr uint64_t HEADER_MAGIC = 0x464F5250534F484FuLL;
24    static constexpr uint32_t V_MAJOR = 0x0001;
25    static constexpr uint32_t V_MAJOR_BITS = 16;
26    static constexpr uint32_t TRACE_VERSION = V_MAJOR << V_MAJOR_BITS;
27    static constexpr uint8_t PLUGIN_MODULE_NAME_MAX = 127;
28    static constexpr uint8_t PLUGIN_MODULE_VERSION_MAX = 7;
29    enum DataType {
30        HIPROFILER_PROTOBUF_BIN = 0,
31        HIPERF_DATA,
32        STANDALONE_DATA = 1000,
33        UNKNOW_TYPE = 1024,
34    };
35    struct HeaderData {
36        // Magic number, used to distinguish offline files
37        uint64_t magic = HEADER_MAGIC;
38        // Total length, which can be used to check whether the document is truncated;
39        uint64_t length = HEADER_SIZE;
40        uint32_t version = TRACE_VERSION;
41        // The number of segments in the load data. The number of segments is even. One describes the length L and the
42        // other describes the next data v
43        uint32_t segments = 0;
44        // Sha256 of load data is used to verify whether the load data is complete;
45        uint8_t sha256[SHA256_SIZE] = {};
46        uint32_t dataType = UNKNOW_TYPE;
47        // clock
48        uint64_t boottime = 0;
49        uint64_t realtime = 0;
50        uint64_t realtimeCoarse = 0;
51        uint64_t monotonic = 0;
52        uint64_t monotonicCoarse = 0;
53        uint64_t monotonicRaw = 0;
54        char standalonePluginName[PLUGIN_MODULE_NAME_MAX + 1] = "";
55        char pluginVersion[PLUGIN_MODULE_VERSION_MAX + 1] = "";
56        uint64_t durationNs = 0;
57    } __attribute__((packed));
58    HeaderData data = {};
59    uint8_t padding_[HEADER_SIZE - sizeof(data)] = {};
60};
61struct ProfilerPluginDataHeader {
62    std::string name = "";
63    uint32_t status;
64    int32_t clockId;
65    uint64_t tvSec;
66    uint64_t tvNsec;
67    std::string version = ""; // "1.01"
68    uint32_t sampleInterval;  // Polling plugin collection interval(ms)
69};
70const std::string EBPF_PLUGIN_NAME = "hiebpf-plugin";
71} // namespace TraceStreamer
72} // namespace SysTuning
73#endif // PBREADER_FILE_HEADER_H
74