Skip to content

Commit

Permalink
netfilter: nf_log: use an array of loggers instead of list
Browse files Browse the repository at this point in the history
Now that legacy ulog targets are not available anymore in the tree, we
can have up to two possible loggers:

1) The plain text logging via kernel logging ring.
2) The nfnetlink_log infrastructure which delivers log messages
   to userspace.

This patch replaces the list of loggers by an array of two pointers
per family for each possible logger and it also introduces a new field
to the nf_logger structure which indicates the position in the logger
array (based on the logger type).

This prepares a follow up patch that consolidates the nf_log_packet()
interface by allowing to specify the logger as parameter.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
  • Loading branch information
Pablo Neira Ayuso committed Jun 25, 2014
1 parent 7200135 commit 5962815
Show file tree
Hide file tree
Showing 5 changed files with 37 additions and 32 deletions.
15 changes: 9 additions & 6 deletions include/net/netfilter/nf_log.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,11 @@
#define NF_LOG_UID 0x08 /* Log UID owning local socket */
#define NF_LOG_MASK 0x0f

#define NF_LOG_TYPE_LOG 0x01
#define NF_LOG_TYPE_ULOG 0x02
enum nf_log_type {
NF_LOG_TYPE_LOG = 0,
NF_LOG_TYPE_ULOG,
NF_LOG_TYPE_MAX
};

struct nf_loginfo {
u_int8_t type;
Expand All @@ -40,10 +43,10 @@ typedef void nf_logfn(struct net *net,
const char *prefix);

struct nf_logger {
struct module *me;
nf_logfn *logfn;
char *name;
struct list_head list[NFPROTO_NUMPROTO];
char *name;
enum nf_log_type type;
nf_logfn *logfn;
struct module *me;
};

/* Function to register/unregister log function. */
Expand Down
1 change: 1 addition & 0 deletions net/bridge/netfilter/ebt_log.c
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,7 @@ static struct xt_target ebt_log_tg_reg __read_mostly = {

static struct nf_logger ebt_log_logger __read_mostly = {
.name = "ebt_log",
.type = NF_LOG_TYPE_LOG,
.logfn = &ebt_log_packet,
.me = THIS_MODULE,
};
Expand Down
50 changes: 24 additions & 26 deletions net/netfilter/nf_log.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,16 +16,22 @@
#define NF_LOG_PREFIXLEN 128
#define NFLOGGER_NAME_LEN 64

static struct list_head nf_loggers_l[NFPROTO_NUMPROTO] __read_mostly;
static struct nf_logger __rcu *loggers[NFPROTO_NUMPROTO][NF_LOG_TYPE_MAX] __read_mostly;
static DEFINE_MUTEX(nf_log_mutex);

static struct nf_logger *__find_logger(int pf, const char *str_logger)
{
struct nf_logger *t;
struct nf_logger *log;
int i;

for (i = 0; i < NF_LOG_TYPE_MAX; i++) {
if (loggers[pf][i] == NULL)
continue;

list_for_each_entry(t, &nf_loggers_l[pf], list[pf]) {
if (!strnicmp(str_logger, t->name, strlen(t->name)))
return t;
log = rcu_dereference_protected(loggers[pf][i],
lockdep_is_held(&nf_log_mutex));
if (!strnicmp(str_logger, log->name, strlen(log->name)))
return log;
}

return NULL;
Expand Down Expand Up @@ -73,17 +79,14 @@ int nf_log_register(u_int8_t pf, struct nf_logger *logger)
if (pf >= ARRAY_SIZE(init_net.nf.nf_loggers))
return -EINVAL;

for (i = 0; i < ARRAY_SIZE(logger->list); i++)
INIT_LIST_HEAD(&logger->list[i]);

mutex_lock(&nf_log_mutex);

if (pf == NFPROTO_UNSPEC) {
for (i = NFPROTO_UNSPEC; i < NFPROTO_NUMPROTO; i++)
list_add_tail(&(logger->list[i]), &(nf_loggers_l[i]));
rcu_assign_pointer(loggers[i][logger->type], logger);
} else {
/* register at end of list to honor first register win */
list_add_tail(&logger->list[pf], &nf_loggers_l[pf]);
rcu_assign_pointer(loggers[pf][logger->type], logger);
}

mutex_unlock(&nf_log_mutex);
Expand All @@ -98,7 +101,7 @@ void nf_log_unregister(struct nf_logger *logger)

mutex_lock(&nf_log_mutex);
for (i = 0; i < NFPROTO_NUMPROTO; i++)
list_del(&logger->list[i]);
RCU_INIT_POINTER(loggers[i][logger->type], NULL);
mutex_unlock(&nf_log_mutex);
}
EXPORT_SYMBOL(nf_log_unregister);
Expand Down Expand Up @@ -188,8 +191,7 @@ static int seq_show(struct seq_file *s, void *v)
{
loff_t *pos = v;
const struct nf_logger *logger;
struct nf_logger *t;
int ret;
int i, ret;
struct net *net = seq_file_net(s);

logger = rcu_dereference_protected(net->nf.nf_loggers[*pos],
Expand All @@ -203,11 +205,16 @@ static int seq_show(struct seq_file *s, void *v)
if (ret < 0)
return ret;

list_for_each_entry(t, &nf_loggers_l[*pos], list[*pos]) {
ret = seq_printf(s, "%s", t->name);
for (i = 0; i < NF_LOG_TYPE_MAX; i++) {
if (loggers[*pos][i] == NULL)
continue;

logger = rcu_dereference_protected(loggers[*pos][i],
lockdep_is_held(&nf_log_mutex));
ret = seq_printf(s, "%s", logger->name);
if (ret < 0)
return ret;
if (&t->list[*pos] != nf_loggers_l[*pos].prev) {
if (i == 0 && loggers[*pos][i + 1] != NULL) {
ret = seq_printf(s, ",");
if (ret < 0)
return ret;
Expand Down Expand Up @@ -389,14 +396,5 @@ static struct pernet_operations nf_log_net_ops = {

int __init netfilter_log_init(void)
{
int i, ret;

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

for (i = NFPROTO_UNSPEC; i < NFPROTO_NUMPROTO; i++)
INIT_LIST_HEAD(&(nf_loggers_l[i]));

return 0;
return register_pernet_subsys(&nf_log_net_ops);
}
1 change: 1 addition & 0 deletions net/netfilter/nfnetlink_log.c
Original file line number Diff line number Diff line change
Expand Up @@ -773,6 +773,7 @@ nfulnl_recv_unsupp(struct sock *ctnl, struct sk_buff *skb,

static struct nf_logger nfulnl_logger __read_mostly = {
.name = "nfnetlink_log",
.type = NF_LOG_TYPE_ULOG,
.logfn = &nfulnl_log_packet,
.me = THIS_MODULE,
};
Expand Down
2 changes: 2 additions & 0 deletions net/netfilter/xt_LOG.c
Original file line number Diff line number Diff line change
Expand Up @@ -896,13 +896,15 @@ static struct xt_target log_tg_regs[] __read_mostly = {

static struct nf_logger ipt_log_logger __read_mostly = {
.name = "ipt_LOG",
.type = NF_LOG_TYPE_LOG,
.logfn = &ipt_log_packet,
.me = THIS_MODULE,
};

#if IS_ENABLED(CONFIG_IP6_NF_IPTABLES)
static struct nf_logger ip6t_log_logger __read_mostly = {
.name = "ip6t_LOG",
.type = NF_LOG_TYPE_LOG,
.logfn = &ip6t_log_packet,
.me = THIS_MODULE,
};
Expand Down

0 comments on commit 5962815

Please sign in to comment.