144d362409d5469aed47d19e7908d19bd194493aThomas Graf/*
244d362409d5469aed47d19e7908d19bd194493aThomas Graf * lib/netfilter/log_obj.c	Netfilter Log Object
344d362409d5469aed47d19e7908d19bd194493aThomas Graf *
444d362409d5469aed47d19e7908d19bd194493aThomas Graf *	This library is free software; you can redistribute it and/or
544d362409d5469aed47d19e7908d19bd194493aThomas Graf *	modify it under the terms of the GNU Lesser General Public
644d362409d5469aed47d19e7908d19bd194493aThomas Graf *	License as published by the Free Software Foundation version 2.1
744d362409d5469aed47d19e7908d19bd194493aThomas Graf *	of the License.
844d362409d5469aed47d19e7908d19bd194493aThomas Graf *
9d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf * Copyright (c) 2003-2008 Thomas Graf <tgraf@suug.ch>
1044d362409d5469aed47d19e7908d19bd194493aThomas Graf * Copyright (c) 2007 Philip Craig <philipc@snapgear.com>
1144d362409d5469aed47d19e7908d19bd194493aThomas Graf * Copyright (c) 2007 Secure Computing Corporation
122f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy * Copyright (c) 2008 Patrick McHardy <kaber@trash.net>
1344d362409d5469aed47d19e7908d19bd194493aThomas Graf */
1444d362409d5469aed47d19e7908d19bd194493aThomas Graf
15054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart#include <netlink-private/netlink.h>
1644d362409d5469aed47d19e7908d19bd194493aThomas Graf#include <netlink/netfilter/nfnl.h>
1744d362409d5469aed47d19e7908d19bd194493aThomas Graf#include <netlink/netfilter/log.h>
1844d362409d5469aed47d19e7908d19bd194493aThomas Graf
1944d362409d5469aed47d19e7908d19bd194493aThomas Graf/** @cond SKIP */
202f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy#define LOG_ATTR_GROUP			(1UL << 0)
212f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy#define LOG_ATTR_COPY_MODE		(1UL << 1)
222f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy#define LOG_ATTR_COPY_RANGE		(1UL << 3)
232f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy#define LOG_ATTR_FLUSH_TIMEOUT		(1UL << 4)
242f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy#define LOG_ATTR_ALLOC_SIZE		(1UL << 5)
252f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy#define LOG_ATTR_QUEUE_THRESHOLD	(1UL << 6)
262f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy
2744d362409d5469aed47d19e7908d19bd194493aThomas Graf/** @endcond */
2844d362409d5469aed47d19e7908d19bd194493aThomas Graf
29d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Grafstatic void nfnl_log_dump(struct nl_object *a, struct nl_dump_params *p)
3044d362409d5469aed47d19e7908d19bd194493aThomas Graf{
312f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	struct nfnl_log *log = (struct nfnl_log *) a;
322f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	char buf[64];
3344d362409d5469aed47d19e7908d19bd194493aThomas Graf
34d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf	nl_new_line(p);
35d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf
362f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	if (log->ce_mask & LOG_ATTR_GROUP)
37d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf		nl_dump(p, "group=%u ", log->log_group);
3844d362409d5469aed47d19e7908d19bd194493aThomas Graf
392f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	if (log->ce_mask & LOG_ATTR_COPY_MODE)
40d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf		nl_dump(p, "copy_mode=%s ",
412f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy			nfnl_log_copy_mode2str(log->log_copy_mode,
422f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy					       buf, sizeof(buf)));
4344d362409d5469aed47d19e7908d19bd194493aThomas Graf
442f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	if (log->ce_mask & LOG_ATTR_COPY_RANGE)
45d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf		nl_dump(p, "copy_range=%u ", log->log_copy_range);
4644d362409d5469aed47d19e7908d19bd194493aThomas Graf
472f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	if (log->ce_mask & LOG_ATTR_FLUSH_TIMEOUT)
48d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf		nl_dump(p, "flush_timeout=%u ", log->log_flush_timeout);
492f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy
502f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	if (log->ce_mask & LOG_ATTR_ALLOC_SIZE)
51d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf		nl_dump(p, "alloc_size=%u ", log->log_alloc_size);
5244d362409d5469aed47d19e7908d19bd194493aThomas Graf
532f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	if (log->ce_mask & LOG_ATTR_QUEUE_THRESHOLD)
54d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf		nl_dump(p, "queue_threshold=%u ", log->log_queue_threshold);
5544d362409d5469aed47d19e7908d19bd194493aThomas Graf
56d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf	nl_dump(p, "\n");
5744d362409d5469aed47d19e7908d19bd194493aThomas Graf}
5844d362409d5469aed47d19e7908d19bd194493aThomas Graf
59054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewartstatic const struct trans_tbl copy_modes[] = {
602f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	__ADD(NFNL_LOG_COPY_NONE,	none)
612f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	__ADD(NFNL_LOG_COPY_META,	meta)
622f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	__ADD(NFNL_LOG_COPY_PACKET,	packet)
632f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy};
642f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy
652f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardychar *nfnl_log_copy_mode2str(enum nfnl_log_copy_mode copy_mode, char *buf,
662f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy			     size_t len)
672f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy{
682f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	return __type2str(copy_mode, buf, len, copy_modes,
692f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy			  ARRAY_SIZE(copy_modes));
702f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy}
712f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy
722f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardyenum nfnl_log_copy_mode nfnl_log_str2copy_mode(const char *name)
732f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy{
742f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	return __str2type(name, copy_modes, ARRAY_SIZE(copy_modes));
752f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy}
762f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy
7744d362409d5469aed47d19e7908d19bd194493aThomas Graf/**
7844d362409d5469aed47d19e7908d19bd194493aThomas Graf * @name Allocation/Freeing
7944d362409d5469aed47d19e7908d19bd194493aThomas Graf * @{
8044d362409d5469aed47d19e7908d19bd194493aThomas Graf */
8144d362409d5469aed47d19e7908d19bd194493aThomas Graf
8244d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct nfnl_log *nfnl_log_alloc(void)
8344d362409d5469aed47d19e7908d19bd194493aThomas Graf{
8444d362409d5469aed47d19e7908d19bd194493aThomas Graf	return (struct nfnl_log *) nl_object_alloc(&log_obj_ops);
8544d362409d5469aed47d19e7908d19bd194493aThomas Graf}
8644d362409d5469aed47d19e7908d19bd194493aThomas Graf
8744d362409d5469aed47d19e7908d19bd194493aThomas Grafvoid nfnl_log_get(struct nfnl_log *log)
8844d362409d5469aed47d19e7908d19bd194493aThomas Graf{
8944d362409d5469aed47d19e7908d19bd194493aThomas Graf	nl_object_get((struct nl_object *) log);
9044d362409d5469aed47d19e7908d19bd194493aThomas Graf}
9144d362409d5469aed47d19e7908d19bd194493aThomas Graf
9244d362409d5469aed47d19e7908d19bd194493aThomas Grafvoid nfnl_log_put(struct nfnl_log *log)
9344d362409d5469aed47d19e7908d19bd194493aThomas Graf{
9444d362409d5469aed47d19e7908d19bd194493aThomas Graf	nl_object_put((struct nl_object *) log);
9544d362409d5469aed47d19e7908d19bd194493aThomas Graf}
9644d362409d5469aed47d19e7908d19bd194493aThomas Graf
9744d362409d5469aed47d19e7908d19bd194493aThomas Graf/** @} */
9844d362409d5469aed47d19e7908d19bd194493aThomas Graf
9944d362409d5469aed47d19e7908d19bd194493aThomas Graf/**
10044d362409d5469aed47d19e7908d19bd194493aThomas Graf * @name Attributes
10144d362409d5469aed47d19e7908d19bd194493aThomas Graf * @{
10244d362409d5469aed47d19e7908d19bd194493aThomas Graf */
10344d362409d5469aed47d19e7908d19bd194493aThomas Graf
1042f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardyvoid nfnl_log_set_group(struct nfnl_log *log, uint16_t group)
10544d362409d5469aed47d19e7908d19bd194493aThomas Graf{
1062f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	log->log_group = group;
1072f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	log->ce_mask |= LOG_ATTR_GROUP;
10844d362409d5469aed47d19e7908d19bd194493aThomas Graf}
10944d362409d5469aed47d19e7908d19bd194493aThomas Graf
1102f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardyint nfnl_log_test_group(const struct nfnl_log *log)
11144d362409d5469aed47d19e7908d19bd194493aThomas Graf{
1122f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	return !!(log->ce_mask & LOG_ATTR_GROUP);
11344d362409d5469aed47d19e7908d19bd194493aThomas Graf}
11444d362409d5469aed47d19e7908d19bd194493aThomas Graf
1152f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardyuint16_t nfnl_log_get_group(const struct nfnl_log *log)
11644d362409d5469aed47d19e7908d19bd194493aThomas Graf{
1172f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	return log->log_group;
11844d362409d5469aed47d19e7908d19bd194493aThomas Graf}
11944d362409d5469aed47d19e7908d19bd194493aThomas Graf
1202f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardyvoid nfnl_log_set_copy_mode(struct nfnl_log *log, enum nfnl_log_copy_mode mode)
12144d362409d5469aed47d19e7908d19bd194493aThomas Graf{
1222f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	log->log_copy_mode = mode;
1232f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	log->ce_mask |= LOG_ATTR_COPY_MODE;
12444d362409d5469aed47d19e7908d19bd194493aThomas Graf}
12544d362409d5469aed47d19e7908d19bd194493aThomas Graf
1262f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardyint nfnl_log_test_copy_mode(const struct nfnl_log *log)
12744d362409d5469aed47d19e7908d19bd194493aThomas Graf{
1282f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	return !!(log->ce_mask & LOG_ATTR_COPY_MODE);
12944d362409d5469aed47d19e7908d19bd194493aThomas Graf}
13044d362409d5469aed47d19e7908d19bd194493aThomas Graf
1312f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardyenum nfnl_log_copy_mode nfnl_log_get_copy_mode(const struct nfnl_log *log)
13244d362409d5469aed47d19e7908d19bd194493aThomas Graf{
1332f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	return log->log_copy_mode;
13444d362409d5469aed47d19e7908d19bd194493aThomas Graf}
13544d362409d5469aed47d19e7908d19bd194493aThomas Graf
1362f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardyvoid nfnl_log_set_copy_range(struct nfnl_log *log, uint32_t copy_range)
13744d362409d5469aed47d19e7908d19bd194493aThomas Graf{
1382f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	log->log_copy_range = copy_range;
1392f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	log->ce_mask |= LOG_ATTR_COPY_RANGE;
14044d362409d5469aed47d19e7908d19bd194493aThomas Graf}
14144d362409d5469aed47d19e7908d19bd194493aThomas Graf
1422f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardyint nfnl_log_test_copy_range(const struct nfnl_log *log)
14344d362409d5469aed47d19e7908d19bd194493aThomas Graf{
1442f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	return !!(log->ce_mask & LOG_ATTR_COPY_RANGE);
14544d362409d5469aed47d19e7908d19bd194493aThomas Graf}
14644d362409d5469aed47d19e7908d19bd194493aThomas Graf
1472f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardyuint32_t nfnl_log_get_copy_range(const struct nfnl_log *log)
14844d362409d5469aed47d19e7908d19bd194493aThomas Graf{
1492f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	return log->log_copy_range;
15044d362409d5469aed47d19e7908d19bd194493aThomas Graf}
15144d362409d5469aed47d19e7908d19bd194493aThomas Graf
1522f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardyvoid nfnl_log_set_flush_timeout(struct nfnl_log *log, uint32_t timeout)
15344d362409d5469aed47d19e7908d19bd194493aThomas Graf{
1542f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	log->log_flush_timeout = timeout;
1552f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	log->ce_mask |= LOG_ATTR_FLUSH_TIMEOUT;
15644d362409d5469aed47d19e7908d19bd194493aThomas Graf}
15744d362409d5469aed47d19e7908d19bd194493aThomas Graf
1582f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardyint nfnl_log_test_flush_timeout(const struct nfnl_log *log)
15944d362409d5469aed47d19e7908d19bd194493aThomas Graf{
1602f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	return !!(log->ce_mask & LOG_ATTR_FLUSH_TIMEOUT);
16144d362409d5469aed47d19e7908d19bd194493aThomas Graf}
16244d362409d5469aed47d19e7908d19bd194493aThomas Graf
1632f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardyuint32_t nfnl_log_get_flush_timeout(const struct nfnl_log *log)
16444d362409d5469aed47d19e7908d19bd194493aThomas Graf{
1652f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	return log->log_flush_timeout;
16644d362409d5469aed47d19e7908d19bd194493aThomas Graf}
16744d362409d5469aed47d19e7908d19bd194493aThomas Graf
1682f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardyvoid nfnl_log_set_alloc_size(struct nfnl_log *log, uint32_t alloc_size)
16944d362409d5469aed47d19e7908d19bd194493aThomas Graf{
1702f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	log->log_alloc_size = alloc_size;
1712f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	log->ce_mask |= LOG_ATTR_ALLOC_SIZE;
17244d362409d5469aed47d19e7908d19bd194493aThomas Graf}
17344d362409d5469aed47d19e7908d19bd194493aThomas Graf
1742f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardyint nfnl_log_test_alloc_size(const struct nfnl_log *log)
17544d362409d5469aed47d19e7908d19bd194493aThomas Graf{
1762f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	return !!(log->ce_mask & LOG_ATTR_ALLOC_SIZE);
17744d362409d5469aed47d19e7908d19bd194493aThomas Graf}
17844d362409d5469aed47d19e7908d19bd194493aThomas Graf
1792f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardyuint32_t nfnl_log_get_alloc_size(const struct nfnl_log *log)
18044d362409d5469aed47d19e7908d19bd194493aThomas Graf{
1812f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	return log->log_alloc_size;
18244d362409d5469aed47d19e7908d19bd194493aThomas Graf}
18344d362409d5469aed47d19e7908d19bd194493aThomas Graf
1842f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardyvoid nfnl_log_set_queue_threshold(struct nfnl_log *log, uint32_t threshold)
18544d362409d5469aed47d19e7908d19bd194493aThomas Graf{
1862f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	log->log_queue_threshold = threshold;
1872f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	log->ce_mask |= LOG_ATTR_QUEUE_THRESHOLD;
18844d362409d5469aed47d19e7908d19bd194493aThomas Graf}
18944d362409d5469aed47d19e7908d19bd194493aThomas Graf
1902f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardyint nfnl_log_test_queue_threshold(const struct nfnl_log *log)
19144d362409d5469aed47d19e7908d19bd194493aThomas Graf{
1922f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	return !!(log->ce_mask & LOG_ATTR_QUEUE_THRESHOLD);
19344d362409d5469aed47d19e7908d19bd194493aThomas Graf}
19444d362409d5469aed47d19e7908d19bd194493aThomas Graf
1952f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardyuint32_t nfnl_log_get_queue_threshold(const struct nfnl_log *log)
19644d362409d5469aed47d19e7908d19bd194493aThomas Graf{
1972f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	return log->log_queue_threshold;
19844d362409d5469aed47d19e7908d19bd194493aThomas Graf}
19944d362409d5469aed47d19e7908d19bd194493aThomas Graf
2002f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy/* We don't actually use the flags for anything yet since the
2012f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy * nfnetlog_log interface truly sucks - it only contains the
2022f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy * flag value, but not mask, so we would have to make assumptions
2032f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy * about the supported flags.
2042f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy */
2052f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardyvoid nfnl_log_set_flags(struct nfnl_log *log, unsigned int flags)
20644d362409d5469aed47d19e7908d19bd194493aThomas Graf{
2072f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	log->log_flags |= flags;
2082f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	log->log_flag_mask |= flags;
20944d362409d5469aed47d19e7908d19bd194493aThomas Graf}
21044d362409d5469aed47d19e7908d19bd194493aThomas Graf
2112f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardyvoid nfnl_log_unset_flags(struct nfnl_log *log, unsigned int flags)
21244d362409d5469aed47d19e7908d19bd194493aThomas Graf{
2132f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	log->log_flags &= ~flags;
2142f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	log->log_flag_mask |= flags;
21544d362409d5469aed47d19e7908d19bd194493aThomas Graf}
21644d362409d5469aed47d19e7908d19bd194493aThomas Graf
217054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewartstatic const struct trans_tbl log_flags[] = {
2182f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	__ADD(NFNL_LOG_FLAG_SEQ,	seq)
2192f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	__ADD(NFNL_LOG_FLAG_SEQ_GLOBAL,	seq_global)
2202f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy};
22144d362409d5469aed47d19e7908d19bd194493aThomas Graf
2222f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardychar *nfnl_log_flags2str(unsigned int flags, char *buf, size_t len)
2233f48e49102f3967e87b98b66721c35aefcc299caPatrick McHardy{
2242f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	return __flags2str(flags, buf, len, log_flags, ARRAY_SIZE(log_flags));
2253f48e49102f3967e87b98b66721c35aefcc299caPatrick McHardy}
2263f48e49102f3967e87b98b66721c35aefcc299caPatrick McHardy
2272f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardyunsigned int nfnl_log_str2flags(const char *name)
2283f48e49102f3967e87b98b66721c35aefcc299caPatrick McHardy{
2292f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	return __str2flags(name, log_flags, ARRAY_SIZE(log_flags));
2303f48e49102f3967e87b98b66721c35aefcc299caPatrick McHardy}
2313f48e49102f3967e87b98b66721c35aefcc299caPatrick McHardy
2322f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardystatic int nfnl_log_compare(struct nl_object *_a, struct nl_object *_b,
2332f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy			    uint32_t attrs, int flags)
2343f48e49102f3967e87b98b66721c35aefcc299caPatrick McHardy{
2352f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	struct nfnl_log *a = (struct nfnl_log *) _a;
2362f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	struct nfnl_log *b = (struct nfnl_log *) _b;
2372f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	int diff = 0;
2383f48e49102f3967e87b98b66721c35aefcc299caPatrick McHardy
2392f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy#define NFNL_LOG_DIFF(ATTR, EXPR) \
2402f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	ATTR_DIFF(attrs, LOG_ATTR_##ATTR, a, b, EXPR)
2412f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy#define NFNL_LOG_DIFF_VAL(ATTR, FIELD) \
2422f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	NFNL_LOG_DIFF(ATTR, a->FIELD != b->FIELD)
24344d362409d5469aed47d19e7908d19bd194493aThomas Graf
2442f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	diff |= NFNL_LOG_DIFF_VAL(GROUP,		log_group);
2452f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	diff |= NFNL_LOG_DIFF_VAL(COPY_MODE,		log_copy_mode);
2462f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	diff |= NFNL_LOG_DIFF_VAL(COPY_RANGE,		log_copy_range);
2472f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	diff |= NFNL_LOG_DIFF_VAL(FLUSH_TIMEOUT,	log_flush_timeout);
2482f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	diff |= NFNL_LOG_DIFF_VAL(ALLOC_SIZE,		log_alloc_size);
2492f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	diff |= NFNL_LOG_DIFF_VAL(QUEUE_THRESHOLD,	log_queue_threshold);
25044d362409d5469aed47d19e7908d19bd194493aThomas Graf
2512f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy#undef NFNL_LOG_DIFF
2522f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy#undef NFNL_LOG_DIFF_VAL
25344d362409d5469aed47d19e7908d19bd194493aThomas Graf
2542f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	return diff;
25544d362409d5469aed47d19e7908d19bd194493aThomas Graf}
25644d362409d5469aed47d19e7908d19bd194493aThomas Graf
257054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewartstatic const struct trans_tbl nfnl_log_attrs[] = {
2582f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	__ADD(LOG_ATTR_GROUP,		group)
2592f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	__ADD(LOG_ATTR_COPY_MODE,	copy_mode)
2602f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	__ADD(LOG_ATTR_COPY_RANGE,	copy_range)
2612f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	__ADD(LOG_ATTR_FLUSH_TIMEOUT,	flush_timeout)
2622f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	__ADD(LOG_ATTR_ALLOC_SIZE,	alloc_size)
2632f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	__ADD(LOG_ATTR_QUEUE_THRESHOLD, queue_threshold)
2642f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy};
26544d362409d5469aed47d19e7908d19bd194493aThomas Graf
2662f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardystatic char *nfnl_log_attrs2str(int attrs, char *buf, size_t len)
26744d362409d5469aed47d19e7908d19bd194493aThomas Graf{
2682f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	return __flags2str(attrs, buf, len, nfnl_log_attrs,
2692f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy			   ARRAY_SIZE(nfnl_log_attrs));
27044d362409d5469aed47d19e7908d19bd194493aThomas Graf}
27144d362409d5469aed47d19e7908d19bd194493aThomas Graf
27244d362409d5469aed47d19e7908d19bd194493aThomas Graf/** @} */
27344d362409d5469aed47d19e7908d19bd194493aThomas Graf
27444d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct nl_object_ops log_obj_ops = {
27544d362409d5469aed47d19e7908d19bd194493aThomas Graf	.oo_name		= "netfilter/log",
27644d362409d5469aed47d19e7908d19bd194493aThomas Graf	.oo_size		= sizeof(struct nfnl_log),
277d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf	.oo_dump = {
278d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf	    [NL_DUMP_LINE]	= nfnl_log_dump,
279d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf	    [NL_DUMP_DETAILS]	= nfnl_log_dump,
280d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf	    [NL_DUMP_STATS]	= nfnl_log_dump,
281d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf	},
2822f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	.oo_compare		= nfnl_log_compare,
2832f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	.oo_attrs2str		= nfnl_log_attrs2str,
2842f4f8a5094b56c460f4b5bb1b62b7ec8f624942cPatrick McHardy	.oo_id_attrs		= LOG_ATTR_GROUP,
28544d362409d5469aed47d19e7908d19bd194493aThomas Graf};
28644d362409d5469aed47d19e7908d19bd194493aThomas Graf
28744d362409d5469aed47d19e7908d19bd194493aThomas Graf/** @} */
288