// SPDX-License-Identifier: GPL-2.0-only
/*
 * (C) 2014 by Pablo Neira Ayuso <pablo@netfilter.org>
 */

#include <linux/module.h>
#include <linux/spinlock.h>
#include <linux/skbuff.h>
#include <linux/if_bridge.h>
#include <linux/ip.h>
#include <net/route.h>

#include <linux/netfilter.h>
#include <net/netfilter/nf_log.h>

static void nf_log_bridge_packet(struct net *net, u_int8_t pf,
				 unsigned int hooknum,
				 const struct sk_buff *skb,
				 const struct net_device *in,
				 const struct net_device *out,
				 const struct nf_loginfo *loginfo,
				 const char *prefix)
{
	nf_log_l2packet(net, pf, eth_hdr(skb)->h_proto, hooknum, skb,
			in, out, loginfo, prefix);
}

static struct nf_logger nf_bridge_logger __read_mostly = {
	.name		= "nf_log_bridge",
	.type		= NF_LOG_TYPE_LOG,
	.logfn		= nf_log_bridge_packet,
	.me		= THIS_MODULE,
};

static int __net_init nf_log_bridge_net_init(struct net *net)
{
	return nf_log_set(net, NFPROTO_BRIDGE, &nf_bridge_logger);
}

static void __net_exit nf_log_bridge_net_exit(struct net *net)
{
	nf_log_unset(net, &nf_bridge_logger);
}

static struct pernet_operations nf_log_bridge_net_ops = {
	.init = nf_log_bridge_net_init,
	.exit = nf_log_bridge_net_exit,
};

static int __init nf_log_bridge_init(void)
{
	int ret;

	/* Request to load the real packet loggers. */
	nf_logger_request_module(NFPROTO_IPV4, NF_LOG_TYPE_LOG);
	nf_logger_request_module(NFPROTO_IPV6, NF_LOG_TYPE_LOG);
	nf_logger_request_module(NFPROTO_ARP, NF_LOG_TYPE_LOG);

	ret = register_pernet_subsys(&nf_log_bridge_net_ops);
	if (ret < 0)
		return ret;

	nf_log_register(NFPROTO_BRIDGE, &nf_bridge_logger);
	return 0;
}

static void __exit nf_log_bridge_exit(void)
{
	unregister_pernet_subsys(&nf_log_bridge_net_ops);
	nf_log_unregister(&nf_bridge_logger);
}

module_init(nf_log_bridge_init);
module_exit(nf_log_bridge_exit);

MODULE_AUTHOR("Pablo Neira Ayuso <pablo@netfilter.org>");
MODULE_DESCRIPTION("Netfilter bridge packet logging");
MODULE_LICENSE("GPL");
MODULE_ALIAS_NF_LOGGER(AF_BRIDGE, 0);
