Files
android_kernel_samsung_sm86…/tools/linux/cfr_test_app.c
Vikram Kandukuri 0314441503 qca-wifi: Add CFR capture test application
Add CFR capture test application with streamfs APIs.
This is test application to read CFR dump from driver

Change-Id: I6925646678d1e87ecef2fb5405e992246a6d4eb4
CRs-Fixed: 2372061
2019-01-15 23:43:29 -08:00

175 lines
3.9 KiB
C

/*
* Copyright (c) 2019 The Linux Foundation. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
* above copyright notice and this permission notice appear in all
* copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
* WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
* AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
/**
* DOC: cfr capture test application
* This file provides test application to dump cfr capture from driver
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>
#include <stdint.h>
#include <sys/time.h>
#include <time.h>
#include <signal.h>
#define CFR_DUMP_STREAMFS_FILE "/sys/kernel/debug/%s/cfr_dump0"
#define CFR_DUMP_FILE "/tmp/cfr_dump_%s.bin"
#define MAX_CAPTURE_SIZE 2048
static char rbuffer[MAX_CAPTURE_SIZE];
int stop_capture;
void print_usage(char *argv[])
{
printf("Usage:cfr_test_app -i <interfacename>\n");
}
void streamfs_read_handler(int sfd, int cfd)
{
int rlen = 0;
memset(rbuffer, 0, sizeof(rbuffer));
rlen = read(sfd, rbuffer, sizeof(rbuffer));
if (rlen <= 0)
return;
write(cfd, rbuffer, rlen);
}
int start_cfr_capture_daemon(int streamfs_fd, int cfr_dump_fd)
{
fd_set sfs_fdset;
int maxfd = 0, retval = 0;
FD_ZERO(&sfs_fdset);
FD_SET(streamfs_fd, &sfs_fdset);
maxfd = streamfs_fd;
while (!stop_capture) {
retval = select(maxfd + 1, &sfs_fdset, NULL, NULL, NULL);
if (retval < 0) {
perror("select()");
exit(EXIT_FAILURE);
}
if (FD_ISSET(streamfs_fd, &sfs_fdset))
streamfs_read_handler(streamfs_fd, cfr_dump_fd);
}
close(streamfs_fd);
close(cfr_dump_fd);
return 0;
}
int open_streamfs_file(char *iface)
{
int fd = -1;
char filename[128];
snprintf(filename, sizeof(filename), CFR_DUMP_STREAMFS_FILE, iface);
fd = open(filename, O_RDONLY);
return fd;
}
int initialize_cfr_dump_file(char *iface)
{
int fd = -1;
static char filename[128];
char time[50] = {0};
struct timeval tv = {0};
time_t curtime = 0;
struct tm *tm_val = NULL;
gettimeofday(&tv, NULL);
curtime = tv.tv_sec;
tm_val = localtime(&curtime);
if (tm_val) {
strftime(time, 50, "%Y_%m_%d_%T", tm_val);
snprintf(filename, sizeof(filename), CFR_DUMP_FILE, time);
fd = open(filename, O_WRONLY | O_CREAT);
} else {
perror("Unable to get time value to generate filename \n");
}
return fd;
}
/* Signal Hnadler to overide CTRL+C */
void sig_handler(int signum)
{
stop_capture = 1;
}
int main(int argc, char *argv[])
{
int option = 0;
char *iface = NULL;
int streamfs_fd = -1, cfr_dump_fd = -1;
while ((option = getopt(argc, argv, "i:")) != -1) {
switch (option) {
case 'i':
iface = optarg;
break;
default:
printf("Invalid argument\n");
print_usage(argv);
exit(EXIT_FAILURE);
break;
}
}
if (iface == NULL) {
printf("Invalid interface option\n");
exit(EXIT_FAILURE);
}
streamfs_fd = open_streamfs_file(iface);
if (streamfs_fd < 0) {
printf("Invalid interface: %s, CFR capture file not found\n", iface);
exit(EXIT_FAILURE);
}
cfr_dump_fd = initialize_cfr_dump_file(iface);
if (cfr_dump_fd < 0) {
printf(" Could not open CFR dump file for write\n");
close(streamfs_fd);
exit(EXIT_FAILURE);
}
printf("Starting CFR capture deamon, Press CTRL+C to exit \n");
signal(SIGINT, sig_handler);
start_cfr_capture_daemon(streamfs_fd, cfr_dump_fd);
return 0;
}