diff options
-rw-r--r-- | extensions/libxt_HARDIDLETIMER.c | 98 | ||||
-rw-r--r-- | extensions/libxt_HARDIDLETIMER.man | 24 | ||||
-rw-r--r-- | include/linux/netfilter/xt_HARDIDLETIMER.h | 55 |
3 files changed, 177 insertions, 0 deletions
diff --git a/extensions/libxt_HARDIDLETIMER.c b/extensions/libxt_HARDIDLETIMER.c new file mode 100644 index 0000000..a375e0e --- /dev/null +++ b/extensions/libxt_HARDIDLETIMER.c @@ -0,0 +1,98 @@ +/* + * Shared library add-on for iptables to add HARDIDLETIMER support. + * + * Copyright (c) 2014, The Linux Foundation. All rights reserved. + * + * Copyright (C) 2010 Nokia Corporation. All rights reserved. + * + * Contact: Luciano Coelho <luciano.coelho@nokia.com> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + */ +#include <stdio.h> +#include <xtables.h> +#include <linux/netfilter/xt_HARDIDLETIMER.h> + +enum { + O_TIMEOUT = 0, + O_LABEL, + O_NETLINK, +}; + +#define s struct hardidletimer_tg_info +static const struct xt_option_entry hardidletimer_tg_opts[] = { + {.name = "timeout", .id = O_TIMEOUT, .type = XTTYPE_UINT32, + .flags = XTOPT_MAND | XTOPT_PUT, XTOPT_POINTER(s, timeout)}, + {.name = "label", .id = O_LABEL, .type = XTTYPE_STRING, + .flags = XTOPT_MAND | XTOPT_PUT, XTOPT_POINTER(s, label)}, + {.name = "send_nl_msg", .id = O_NETLINK, .type = XTTYPE_UINT8, + .flags = XTOPT_PUT, XTOPT_POINTER(s, send_nl_msg)}, + XTOPT_TABLEEND, +}; +#undef s + +static void hardidletimer_tg_help(void) +{ + printf( + "HARDIDLETIMER target options:\n" + " --timeout time Timeout until the notification is sent (in seconds)\n" + " --label string Unique rule identifier\n" + " --send_nl_msg (0/1) Enable netlink messages," + "and show remaining time in sysfs. Defaults to 0.\n" + "\n"); +} + +static void hardidletimer_tg_print(const void *ip, + const struct xt_entry_target *target, + int numeric) +{ + struct hardidletimer_tg_info *info = + (struct hardidletimer_tg_info *) target->data; + + printf(" timeout:%u", info->timeout); + printf(" label:%s", info->label); + printf(" send_nl_msg:%u", info->send_nl_msg); +} + +static void hardidletimer_tg_save(const void *ip, + const struct xt_entry_target *target) +{ + struct hardidletimer_tg_info *info = + (struct hardidletimer_tg_info *) target->data; + + printf(" --timeout %u", info->timeout); + printf(" --label %s", info->label); + printf(" --send_nl_msg %u", info->send_nl_msg); +} + +static struct xtables_target hardidletimer_tg_reg = { + .family = NFPROTO_UNSPEC, + .name = "HARDIDLETIMER", + .version = XTABLES_VERSION, + .revision = 1, + .size = XT_ALIGN(sizeof(struct hardidletimer_tg_info)), + .userspacesize = offsetof(struct hardidletimer_tg_info, timer), + .help = hardidletimer_tg_help, + .x6_parse = xtables_option_parse, + .print = hardidletimer_tg_print, + .save = hardidletimer_tg_save, + .x6_options = hardidletimer_tg_opts, +}; + +void _init(void) +{ + xtables_register_target(&hardidletimer_tg_reg); +} diff --git a/extensions/libxt_HARDIDLETIMER.man b/extensions/libxt_HARDIDLETIMER.man new file mode 100644 index 0000000..e7e3124 --- /dev/null +++ b/extensions/libxt_HARDIDLETIMER.man @@ -0,0 +1,24 @@ +This target can be used to identify when interfaces have been idle for a +certain period of time. Timers are identified by labels and are created when +a rule is set with a new label. The rules also take a timeout value (in +seconds) as an option. If more than one rule uses the same timer label, the +timer will be restarted whenever any of the rules get a hit. One entry for +each timer is created in sysfs. This attribute contains the timer remaining +for the timer to expire. The attributes are located under the xt_hardidletimer +class: +.PP +/sys/class/xt_hardidletimer/timers/<label> +.PP +When the timer expires, the target module sends a sysfs notification to the +userspace, which can then decide what to do (eg. disconnect to save power). +.TP +\fB\-\-timeout\fP \fIamount\fP +This is the time in seconds that will trigger the notification. +.TP +\fB\-\-label\fP \fIstring\fP +This is a unique identifier for the timer. The maximum length for the +label string is 27 characters. +.TP +\fB\-\---send_nl_msg\fP \fI(0/1)\fP +Send netlink messages in addition to sysfs notifications and show remaining +time. Defaults to 0. diff --git a/include/linux/netfilter/xt_HARDIDLETIMER.h b/include/linux/netfilter/xt_HARDIDLETIMER.h new file mode 100644 index 0000000..58ff608 --- /dev/null +++ b/include/linux/netfilter/xt_HARDIDLETIMER.h @@ -0,0 +1,55 @@ +/* + * linux/include/linux/netfilter/xt_HARDIDLETIMER.h + * + * Header file for Xtables timer target module. + * + * Copyright (c) 2014, The Linux Foundation. All rights reserved. + * + * Copyright (C) 2004, 2010 Nokia Corporation + * + * Written by Timo Teras <ext-timo.teras@nokia.com> + * + * Converted to x_tables and forward-ported to 2.6.34 + * by Luciano Coelho <luciano.coelho@nokia.com> + * + * Contact: Luciano Coelho <luciano.coelho@nokia.com> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + */ + +#ifndef _XT_HARDIDLETIMER_H +#define _XT_HARDIDLETIMER_H + +#include <linux/types.h> + +#define MAX_HARDIDLETIMER_LABEL_SIZE 28 +#define NLMSG_MAX_SIZE 64 + +#define NL_EVENT_TYPE_INACTIVE 0 +#define NL_EVENT_TYPE_ACTIVE 1 + +struct hardidletimer_tg_info { + __u32 timeout; + + char label[MAX_HARDIDLETIMER_LABEL_SIZE]; + + /* Use netlink messages for notification in addition to sysfs */ + __u8 send_nl_msg; + + /* for kernel module internal use only */ + struct hardidletimer_tg *timer __attribute__((aligned(8))); +}; + +#endif |