1e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy/*
2e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy * lib/netfilter/queue_obj.c	Netfilter Queue
3e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy *
4e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy *	This library is free software; you can redistribute it and/or
5e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy *	modify it under the terms of the GNU Lesser General Public
6e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy *	License as published by the Free Software Foundation version 2.1
7e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy *	of the License.
8e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy *
9e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy * Copyright (c) 2007, 2008 Patrick McHardy <kaber@trash.net>
10e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy */
11e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
12e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy/**
13e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy * @ingroup nfnl
14e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy * @defgroup queue Queue
15e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy * @brief
16e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy * @{
17e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy */
18e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
19e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy#include <netlink-local.h>
20e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy#include <netlink/netfilter/nfnl.h>
21e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy#include <netlink/netfilter/queue.h>
22e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
23e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy/** @cond SKIP */
24e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy#define QUEUE_ATTR_GROUP		(1UL << 0)
25e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy#define QUEUE_ATTR_MAXLEN		(1UL << 1)
26e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy#define QUEUE_ATTR_COPY_MODE		(1UL << 2)
27e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy#define QUEUE_ATTR_COPY_RANGE		(1UL << 3)
28e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy/** @endcond */
29e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
30e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
31d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Grafstatic void nfnl_queue_dump(struct nl_object *a, struct nl_dump_params *p)
32e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
33e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	struct nfnl_queue *queue = (struct nfnl_queue *) a;
34e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	char buf[64];
35e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
36d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf	nl_new_line(p);
37d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf
38e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	if (queue->ce_mask & QUEUE_ATTR_GROUP)
39d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf		nl_dump(p, "group=%u ", queue->queue_group);
40e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
41e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	if (queue->ce_mask & QUEUE_ATTR_MAXLEN)
42d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf		nl_dump(p, "maxlen=%u ", queue->queue_maxlen);
43e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
44e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	if (queue->ce_mask & QUEUE_ATTR_COPY_MODE)
45d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf		nl_dump(p, "copy_mode=%s ",
46e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy			nfnl_queue_copy_mode2str(queue->queue_copy_mode,
47e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy						 buf, sizeof(buf)));
48e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
49e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	if (queue->ce_mask & QUEUE_ATTR_COPY_RANGE)
50d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf		nl_dump(p, "copy_range=%u ", queue->queue_copy_range);
51e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
52d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf	nl_dump(p, "\n");
53e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
54e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
55e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardystatic struct trans_tbl copy_modes[] = {
56e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	__ADD(NFNL_QUEUE_COPY_NONE,	none)
57e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	__ADD(NFNL_QUEUE_COPY_META,	meta)
58e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	__ADD(NFNL_QUEUE_COPY_PACKET,	packet)
59e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy};
60e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
61e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardychar *nfnl_queue_copy_mode2str(enum nfnl_queue_copy_mode copy_mode, char *buf,
62e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy			       size_t len)
63e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
64e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	return __type2str(copy_mode, buf, len, copy_modes,
65e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy			   ARRAY_SIZE(copy_modes));
66e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
67e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
68e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyenum nfnl_queue_copy_mode nfnl_queue_str2copy_mode(const char *name)
69e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
70e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	return __str2type(name, copy_modes, ARRAY_SIZE(copy_modes));
71e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
72e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
73e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy/**
74e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy * @name Allocation/Freeing
75e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy * @{
76e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy */
77e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
78e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardystruct nfnl_queue *nfnl_queue_alloc(void)
79e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
80e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	return (struct nfnl_queue *) nl_object_alloc(&queue_obj_ops);
81e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
82e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
83e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyvoid nfnl_queue_get(struct nfnl_queue *queue)
84e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
85e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	nl_object_get((struct nl_object *) queue);
86e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
87e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
88e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyvoid nfnl_queue_put(struct nfnl_queue *queue)
89e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
90e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	nl_object_put((struct nl_object *) queue);
91e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
92e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
93e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy/** @} */
94e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
95e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy/**
96e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy * @name Attributes
97e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy * @{
98e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy */
99e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
100e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyvoid nfnl_queue_set_group(struct nfnl_queue *queue, uint16_t group)
101e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
102e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	queue->queue_group = group;
103e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	queue->ce_mask |= QUEUE_ATTR_GROUP;
104e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
105e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
106e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyint nfnl_queue_test_group(const struct nfnl_queue *queue)
107e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
108e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	return !!(queue->ce_mask & QUEUE_ATTR_GROUP);
109e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
110e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
111e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyuint16_t nfnl_queue_get_group(const struct nfnl_queue *queue)
112e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
113e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	return queue->queue_group;
114e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
115e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
116e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyvoid nfnl_queue_set_maxlen(struct nfnl_queue *queue, uint32_t maxlen)
117e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
118e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	queue->queue_maxlen = maxlen;
119e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	queue->ce_mask |= QUEUE_ATTR_MAXLEN;
120e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
121e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
122e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyint nfnl_queue_test_maxlen(const struct nfnl_queue *queue)
123e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
124e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	return !!(queue->ce_mask & QUEUE_ATTR_MAXLEN);
125e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
126e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
127e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyuint32_t nfnl_queue_get_maxlen(const struct nfnl_queue *queue)
128e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
129e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	return queue->queue_maxlen;
130e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
131e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
132e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyvoid nfnl_queue_set_copy_mode(struct nfnl_queue *queue, enum nfnl_queue_copy_mode mode)
133e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
134e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	queue->queue_copy_mode = mode;
135e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	queue->ce_mask |= QUEUE_ATTR_COPY_MODE;
136e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
137e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
138e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyint nfnl_queue_test_copy_mode(const struct nfnl_queue *queue)
139e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
140e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	return !!(queue->ce_mask & QUEUE_ATTR_COPY_MODE);
141e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
142e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
143e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyenum nfnl_queue_copy_mode nfnl_queue_get_copy_mode(const struct nfnl_queue *queue)
144e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
145e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	return queue->queue_copy_mode;
146e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
147e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
148e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyvoid nfnl_queue_set_copy_range(struct nfnl_queue *queue, uint32_t copy_range)
149e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
150e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	queue->queue_copy_range = copy_range;
151e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	queue->ce_mask |= QUEUE_ATTR_COPY_RANGE;
152e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
153e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
154e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyint nfnl_queue_test_copy_range(const struct nfnl_queue *queue)
155e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
156e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	return !!(queue->ce_mask & QUEUE_ATTR_COPY_RANGE);
157e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
158e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
159e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyuint32_t nfnl_queue_get_copy_range(const struct nfnl_queue *queue)
160e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
161e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	return queue->queue_copy_range;
162e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
163e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
164e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardystatic int nfnl_queue_compare(struct nl_object *_a, struct nl_object *_b,
165e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy			      uint32_t attrs, int flags)
166e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
167e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	struct nfnl_queue *a = (struct nfnl_queue *) _a;
168e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	struct nfnl_queue *b = (struct nfnl_queue *) _b;
169e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	int diff = 0;
170e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
171e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy#define NFNL_QUEUE_DIFF(ATTR, EXPR) \
172e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	ATTR_DIFF(attrs, QUEUE_ATTR_##ATTR, a, b, EXPR)
173e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy#define NFNL_QUEUE_DIFF_VAL(ATTR, FIELD) \
174e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	NFNL_QUEUE_DIFF(ATTR, a->FIELD != b->FIELD)
175e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
176e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	diff |= NFNL_QUEUE_DIFF_VAL(GROUP,	queue_group);
177e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	diff |= NFNL_QUEUE_DIFF_VAL(MAXLEN,	queue_maxlen);
178e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	diff |= NFNL_QUEUE_DIFF_VAL(COPY_MODE,	queue_copy_mode);
179e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	diff |= NFNL_QUEUE_DIFF_VAL(COPY_RANGE,	queue_copy_range);
180e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
181e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy#undef NFNL_QUEUE_DIFF
182e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy#undef NFNL_QUEUE_DIFF_VAL
183e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
184e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	return diff;
185e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
186e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
187e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardystatic struct trans_tbl nfnl_queue_attrs[] = {
188e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	__ADD(QUEUE_ATTR_GROUP,		group)
189e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	__ADD(QUEUE_ATTR_MAXLEN,	maxlen)
190e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	__ADD(QUEUE_ATTR_COPY_MODE,	copy_mode)
191e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	__ADD(QUEUE_ATTR_COPY_RANGE,	copy_range)
192e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy};
193e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
194e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardystatic char *nfnl_queue_attrs2str(int attrs, char *buf, size_t len)
195e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
196e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	return __flags2str(attrs, buf, len, nfnl_queue_attrs,
197e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy			   ARRAY_SIZE(nfnl_queue_attrs));
198e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
199e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
200e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy/** @} */
201e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
202e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardystruct nl_object_ops queue_obj_ops = {
203e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	.oo_name		= "netfilter/queue",
204e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	.oo_size		= sizeof(struct nfnl_queue),
205d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf	.oo_dump = {
206d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf	    [NL_DUMP_LINE]	= nfnl_queue_dump,
207d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf	    [NL_DUMP_DETAILS]	= nfnl_queue_dump,
208d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf	    [NL_DUMP_STATS]	= nfnl_queue_dump,
209d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf	},
210e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	.oo_compare		= nfnl_queue_compare,
211e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	.oo_attrs2str		= nfnl_queue_attrs2str,
212e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	.oo_id_attrs		= QUEUE_ATTR_GROUP,
213e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy};
214e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
215e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy/** @} */
216