Home | History | Annotate | Download | only in extensions
      1 /* ebt_nflog
      2  *
      3  * Authors:
      4  * Peter Warasin <peter (at) endian.com>
      5  *
      6  *  February, 2008
      7  *
      8  * Based on:
      9  *  ebt_ulog.c, (C) 2004, Bart De Schuymer <bdschuym (at) pandora.be>
     10  *  libxt_NFLOG.c
     11  *
     12  * Adapted to libxtables for ebtables-compat in 2015 by
     13  * Arturo Borrero Gonzalez <arturo (at) debian.org>
     14  */
     15 
     16 #include <stdio.h>
     17 #include <stdlib.h>
     18 #include <string.h>
     19 #include <getopt.h>
     20 #include <xtables.h>
     21 #include "iptables/nft.h"
     22 #include "iptables/nft-bridge.h"
     23 #include <linux/netfilter_bridge/ebt_nflog.h>
     24 
     25 enum {
     26 	NFLOG_GROUP	= 0x1,
     27 	NFLOG_PREFIX	= 0x2,
     28 	NFLOG_RANGE	= 0x4,
     29 	NFLOG_THRESHOLD	= 0x8,
     30 	NFLOG_NFLOG	= 0x16,
     31 };
     32 
     33 static struct option brnflog_opts[] = {
     34 	{ .name = "nflog-group",     .has_arg = true,  .val = NFLOG_GROUP},
     35 	{ .name = "nflog-prefix",    .has_arg = true,  .val = NFLOG_PREFIX},
     36 	{ .name = "nflog-range",     .has_arg = true,  .val = NFLOG_RANGE},
     37 	{ .name = "nflog-threshold", .has_arg = true,  .val = NFLOG_THRESHOLD},
     38 	{ .name = "nflog",           .has_arg = false, .val = NFLOG_NFLOG},
     39 	XT_GETOPT_TABLEEND,
     40 };
     41 
     42 static void brnflog_help(void)
     43 {
     44 	printf("nflog options:\n"
     45 	       "--nflog               : use the default nflog parameters\n"
     46 	       "--nflog-prefix prefix : Prefix string for log message\n"
     47 	       "--nflog-group group   : NETLINK group used for logging\n"
     48 	       "--nflog-range range   : Number of byte to copy\n"
     49 	       "--nflog-threshold     : Message threshold of"
     50 	       "in-kernel queue\n");
     51 }
     52 
     53 static void brnflog_init(struct xt_entry_target *t)
     54 {
     55 	struct ebt_nflog_info *info = (struct ebt_nflog_info *)t->data;
     56 
     57 	info->prefix[0]	= '\0';
     58 	info->group	= EBT_NFLOG_DEFAULT_GROUP;
     59 	info->threshold = EBT_NFLOG_DEFAULT_THRESHOLD;
     60 }
     61 
     62 static int brnflog_parse(int c, char **argv, int invert, unsigned int *flags,
     63 			 const void *entry, struct xt_entry_target **target)
     64 {
     65 	struct ebt_nflog_info *info = (struct ebt_nflog_info *)(*target)->data;
     66 	unsigned int i;
     67 
     68 	if (invert)
     69 		xtables_error(PARAMETER_PROBLEM,
     70 			      "The use of '!' makes no sense for the"
     71 			      " nflog watcher");
     72 
     73 	switch (c) {
     74 	case NFLOG_PREFIX:
     75 		EBT_CHECK_OPTION(flags, NFLOG_PREFIX);
     76 		if (strlen(optarg) > EBT_NFLOG_PREFIX_SIZE - 1)
     77 			xtables_error(PARAMETER_PROBLEM,
     78 				      "Prefix too long for nflog-prefix");
     79 		strncpy(info->prefix, optarg, EBT_NFLOG_PREFIX_SIZE);
     80 		break;
     81 	case NFLOG_GROUP:
     82 		EBT_CHECK_OPTION(flags, NFLOG_GROUP);
     83 		if (!xtables_strtoui(optarg, NULL, &i, 1, UINT32_MAX))
     84 			xtables_error(PARAMETER_PROBLEM,
     85 				      "--nflog-group must be a number!");
     86 		info->group = i;
     87 		break;
     88 	case NFLOG_RANGE:
     89 		EBT_CHECK_OPTION(flags, NFLOG_RANGE);
     90 		if (!xtables_strtoui(optarg, NULL, &i, 1, UINT32_MAX))
     91 			xtables_error(PARAMETER_PROBLEM,
     92 				      "--nflog-range must be a number!");
     93 		info->len = i;
     94 		break;
     95 	case NFLOG_THRESHOLD:
     96 		EBT_CHECK_OPTION(flags, NFLOG_THRESHOLD);
     97 		if (!xtables_strtoui(optarg, NULL, &i, 1, UINT32_MAX))
     98 			xtables_error(PARAMETER_PROBLEM,
     99 				      "--nflog-threshold must be a number!");
    100 		info->threshold = i;
    101 		break;
    102 	case NFLOG_NFLOG:
    103 		EBT_CHECK_OPTION(flags, NFLOG_NFLOG);
    104 		break;
    105 	default:
    106 		return 0;
    107 	}
    108 	return 1;
    109 }
    110 
    111 static void
    112 brnflog_print(const void *ip, const struct xt_entry_target *target,
    113 	      int numeric)
    114 {
    115 	struct ebt_nflog_info *info = (struct ebt_nflog_info *)target->data;
    116 
    117 	if (info->prefix[0] != '\0')
    118 		printf("--nflog-prefix \"%s\" ", info->prefix);
    119 	if (info->group)
    120 		printf("--nflog-group %d ", info->group);
    121 	if (info->len)
    122 		printf("--nflog-range %d ", info->len);
    123 	if (info->threshold != EBT_NFLOG_DEFAULT_THRESHOLD)
    124 		printf("--nflog-threshold %d ", info->threshold);
    125 }
    126 
    127 static struct xtables_target brnflog_watcher = {
    128 	.name		= "nflog",
    129 	.revision	= 0,
    130 	.version	= XTABLES_VERSION,
    131 	.family		= NFPROTO_BRIDGE,
    132 	.size		= XT_ALIGN(sizeof(struct ebt_nflog_info)),
    133 	.userspacesize	= XT_ALIGN(sizeof(struct ebt_nflog_info)),
    134 	.init		= brnflog_init,
    135 	.help		= brnflog_help,
    136 	.parse		= brnflog_parse,
    137 	.print		= brnflog_print,
    138 	.extra_opts	= brnflog_opts,
    139 };
    140 
    141 void _init(void)
    142 {
    143 	xtables_register_target(&brnflog_watcher);
    144 }
    145