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