10175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn/*
20175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn * Copyright (C) 2012-2014 The Android Open Source Project
30175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn *
40175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn * Licensed under the Apache License, Version 2.0 (the "License");
50175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn * you may not use this file except in compliance with the License.
60175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn * You may obtain a copy of the License at
70175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn *
80175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn *      http://www.apache.org/licenses/LICENSE-2.0
90175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn *
100175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn * Unless required by applicable law or agreed to in writing, software
110175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn * distributed under the License is distributed on an "AS IS" BASIS,
120175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn * See the License for the specific language governing permissions and
140175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn * limitations under the License.
150175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn */
160175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn
170175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn#ifndef _LOGD_LOG_BUFFER_ELEMENT_H__
180175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn#define _LOGD_LOG_BUFFER_ELEMENT_H__
190175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn
20f7c0f75275d0fde2d8b7614f1501f0ad0cd3a01cMark Salyzyn#include <stdatomic.h>
21ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn#include <stdlib.h>
2297c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn#include <sys/types.h>
2397c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn
24aeaaf81c2cc8366ac4f66eb3d2fc85f9b8194982Mark Salyzyn#include <log/log.h>
250175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn#include <sysutils/SocketClient.h>
260175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn
2721fb7e0b753b2251369bfaa1c6f6a09e58e64437Mark Salyzynclass LogBuffer;
2821fb7e0b753b2251369bfaa1c6f6a09e58e64437Mark Salyzyn
29501c373916e292764400dbae735f44b33378400fMark Salyzyn#define EXPIRE_HOUR_THRESHOLD 24  // Only expire chatty UID logs to preserve
30501c373916e292764400dbae735f44b33378400fMark Salyzyn                                  // non-chatty UIDs less than this age in hours
31501c373916e292764400dbae735f44b33378400fMark Salyzyn#define EXPIRE_THRESHOLD 10       // A smaller expire count is considered too
32501c373916e292764400dbae735f44b33378400fMark Salyzyn                                  // chatty for the temporal expire messages
33501c373916e292764400dbae735f44b33378400fMark Salyzyn#define EXPIRE_RATELIMIT 10  // maximum rate in seconds to report expiration
34833a9b1e38ce65f2cdf3ebd095aaa99a92eb9467Mark Salyzyn
3574e74f96a75209379facaf9d46f424c571b484a8Christopher Ferrisclass __attribute__((packed)) LogBufferElement {
36b6bee33182cedea49199eb2252b3f3b442899c6dMark Salyzyn    friend LogBuffer;
37b6bee33182cedea49199eb2252b3f3b442899c6dMark Salyzyn
3860636fa872382a8cde0440b72cdfc9032b5fa7d0Mark Salyzyn    // sized to match reality of incoming log packets
3960636fa872382a8cde0440b72cdfc9032b5fa7d0Mark Salyzyn    const uint32_t mUid;
4060636fa872382a8cde0440b72cdfc9032b5fa7d0Mark Salyzyn    const uint32_t mPid;
4160636fa872382a8cde0440b72cdfc9032b5fa7d0Mark Salyzyn    const uint32_t mTid;
4260636fa872382a8cde0440b72cdfc9032b5fa7d0Mark Salyzyn    log_time mRealTime;
43501c373916e292764400dbae735f44b33378400fMark Salyzyn    char* mMsg;
44ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn    union {
4574e74f96a75209379facaf9d46f424c571b484a8Christopher Ferris        const uint16_t mMsgLen;  // mDropped == false
4674e74f96a75209379facaf9d46f424c571b484a8Christopher Ferris        uint16_t mDroppedCount;  // mDropped == true
47ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn    };
4860636fa872382a8cde0440b72cdfc9032b5fa7d0Mark Salyzyn    const uint8_t mLogId;
4974e74f96a75209379facaf9d46f424c571b484a8Christopher Ferris    bool mDropped;
5060636fa872382a8cde0440b72cdfc9032b5fa7d0Mark Salyzyn
51f7c0f75275d0fde2d8b7614f1501f0ad0cd3a01cMark Salyzyn    static atomic_int_fast64_t sequence;
520175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn
5374e74f96a75209379facaf9d46f424c571b484a8Christopher Ferris    // assumption: mDropped == true
54501c373916e292764400dbae735f44b33378400fMark Salyzyn    size_t populateDroppedMessage(char*& buffer, LogBuffer* parent,
55b5b879678522882e6dbb02511379518d2b7b545dMark Salyzyn                                  bool lastSame);
56501c373916e292764400dbae735f44b33378400fMark Salyzyn
57501c373916e292764400dbae735f44b33378400fMark Salyzyn   public:
58501c373916e292764400dbae735f44b33378400fMark Salyzyn    LogBufferElement(log_id_t log_id, log_time realtime, uid_t uid, pid_t pid,
59501c373916e292764400dbae735f44b33378400fMark Salyzyn                     pid_t tid, const char* msg, unsigned short len);
60501c373916e292764400dbae735f44b33378400fMark Salyzyn    LogBufferElement(const LogBufferElement& elem);
6174e74f96a75209379facaf9d46f424c571b484a8Christopher Ferris    ~LogBufferElement();
620175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn
6360636fa872382a8cde0440b72cdfc9032b5fa7d0Mark Salyzyn    bool isBinary(void) const {
6460636fa872382a8cde0440b72cdfc9032b5fa7d0Mark Salyzyn        return (mLogId == LOG_ID_EVENTS) || (mLogId == LOG_ID_SECURITY);
6560636fa872382a8cde0440b72cdfc9032b5fa7d0Mark Salyzyn    }
6660636fa872382a8cde0440b72cdfc9032b5fa7d0Mark Salyzyn
67501c373916e292764400dbae735f44b33378400fMark Salyzyn    log_id_t getLogId() const {
68501c373916e292764400dbae735f44b33378400fMark Salyzyn        return static_cast<log_id_t>(mLogId);
69501c373916e292764400dbae735f44b33378400fMark Salyzyn    }
70501c373916e292764400dbae735f44b33378400fMark Salyzyn    uid_t getUid(void) const {
71501c373916e292764400dbae735f44b33378400fMark Salyzyn        return mUid;
72501c373916e292764400dbae735f44b33378400fMark Salyzyn    }
73501c373916e292764400dbae735f44b33378400fMark Salyzyn    pid_t getPid(void) const {
74501c373916e292764400dbae735f44b33378400fMark Salyzyn        return mPid;
75501c373916e292764400dbae735f44b33378400fMark Salyzyn    }
76501c373916e292764400dbae735f44b33378400fMark Salyzyn    pid_t getTid(void) const {
77501c373916e292764400dbae735f44b33378400fMark Salyzyn        return mTid;
78501c373916e292764400dbae735f44b33378400fMark Salyzyn    }
7974e74f96a75209379facaf9d46f424c571b484a8Christopher Ferris    uint32_t getTag() const;
80501c373916e292764400dbae735f44b33378400fMark Salyzyn    unsigned short getDropped(void) const {
8174e74f96a75209379facaf9d46f424c571b484a8Christopher Ferris        return mDropped ? mDroppedCount : 0;
82ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn    }
8374e74f96a75209379facaf9d46f424c571b484a8Christopher Ferris    unsigned short setDropped(unsigned short value);
84501c373916e292764400dbae735f44b33378400fMark Salyzyn    unsigned short getMsgLen() const {
8574e74f96a75209379facaf9d46f424c571b484a8Christopher Ferris        return mDropped ? 0 : mMsgLen;
86501c373916e292764400dbae735f44b33378400fMark Salyzyn    }
87501c373916e292764400dbae735f44b33378400fMark Salyzyn    const char* getMsg() const {
8874e74f96a75209379facaf9d46f424c571b484a8Christopher Ferris        return mDropped ? nullptr : mMsg;
89501c373916e292764400dbae735f44b33378400fMark Salyzyn    }
90501c373916e292764400dbae735f44b33378400fMark Salyzyn    log_time getRealTime(void) const {
91501c373916e292764400dbae735f44b33378400fMark Salyzyn        return mRealTime;
92501c373916e292764400dbae735f44b33378400fMark Salyzyn    }
930175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn
945a34d6ea43d28f3b5d27bf6dd5b9fa31ec033531Mark Salyzyn    static const log_time FLUSH_ERROR;
955a34d6ea43d28f3b5d27bf6dd5b9fa31ec033531Mark Salyzyn    log_time flushTo(SocketClient* writer, LogBuffer* parent, bool privileged,
96501c373916e292764400dbae735f44b33378400fMark Salyzyn                     bool lastSame);
970175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn};
980175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn
990175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn#endif
100