1/*
2 * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
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
16#ifndef HILOG_CMD_H
17#define HILOG_CMD_H
18
19#include "hilog_common.h"
20#include "hilog/log.h"
21
22#define MSG_VER (0)
23#define MAX_DOMAINS (5)
24#define MAX_TAGS (10)
25#define MAX_PIDS (5)
26#define MAX_FILE_NAME_LEN (64)
27#define MAX_STREAM_NAME_LEN (16)
28#define MAX_PROC_NAME_LEN (32)
29
30constexpr int LevelBase = static_cast<int>(LOG_DEBUG);
31constexpr int LevelNum = static_cast<int>(LOG_LEVEL_MAX) - LevelBase;
32constexpr int TypeNum = static_cast<int>(LOG_TYPE_MAX);
33
34enum class IoctlCmd {
35    INVALID = -1,
36    OUTPUT_RQST = 1,
37    OUTPUT_RSP,
38    PERSIST_START_RQST,
39    PERSIST_START_RSP,
40    PERSIST_STOP_RQST,
41    PERSIST_STOP_RSP,
42    PERSIST_QUERY_RQST,
43    PERSIST_QUERY_RSP,
44    PERSIST_REFRESH_RQST,
45    PERSIST_REFRESH_RSP,
46    PERSIST_CLEAR_RQST,
47    PERSIST_CLEAR_RSP,
48    BUFFERSIZE_GET_RQST,
49    BUFFERSIZE_GET_RSP,
50    BUFFERSIZE_SET_RQST,
51    BUFFERSIZE_SET_RSP,
52    STATS_QUERY_RQST,
53    STATS_QUERY_RSP,
54    STATS_CLEAR_RQST,
55    STATS_CLEAR_RSP,
56    DOMAIN_FLOWCTRL_RQST,
57    DOMAIN_FLOWCTRL_RSP,
58    LOG_REMOVE_RQST,
59    LOG_REMOVE_RSP,
60    KMSG_ENABLE_RQST,
61    KMSG_ENABLE_RSP,
62    // Process error response with same logic
63    RSP_ERROR,
64    CMD_COUNT
65};
66
67struct MsgHeader {
68    uint8_t ver;
69    uint8_t cmd;
70    int16_t err;
71    uint16_t len;
72} __attribute__((__packed__));
73
74struct OutputRqst {
75    uint16_t headLines;
76    uint16_t types;
77    uint16_t levels;
78    bool blackDomain;
79    uint8_t domainCount;
80    uint32_t domains[MAX_DOMAINS];
81    bool blackTag;
82    uint8_t tagCount;
83    char tags[MAX_TAGS][MAX_TAG_LEN];
84    bool blackPid;
85    int pidCount;
86    uint32_t pids[MAX_PIDS];
87    char regex[MAX_REGEX_STR_LEN];
88    bool noBlock;
89    uint16_t tailLines;
90} __attribute__((__packed__));
91
92struct OutputRsp {
93    uint16_t len; /* data len, equals tagLen plus content length, include '\0' */
94    uint8_t level;
95    uint8_t type;
96    uint32_t pid;
97    uint32_t tid;
98    uint32_t domain;
99    uint32_t tv_sec;
100    uint32_t tv_nsec;
101    uint32_t mono_sec;
102    uint8_t tagLen;
103    bool end;
104    char data[]; /* tag and content, include '\0' */
105} __attribute__((__packed__));
106
107enum class FormatTime {
108    INVALID = 0,
109    TIME = 1,
110    EPOCH,
111    MONOTONIC,
112};
113
114enum class FormatTimeAccu {
115    INVALID = 0,
116    MSEC,
117    USEC,
118    NSEC,
119};
120
121struct PersistStartRqst {
122    OutputRqst outputFilter;
123    uint32_t jobId;
124    uint32_t fileSize;
125    uint16_t fileNum;
126    char fileName[MAX_FILE_NAME_LEN];
127    char stream[MAX_STREAM_NAME_LEN];
128} __attribute__((__packed__));
129
130struct PersistStartRsp {
131    uint32_t jobId;
132} __attribute__((__packed__));
133
134struct PersistStopRqst {
135    uint32_t jobId;
136} __attribute__((__packed__));
137
138struct PersistStopRsp {
139    uint8_t jobNum;
140    uint32_t jobId[MAX_JOBS];
141} __attribute__((__packed__));
142
143struct PersistQueryRqst {
144    char placeholder; // Query tasks needn't any parameter, this is just a placeholder
145} __attribute__((__packed__));
146
147using PersistTaskInfo = struct PersistStartRqst;
148struct PersistQueryRsp {
149    uint8_t jobNum;
150    PersistTaskInfo taskInfo[MAX_JOBS];
151} __attribute__((__packed__));
152
153struct PersistRefreshRqst {
154    uint32_t jobId;
155} __attribute__((__packed__));
156
157struct PersistRefreshRsp {
158    uint8_t jobNum;
159    uint32_t jobId[MAX_JOBS];
160} __attribute__((__packed__));
161
162struct PersistClearRqst {
163    char placeholder; // Clear tasks needn't any parameter, this is just a placeholder
164} __attribute__((__packed__));
165
166struct PersistClearRsp {
167    char placeholder;
168} __attribute__((__packed__));
169
170struct BufferSizeSetRqst {
171    uint16_t types;
172    int32_t size;
173} __attribute__((__packed__));
174
175struct BufferSizeSetRsp {
176    int32_t size[LOG_TYPE_MAX];
177} __attribute__((__packed__));
178
179struct BufferSizeGetRqst {
180    uint16_t types;
181} __attribute__((__packed__));
182
183struct BufferSizeGetRsp {
184    uint32_t size[LOG_TYPE_MAX];
185} __attribute__((__packed__));
186
187struct StatsQueryRqst {
188    uint16_t types;
189    uint8_t domainCount;
190    uint32_t domains[MAX_DOMAINS];
191} __attribute__((__packed__));
192
193struct StatsRsp {
194    uint32_t lines[LevelNum];
195    uint64_t len[LevelNum];
196    uint32_t dropped;
197    float freqMax; // lines per second, average value
198    uint32_t freqMaxSec;
199    uint32_t freqMaxNsec;
200    float throughputMax; // length per second, average value
201    uint32_t tpMaxSec;
202    uint32_t tpMaxNsec;
203} __attribute__((__packed__));
204
205struct TagStatsRsp {
206    char tag[MAX_TAG_LEN];
207    StatsRsp stats;
208} __attribute__((__packed__));
209
210struct DomainStatsRsp {
211    uint32_t domain;
212    StatsRsp stats;
213    uint16_t tagNum;
214    TagStatsRsp *tStats;
215} __attribute__((__packed__));
216
217struct LogTypeDomainStatsRsp {
218    uint16_t type;
219    uint16_t domainNum;
220    DomainStatsRsp *dStats;
221} __attribute__((__packed__));
222
223struct LogTypeStatsRsp {
224    uint16_t type;
225    StatsRsp stats;
226} __attribute__((__packed__));
227
228struct ProcStatsRsp {
229    uint32_t pid;
230    char name[MAX_PROC_NAME_LEN];
231    StatsRsp stats;
232    uint16_t typeNum;
233    uint16_t tagNum;
234    LogTypeStatsRsp *lStats;
235    TagStatsRsp *tStats;
236} __attribute__((__packed__));
237
238struct StatsQueryRsp {
239    uint32_t tsBeginSec;
240    uint32_t tsBeginNsec;
241    uint32_t durationSec;
242    uint32_t durationNsec;
243    uint32_t totalLines[LevelNum];
244    uint64_t totalLens[LevelNum];
245    uint16_t typeNum;
246    uint16_t procNum;
247    LogTypeDomainStatsRsp *ldStats;
248    ProcStatsRsp *pStats;
249} __attribute__((__packed__));
250
251struct StatsClearRqst {
252    char placeholder;
253} __attribute__((__packed__));
254
255struct StatsClearRsp {
256    char placeholder;
257} __attribute__((__packed__));
258
259struct DomainFlowCtrlRqst {
260    bool on;
261} __attribute__((__packed__));
262
263struct DomainFlowCtrlRsp {
264    char placeholder;
265} __attribute__((__packed__));
266
267struct LogRemoveRqst {
268    uint16_t types;
269} __attribute__((__packed__));
270
271struct LogRemoveRsp {
272    uint16_t types;
273} __attribute__((__packed__));
274
275struct KmsgEnableRqst {
276    bool on;
277} __attribute__((__packed__));
278
279struct KmsgEnableRsp {
280    char placeholder;
281} __attribute__((__packed__));
282#endif /* HILOG_CMD_H */