summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorluwenpeng <[email protected]>2021-10-27 20:10:06 +0300
committerluwenpeng <[email protected]>2021-10-27 20:10:06 +0300
commitf934023b40e08be1c1ae315c67438dc5625a8edb (patch)
treea0f4693776a0ccca7063a3cb2766ea3cb29a3a4f
parentf567aa1d3dc2806ef55a10f9cda694fe6fdbd20f (diff)
TSG-8230 PacketAdapter支持输出json格式的日志,并支持动态调整日志级别
-rw-r--r--common/include/decode_gtp.h2
-rw-r--r--common/include/decode_ipv4.h2
-rw-r--r--common/include/decode_ipv6.h2
-rw-r--r--common/include/decode_tcp.h2
-rw-r--r--common/include/decode_udp.h2
-rw-r--r--common/include/public.h27
-rw-r--r--common/src/decode_gtp.c10
-rw-r--r--common/src/decode_ipv4.c16
-rw-r--r--common/src/decode_ipv6.c14
-rw-r--r--common/src/decode_tcp.c16
-rw-r--r--common/src/decode_udp.c14
-rw-r--r--platform/src/packet_adapter.c105
12 files changed, 133 insertions, 79 deletions
diff --git a/common/include/decode_gtp.h b/common/include/decode_gtp.h
index 87d9fd9..0d936a6 100644
--- a/common/include/decode_gtp.h
+++ b/common/include/decode_gtp.h
@@ -27,7 +27,7 @@ extern "C"
} gtp_info_t;
int decode_gtp(gtp_info_t *packet, const uint8_t *data, uint32_t len);
- void dump_gtp_info(uint32_t pkt_id, gtp_info_t *packet);
+ int dump_gtp_info(gtp_info_t *packet, char *buff, size_t size);
#ifdef __cpluscplus
}
diff --git a/common/include/decode_ipv4.h b/common/include/decode_ipv4.h
index f3e3fa8..73cacd1 100644
--- a/common/include/decode_ipv4.h
+++ b/common/include/decode_ipv4.h
@@ -46,7 +46,7 @@ extern "C"
} ipv4_info_t;
int decode_ipv4(ipv4_info_t *packet, const uint8_t *data, uint32_t len);
- void dump_ipv4_info(uint32_t pkt_id, ipv4_info_t *packet);
+ int dump_ipv4_info(ipv4_info_t *packet, char *buff, size_t size);
#ifdef __cpluscplus
}
diff --git a/common/include/decode_ipv6.h b/common/include/decode_ipv6.h
index 9bb0d36..6e66226 100644
--- a/common/include/decode_ipv6.h
+++ b/common/include/decode_ipv6.h
@@ -49,7 +49,7 @@ extern "C"
} ipv6_info_t;
int decode_ipv6(ipv6_info_t *packet, const uint8_t *data, uint32_t len);
- void dump_ipv6_info(uint32_t pkt_id, ipv6_info_t *packet);
+ int dump_ipv6_info(ipv6_info_t *packet, char *buff, size_t size);
#ifdef __cpluscplus
}
diff --git a/common/include/decode_tcp.h b/common/include/decode_tcp.h
index 27cc14b..26197ac 100644
--- a/common/include/decode_tcp.h
+++ b/common/include/decode_tcp.h
@@ -37,7 +37,7 @@ extern "C"
} tcp_info_t;
int decode_tcp(tcp_info_t *packet, const uint8_t *data, uint32_t len);
- void dump_tcp_info(uint32_t pkt_id, tcp_info_t *packet);
+ int dump_tcp_info(tcp_info_t *packet, char *buff, size_t size);
#ifdef __cpluscplus
}
diff --git a/common/include/decode_udp.h b/common/include/decode_udp.h
index 7f8ba45..fc12ffe 100644
--- a/common/include/decode_udp.h
+++ b/common/include/decode_udp.h
@@ -31,7 +31,7 @@ extern "C"
} udp_info_t;
int decode_udp(udp_info_t *packet, const uint8_t *data, uint32_t len);
- void dump_udp_info(uint32_t pkt_id, udp_info_t *packet);
+ int dump_udp_info(udp_info_t *packet, char *buff, size_t size);
#ifdef __cpluscplus
}
diff --git a/common/include/public.h b/common/include/public.h
index 60f3048..3e8083e 100644
--- a/common/include/public.h
+++ b/common/include/public.h
@@ -12,27 +12,24 @@ extern "C"
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
+#include <signal.h>
#include <sys/stat.h>
#include <arpa/inet.h>
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
#define IP_GET_RAW_VER(raw_pkt) ((((raw_pkt)[0] & 0xf0) >> 4))
-#define PRINT_FILE_INFO 0
-
-#if (PRINT_FILE_INFO)
-#define LOG_DEBUG(format, ...) \
- fprintf(stdout, "[%s-%s()-%05d] " format "\n", __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__);
-
-#define LOG_ERROR(format, ...) \
- fprintf(stderr, "[%s-%s()-%05d] " format "\n", __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__);
-#else
-#define LOG_DEBUG(format, ...) \
- fprintf(stdout, format "\n", ##__VA_ARGS__);
-
-#define LOG_ERROR(format, ...) \
- fprintf(stderr, format "\n", ##__VA_ARGS__);
-#endif
+#define LOG_DEBUG(format, ...) \
+ { \
+ fprintf(stdout, format "\n", ##__VA_ARGS__); \
+ fflush(stdout); \
+ }
+
+#define LOG_ERROR(format, ...) \
+ { \
+ fprintf(stderr, format "\n", ##__VA_ARGS__); \
+ fflush(stderr); \
+ }
#ifdef __cpluscplus
}
diff --git a/common/src/decode_gtp.c b/common/src/decode_gtp.c
index 92dc528..9398ab5 100644
--- a/common/src/decode_gtp.c
+++ b/common/src/decode_gtp.c
@@ -47,10 +47,10 @@ int decode_gtp(gtp_info_t *packet, const uint8_t *data, uint32_t len)
return 0;
}
-void dump_gtp_info(uint32_t pkt_id, gtp_info_t *packet)
+int dump_gtp_info(gtp_info_t *packet, char *buff, size_t size)
{
- LOG_DEBUG("id: %u, gtp_info: {hdr_len: %u, data_len: %u}",
- pkt_id,
- packet->hdr_len,
- packet->payload_len);
+ return snprintf(buff, size,
+ "{\"hdr_len\":%u,\"data_len\":%u}",
+ packet->hdr_len,
+ packet->payload_len);
} \ No newline at end of file
diff --git a/common/src/decode_ipv4.c b/common/src/decode_ipv4.c
index 8b98975..512d5af 100644
--- a/common/src/decode_ipv4.c
+++ b/common/src/decode_ipv4.c
@@ -56,13 +56,13 @@ int decode_ipv4(ipv4_info_t *packet, const uint8_t *data, uint32_t len)
return 0;
}
-void dump_ipv4_info(uint32_t pkt_id, ipv4_info_t *packet)
+int dump_ipv4_info(ipv4_info_t *packet, char *buff, size_t size)
{
- LOG_DEBUG("id: %u, ipv4_info: {src_addr: %s, dst_addr: %s, hdr_len: %u, opt_len: %u, data_len: %u}",
- pkt_id,
- packet->src_addr,
- packet->dst_addr,
- packet->hdr_len,
- packet->opts_len,
- packet->payload_len);
+ return snprintf(buff, size,
+ "{\"src_addr\":\"%s\",\"dst_addr\":\"%s\",\"hdr_len\":%u,\"opts_len\":%u,\"data_len\":%u}",
+ packet->src_addr,
+ packet->dst_addr,
+ packet->hdr_len,
+ packet->opts_len,
+ packet->payload_len);
} \ No newline at end of file
diff --git a/common/src/decode_ipv6.c b/common/src/decode_ipv6.c
index a583d54..b360550 100644
--- a/common/src/decode_ipv6.c
+++ b/common/src/decode_ipv6.c
@@ -44,12 +44,12 @@ int decode_ipv6(ipv6_info_t *packet, const uint8_t *data, uint32_t len)
return 0;
}
-void dump_ipv6_info(uint32_t pkt_id, ipv6_info_t *packet)
+int dump_ipv6_info(ipv6_info_t *packet, char *buff, size_t size)
{
- LOG_DEBUG("id: %u, ipv6_info: {src_addr: %s, dst_addr: %s, hdr_len: %u, data_len: %u}",
- pkt_id,
- packet->src_addr,
- packet->dst_addr,
- packet->hdr_len,
- packet->payload_len);
+ return snprintf(buff, size,
+ "{\"src_addr\":\"%s\",\"dst_addr\":\"%s\",\"hdr_len\":%u,\"data_len\":%u}",
+ packet->src_addr,
+ packet->dst_addr,
+ packet->hdr_len,
+ packet->payload_len);
} \ No newline at end of file
diff --git a/common/src/decode_tcp.c b/common/src/decode_tcp.c
index 75a1ab8..f8a7cd6 100644
--- a/common/src/decode_tcp.c
+++ b/common/src/decode_tcp.c
@@ -40,13 +40,13 @@ int decode_tcp(tcp_info_t *packet, const uint8_t *data, uint32_t len)
return 0;
}
-void dump_tcp_info(uint32_t pkt_id, tcp_info_t *packet)
+int dump_tcp_info(tcp_info_t *packet, char *buff, size_t size)
{
- LOG_DEBUG("id: %u, tcp_info: {src_port: %u, dst_port: %u, hdr_len: %u, opt_len: %u, data_len:%u}",
- pkt_id,
- packet->src_port,
- packet->dst_port,
- packet->hdr_len,
- packet->opt_len,
- packet->payload_len);
+ return snprintf(buff, size,
+ "{\"src_port\":%u,\"dst_port\":%u,\"hdr_len\":%u,\"opt_len\":%u,\"data_len\":%u}",
+ packet->src_port,
+ packet->dst_port,
+ packet->hdr_len,
+ packet->opt_len,
+ packet->payload_len);
} \ No newline at end of file
diff --git a/common/src/decode_udp.c b/common/src/decode_udp.c
index bebe337..fff1256 100644
--- a/common/src/decode_udp.c
+++ b/common/src/decode_udp.c
@@ -37,12 +37,12 @@ int decode_udp(udp_info_t *packet, const uint8_t *data, uint32_t len)
return 0;
}
-void dump_udp_info(uint32_t pkt_id, udp_info_t *packet)
+int dump_udp_info(udp_info_t *packet, char *buff, size_t size)
{
- LOG_DEBUG("id: %u, udp_info: {src_port: %u, dst_port: %u, hdr_len: %u, data_len: %u}",
- pkt_id,
- packet->src_port,
- packet->dst_port,
- packet->hdr_len,
- packet->payload_len);
+ return snprintf(buff, size,
+ "{\"src_port\":%u,\"dst_port\":%u,\"hdr_len\":%u,\"data_len\":%u}",
+ packet->src_port,
+ packet->dst_port,
+ packet->hdr_len,
+ packet->payload_len);
}
diff --git a/platform/src/packet_adapter.c b/platform/src/packet_adapter.c
index 8325f05..70eab10 100644
--- a/platform/src/packet_adapter.c
+++ b/platform/src/packet_adapter.c
@@ -48,62 +48,81 @@ typedef struct pkt_paser_s
union_info_t internal;
} pkt_paser_t;
+static int is_dump_packet_info = 0;
+
static void dump_info(pkt_paser_t *parser)
{
- uint32_t pkt_id = parser->raw.id;
- LOG_DEBUG("raw: {id: %u, protocol: %u, hook: %u, mark: %u, indev: %u, outdev: %u, phys_indev: %u, phys_outdev: %u, src_addr: %s, data_len: %u}",
- parser->raw.id,
- parser->raw.protocol,
- parser->raw.hook,
- parser->raw.mark,
- parser->raw.indev,
- parser->raw.outdev,
- parser->raw.phys_indev,
- parser->raw.phys_outdev,
- parser->raw.src_addr,
- parser->raw.payload_len);
+ char buff[4096] = {0};
+ size_t size = sizeof(buff);
+ size_t len = 0;
+
+ len += snprintf(buff + len, size - len, "{");
+ len += snprintf(buff + len, size - len,
+ "\"raw_info\":{\"id\":%u,\"protocol\":%u,\"hook\":%u,\"mark\":%u,\"indev\":%u,\"outdev\":%u,\"phys_indev\":%u,\"phys_outdev\":%u,\"src_addr\":\"%s\",\"data_len\":%u}",
+ parser->raw.id,
+ parser->raw.protocol,
+ parser->raw.hook,
+ parser->raw.mark,
+ parser->raw.indev,
+ parser->raw.outdev,
+ parser->raw.phys_indev,
+ parser->raw.phys_outdev,
+ parser->raw.src_addr,
+ parser->raw.payload_len);
// external
if (parser->external.ipv4.hdr)
{
- dump_ipv4_info(pkt_id, &(parser->external.ipv4));
+ len += snprintf(buff + len, size - len, ",\"external_ipv4\":");
+ len += dump_ipv4_info(&(parser->external.ipv4), buff + len, size - len);
}
if (parser->external.ipv6.hdr)
{
- dump_ipv6_info(pkt_id, &(parser->external.ipv6));
+ len += snprintf(buff + len, size - len, ",\"external_ipv6\":");
+ len += dump_ipv6_info(&(parser->external.ipv6), buff + len, size - len);
}
if (parser->external.udp.hdr)
{
- dump_udp_info(pkt_id, &(parser->external.udp));
+ len += snprintf(buff + len, size - len, ",\"external_udp\":");
+ len += dump_udp_info(&(parser->external.udp), buff + len, size - len);
}
if (parser->external.tcp.hdr)
{
- dump_tcp_info(pkt_id, &(parser->external.tcp));
+ len += snprintf(buff + len, size - len, ",\"external_tcp\":");
+ len += dump_tcp_info(&(parser->external.tcp), buff + len, size - len);
}
// gtp
if (parser->gtp.hdr)
{
- dump_gtp_info(pkt_id, &(parser->gtp));
+ len += snprintf(buff + len, size - len, ",\"gtp\":");
+ len += dump_gtp_info(&(parser->gtp), buff + len, size - len);
}
// internal
if (parser->internal.ipv4.hdr)
{
- dump_ipv4_info(pkt_id, &(parser->internal.ipv4));
+ len += snprintf(buff + len, size - len, ",\"internal_ipv4\":");
+ len += dump_ipv4_info(&(parser->internal.ipv4), buff + len, size - len);
}
if (parser->internal.ipv6.hdr)
{
- dump_ipv6_info(pkt_id, &(parser->internal.ipv6));
+ len += snprintf(buff + len, size - len, ",\"internal_ipv6\":");
+ len += dump_ipv6_info(&(parser->internal.ipv6), buff + len, size - len);
}
if (parser->internal.udp.hdr)
{
- dump_udp_info(pkt_id, &(parser->internal.udp));
+ len += snprintf(buff + len, size - len, ",\"internal_udp\":");
+ len += dump_udp_info(&(parser->internal.udp), buff + len, size - len);
}
if (parser->internal.tcp.hdr)
{
- dump_tcp_info(pkt_id, &(parser->internal.tcp));
+ len += snprintf(buff + len, size - len, ",\"internal_tcp\":");
+ len += dump_tcp_info(&(parser->internal.tcp), buff + len, size - len);
}
+
+ len += snprintf(buff + len, size - len, "}");
+ LOG_DEBUG("%s", buff);
}
static int decode_ip_tcp_udp(union_info_t *parser, const uint8_t *data, uint32_t len)
@@ -276,8 +295,11 @@ static int packet_handler_cb(struct nfq_q_handle *qh, struct nfgenmsg *nfmsg, st
offest += parser.external.udp.hdr_len;
offest += parser.gtp.hdr_len;
- dump_info(&parser);
- LOG_DEBUG("Offset : %d", offest);
+ if (is_dump_packet_info)
+ {
+ dump_info(&parser);
+ LOG_DEBUG("Offset : %d", offest);
+ }
uint8_t *inject_data = parser.raw.payload + offest;
uint32_t inject_data_len = parser.raw.payload_len - offest;
@@ -312,13 +334,31 @@ end:
return nfq_set_verdict(qh, packet_id, NF_ACCEPT, 0, NULL);
}
+static void sig_handler(int signo)
+{
+ if (signo == SIGUSR1)
+ {
+ is_dump_packet_info = 1;
+ LOG_ERROR("received SIGUSR1, enable dump packet info");
+ }
+ if (signo == SIGUSR2)
+ {
+ is_dump_packet_info = 0;
+ LOG_ERROR("received SIGUSR2, disable dump packet info");
+ }
+}
+
static void usage(char *cmd)
{
fprintf(stderr, "USAGE: %s [OPTIONS]\n", cmd);
fprintf(stderr, " -v -- show version\n");
fprintf(stderr, " -i id -- set queue id\n");
fprintf(stderr, " -d -- run daemon\n");
+ fprintf(stderr, " -p -- dump packet info\n");
fprintf(stderr, " -h -- show help\n");
+ fprintf(stderr, "Signal: \n");
+ fprintf(stderr, " kill -s SIGUSR1 `pidof %s` -- enable dump packet info\n", cmd);
+ fprintf(stderr, " kill -s SIGUSR2 `pidof %s` -- disable dump packet info\n", cmd);
}
/*
@@ -337,7 +377,9 @@ int main(int argc, char **argv)
struct nfq_q_handle *q_handle;
char buf[65535] __attribute__((aligned));
- while ((opt = getopt(argc, argv, "vi:dh")) != -1)
+ is_dump_packet_info = 0;
+
+ while ((opt = getopt(argc, argv, "vi:dph")) != -1)
{
switch (opt)
{
@@ -355,6 +397,9 @@ int main(int argc, char **argv)
case 'd':
run_daemon();
break;
+ case 'p':
+ is_dump_packet_info = 1;
+ break;
case 'h': /* fall through */
default:
usage(argv[0]);
@@ -364,6 +409,18 @@ int main(int argc, char **argv)
LOG_DEBUG("Using queue: %d", queue);
+ if (signal(SIGUSR1, sig_handler) == SIG_ERR)
+ {
+ LOG_ERROR("Failed at signal(SIGUSR1), %d: %s", errno, strerror(errno));
+ goto error;
+ }
+
+ if (signal(SIGUSR2, sig_handler) == SIG_ERR)
+ {
+ LOG_ERROR("Failed at signal(SIGUSR2), %d: %s", errno, strerror(errno));
+ goto error;
+ }
+
handle = nfq_open();
if (handle == NULL)
{