TSG-8230 PacketAdapter支持输出json格式的日志,并支持动态调整日志级别
This commit is contained in:
@@ -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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user