blob: 005728d0ff7b89411833b2f98c0d70df49d746d7 [file] [log] [blame]
/*
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
** http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
**
** Copyright 2022-2023 NXP
**
*/
#include "phNxpEventLogger.h"
#include <errno.h>
#include <phNxpConfig.h>
#include <phNxpLog.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <unistd.h>
#include <fstream>
#include <iomanip>
#define TIMESTAMP_BUFFER_SIZE 64
PhNxpEventLogger::PhNxpEventLogger() { logging_enabled_ = false; }
PhNxpEventLogger& PhNxpEventLogger::GetInstance() {
static PhNxpEventLogger nxp_event_logger_;
return nxp_event_logger_;
}
// Helper function to get current timestamp of the
// device in [MM:DD HH:MIN:SEC:MSEC] format
static void GetCurrentTimestamp(char* timestamp) {
struct timespec tv;
clock_gettime(CLOCK_REALTIME, &tv);
time_t rawtime = tv.tv_sec;
struct tm* timeinfo;
char buffer[TIMESTAMP_BUFFER_SIZE];
timeinfo = localtime(&rawtime);
// Need to calculate millisec separately as timeinfo doesn't
// have milliseconds field
int milliseconds = tv.tv_nsec / 1000000;
strftime(buffer, sizeof(buffer), "%m-%d %H:%M:%S", timeinfo);
sprintf(timestamp, "[%s.%03d]:", buffer, milliseconds);
}
void PhNxpEventLogger::Initialize() {
NXPLOG_NCIHAL_D("EventLogger: init");
dpd_logFile_.open(kDPDEventFilePath, std::ofstream::out |
std::ofstream::binary |
std::ofstream::app);
if (dpd_logFile_.fail()) {
NXPLOG_NCIHAL_D("EventLogger: Log file %s couldn't be opened! %d",
kDPDEventFilePath, errno);
} else {
mode_t permissions = 0744; // rwxr--r--
if (chmod(kDPDEventFilePath, permissions) == -1) {
NXPLOG_NCIHAL_D("EventLogger: chmod failed on %s errno: %d",
kDPDEventFilePath, errno);
}
}
unsigned long value = 0;
if (GetNxpNumValue(NAME_NXP_SMBLOG_ENABLED, &value, sizeof(value))) {
logging_enabled_ = (value == 1) ? true : false;
}
if (!logging_enabled_) return;
smb_logFile_.open(kSMBLogFilePath, std::ofstream::out |
std::ofstream::binary |
std::ofstream::app);
if (smb_logFile_.fail()) {
NXPLOG_NCIHAL_D("EventLogger: Log file %s couldn't be opened! errno: %d",
kSMBLogFilePath, errno);
}
}
void PhNxpEventLogger::Log(uint8_t* p_ntf, uint16_t p_len, LogEventType event) {
NXPLOG_NCIHAL_D("EventLogger: event is %d", event);
switch (event) {
case LogEventType::kLogSMBEvent:
if (!logging_enabled_) return;
if (smb_logFile_.is_open()) {
while (p_len) {
smb_logFile_ << std::setfill('0') << std::hex << std::uppercase
<< std::setw(2) << (0xFF & *p_ntf);
++p_ntf;
--p_len;
}
smb_logFile_ << std::endl;
} else {
NXPLOG_NCIHAL_D("EventLogger: Log file %s is not opened",
kSMBLogFilePath);
}
break;
case LogEventType::kLogDPDEvent:
if (dpd_logFile_.is_open()) {
char timestamp[TIMESTAMP_BUFFER_SIZE];
memset(timestamp, 0, TIMESTAMP_BUFFER_SIZE);
GetCurrentTimestamp(timestamp);
dpd_logFile_ << timestamp;
while (p_len) {
dpd_logFile_ << std::setfill('0') << std::hex << std::uppercase
<< std::setw(2) << (0xFF & *p_ntf);
++p_ntf;
--p_len;
}
dpd_logFile_ << std::endl;
} else {
NXPLOG_NCIHAL_D("EventLogger: Log file %s is not opened",
kDPDEventFilePath);
}
break;
default:
NXPLOG_NCIHAL_D("EventLogger: Invalid destination");
}
}
void PhNxpEventLogger::Finalize() {
NXPLOG_NCIHAL_D("EventLogger: closing the Log file");
if (dpd_logFile_.is_open()) dpd_logFile_.close();
if (smb_logFile_.is_open()) smb_logFile_.close();
}