1 /* Shared library add-on to iptables to add ULOG support. 2 * 3 * (C) 2000 by Harald Welte <laforge (at) gnumonks.org> 4 * 5 * multipart netlink support based on ideas by Sebastian Zander 6 * <zander (at) fokus.gmd.de> 7 * 8 * This software is released under the terms of GNU GPL 9 * 10 * libipt_ULOG.c,v 1.7 2001/01/30 11:55:02 laforge Exp 11 */ 12 #include <stdio.h> 13 #include <string.h> 14 #include <strings.h> 15 #include <xtables.h> 16 /* For 64bit kernel / 32bit userspace */ 17 #include <linux/netfilter_ipv4/ipt_ULOG.h> 18 19 enum { 20 O_ULOG_NLGROUP = 0, 21 O_ULOG_PREFIX, 22 O_ULOG_CPRANGE, 23 O_ULOG_QTHR, 24 }; 25 26 static void ULOG_help(void) 27 { 28 printf("ULOG target options:\n" 29 " --ulog-nlgroup nlgroup NETLINK group used for logging\n" 30 " --ulog-cprange size Bytes of each packet to be passed\n" 31 " --ulog-qthreshold Threshold of in-kernel queue\n" 32 " --ulog-prefix prefix Prefix log messages with this prefix.\n"); 33 } 34 35 static const struct xt_option_entry ULOG_opts[] = { 36 {.name = "ulog-nlgroup", .id = O_ULOG_NLGROUP, .type = XTTYPE_UINT8, 37 .min = 1, .max = 32}, 38 {.name = "ulog-prefix", .id = O_ULOG_PREFIX, .type = XTTYPE_STRING, 39 .flags = XTOPT_PUT, XTOPT_POINTER(struct ipt_ulog_info, prefix), 40 .min = 1}, 41 {.name = "ulog-cprange", .id = O_ULOG_CPRANGE, .type = XTTYPE_UINT64}, 42 {.name = "ulog-qthreshold", .id = O_ULOG_QTHR, .type = XTTYPE_UINT64, 43 .min = 1, .max = ULOG_MAX_QLEN}, 44 XTOPT_TABLEEND, 45 }; 46 47 static void ULOG_init(struct xt_entry_target *t) 48 { 49 struct ipt_ulog_info *loginfo = (struct ipt_ulog_info *) t->data; 50 51 loginfo->nl_group = ULOG_DEFAULT_NLGROUP; 52 loginfo->qthreshold = ULOG_DEFAULT_QTHRESHOLD; 53 54 } 55 56 static void ULOG_parse(struct xt_option_call *cb) 57 { 58 struct ipt_ulog_info *loginfo = cb->data; 59 60 xtables_option_parse(cb); 61 switch (cb->entry->id) { 62 case O_ULOG_NLGROUP: 63 loginfo->nl_group = 1 << (cb->val.u8 - 1); 64 break; 65 case O_ULOG_PREFIX: 66 if (strchr(cb->arg, '\n') != NULL) 67 xtables_error(PARAMETER_PROBLEM, 68 "Newlines not allowed in --ulog-prefix"); 69 break; 70 case O_ULOG_CPRANGE: 71 loginfo->copy_range = cb->val.u64; 72 break; 73 case O_ULOG_QTHR: 74 loginfo->qthreshold = cb->val.u64; 75 break; 76 } 77 } 78 79 static void ULOG_save(const void *ip, const struct xt_entry_target *target) 80 { 81 const struct ipt_ulog_info *loginfo 82 = (const struct ipt_ulog_info *) target->data; 83 84 if (strcmp(loginfo->prefix, "") != 0) { 85 fputs(" --ulog-prefix", stdout); 86 xtables_save_string(loginfo->prefix); 87 } 88 89 if (loginfo->nl_group != ULOG_DEFAULT_NLGROUP) 90 printf(" --ulog-nlgroup %d", ffs(loginfo->nl_group)); 91 if (loginfo->copy_range) 92 printf(" --ulog-cprange %u", (unsigned int)loginfo->copy_range); 93 94 if (loginfo->qthreshold != ULOG_DEFAULT_QTHRESHOLD) 95 printf(" --ulog-qthreshold %u", (unsigned int)loginfo->qthreshold); 96 } 97 98 static void ULOG_print(const void *ip, const struct xt_entry_target *target, 99 int numeric) 100 { 101 const struct ipt_ulog_info *loginfo 102 = (const struct ipt_ulog_info *) target->data; 103 104 printf(" ULOG "); 105 printf("copy_range %u nlgroup %d", (unsigned int)loginfo->copy_range, 106 ffs(loginfo->nl_group)); 107 if (strcmp(loginfo->prefix, "") != 0) 108 printf(" prefix \"%s\"", loginfo->prefix); 109 printf(" queue_threshold %u", (unsigned int)loginfo->qthreshold); 110 } 111 112 static struct xtables_target ulog_tg_reg = { 113 .name = "ULOG", 114 .version = XTABLES_VERSION, 115 .family = NFPROTO_IPV4, 116 .size = XT_ALIGN(sizeof(struct ipt_ulog_info)), 117 .userspacesize = XT_ALIGN(sizeof(struct ipt_ulog_info)), 118 .help = ULOG_help, 119 .init = ULOG_init, 120 .print = ULOG_print, 121 .save = ULOG_save, 122 .x6_parse = ULOG_parse, 123 .x6_options = ULOG_opts, 124 }; 125 126 void _init(void) 127 { 128 xtables_register_target(&ulog_tg_reg); 129 } 130