| 1 | // SPDX-License-Identifier: GPL-2.0-only | 
|---|
| 2 | /* | 
|---|
| 3 | * Copyright (c) 2006 Patrick McHardy <kaber@trash.net> | 
|---|
| 4 | */ | 
|---|
| 5 |  | 
|---|
| 6 | #include <linux/module.h> | 
|---|
| 7 | #include <linux/init.h> | 
|---|
| 8 | #include <linux/skbuff.h> | 
|---|
| 9 |  | 
|---|
| 10 | #include <linux/netfilter/x_tables.h> | 
|---|
| 11 | #include <linux/netfilter/xt_NFLOG.h> | 
|---|
| 12 | #include <net/netfilter/nf_log.h> | 
|---|
| 13 |  | 
|---|
| 14 | MODULE_AUTHOR( "Patrick McHardy <kaber@trash.net>"); | 
|---|
| 15 | MODULE_DESCRIPTION( "Xtables: packet logging to netlink using NFLOG"); | 
|---|
| 16 | MODULE_LICENSE( "GPL"); | 
|---|
| 17 | MODULE_ALIAS( "ipt_NFLOG"); | 
|---|
| 18 | MODULE_ALIAS( "ip6t_NFLOG"); | 
|---|
| 19 |  | 
|---|
| 20 | static unsigned int | 
|---|
| 21 | nflog_tg(struct sk_buff *skb, const struct xt_action_param *par) | 
|---|
| 22 | { | 
|---|
| 23 | const struct xt_nflog_info *info = par->targinfo; | 
|---|
| 24 | struct net *net = xt_net(par); | 
|---|
| 25 | struct nf_loginfo li; | 
|---|
| 26 |  | 
|---|
| 27 | li.type		     = NF_LOG_TYPE_ULOG; | 
|---|
| 28 | li.u.ulog.copy_len   = info->len; | 
|---|
| 29 | li.u.ulog.group	     = info->group; | 
|---|
| 30 | li.u.ulog.qthreshold = info->threshold; | 
|---|
| 31 | li.u.ulog.flags	     = 0; | 
|---|
| 32 |  | 
|---|
| 33 | if (info->flags & XT_NFLOG_F_COPY_LEN) | 
|---|
| 34 | li.u.ulog.flags |= NF_LOG_F_COPY_LEN; | 
|---|
| 35 |  | 
|---|
| 36 | nf_log_packet(net, pf: xt_family(par), hooknum: xt_hooknum(par), skb, in: xt_in(par), | 
|---|
| 37 | out: xt_out(par), li: &li, fmt: "%s", info->prefix); | 
|---|
| 38 |  | 
|---|
| 39 | return XT_CONTINUE; | 
|---|
| 40 | } | 
|---|
| 41 |  | 
|---|
| 42 | static int nflog_tg_check(const struct xt_tgchk_param *par) | 
|---|
| 43 | { | 
|---|
| 44 | const struct xt_nflog_info *info = par->targinfo; | 
|---|
| 45 | int ret; | 
|---|
| 46 |  | 
|---|
| 47 | if (info->flags & ~XT_NFLOG_MASK) | 
|---|
| 48 | return -EINVAL; | 
|---|
| 49 | if (info->prefix[sizeof(info->prefix) - 1] != '\0') | 
|---|
| 50 | return -EINVAL; | 
|---|
| 51 |  | 
|---|
| 52 | ret = nf_logger_find_get(pf: par->family, type: NF_LOG_TYPE_ULOG); | 
|---|
| 53 | if (ret != 0 && !par->nft_compat) { | 
|---|
| 54 | request_module( "%s", "nfnetlink_log"); | 
|---|
| 55 |  | 
|---|
| 56 | ret = nf_logger_find_get(pf: par->family, type: NF_LOG_TYPE_ULOG); | 
|---|
| 57 | } | 
|---|
| 58 |  | 
|---|
| 59 | return ret; | 
|---|
| 60 | } | 
|---|
| 61 |  | 
|---|
| 62 | static void nflog_tg_destroy(const struct xt_tgdtor_param *par) | 
|---|
| 63 | { | 
|---|
| 64 | nf_logger_put(pf: par->family, type: NF_LOG_TYPE_ULOG); | 
|---|
| 65 | } | 
|---|
| 66 |  | 
|---|
| 67 | static struct xt_target nflog_tg_reg[] __read_mostly = { | 
|---|
| 68 | { | 
|---|
| 69 | .name       = "NFLOG", | 
|---|
| 70 | .revision   = 0, | 
|---|
| 71 | .family     = NFPROTO_IPV4, | 
|---|
| 72 | .checkentry = nflog_tg_check, | 
|---|
| 73 | .destroy    = nflog_tg_destroy, | 
|---|
| 74 | .target     = nflog_tg, | 
|---|
| 75 | .targetsize = sizeof(struct xt_nflog_info), | 
|---|
| 76 | .me         = THIS_MODULE, | 
|---|
| 77 | }, | 
|---|
| 78 | #if IS_ENABLED(CONFIG_IP6_NF_IPTABLES) | 
|---|
| 79 | { | 
|---|
| 80 | .name       = "NFLOG", | 
|---|
| 81 | .revision   = 0, | 
|---|
| 82 | .family     = NFPROTO_IPV6, | 
|---|
| 83 | .checkentry = nflog_tg_check, | 
|---|
| 84 | .destroy    = nflog_tg_destroy, | 
|---|
| 85 | .target     = nflog_tg, | 
|---|
| 86 | .targetsize = sizeof(struct xt_nflog_info), | 
|---|
| 87 | .me         = THIS_MODULE, | 
|---|
| 88 | }, | 
|---|
| 89 | #endif | 
|---|
| 90 | }; | 
|---|
| 91 |  | 
|---|
| 92 | static int __init nflog_tg_init(void) | 
|---|
| 93 | { | 
|---|
| 94 | return xt_register_targets(target: nflog_tg_reg, ARRAY_SIZE(nflog_tg_reg)); | 
|---|
| 95 | } | 
|---|
| 96 |  | 
|---|
| 97 | static void __exit nflog_tg_exit(void) | 
|---|
| 98 | { | 
|---|
| 99 | xt_unregister_targets(target: nflog_tg_reg, ARRAY_SIZE(nflog_tg_reg)); | 
|---|
| 100 | } | 
|---|
| 101 |  | 
|---|
| 102 | module_init(nflog_tg_init); | 
|---|
| 103 | module_exit(nflog_tg_exit); | 
|---|
| 104 | MODULE_SOFTDEP( "pre: nfnetlink_log"); | 
|---|
| 105 |  | 
|---|