1e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy/*
2e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy * lib/netfilter/queue_msg_obj.c	Netfilter Queue Message Object
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
12054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart#include <netlink-private/netlink.h>
13e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy#include <netlink/netfilter/nfnl.h>
14e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy#include <netlink/netfilter/netfilter.h>
15e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy#include <netlink/netfilter/queue_msg.h>
16e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy#include <linux/netfilter.h>
17e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
18e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy/** @cond SKIP */
19e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy#define QUEUE_MSG_ATTR_GROUP		(1UL << 0)
20e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy#define QUEUE_MSG_ATTR_FAMILY		(1UL << 1)
21e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy#define QUEUE_MSG_ATTR_PACKETID		(1UL << 2)
22e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy#define QUEUE_MSG_ATTR_HWPROTO		(1UL << 3)
23e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy#define QUEUE_MSG_ATTR_HOOK		(1UL << 4)
24e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy#define QUEUE_MSG_ATTR_MARK		(1UL << 5)
25e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy#define QUEUE_MSG_ATTR_TIMESTAMP	(1UL << 6)
26e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy#define QUEUE_MSG_ATTR_INDEV		(1UL << 7)
27e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy#define QUEUE_MSG_ATTR_OUTDEV		(1UL << 8)
28e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy#define QUEUE_MSG_ATTR_PHYSINDEV	(1UL << 9)
29e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy#define QUEUE_MSG_ATTR_PHYSOUTDEV	(1UL << 10)
30e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy#define QUEUE_MSG_ATTR_HWADDR		(1UL << 11)
31e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy#define QUEUE_MSG_ATTR_PAYLOAD		(1UL << 12)
32e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy#define QUEUE_MSG_ATTR_VERDICT		(1UL << 13)
33e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy/** @endcond */
34e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
35e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardystatic void nfnl_queue_msg_free_data(struct nl_object *c)
36e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
37e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	struct nfnl_queue_msg *msg = (struct nfnl_queue_msg *) c;
38e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
39e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	if (msg == NULL)
40e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy		return;
41e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
42e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	free(msg->queue_msg_payload);
43e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
44e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
45e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardystatic int nfnl_queue_msg_clone(struct nl_object *_dst, struct nl_object *_src)
46e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
47e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	struct nfnl_queue_msg *dst = (struct nfnl_queue_msg *) _dst;
48e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	struct nfnl_queue_msg *src = (struct nfnl_queue_msg *) _src;
49e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	int err;
50e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
51e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	if (src->queue_msg_payload) {
52e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy		err = nfnl_queue_msg_set_payload(dst, src->queue_msg_payload,
53e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy						 src->queue_msg_payload_len);
54e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy		if (err < 0)
55e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy			goto errout;
56e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	}
57e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
58e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	return 0;
59e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyerrout:
60e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	return err;
61e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
62e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
63d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Grafstatic void nfnl_queue_msg_dump(struct nl_object *a, struct nl_dump_params *p)
64e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
65e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	struct nfnl_queue_msg *msg = (struct nfnl_queue_msg *) a;
66e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	struct nl_cache *link_cache;
67e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	char buf[64];
68e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
69054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	link_cache = nl_cache_mngt_require_safe("route/link");
70e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
71d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf	nl_new_line(p);
72d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf
73e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	if (msg->ce_mask & QUEUE_MSG_ATTR_GROUP)
74d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf		nl_dump(p, "GROUP=%u ", msg->queue_msg_group);
75e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
76e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	if (msg->ce_mask & QUEUE_MSG_ATTR_INDEV) {
77e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy		if (link_cache)
78d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf			nl_dump(p, "IN=%s ",
79e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy				rtnl_link_i2name(link_cache,
80e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy						 msg->queue_msg_indev,
81e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy						 buf, sizeof(buf)));
82e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy		else
83d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf			nl_dump(p, "IN=%d ", msg->queue_msg_indev);
84e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	}
85e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
86e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	if (msg->ce_mask & QUEUE_MSG_ATTR_PHYSINDEV) {
87e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy		if (link_cache)
88d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf			nl_dump(p, "PHYSIN=%s ",
89e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy				rtnl_link_i2name(link_cache,
90e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy						 msg->queue_msg_physindev,
91e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy						 buf, sizeof(buf)));
92e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy		else
93d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf			nl_dump(p, "IN=%d ", msg->queue_msg_physindev);
94e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	}
95e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
96e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	if (msg->ce_mask & QUEUE_MSG_ATTR_OUTDEV) {
97e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy		if (link_cache)
98d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf			nl_dump(p, "OUT=%s ",
99e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy				rtnl_link_i2name(link_cache,
100e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy						 msg->queue_msg_outdev,
101e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy						 buf, sizeof(buf)));
102e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy		else
103d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf			nl_dump(p, "OUT=%d ", msg->queue_msg_outdev);
104e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	}
105e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
106e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	if (msg->ce_mask & QUEUE_MSG_ATTR_PHYSOUTDEV) {
107e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy		if (link_cache)
108d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf			nl_dump(p, "PHYSOUT=%s ",
109e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy				rtnl_link_i2name(link_cache,
110e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy						 msg->queue_msg_physoutdev,
111e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy						 buf, sizeof(buf)));
112e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy		else
113d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf			nl_dump(p, "PHYSOUT=%d ", msg->queue_msg_physoutdev);
114e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	}
115e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
116e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	if (msg->ce_mask & QUEUE_MSG_ATTR_HWADDR) {
117e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy		int i;
118e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
119d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf		nl_dump(p, "MAC");
120e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy		for (i = 0; i < msg->queue_msg_hwaddr_len; i++)
121d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf			nl_dump(p, "%c%02x", i?':':'=',
122e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy				msg->queue_msg_hwaddr[i]);
123d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf		nl_dump(p, " ");
124e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	}
125e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
126e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	if (msg->ce_mask & QUEUE_MSG_ATTR_FAMILY)
127d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf		nl_dump(p, "FAMILY=%s ",
128e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy			nl_af2str(msg->queue_msg_family, buf, sizeof(buf)));
129e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
130e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	if (msg->ce_mask & QUEUE_MSG_ATTR_HWPROTO)
131d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf		nl_dump(p, "HWPROTO=%s ",
132e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy			nl_ether_proto2str(ntohs(msg->queue_msg_hwproto),
133e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy					   buf, sizeof(buf)));
134e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
135e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	if (msg->ce_mask & QUEUE_MSG_ATTR_HOOK)
136d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf		nl_dump(p, "HOOK=%s ",
137e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy			nfnl_inet_hook2str(msg->queue_msg_hook,
138e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy					   buf, sizeof(buf)));
139e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
140e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	if (msg->ce_mask & QUEUE_MSG_ATTR_MARK)
141d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf		nl_dump(p, "MARK=%d ", msg->queue_msg_mark);
142e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
143e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	if (msg->ce_mask & QUEUE_MSG_ATTR_PAYLOAD)
144d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf		nl_dump(p, "PAYLOADLEN=%d ", msg->queue_msg_payload_len);
145e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
146e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	if (msg->ce_mask & QUEUE_MSG_ATTR_PACKETID)
147d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf		nl_dump(p, "PACKETID=%u ", msg->queue_msg_packetid);
148e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
149e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	if (msg->ce_mask & QUEUE_MSG_ATTR_VERDICT)
150d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf		nl_dump(p, "VERDICT=%s ",
151e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy			nfnl_verdict2str(msg->queue_msg_verdict,
152e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy					 buf, sizeof(buf)));
153e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
154d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf	nl_dump(p, "\n");
155054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart
156054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	if (link_cache)
157054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart		nl_cache_put(link_cache);
158e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
159e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
160e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy/**
161e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy * @name Allocation/Freeing
162e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy * @{
163e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy */
164e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
165e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardystruct nfnl_queue_msg *nfnl_queue_msg_alloc(void)
166e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
167e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	return (struct nfnl_queue_msg *) nl_object_alloc(&queue_msg_obj_ops);
168e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
169e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
170e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyvoid nfnl_queue_msg_get(struct nfnl_queue_msg *msg)
171e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
172e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	nl_object_get((struct nl_object *) msg);
173e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
174e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
175e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyvoid nfnl_queue_msg_put(struct nfnl_queue_msg *msg)
176e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
177e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	nl_object_put((struct nl_object *) msg);
178e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
179e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
180e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy/** @} */
181e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
182e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy/**
183e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy * @name Attributes
184e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy * @{
185e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy */
186e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
187e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyvoid nfnl_queue_msg_set_group(struct nfnl_queue_msg *msg, uint16_t group)
188e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
189e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	msg->queue_msg_group = group;
190e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	msg->ce_mask |= QUEUE_MSG_ATTR_GROUP;
191e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
192e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
193e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyint nfnl_queue_msg_test_group(const struct nfnl_queue_msg *msg)
194e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
195e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	return !!(msg->ce_mask & QUEUE_MSG_ATTR_GROUP);
196e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
197e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
198e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyuint16_t nfnl_queue_msg_get_group(const struct nfnl_queue_msg *msg)
199e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
200e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	return msg->queue_msg_group;
201e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
202e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
203cafdaa4e065a2ee658d7e361158100f4c7abe445Karl Hiramoto/**
204cafdaa4e065a2ee658d7e361158100f4c7abe445Karl Hiramoto* Set the protocol family
205cafdaa4e065a2ee658d7e361158100f4c7abe445Karl Hiramoto* @arg msg         NF queue message
206cafdaa4e065a2ee658d7e361158100f4c7abe445Karl Hiramoto* @arg family      AF_XXX  address family  example: AF_INET, AF_UNIX, etc
207cafdaa4e065a2ee658d7e361158100f4c7abe445Karl Hiramoto*/
208e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyvoid nfnl_queue_msg_set_family(struct nfnl_queue_msg *msg, uint8_t family)
209e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
210e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	msg->queue_msg_family = family;
211e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	msg->ce_mask |= QUEUE_MSG_ATTR_FAMILY;
212e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
213e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
214e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyint nfnl_queue_msg_test_family(const struct nfnl_queue_msg *msg)
215e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
216e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	return !!(msg->ce_mask & QUEUE_MSG_ATTR_FAMILY);
217e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
218e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
219e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyuint8_t nfnl_queue_msg_get_family(const struct nfnl_queue_msg *msg)
220e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
221e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	if (msg->ce_mask & QUEUE_MSG_ATTR_FAMILY)
222e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy		return msg->queue_msg_family;
223e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	else
224e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy		return AF_UNSPEC;
225e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
226e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
227e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyvoid nfnl_queue_msg_set_packetid(struct nfnl_queue_msg *msg, uint32_t packetid)
228e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
229e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	msg->queue_msg_packetid = packetid;
230e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	msg->ce_mask |= QUEUE_MSG_ATTR_PACKETID;
231e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
232e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
233e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyint nfnl_queue_msg_test_packetid(const struct nfnl_queue_msg *msg)
234e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
235e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	return !!(msg->ce_mask & QUEUE_MSG_ATTR_PACKETID);
236e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
237e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
238ca0988a2a793bf06381ef1237178df6115b34c80Patrick McHardyuint32_t nfnl_queue_msg_get_packetid(const struct nfnl_queue_msg *msg)
239e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
240e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	return msg->queue_msg_packetid;
241e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
242e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
243e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyvoid nfnl_queue_msg_set_hwproto(struct nfnl_queue_msg *msg, uint16_t hwproto)
244e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
245e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	msg->queue_msg_hwproto = hwproto;
246e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	msg->ce_mask |= QUEUE_MSG_ATTR_HWPROTO;
247e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
248e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
249e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyint nfnl_queue_msg_test_hwproto(const struct nfnl_queue_msg *msg)
250e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
251e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	return !!(msg->ce_mask & QUEUE_MSG_ATTR_HWPROTO);
252e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
253e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
254e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyuint16_t nfnl_queue_msg_get_hwproto(const struct nfnl_queue_msg *msg)
255e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
256e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	return msg->queue_msg_hwproto;
257e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
258e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
259e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyvoid nfnl_queue_msg_set_hook(struct nfnl_queue_msg *msg, uint8_t hook)
260e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
261e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	msg->queue_msg_hook = hook;
262e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	msg->ce_mask |= QUEUE_MSG_ATTR_HOOK;
263e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
264e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
265e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyint nfnl_queue_msg_test_hook(const struct nfnl_queue_msg *msg)
266e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
267e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	return !!(msg->ce_mask & QUEUE_MSG_ATTR_HOOK);
268e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
269e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
270e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyuint8_t nfnl_queue_msg_get_hook(const struct nfnl_queue_msg *msg)
271e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
272e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	return msg->queue_msg_hook;
273e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
274e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
275e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyvoid nfnl_queue_msg_set_mark(struct nfnl_queue_msg *msg, uint32_t mark)
276e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
277e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	msg->queue_msg_mark = mark;
278e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	msg->ce_mask |= QUEUE_MSG_ATTR_MARK;
279e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
280e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
281e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyint nfnl_queue_msg_test_mark(const struct nfnl_queue_msg *msg)
282e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
283e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	return !!(msg->ce_mask & QUEUE_MSG_ATTR_MARK);
284e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
285e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
286e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyuint32_t nfnl_queue_msg_get_mark(const struct nfnl_queue_msg *msg)
287e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
288e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	return msg->queue_msg_mark;
289e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
290e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
291e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyvoid nfnl_queue_msg_set_timestamp(struct nfnl_queue_msg *msg,
292e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy				  struct timeval *tv)
293e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
294e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	msg->queue_msg_timestamp.tv_sec = tv->tv_sec;
295e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	msg->queue_msg_timestamp.tv_usec = tv->tv_usec;
296e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	msg->ce_mask |= QUEUE_MSG_ATTR_TIMESTAMP;
297e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
298e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
299e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyint nfnl_queue_msg_test_timestamp(const struct nfnl_queue_msg *msg)
300e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
301e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	return !!(msg->ce_mask & QUEUE_MSG_ATTR_TIMESTAMP);
302e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
303e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
304e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyconst struct timeval *nfnl_queue_msg_get_timestamp(const struct nfnl_queue_msg *msg)
305e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
306e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	if (!(msg->ce_mask & QUEUE_MSG_ATTR_TIMESTAMP))
307e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy		return NULL;
308e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	return &msg->queue_msg_timestamp;
309e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
310e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
311e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyvoid nfnl_queue_msg_set_indev(struct nfnl_queue_msg *msg, uint32_t indev)
312e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
313e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	msg->queue_msg_indev = indev;
314e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	msg->ce_mask |= QUEUE_MSG_ATTR_INDEV;
315e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
316e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
317e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyint nfnl_queue_msg_test_indev(const struct nfnl_queue_msg *msg)
318e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
319e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	return !!(msg->ce_mask & QUEUE_MSG_ATTR_INDEV);
320e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
321e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
322e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyuint32_t nfnl_queue_msg_get_indev(const struct nfnl_queue_msg *msg)
323e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
324e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	return msg->queue_msg_indev;
325e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
326e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
327e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyvoid nfnl_queue_msg_set_outdev(struct nfnl_queue_msg *msg, uint32_t outdev)
328e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
329e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	msg->queue_msg_outdev = outdev;
330e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	msg->ce_mask |= QUEUE_MSG_ATTR_OUTDEV;
331e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
332e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
333e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyint nfnl_queue_msg_test_outdev(const struct nfnl_queue_msg *msg)
334e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
335e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	return !!(msg->ce_mask & QUEUE_MSG_ATTR_OUTDEV);
336e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
337e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
338e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyuint32_t nfnl_queue_msg_get_outdev(const struct nfnl_queue_msg *msg)
339e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
340e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	return msg->queue_msg_outdev;
341e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
342e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
343e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyvoid nfnl_queue_msg_set_physindev(struct nfnl_queue_msg *msg,
344e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy				  uint32_t physindev)
345e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
346e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	msg->queue_msg_physindev = physindev;
347e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	msg->ce_mask |= QUEUE_MSG_ATTR_PHYSINDEV;
348e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
349e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
350e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyint nfnl_queue_msg_test_physindev(const struct nfnl_queue_msg *msg)
351e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
352e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	return !!(msg->ce_mask & QUEUE_MSG_ATTR_PHYSINDEV);
353e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
354e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
355e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyuint32_t nfnl_queue_msg_get_physindev(const struct nfnl_queue_msg *msg)
356e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
357e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	return msg->queue_msg_physindev;
358e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
359e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
360e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyvoid nfnl_queue_msg_set_physoutdev(struct nfnl_queue_msg *msg,
361e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy				   uint32_t physoutdev)
362e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
363e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	msg->queue_msg_physoutdev = physoutdev;
364e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	msg->ce_mask |= QUEUE_MSG_ATTR_PHYSOUTDEV;
365e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
366e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
367e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyint nfnl_queue_msg_test_physoutdev(const struct nfnl_queue_msg *msg)
368e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
369e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	return !!(msg->ce_mask & QUEUE_MSG_ATTR_PHYSOUTDEV);
370e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
371e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
372e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyuint32_t nfnl_queue_msg_get_physoutdev(const struct nfnl_queue_msg *msg)
373e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
374e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	return msg->queue_msg_physoutdev;
375e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
376e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
377e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyvoid nfnl_queue_msg_set_hwaddr(struct nfnl_queue_msg *msg, uint8_t *hwaddr,
378e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy			       int len)
379e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
380e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	if (len > sizeof(msg->queue_msg_hwaddr))
381e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy		len = sizeof(msg->queue_msg_hwaddr);
382e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
383e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	msg->queue_msg_hwaddr_len = len;
384e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	memcpy(msg->queue_msg_hwaddr, hwaddr, len);
385e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	msg->ce_mask |= QUEUE_MSG_ATTR_HWADDR;
386e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
387e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
388e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyint nfnl_queue_msg_test_hwaddr(const struct nfnl_queue_msg *msg)
389e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
390e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	return !!(msg->ce_mask & QUEUE_MSG_ATTR_HWADDR);
391e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
392e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
393e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyconst uint8_t *nfnl_queue_msg_get_hwaddr(const struct nfnl_queue_msg *msg,
394e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy					 int *len)
395e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
396e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	if (!(msg->ce_mask & QUEUE_MSG_ATTR_HWADDR)) {
397e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy		*len = 0;
398e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy		return NULL;
399e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	}
400e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
401e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	*len = msg->queue_msg_hwaddr_len;
402e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	return msg->queue_msg_hwaddr;
403e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
404e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
405e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyint nfnl_queue_msg_set_payload(struct nfnl_queue_msg *msg, uint8_t *payload,
406e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy			       int len)
407e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
408e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	free(msg->queue_msg_payload);
409e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	msg->queue_msg_payload = malloc(len);
410e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	if (!msg->queue_msg_payload)
4118a3efffa5b3fde252675239914118664d36a2c24Thomas Graf		return -NLE_NOMEM;
412e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
413e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	memcpy(msg->queue_msg_payload, payload, len);
414e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	msg->queue_msg_payload_len = len;
415e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	msg->ce_mask |= QUEUE_MSG_ATTR_PAYLOAD;
416e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	return 0;
417e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
418e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
419e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyint nfnl_queue_msg_test_payload(const struct nfnl_queue_msg *msg)
420e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
421e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	return !!(msg->ce_mask & QUEUE_MSG_ATTR_PAYLOAD);
422e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
423e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
424e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyconst void *nfnl_queue_msg_get_payload(const struct nfnl_queue_msg *msg, int *len)
425e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
426e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	if (!(msg->ce_mask & QUEUE_MSG_ATTR_PAYLOAD)) {
427e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy		*len = 0;
428e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy		return NULL;
429e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	}
430e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
431e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	*len = msg->queue_msg_payload_len;
432e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	return msg->queue_msg_payload;
433e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
434e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
435cafdaa4e065a2ee658d7e361158100f4c7abe445Karl Hiramoto/**
436cafdaa4e065a2ee658d7e361158100f4c7abe445Karl Hiramoto* Return the number of items matching a filter in the cache
437cafdaa4e065a2ee658d7e361158100f4c7abe445Karl Hiramoto* @arg msg        queue msg
438cafdaa4e065a2ee658d7e361158100f4c7abe445Karl Hiramoto* @arg verdict    NF_DROP, NF_ACCEPT, NF_REPEAT, etc
439cafdaa4e065a2ee658d7e361158100f4c7abe445Karl Hiramoto*/
440e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyvoid nfnl_queue_msg_set_verdict(struct nfnl_queue_msg *msg,
441e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy				unsigned int verdict)
442e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
443e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	msg->queue_msg_verdict = verdict;
444e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	msg->ce_mask |= QUEUE_MSG_ATTR_VERDICT;
445e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
446e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
447e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyint nfnl_queue_msg_test_verdict(const struct nfnl_queue_msg *msg)
448e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
449e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	return !!(msg->ce_mask & QUEUE_MSG_ATTR_VERDICT);
450e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
451e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
452e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyunsigned int nfnl_queue_msg_get_verdict(const struct nfnl_queue_msg *msg)
453e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
454e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	return msg->queue_msg_verdict;
455e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
456e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
457054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewartstatic const struct trans_tbl nfnl_queue_msg_attrs[] = {
458e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	__ADD(QUEUE_MSG_ATTR_GROUP,		group)
459e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	__ADD(QUEUE_MSG_ATTR_FAMILY,		family)
460e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	__ADD(QUEUE_MSG_ATTR_PACKETID,		packetid)
461e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	__ADD(QUEUE_MSG_ATTR_HWPROTO,		hwproto)
462e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	__ADD(QUEUE_MSG_ATTR_HOOK,		hook)
463e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	__ADD(QUEUE_MSG_ATTR_MARK,		mark)
464e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	__ADD(QUEUE_MSG_ATTR_TIMESTAMP,		timestamp)
465e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	__ADD(QUEUE_MSG_ATTR_INDEV,		indev)
466e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	__ADD(QUEUE_MSG_ATTR_OUTDEV,		outdev)
467e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	__ADD(QUEUE_MSG_ATTR_PHYSINDEV,		physindev)
468e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	__ADD(QUEUE_MSG_ATTR_PHYSOUTDEV,	physoutdev)
469e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	__ADD(QUEUE_MSG_ATTR_HWADDR,		hwaddr)
470e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	__ADD(QUEUE_MSG_ATTR_PAYLOAD,		payload)
471e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	__ADD(QUEUE_MSG_ATTR_VERDICT,		verdict)
472e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy};
473e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
474e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardystatic char *nfnl_queue_msg_attrs2str(int attrs, char *buf, size_t len)
475e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{
476e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	return __flags2str(attrs, buf, len, nfnl_queue_msg_attrs,
477e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy			   ARRAY_SIZE(nfnl_queue_msg_attrs));
478e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}
479e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
480e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy/** @} */
481e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
482e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardystruct nl_object_ops queue_msg_obj_ops = {
483e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	.oo_name		= "netfilter/queuemsg",
484e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	.oo_size		= sizeof(struct nfnl_queue_msg),
485e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	.oo_free_data		= nfnl_queue_msg_free_data,
486e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	.oo_clone		= nfnl_queue_msg_clone,
487d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf	.oo_dump = {
488d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf	    [NL_DUMP_LINE]	= nfnl_queue_msg_dump,
489d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf	    [NL_DUMP_DETAILS]	= nfnl_queue_msg_dump,
490d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf	    [NL_DUMP_STATS]	= nfnl_queue_msg_dump,
491d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf	},
492e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy	.oo_attrs2str		= nfnl_queue_msg_attrs2str,
493e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy};
494e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy
495e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy/** @} */
496