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 */