Jan Engelhardt | 32b8e61 | 2010-07-23 21:16:14 +0200 | [diff] [blame] | 1 | #include <stdbool.h> |
Yasuyuki KOZAKAIYasuyuki KOZAKAI | a16e114 | 2007-08-04 08:21:16 +0000 | [diff] [blame] | 2 | #include <stdlib.h> |
| 3 | #include <stdio.h> |
| 4 | #include <string.h> |
| 5 | #include <getopt.h> |
| 6 | #include <xtables.h> |
| 7 | |
| 8 | #include <linux/netfilter/x_tables.h> |
| 9 | #include <linux/netfilter/xt_NFLOG.h> |
| 10 | |
| 11 | enum { |
Jan Engelhardt | 6cfb28b | 2011-05-01 16:27:46 +0200 | [diff] [blame] | 12 | O_GROUP = 0, |
| 13 | O_PREFIX, |
| 14 | O_RANGE, |
| 15 | O_THRESHOLD, |
Yasuyuki KOZAKAIYasuyuki KOZAKAI | a16e114 | 2007-08-04 08:21:16 +0000 | [diff] [blame] | 16 | }; |
| 17 | |
Jan Engelhardt | 6cfb28b | 2011-05-01 16:27:46 +0200 | [diff] [blame] | 18 | #define s struct xt_nflog_info |
| 19 | static const struct xt_option_entry NFLOG_opts[] = { |
| 20 | {.name = "nflog-group", .id = O_GROUP, .type = XTTYPE_UINT16, |
| 21 | .flags = XTOPT_PUT, XTOPT_POINTER(s, group)}, |
| 22 | {.name = "nflog-prefix", .id = O_PREFIX, .type = XTTYPE_STRING, |
| 23 | .min = 1, .flags = XTOPT_PUT, XTOPT_POINTER(s, prefix)}, |
| 24 | {.name = "nflog-range", .id = O_RANGE, .type = XTTYPE_UINT32, |
| 25 | .flags = XTOPT_PUT, XTOPT_POINTER(s, len)}, |
| 26 | {.name = "nflog-threshold", .id = O_THRESHOLD, .type = XTTYPE_UINT16, |
| 27 | .flags = XTOPT_PUT, XTOPT_POINTER(s, threshold)}, |
| 28 | XTOPT_TABLEEND, |
Yasuyuki KOZAKAIYasuyuki KOZAKAI | a16e114 | 2007-08-04 08:21:16 +0000 | [diff] [blame] | 29 | }; |
Jan Engelhardt | 6cfb28b | 2011-05-01 16:27:46 +0200 | [diff] [blame] | 30 | #undef s |
Yasuyuki KOZAKAIYasuyuki KOZAKAI | a16e114 | 2007-08-04 08:21:16 +0000 | [diff] [blame] | 31 | |
Jan Engelhardt | 932e648 | 2007-10-04 16:27:30 +0000 | [diff] [blame] | 32 | static void NFLOG_help(void) |
Yasuyuki KOZAKAIYasuyuki KOZAKAI | a16e114 | 2007-08-04 08:21:16 +0000 | [diff] [blame] | 33 | { |
Jan Engelhardt | 8b7c64d | 2008-04-15 11:48:25 +0200 | [diff] [blame] | 34 | printf("NFLOG target options:\n" |
Yasuyuki KOZAKAIYasuyuki KOZAKAI | a16e114 | 2007-08-04 08:21:16 +0000 | [diff] [blame] | 35 | " --nflog-group NUM NETLINK group used for logging\n" |
| 36 | " --nflog-range NUM Number of byte to copy\n" |
| 37 | " --nflog-threshold NUM Message threshold of in-kernel queue\n" |
Jan Engelhardt | 8b7c64d | 2008-04-15 11:48:25 +0200 | [diff] [blame] | 38 | " --nflog-prefix STRING Prefix string for log messages\n"); |
Yasuyuki KOZAKAIYasuyuki KOZAKAI | a16e114 | 2007-08-04 08:21:16 +0000 | [diff] [blame] | 39 | } |
| 40 | |
Jan Engelhardt | 932e648 | 2007-10-04 16:27:30 +0000 | [diff] [blame] | 41 | static void NFLOG_init(struct xt_entry_target *t) |
Yasuyuki KOZAKAIYasuyuki KOZAKAI | a16e114 | 2007-08-04 08:21:16 +0000 | [diff] [blame] | 42 | { |
| 43 | struct xt_nflog_info *info = (struct xt_nflog_info *)t->data; |
| 44 | |
Yasuyuki KOZAKAIYasuyuki KOZAKAI | a16e114 | 2007-08-04 08:21:16 +0000 | [diff] [blame] | 45 | info->threshold = XT_NFLOG_DEFAULT_THRESHOLD; |
| 46 | } |
| 47 | |
Jan Engelhardt | 6cfb28b | 2011-05-01 16:27:46 +0200 | [diff] [blame] | 48 | static void NFLOG_parse(struct xt_option_call *cb) |
Yasuyuki KOZAKAIYasuyuki KOZAKAI | a16e114 | 2007-08-04 08:21:16 +0000 | [diff] [blame] | 49 | { |
Jan Engelhardt | 6cfb28b | 2011-05-01 16:27:46 +0200 | [diff] [blame] | 50 | xtables_option_parse(cb); |
| 51 | switch (cb->entry->id) { |
| 52 | case O_PREFIX: |
| 53 | if (strchr(cb->arg, '\n') != NULL) |
Jan Engelhardt | 1829ed4 | 2009-02-21 03:29:44 +0100 | [diff] [blame] | 54 | xtables_error(PARAMETER_PROBLEM, |
Jan Engelhardt | 6cfb28b | 2011-05-01 16:27:46 +0200 | [diff] [blame] | 55 | "Newlines not allowed in --log-prefix"); |
Yasuyuki KOZAKAIYasuyuki KOZAKAI | a16e114 | 2007-08-04 08:21:16 +0000 | [diff] [blame] | 56 | break; |
Yasuyuki KOZAKAIYasuyuki KOZAKAI | a16e114 | 2007-08-04 08:21:16 +0000 | [diff] [blame] | 57 | } |
Yasuyuki KOZAKAIYasuyuki KOZAKAI | a16e114 | 2007-08-04 08:21:16 +0000 | [diff] [blame] | 58 | } |
| 59 | |
Yasuyuki KOZAKAIYasuyuki KOZAKAI | a16e114 | 2007-08-04 08:21:16 +0000 | [diff] [blame] | 60 | static void nflog_print(const struct xt_nflog_info *info, char *prefix) |
| 61 | { |
Max Kellermann | a5d0994 | 2008-01-29 13:44:34 +0000 | [diff] [blame] | 62 | if (info->prefix[0] != '\0') { |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 63 | printf(" %snflog-prefix ", prefix); |
Jan Engelhardt | a0baae8 | 2009-01-30 04:32:50 +0100 | [diff] [blame] | 64 | xtables_save_string(info->prefix); |
Max Kellermann | a5d0994 | 2008-01-29 13:44:34 +0000 | [diff] [blame] | 65 | } |
Yasuyuki KOZAKAIYasuyuki KOZAKAI | a16e114 | 2007-08-04 08:21:16 +0000 | [diff] [blame] | 66 | if (info->group) |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 67 | printf(" %snflog-group %u", prefix, info->group); |
Yasuyuki KOZAKAIYasuyuki KOZAKAI | a16e114 | 2007-08-04 08:21:16 +0000 | [diff] [blame] | 68 | if (info->len) |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 69 | printf(" %snflog-range %u", prefix, info->len); |
Yasuyuki KOZAKAIYasuyuki KOZAKAI | a16e114 | 2007-08-04 08:21:16 +0000 | [diff] [blame] | 70 | if (info->threshold != XT_NFLOG_DEFAULT_THRESHOLD) |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 71 | printf(" %snflog-threshold %u", prefix, info->threshold); |
Yasuyuki KOZAKAIYasuyuki KOZAKAI | a16e114 | 2007-08-04 08:21:16 +0000 | [diff] [blame] | 72 | } |
| 73 | |
Jan Engelhardt | 932e648 | 2007-10-04 16:27:30 +0000 | [diff] [blame] | 74 | static void NFLOG_print(const void *ip, const struct xt_entry_target *target, |
| 75 | int numeric) |
Yasuyuki KOZAKAIYasuyuki KOZAKAI | a16e114 | 2007-08-04 08:21:16 +0000 | [diff] [blame] | 76 | { |
| 77 | const struct xt_nflog_info *info = (struct xt_nflog_info *)target->data; |
| 78 | |
| 79 | nflog_print(info, ""); |
| 80 | } |
| 81 | |
Jan Engelhardt | 932e648 | 2007-10-04 16:27:30 +0000 | [diff] [blame] | 82 | static void NFLOG_save(const void *ip, const struct xt_entry_target *target) |
Yasuyuki KOZAKAIYasuyuki KOZAKAI | a16e114 | 2007-08-04 08:21:16 +0000 | [diff] [blame] | 83 | { |
| 84 | const struct xt_nflog_info *info = (struct xt_nflog_info *)target->data; |
| 85 | |
| 86 | nflog_print(info, "--"); |
| 87 | } |
| 88 | |
Jan Engelhardt | 932e648 | 2007-10-04 16:27:30 +0000 | [diff] [blame] | 89 | static struct xtables_target nflog_target = { |
Jan Engelhardt | c5e8573 | 2009-06-12 20:55:44 +0200 | [diff] [blame] | 90 | .family = NFPROTO_UNSPEC, |
Yasuyuki KOZAKAIYasuyuki KOZAKAI | a16e114 | 2007-08-04 08:21:16 +0000 | [diff] [blame] | 91 | .name = "NFLOG", |
Jan Engelhardt | 8b7c64d | 2008-04-15 11:48:25 +0200 | [diff] [blame] | 92 | .version = XTABLES_VERSION, |
Yasuyuki KOZAKAIYasuyuki KOZAKAI | a16e114 | 2007-08-04 08:21:16 +0000 | [diff] [blame] | 93 | .size = XT_ALIGN(sizeof(struct xt_nflog_info)), |
| 94 | .userspacesize = XT_ALIGN(sizeof(struct xt_nflog_info)), |
Jan Engelhardt | 932e648 | 2007-10-04 16:27:30 +0000 | [diff] [blame] | 95 | .help = NFLOG_help, |
| 96 | .init = NFLOG_init, |
Jan Engelhardt | 6cfb28b | 2011-05-01 16:27:46 +0200 | [diff] [blame] | 97 | .x6_parse = NFLOG_parse, |
Jan Engelhardt | 932e648 | 2007-10-04 16:27:30 +0000 | [diff] [blame] | 98 | .print = NFLOG_print, |
| 99 | .save = NFLOG_save, |
Jan Engelhardt | 6cfb28b | 2011-05-01 16:27:46 +0200 | [diff] [blame] | 100 | .x6_options = NFLOG_opts, |
Yasuyuki KOZAKAIYasuyuki KOZAKAI | a16e114 | 2007-08-04 08:21:16 +0000 | [diff] [blame] | 101 | }; |
| 102 | |
| 103 | void _init(void) |
| 104 | { |
Jan Engelhardt | 932e648 | 2007-10-04 16:27:30 +0000 | [diff] [blame] | 105 | xtables_register_target(&nflog_target); |
Yasuyuki KOZAKAIYasuyuki KOZAKAI | a16e114 | 2007-08-04 08:21:16 +0000 | [diff] [blame] | 106 | } |