21 #include <sys/types.h>
22 #include <linux/netfilter/nfnetlink_log.h>
24 #include <netlink-private/netlink.h>
25 #include <netlink/attr.h>
26 #include <netlink/netfilter/nfnl.h>
27 #include <netlink/netfilter/log.h>
34 static int build_log_cmd_request(uint8_t family, uint16_t queuenum,
35 uint8_t command,
struct nl_msg **result)
38 struct nfulnl_msg_config_cmd cmd;
45 cmd.command = command;
46 if (
nla_put(msg, NFULA_CFG_CMD,
sizeof(cmd), &cmd) < 0)
57 static int send_log_request(
struct nl_sock *sk,
struct nl_msg *msg)
66 return wait_for_ack(sk);
69 int nfnl_log_build_pf_bind(uint8_t pf,
struct nl_msg **result)
71 return build_log_cmd_request(pf, 0, NFULNL_CFG_CMD_PF_BIND, result);
74 int nfnl_log_pf_bind(
struct nl_sock *nlh, uint8_t pf)
79 if ((err = nfnl_log_build_pf_bind(pf, &msg)) < 0)
82 return send_log_request(nlh, msg);
85 int nfnl_log_build_pf_unbind(uint8_t pf,
struct nl_msg **result)
87 return build_log_cmd_request(pf, 0, NFULNL_CFG_CMD_PF_UNBIND, result);
90 int nfnl_log_pf_unbind(
struct nl_sock *nlh, uint8_t pf)
95 if ((err = nfnl_log_build_pf_unbind(pf, &msg)) < 0)
98 return send_log_request(nlh, msg);
101 static int nfnl_log_build_request(
const struct nfnl_log *log,
102 struct nl_msg **result)
106 if (!nfnl_log_test_group(log))
107 return -NLE_MISSING_ATTR;
110 0, nfnl_log_get_group(log));
117 if (nfnl_log_test_copy_mode(log)) {
118 struct nfulnl_msg_config_mode mode;
120 switch (nfnl_log_get_copy_mode(log)) {
121 case NFNL_LOG_COPY_NONE:
122 mode.copy_mode = NFULNL_COPY_NONE;
124 case NFNL_LOG_COPY_META:
125 mode.copy_mode = NFULNL_COPY_META;
127 case NFNL_LOG_COPY_PACKET:
128 mode.copy_mode = NFULNL_COPY_PACKET;
131 mode.copy_range = htonl(nfnl_log_get_copy_range(log));
134 if (
nla_put(msg, NFULA_CFG_MODE,
sizeof(mode), &mode) < 0)
135 goto nla_put_failure;
138 if (nfnl_log_test_flush_timeout(log) &&
140 htonl(nfnl_log_get_flush_timeout(log))) < 0)
141 goto nla_put_failure;
143 if (nfnl_log_test_alloc_size(log) &&
145 htonl(nfnl_log_get_alloc_size(log))) < 0)
146 goto nla_put_failure;
148 if (nfnl_log_test_queue_threshold(log) &&
150 htonl(nfnl_log_get_queue_threshold(log))) < 0)
151 goto nla_put_failure;
161 int nfnl_log_build_create_request(
const struct nfnl_log *log,
162 struct nl_msg **result)
164 struct nfulnl_msg_config_cmd cmd;
167 if ((err = nfnl_log_build_request(log, result)) < 0)
170 cmd.command = NFULNL_CFG_CMD_BIND;
172 if (
nla_put(*result, NFULA_CFG_CMD,
sizeof(cmd), &cmd) < 0)
173 goto nla_put_failure;
182 int nfnl_log_create(
struct nl_sock *nlh,
const struct nfnl_log *log)
187 if ((err = nfnl_log_build_create_request(log, &msg)) < 0)
190 return send_log_request(nlh, msg);
193 int nfnl_log_build_change_request(
const struct nfnl_log *log,
194 struct nl_msg **result)
196 return nfnl_log_build_request(log, result);
199 int nfnl_log_change(
struct nl_sock *nlh,
const struct nfnl_log *log)
204 if ((err = nfnl_log_build_change_request(log, &msg)) < 0)
207 return send_log_request(nlh, msg);
210 int nfnl_log_build_delete_request(
const struct nfnl_log *log,
211 struct nl_msg **result)
213 if (!nfnl_log_test_group(log))
214 return -NLE_MISSING_ATTR;
216 return build_log_cmd_request(0, nfnl_log_get_group(log),
217 NFULNL_CFG_CMD_UNBIND, result);
220 int nfnl_log_delete(
struct nl_sock *nlh,
const struct nfnl_log *log)
225 if ((err = nfnl_log_build_delete_request(log, &msg)) < 0)
228 return send_log_request(nlh, msg);
233 static struct nl_cache_ops nfnl_log_ops = {
234 .co_name =
"netfilter/log",
235 .co_obj_ops = &log_obj_ops,
237 END_OF_MSGTYPES_LIST,
241 static void __init log_init(
void)
246 static void __exit log_exit(
void)