Commit linux kernel-2.6.32.9 again because some files were different from the snapsho...
authorkt920.kim <kt920.kim@samsung.com>
Fri, 22 Apr 2011 06:09:58 +0000 (15:09 +0900)
committerkt920.kim <kt920.kim@samsung.com>
Fri, 22 Apr 2011 06:09:58 +0000 (15:09 +0900)
55 files changed:
Documentation/io-mapping.txt [new file with mode: 0644]
arch/ia64/scripts/check-gas [changed mode: 0644->0755]
arch/ia64/scripts/toolchain-flags [changed mode: 0644->0755]
arch/microblaze/boot/dts/system.dts [changed from file to symlink]
arch/powerpc/boot/wrapper [changed mode: 0644->0755]
arch/powerpc/relocs_check.pl [changed mode: 0644->0755]
drivers/mtd/chips/cfi_util.c [changed mode: 0644->0755]
drivers/mtd/inftlcore.c [changed mode: 0644->0755]
include/linux/netfilter/xt_CONNMARK.h [new file with mode: 0644]
include/linux/netfilter/xt_RATEEST.h [new file with mode: 0644]
include/linux/netfilter/xt_dscp.h [new file with mode: 0644]
include/linux/netfilter/xt_mark.h [new file with mode: 0644]
include/linux/netfilter/xt_tcpmss.h [new file with mode: 0644]
include/linux/netfilter_ipv4/ipt_TTL.h [new file with mode: 0644]
include/linux/netfilter_ipv4/ipt_ecn.h [new file with mode: 0644]
include/linux/netfilter_ipv6/ip6t_HL.h [new file with mode: 0644]
net/ipv4/netfilter/ipt_ecn.c [new file with mode: 0644]
net/netfilter/xt_CONNMARK.c [new file with mode: 0644]
net/netfilter/xt_RATEEST.c [new file with mode: 0644]
net/netfilter/xt_dscp.c [new file with mode: 0644]
net/netfilter/xt_hl.c [new file with mode: 0644]
net/netfilter/xt_mark.c [new file with mode: 0644]
net/netfilter/xt_tcpmss.c [new file with mode: 0644]
scripts/Lindent [changed mode: 0644->0755]
scripts/bloat-o-meter [changed mode: 0644->0755]
scripts/checkincludes.pl [changed mode: 0644->0755]
scripts/checkkconfigsymbols.sh [changed mode: 0644->0755]
scripts/checkpatch.pl [changed mode: 0644->0755]
scripts/checkstack.pl [changed mode: 0644->0755]
scripts/checksyscalls.sh [changed mode: 0644->0755]
scripts/checkversion.pl [changed mode: 0644->0755]
scripts/cleanfile [changed mode: 0644->0755]
scripts/cleanpatch [changed mode: 0644->0755]
scripts/config [changed mode: 0644->0755]
scripts/decodecode [changed mode: 0644->0755]
scripts/diffconfig [changed mode: 0644->0755]
scripts/extract-ikconfig [changed mode: 0644->0755]
scripts/get_maintainer.pl [changed mode: 0644->0755]
scripts/headerdep.pl [changed mode: 0644->0755]
scripts/headers.sh [changed mode: 0644->0755]
scripts/kconfig/check.sh [changed mode: 0644->0755]
scripts/kernel-doc [changed mode: 0644->0755]
scripts/makelst [changed mode: 0644->0755]
scripts/mkcompile_h [changed mode: 0644->0755]
scripts/mkuboot.sh [changed mode: 0644->0755]
scripts/namespace.pl [changed mode: 0644->0755]
scripts/package/mkspec [changed mode: 0644->0755]
scripts/patch-kernel [changed mode: 0644->0755]
scripts/recordmcount.pl [changed mode: 0644->0755]
scripts/setlocalversion [changed mode: 0644->0755]
scripts/show_delta [changed mode: 0644->0755]
scripts/tags.sh [changed mode: 0644->0755]
scripts/ver_linux [changed mode: 0644->0755]
tools/perf/util/PERF-VERSION-GEN [changed mode: 0644->0755]
tools/perf/util/generate-cmdlist.sh [changed mode: 0644->0755]

diff --git a/Documentation/io-mapping.txt b/Documentation/io-mapping.txt
new file mode 100644 (file)
index 0000000..473e43b
--- /dev/null
@@ -0,0 +1,82 @@
+The io_mapping functions in linux/io-mapping.h provide an abstraction for
+efficiently mapping small regions of an I/O device to the CPU. The initial
+usage is to support the large graphics aperture on 32-bit processors where
+ioremap_wc cannot be used to statically map the entire aperture to the CPU
+as it would consume too much of the kernel address space.
+
+A mapping object is created during driver initialization using
+
+       struct io_mapping *io_mapping_create_wc(unsigned long base,
+                                               unsigned long size)
+
+               'base' is the bus address of the region to be made
+               mappable, while 'size' indicates how large a mapping region to
+               enable. Both are in bytes.
+
+               This _wc variant provides a mapping which may only be used
+               with the io_mapping_map_atomic_wc or io_mapping_map_wc.
+
+With this mapping object, individual pages can be mapped either atomically
+or not, depending on the necessary scheduling environment. Of course, atomic
+maps are more efficient:
+
+       void *io_mapping_map_atomic_wc(struct io_mapping *mapping,
+                                      unsigned long offset)
+
+               'offset' is the offset within the defined mapping region.
+               Accessing addresses beyond the region specified in the
+               creation function yields undefined results. Using an offset
+               which is not page aligned yields an undefined result. The
+               return value points to a single page in CPU address space.
+
+               This _wc variant returns a write-combining map to the
+               page and may only be used with mappings created by
+               io_mapping_create_wc
+
+               Note that the task may not sleep while holding this page
+               mapped.
+
+       void io_mapping_unmap_atomic(void *vaddr)
+
+               'vaddr' must be the the value returned by the last
+               io_mapping_map_atomic_wc call. This unmaps the specified
+               page and allows the task to sleep once again.
+
+If you need to sleep while holding the lock, you can use the non-atomic
+variant, although they may be significantly slower.
+
+       void *io_mapping_map_wc(struct io_mapping *mapping,
+                               unsigned long offset)
+
+               This works like io_mapping_map_atomic_wc except it allows
+               the task to sleep while holding the page mapped.
+
+       void io_mapping_unmap(void *vaddr)
+
+               This works like io_mapping_unmap_atomic, except it is used
+               for pages mapped with io_mapping_map_wc.
+
+At driver close time, the io_mapping object must be freed:
+
+       void io_mapping_free(struct io_mapping *mapping)
+
+Current Implementation:
+
+The initial implementation of these functions uses existing mapping
+mechanisms and so provides only an abstraction layer and no new
+functionality.
+
+On 64-bit processors, io_mapping_create_wc calls ioremap_wc for the whole
+range, creating a permanent kernel-visible mapping to the resource. The
+map_atomic and map functions add the requested offset to the base of the
+virtual address returned by ioremap_wc.
+
+On 32-bit processors with HIGHMEM defined, io_mapping_map_atomic_wc uses
+kmap_atomic_pfn to map the specified page in an atomic fashion;
+kmap_atomic_pfn isn't really supposed to be used with device pages, but it
+provides an efficient mapping for this usage.
+
+On 32-bit processors without HIGHMEM defined, io_mapping_map_atomic_wc and
+io_mapping_map_wc both use ioremap_wc, a terribly inefficient function which
+performs an IPI to inform all processors about the new mapping. This results
+in a significant performance penalty.
old mode 100644 (file)
new mode 100755 (executable)
old mode 100644 (file)
new mode 100755 (executable)
deleted file mode 100644 (file)
index 7cb657892f21229d0068d2e7416e91e551264f77..0000000000000000000000000000000000000000
+++ /dev/null
@@ -1 +0,0 @@
-../../platform/generic/system.dts
\ No newline at end of file
new file mode 120000 (symlink)
index 0000000000000000000000000000000000000000..7cb657892f21229d0068d2e7416e91e551264f77
--- /dev/null
@@ -0,0 +1 @@
+../../platform/generic/system.dts
\ No newline at end of file
old mode 100644 (file)
new mode 100755 (executable)
old mode 100644 (file)
new mode 100755 (executable)
old mode 100644 (file)
new mode 100755 (executable)
old mode 100644 (file)
new mode 100755 (executable)
diff --git a/include/linux/netfilter/xt_CONNMARK.h b/include/linux/netfilter/xt_CONNMARK.h
new file mode 100644 (file)
index 0000000..0a85458
--- /dev/null
@@ -0,0 +1,26 @@
+#ifndef _XT_CONNMARK_H_target
+#define _XT_CONNMARK_H_target
+
+#include <linux/types.h>
+
+/* Copyright (C) 2002,2004 MARA Systems AB <http://www.marasystems.com>
+ * by Henrik Nordstrom <hno@marasystems.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+
+enum {
+       XT_CONNMARK_SET = 0,
+       XT_CONNMARK_SAVE,
+       XT_CONNMARK_RESTORE
+};
+
+struct xt_connmark_tginfo1 {
+       __u32 ctmark, ctmask, nfmask;
+       __u8 mode;
+};
+
+#endif /*_XT_CONNMARK_H_target*/
diff --git a/include/linux/netfilter/xt_RATEEST.h b/include/linux/netfilter/xt_RATEEST.h
new file mode 100644 (file)
index 0000000..6605e20
--- /dev/null
@@ -0,0 +1,15 @@
+#ifndef _XT_RATEEST_TARGET_H
+#define _XT_RATEEST_TARGET_H
+
+#include <linux/types.h>
+
+struct xt_rateest_target_info {
+       char                    name[IFNAMSIZ];
+       __s8                    interval;
+       __u8            ewma_log;
+
+       /* Used internally by the kernel */
+       struct xt_rateest       *est __attribute__((aligned(8)));
+};
+
+#endif /* _XT_RATEEST_TARGET_H */
diff --git a/include/linux/netfilter/xt_dscp.h b/include/linux/netfilter/xt_dscp.h
new file mode 100644 (file)
index 0000000..15f8932
--- /dev/null
@@ -0,0 +1,31 @@
+/* x_tables module for matching the IPv4/IPv6 DSCP field
+ *
+ * (C) 2002 Harald Welte <laforge@gnumonks.org>
+ * This software is distributed under GNU GPL v2, 1991
+ *
+ * See RFC2474 for a description of the DSCP field within the IP Header.
+ *
+ * xt_dscp.h,v 1.3 2002/08/05 19:00:21 laforge Exp
+*/
+#ifndef _XT_DSCP_H
+#define _XT_DSCP_H
+
+#include <linux/types.h>
+
+#define XT_DSCP_MASK   0xfc    /* 11111100 */
+#define XT_DSCP_SHIFT  2
+#define XT_DSCP_MAX    0x3f    /* 00111111 */
+
+/* match info */
+struct xt_dscp_info {
+       __u8 dscp;
+       __u8 invert;
+};
+
+struct xt_tos_match_info {
+       __u8 tos_mask;
+       __u8 tos_value;
+       __u8 invert;
+};
+
+#endif /* _XT_DSCP_H */
diff --git a/include/linux/netfilter/xt_mark.h b/include/linux/netfilter/xt_mark.h
new file mode 100644 (file)
index 0000000..6607c8f
--- /dev/null
@@ -0,0 +1,11 @@
+#ifndef _XT_MARK_H
+#define _XT_MARK_H
+
+#include <linux/types.h>
+
+struct xt_mark_mtinfo1 {
+       __u32 mark, mask;
+       __u8 invert;
+};
+
+#endif /*_XT_MARK_H*/
diff --git a/include/linux/netfilter/xt_tcpmss.h b/include/linux/netfilter/xt_tcpmss.h
new file mode 100644 (file)
index 0000000..fbac56b
--- /dev/null
@@ -0,0 +1,11 @@
+#ifndef _XT_TCPMSS_MATCH_H
+#define _XT_TCPMSS_MATCH_H
+
+#include <linux/types.h>
+
+struct xt_tcpmss_match_info {
+    __u16 mss_min, mss_max;
+    __u8 invert;
+};
+
+#endif /*_XT_TCPMSS_MATCH_H*/
diff --git a/include/linux/netfilter_ipv4/ipt_TTL.h b/include/linux/netfilter_ipv4/ipt_TTL.h
new file mode 100644 (file)
index 0000000..ee6611e
--- /dev/null
@@ -0,0 +1,21 @@
+/* TTL modification module for IP tables
+ * (C) 2000 by Harald Welte <laforge@netfilter.org> */
+
+#ifndef _IPT_TTL_H
+#define _IPT_TTL_H
+
+enum {
+       IPT_TTL_SET = 0,
+       IPT_TTL_INC,
+       IPT_TTL_DEC
+};
+
+#define IPT_TTL_MAXMODE        IPT_TTL_DEC
+
+struct ipt_TTL_info {
+       u_int8_t        mode;
+       u_int8_t        ttl;
+};
+
+
+#endif
diff --git a/include/linux/netfilter_ipv4/ipt_ecn.h b/include/linux/netfilter_ipv4/ipt_ecn.h
new file mode 100644 (file)
index 0000000..9945baa
--- /dev/null
@@ -0,0 +1,33 @@
+/* iptables module for matching the ECN header in IPv4 and TCP header
+ *
+ * (C) 2002 Harald Welte <laforge@gnumonks.org>
+ *
+ * This software is distributed under GNU GPL v2, 1991
+ * 
+ * ipt_ecn.h,v 1.4 2002/08/05 19:39:00 laforge Exp
+*/
+#ifndef _IPT_ECN_H
+#define _IPT_ECN_H
+#include <linux/netfilter/xt_dscp.h>
+
+#define IPT_ECN_IP_MASK        (~XT_DSCP_MASK)
+
+#define IPT_ECN_OP_MATCH_IP    0x01
+#define IPT_ECN_OP_MATCH_ECE   0x10
+#define IPT_ECN_OP_MATCH_CWR   0x20
+
+#define IPT_ECN_OP_MATCH_MASK  0xce
+
+/* match info */
+struct ipt_ecn_info {
+       u_int8_t operation;
+       u_int8_t invert;
+       u_int8_t ip_ect;
+       union {
+               struct {
+                       u_int8_t ect;
+               } tcp;
+       } proto;
+};
+
+#endif /* _IPT_ECN_H */
diff --git a/include/linux/netfilter_ipv6/ip6t_HL.h b/include/linux/netfilter_ipv6/ip6t_HL.h
new file mode 100644 (file)
index 0000000..afb7813
--- /dev/null
@@ -0,0 +1,22 @@
+/* Hop Limit modification module for ip6tables
+ * Maciej Soltysiak <solt@dns.toxicfilms.tv>
+ * Based on HW's TTL module */
+
+#ifndef _IP6T_HL_H
+#define _IP6T_HL_H
+
+enum {
+       IP6T_HL_SET = 0,
+       IP6T_HL_INC,
+       IP6T_HL_DEC
+};
+
+#define IP6T_HL_MAXMODE        IP6T_HL_DEC
+
+struct ip6t_HL_info {
+       u_int8_t        mode;
+       u_int8_t        hop_limit;
+};
+
+
+#endif
diff --git a/net/ipv4/netfilter/ipt_ecn.c b/net/ipv4/netfilter/ipt_ecn.c
new file mode 100644 (file)
index 0000000..6289b64
--- /dev/null
@@ -0,0 +1,129 @@
+/* IP tables module for matching the value of the IPv4 and TCP ECN bits
+ *
+ * (C) 2002 by Harald Welte <laforge@gnumonks.org>
+ *
+ * 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.
+ */
+
+#include <linux/in.h>
+#include <linux/ip.h>
+#include <net/ip.h>
+#include <linux/module.h>
+#include <linux/skbuff.h>
+#include <linux/tcp.h>
+
+#include <linux/netfilter/x_tables.h>
+#include <linux/netfilter_ipv4/ip_tables.h>
+#include <linux/netfilter_ipv4/ipt_ecn.h>
+
+MODULE_AUTHOR("Harald Welte <laforge@netfilter.org>");
+MODULE_DESCRIPTION("Xtables: Explicit Congestion Notification (ECN) flag match for IPv4");
+MODULE_LICENSE("GPL");
+
+static inline bool match_ip(const struct sk_buff *skb,
+                           const struct ipt_ecn_info *einfo)
+{
+       return (ip_hdr(skb)->tos & IPT_ECN_IP_MASK) == einfo->ip_ect;
+}
+
+static inline bool match_tcp(const struct sk_buff *skb,
+                            const struct ipt_ecn_info *einfo,
+                            bool *hotdrop)
+{
+       struct tcphdr _tcph;
+       const struct tcphdr *th;
+
+       /* In practice, TCP match does this, so can't fail.  But let's
+        * be good citizens.
+        */
+       th = skb_header_pointer(skb, ip_hdrlen(skb), sizeof(_tcph), &_tcph);
+       if (th == NULL) {
+               *hotdrop = false;
+               return false;
+       }
+
+       if (einfo->operation & IPT_ECN_OP_MATCH_ECE) {
+               if (einfo->invert & IPT_ECN_OP_MATCH_ECE) {
+                       if (th->ece == 1)
+                               return false;
+               } else {
+                       if (th->ece == 0)
+                               return false;
+               }
+       }
+
+       if (einfo->operation & IPT_ECN_OP_MATCH_CWR) {
+               if (einfo->invert & IPT_ECN_OP_MATCH_CWR) {
+                       if (th->cwr == 1)
+                               return false;
+               } else {
+                       if (th->cwr == 0)
+                               return false;
+               }
+       }
+
+       return true;
+}
+
+static bool ecn_mt(const struct sk_buff *skb, const struct xt_match_param *par)
+{
+       const struct ipt_ecn_info *info = par->matchinfo;
+
+       if (info->operation & IPT_ECN_OP_MATCH_IP)
+               if (!match_ip(skb, info))
+                       return false;
+
+       if (info->operation & (IPT_ECN_OP_MATCH_ECE|IPT_ECN_OP_MATCH_CWR)) {
+               if (ip_hdr(skb)->protocol != IPPROTO_TCP)
+                       return false;
+               if (!match_tcp(skb, info, par->hotdrop))
+                       return false;
+       }
+
+       return true;
+}
+
+static bool ecn_mt_check(const struct xt_mtchk_param *par)
+{
+       const struct ipt_ecn_info *info = par->matchinfo;
+       const struct ipt_ip *ip = par->entryinfo;
+
+       if (info->operation & IPT_ECN_OP_MATCH_MASK)
+               return false;
+
+       if (info->invert & IPT_ECN_OP_MATCH_MASK)
+               return false;
+
+       if (info->operation & (IPT_ECN_OP_MATCH_ECE|IPT_ECN_OP_MATCH_CWR)
+           && ip->proto != IPPROTO_TCP) {
+               printk(KERN_WARNING "ipt_ecn: can't match TCP bits in rule for"
+                      " non-tcp packets\n");
+               return false;
+       }
+
+       return true;
+}
+
+static struct xt_match ecn_mt_reg __read_mostly = {
+       .name           = "ecn",
+       .family         = NFPROTO_IPV4,
+       .match          = ecn_mt,
+       .matchsize      = sizeof(struct ipt_ecn_info),
+       .checkentry     = ecn_mt_check,
+       .me             = THIS_MODULE,
+};
+
+static int __init ecn_mt_init(void)
+{
+       return xt_register_match(&ecn_mt_reg);
+}
+
+static void __exit ecn_mt_exit(void)
+{
+       xt_unregister_match(&ecn_mt_reg);
+}
+
+module_init(ecn_mt_init);
+module_exit(ecn_mt_exit);
diff --git a/net/netfilter/xt_CONNMARK.c b/net/netfilter/xt_CONNMARK.c
new file mode 100644 (file)
index 0000000..5934570
--- /dev/null
@@ -0,0 +1,113 @@
+/*
+ *     xt_CONNMARK - Netfilter module to modify the connection mark values
+ *
+ *     Copyright (C) 2002,2004 MARA Systems AB <http://www.marasystems.com>
+ *     by Henrik Nordstrom <hno@marasystems.com>
+ *     Copyright © CC Computer Consultants GmbH, 2007 - 2008
+ *     Jan Engelhardt <jengelh@computergmbh.de>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+#include <linux/module.h>
+#include <linux/skbuff.h>
+#include <linux/ip.h>
+#include <net/checksum.h>
+
+MODULE_AUTHOR("Henrik Nordstrom <hno@marasystems.com>");
+MODULE_DESCRIPTION("Xtables: connection mark modification");
+MODULE_LICENSE("GPL");
+MODULE_ALIAS("ipt_CONNMARK");
+MODULE_ALIAS("ip6t_CONNMARK");
+
+#include <linux/netfilter/x_tables.h>
+#include <linux/netfilter/xt_CONNMARK.h>
+#include <net/netfilter/nf_conntrack_ecache.h>
+
+static unsigned int
+connmark_tg(struct sk_buff *skb, const struct xt_target_param *par)
+{
+       const struct xt_connmark_tginfo1 *info = par->targinfo;
+       enum ip_conntrack_info ctinfo;
+       struct nf_conn *ct;
+       u_int32_t newmark;
+
+       ct = nf_ct_get(skb, &ctinfo);
+       if (ct == NULL)
+               return XT_CONTINUE;
+
+       switch (info->mode) {
+       case XT_CONNMARK_SET:
+               newmark = (ct->mark & ~info->ctmask) ^ info->ctmark;
+               if (ct->mark != newmark) {
+                       ct->mark = newmark;
+                       nf_conntrack_event_cache(IPCT_MARK, ct);
+               }
+               break;
+       case XT_CONNMARK_SAVE:
+               newmark = (ct->mark & ~info->ctmask) ^
+                         (skb->mark & info->nfmask);
+               if (ct->mark != newmark) {
+                       ct->mark = newmark;
+                       nf_conntrack_event_cache(IPCT_MARK, ct);
+               }
+               break;
+       case XT_CONNMARK_RESTORE:
+               newmark = (skb->mark & ~info->nfmask) ^
+                         (ct->mark & info->ctmask);
+               skb->mark = newmark;
+               break;
+       }
+
+       return XT_CONTINUE;
+}
+
+static bool connmark_tg_check(const struct xt_tgchk_param *par)
+{
+       if (nf_ct_l3proto_try_module_get(par->family) < 0) {
+               printk(KERN_WARNING "cannot load conntrack support for "
+                      "proto=%u\n", par->family);
+               return false;
+       }
+       return true;
+}
+
+static void connmark_tg_destroy(const struct xt_tgdtor_param *par)
+{
+       nf_ct_l3proto_module_put(par->family);
+}
+
+static struct xt_target connmark_tg_reg __read_mostly = {
+       .name           = "CONNMARK",
+       .revision       = 1,
+       .family         = NFPROTO_UNSPEC,
+       .checkentry     = connmark_tg_check,
+       .target         = connmark_tg,
+       .targetsize     = sizeof(struct xt_connmark_tginfo1),
+       .destroy        = connmark_tg_destroy,
+       .me             = THIS_MODULE,
+};
+
+static int __init connmark_tg_init(void)
+{
+       return xt_register_target(&connmark_tg_reg);
+}
+
+static void __exit connmark_tg_exit(void)
+{
+       xt_unregister_target(&connmark_tg_reg);
+}
+
+module_init(connmark_tg_init);
+module_exit(connmark_tg_exit);
diff --git a/net/netfilter/xt_RATEEST.c b/net/netfilter/xt_RATEEST.c
new file mode 100644 (file)
index 0000000..d80b819
--- /dev/null
@@ -0,0 +1,183 @@
+/*
+ * (C) 2007 Patrick McHardy <kaber@trash.net>
+ *
+ * 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.
+ */
+#include <linux/module.h>
+#include <linux/skbuff.h>
+#include <linux/gen_stats.h>
+#include <linux/jhash.h>
+#include <linux/rtnetlink.h>
+#include <linux/random.h>
+#include <net/gen_stats.h>
+#include <net/netlink.h>
+
+#include <linux/netfilter/x_tables.h>
+#include <linux/netfilter/xt_RATEEST.h>
+#include <net/netfilter/xt_rateest.h>
+
+static DEFINE_MUTEX(xt_rateest_mutex);
+
+#define RATEEST_HSIZE  16
+static struct hlist_head rateest_hash[RATEEST_HSIZE] __read_mostly;
+static unsigned int jhash_rnd __read_mostly;
+
+static unsigned int xt_rateest_hash(const char *name)
+{
+       return jhash(name, FIELD_SIZEOF(struct xt_rateest, name), jhash_rnd) &
+              (RATEEST_HSIZE - 1);
+}
+
+static void xt_rateest_hash_insert(struct xt_rateest *est)
+{
+       unsigned int h;
+
+       h = xt_rateest_hash(est->name);
+       hlist_add_head(&est->list, &rateest_hash[h]);
+}
+
+struct xt_rateest *xt_rateest_lookup(const char *name)
+{
+       struct xt_rateest *est;
+       struct hlist_node *n;
+       unsigned int h;
+
+       h = xt_rateest_hash(name);
+       mutex_lock(&xt_rateest_mutex);
+       hlist_for_each_entry(est, n, &rateest_hash[h], list) {
+               if (strcmp(est->name, name) == 0) {
+                       est->refcnt++;
+                       mutex_unlock(&xt_rateest_mutex);
+                       return est;
+               }
+       }
+       mutex_unlock(&xt_rateest_mutex);
+       return NULL;
+}
+EXPORT_SYMBOL_GPL(xt_rateest_lookup);
+
+void xt_rateest_put(struct xt_rateest *est)
+{
+       mutex_lock(&xt_rateest_mutex);
+       if (--est->refcnt == 0) {
+               hlist_del(&est->list);
+               gen_kill_estimator(&est->bstats, &est->rstats);
+               kfree(est);
+       }
+       mutex_unlock(&xt_rateest_mutex);
+}
+EXPORT_SYMBOL_GPL(xt_rateest_put);
+
+static unsigned int
+xt_rateest_tg(struct sk_buff *skb, const struct xt_target_param *par)
+{
+       const struct xt_rateest_target_info *info = par->targinfo;
+       struct gnet_stats_basic_packed *stats = &info->est->bstats;
+
+       spin_lock_bh(&info->est->lock);
+       stats->bytes += skb->len;
+       stats->packets++;
+       spin_unlock_bh(&info->est->lock);
+
+       return XT_CONTINUE;
+}
+
+static bool xt_rateest_tg_checkentry(const struct xt_tgchk_param *par)
+{
+       struct xt_rateest_target_info *info = par->targinfo;
+       struct xt_rateest *est;
+       struct {
+               struct nlattr           opt;
+               struct gnet_estimator   est;
+       } cfg;
+
+       est = xt_rateest_lookup(info->name);
+       if (est) {
+               /*
+                * If estimator parameters are specified, they must match the
+                * existing estimator.
+                */
+               if ((!info->interval && !info->ewma_log) ||
+                   (info->interval != est->params.interval ||
+                    info->ewma_log != est->params.ewma_log)) {
+                       xt_rateest_put(est);
+                       return false;
+               }
+               info->est = est;
+               return true;
+       }
+
+       est = kzalloc(sizeof(*est), GFP_KERNEL);
+       if (!est)
+               goto err1;
+
+       strlcpy(est->name, info->name, sizeof(est->name));
+       spin_lock_init(&est->lock);
+       est->refcnt             = 1;
+       est->params.interval    = info->interval;
+       est->params.ewma_log    = info->ewma_log;
+
+       cfg.opt.nla_len         = nla_attr_size(sizeof(cfg.est));
+       cfg.opt.nla_type        = TCA_STATS_RATE_EST;
+       cfg.est.interval        = info->interval;
+       cfg.est.ewma_log        = info->ewma_log;
+
+       if (gen_new_estimator(&est->bstats, &est->rstats, &est->lock,
+                             &cfg.opt) < 0)
+               goto err2;
+
+       info->est = est;
+       xt_rateest_hash_insert(est);
+
+       return true;
+
+err2:
+       kfree(est);
+err1:
+       return false;
+}
+
+static void xt_rateest_tg_destroy(const struct xt_tgdtor_param *par)
+{
+       struct xt_rateest_target_info *info = par->targinfo;
+
+       xt_rateest_put(info->est);
+}
+
+static struct xt_target xt_rateest_tg_reg __read_mostly = {
+       .name       = "RATEEST",
+       .revision   = 0,
+       .family     = NFPROTO_UNSPEC,
+       .target     = xt_rateest_tg,
+       .checkentry = xt_rateest_tg_checkentry,
+       .destroy    = xt_rateest_tg_destroy,
+       .targetsize = sizeof(struct xt_rateest_target_info),
+       .me         = THIS_MODULE,
+};
+
+static int __init xt_rateest_tg_init(void)
+{
+       unsigned int i;
+
+       for (i = 0; i < ARRAY_SIZE(rateest_hash); i++)
+               INIT_HLIST_HEAD(&rateest_hash[i]);
+
+       get_random_bytes(&jhash_rnd, sizeof(jhash_rnd));
+       return xt_register_target(&xt_rateest_tg_reg);
+}
+
+static void __exit xt_rateest_tg_fini(void)
+{
+       xt_unregister_target(&xt_rateest_tg_reg);
+}
+
+
+MODULE_AUTHOR("Patrick McHardy <kaber@trash.net>");
+MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("Xtables: packet rate estimator");
+MODULE_ALIAS("ipt_RATEEST");
+MODULE_ALIAS("ip6t_RATEEST");
+module_init(xt_rateest_tg_init);
+module_exit(xt_rateest_tg_fini);
diff --git a/net/netfilter/xt_dscp.c b/net/netfilter/xt_dscp.c
new file mode 100644 (file)
index 0000000..0280d3a
--- /dev/null
@@ -0,0 +1,115 @@
+/* IP tables module for matching the value of the IPv4/IPv6 DSCP field
+ *
+ * (C) 2002 by Harald Welte <laforge@netfilter.org>
+ *
+ * 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.
+ */
+
+#include <linux/module.h>
+#include <linux/skbuff.h>
+#include <linux/ip.h>
+#include <linux/ipv6.h>
+#include <net/dsfield.h>
+
+#include <linux/netfilter/x_tables.h>
+#include <linux/netfilter/xt_dscp.h>
+
+MODULE_AUTHOR("Harald Welte <laforge@netfilter.org>");
+MODULE_DESCRIPTION("Xtables: DSCP/TOS field match");
+MODULE_LICENSE("GPL");
+MODULE_ALIAS("ipt_dscp");
+MODULE_ALIAS("ip6t_dscp");
+MODULE_ALIAS("ipt_tos");
+MODULE_ALIAS("ip6t_tos");
+
+static bool
+dscp_mt(const struct sk_buff *skb, const struct xt_match_param *par)
+{
+       const struct xt_dscp_info *info = par->matchinfo;
+       u_int8_t dscp = ipv4_get_dsfield(ip_hdr(skb)) >> XT_DSCP_SHIFT;
+
+       return (dscp == info->dscp) ^ !!info->invert;
+}
+
+static bool
+dscp_mt6(const struct sk_buff *skb, const struct xt_match_param *par)
+{
+       const struct xt_dscp_info *info = par->matchinfo;
+       u_int8_t dscp = ipv6_get_dsfield(ipv6_hdr(skb)) >> XT_DSCP_SHIFT;
+
+       return (dscp == info->dscp) ^ !!info->invert;
+}
+
+static bool dscp_mt_check(const struct xt_mtchk_param *par)
+{
+       const struct xt_dscp_info *info = par->matchinfo;
+
+       if (info->dscp > XT_DSCP_MAX) {
+               printk(KERN_ERR "xt_dscp: dscp %x out of range\n", info->dscp);
+               return false;
+       }
+
+       return true;
+}
+
+static bool tos_mt(const struct sk_buff *skb, const struct xt_match_param *par)
+{
+       const struct xt_tos_match_info *info = par->matchinfo;
+
+       if (par->match->family == NFPROTO_IPV4)
+               return ((ip_hdr(skb)->tos & info->tos_mask) ==
+                      info->tos_value) ^ !!info->invert;
+       else
+               return ((ipv6_get_dsfield(ipv6_hdr(skb)) & info->tos_mask) ==
+                      info->tos_value) ^ !!info->invert;
+}
+
+static struct xt_match dscp_mt_reg[] __read_mostly = {
+       {
+               .name           = "dscp",
+               .family         = NFPROTO_IPV4,
+               .checkentry     = dscp_mt_check,
+               .match          = dscp_mt,
+               .matchsize      = sizeof(struct xt_dscp_info),
+               .me             = THIS_MODULE,
+       },
+       {
+               .name           = "dscp",
+               .family         = NFPROTO_IPV6,
+               .checkentry     = dscp_mt_check,
+               .match          = dscp_mt6,
+               .matchsize      = sizeof(struct xt_dscp_info),
+               .me             = THIS_MODULE,
+       },
+       {
+               .name           = "tos",
+               .revision       = 1,
+               .family         = NFPROTO_IPV4,
+               .match          = tos_mt,
+               .matchsize      = sizeof(struct xt_tos_match_info),
+               .me             = THIS_MODULE,
+       },
+       {
+               .name           = "tos",
+               .revision       = 1,
+               .family         = NFPROTO_IPV6,
+               .match          = tos_mt,
+               .matchsize      = sizeof(struct xt_tos_match_info),
+               .me             = THIS_MODULE,
+       },
+};
+
+static int __init dscp_mt_init(void)
+{
+       return xt_register_matches(dscp_mt_reg, ARRAY_SIZE(dscp_mt_reg));
+}
+
+static void __exit dscp_mt_exit(void)
+{
+       xt_unregister_matches(dscp_mt_reg, ARRAY_SIZE(dscp_mt_reg));
+}
+
+module_init(dscp_mt_init);
+module_exit(dscp_mt_exit);
diff --git a/net/netfilter/xt_hl.c b/net/netfilter/xt_hl.c
new file mode 100644 (file)
index 0000000..7726154
--- /dev/null
@@ -0,0 +1,108 @@
+/*
+ * IP tables module for matching the value of the TTL
+ * (C) 2000,2001 by Harald Welte <laforge@netfilter.org>
+ *
+ * Hop Limit matching module
+ * (C) 2001-2002 Maciej Soltysiak <solt@dns.toxicfilms.tv>
+ *
+ * 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.
+ */
+
+#include <linux/ip.h>
+#include <linux/ipv6.h>
+#include <linux/module.h>
+#include <linux/skbuff.h>
+
+#include <linux/netfilter/x_tables.h>
+#include <linux/netfilter_ipv4/ipt_ttl.h>
+#include <linux/netfilter_ipv6/ip6t_hl.h>
+
+MODULE_AUTHOR("Maciej Soltysiak <solt@dns.toxicfilms.tv>");
+MODULE_DESCRIPTION("Xtables: Hoplimit/TTL field match");
+MODULE_LICENSE("GPL");
+MODULE_ALIAS("ipt_ttl");
+MODULE_ALIAS("ip6t_hl");
+
+static bool ttl_mt(const struct sk_buff *skb, const struct xt_match_param *par)
+{
+       const struct ipt_ttl_info *info = par->matchinfo;
+       const u8 ttl = ip_hdr(skb)->ttl;
+
+       switch (info->mode) {
+               case IPT_TTL_EQ:
+                       return ttl == info->ttl;
+               case IPT_TTL_NE:
+                       return ttl != info->ttl;
+               case IPT_TTL_LT:
+                       return ttl < info->ttl;
+               case IPT_TTL_GT:
+                       return ttl > info->ttl;
+               default:
+                       printk(KERN_WARNING "ipt_ttl: unknown mode %d\n",
+                               info->mode);
+                       return false;
+       }
+
+       return false;
+}
+
+static bool hl_mt6(const struct sk_buff *skb, const struct xt_match_param *par)
+{
+       const struct ip6t_hl_info *info = par->matchinfo;
+       const struct ipv6hdr *ip6h = ipv6_hdr(skb);
+
+       switch (info->mode) {
+               case IP6T_HL_EQ:
+                       return ip6h->hop_limit == info->hop_limit;
+                       break;
+               case IP6T_HL_NE:
+                       return ip6h->hop_limit != info->hop_limit;
+                       break;
+               case IP6T_HL_LT:
+                       return ip6h->hop_limit < info->hop_limit;
+                       break;
+               case IP6T_HL_GT:
+                       return ip6h->hop_limit > info->hop_limit;
+                       break;
+               default:
+                       printk(KERN_WARNING "ip6t_hl: unknown mode %d\n",
+                               info->mode);
+                       return false;
+       }
+
+       return false;
+}
+
+static struct xt_match hl_mt_reg[] __read_mostly = {
+       {
+               .name       = "ttl",
+               .revision   = 0,
+               .family     = NFPROTO_IPV4,
+               .match      = ttl_mt,
+               .matchsize  = sizeof(struct ipt_ttl_info),
+               .me         = THIS_MODULE,
+       },
+       {
+               .name       = "hl",
+               .revision   = 0,
+               .family     = NFPROTO_IPV6,
+               .match      = hl_mt6,
+               .matchsize  = sizeof(struct ip6t_hl_info),
+               .me         = THIS_MODULE,
+       },
+};
+
+static int __init hl_mt_init(void)
+{
+       return xt_register_matches(hl_mt_reg, ARRAY_SIZE(hl_mt_reg));
+}
+
+static void __exit hl_mt_exit(void)
+{
+       xt_unregister_matches(hl_mt_reg, ARRAY_SIZE(hl_mt_reg));
+}
+
+module_init(hl_mt_init);
+module_exit(hl_mt_exit);
diff --git a/net/netfilter/xt_mark.c b/net/netfilter/xt_mark.c
new file mode 100644 (file)
index 0000000..1db07d8
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ *     xt_mark - Netfilter module to match NFMARK value
+ *
+ *     (C) 1999-2001 Marc Boucher <marc@mbsi.ca>
+ *     Copyright © CC Computer Consultants GmbH, 2007 - 2008
+ *     Jan Engelhardt <jengelh@medozas.de>
+ *
+ *     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.
+ */
+
+#include <linux/module.h>
+#include <linux/skbuff.h>
+
+#include <linux/netfilter/xt_mark.h>
+#include <linux/netfilter/x_tables.h>
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Marc Boucher <marc@mbsi.ca>");
+MODULE_DESCRIPTION("Xtables: packet mark match");
+MODULE_ALIAS("ipt_mark");
+MODULE_ALIAS("ip6t_mark");
+
+static bool
+mark_mt(const struct sk_buff *skb, const struct xt_match_param *par)
+{
+       const struct xt_mark_mtinfo1 *info = par->matchinfo;
+
+       return ((skb->mark & info->mask) == info->mark) ^ info->invert;
+}
+
+static struct xt_match mark_mt_reg __read_mostly = {
+       .name           = "mark",
+       .revision       = 1,
+       .family         = NFPROTO_UNSPEC,
+       .match          = mark_mt,
+       .matchsize      = sizeof(struct xt_mark_mtinfo1),
+       .me             = THIS_MODULE,
+};
+
+static int __init mark_mt_init(void)
+{
+       return xt_register_match(&mark_mt_reg);
+}
+
+static void __exit mark_mt_exit(void)
+{
+       xt_unregister_match(&mark_mt_reg);
+}
+
+module_init(mark_mt_init);
+module_exit(mark_mt_exit);
diff --git a/net/netfilter/xt_tcpmss.c b/net/netfilter/xt_tcpmss.c
new file mode 100644 (file)
index 0000000..4809b34
--- /dev/null
@@ -0,0 +1,110 @@
+/* Kernel module to match TCP MSS values. */
+
+/* Copyright (C) 2000 Marc Boucher <marc@mbsi.ca>
+ * Portions (C) 2005 by Harald Welte <laforge@netfilter.org>
+ *
+ * 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.
+ */
+
+#include <linux/module.h>
+#include <linux/skbuff.h>
+#include <net/tcp.h>
+
+#include <linux/netfilter/xt_tcpmss.h>
+#include <linux/netfilter/x_tables.h>
+
+#include <linux/netfilter_ipv4/ip_tables.h>
+#include <linux/netfilter_ipv6/ip6_tables.h>
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Marc Boucher <marc@mbsi.ca>");
+MODULE_DESCRIPTION("Xtables: TCP MSS match");
+MODULE_ALIAS("ipt_tcpmss");
+MODULE_ALIAS("ip6t_tcpmss");
+
+static bool
+tcpmss_mt(const struct sk_buff *skb, const struct xt_match_param *par)
+{
+       const struct xt_tcpmss_match_info *info = par->matchinfo;
+       const struct tcphdr *th;
+       struct tcphdr _tcph;
+       /* tcp.doff is only 4 bits, ie. max 15 * 4 bytes */
+       const u_int8_t *op;
+       u8 _opt[15 * 4 - sizeof(_tcph)];
+       unsigned int i, optlen;
+
+       /* If we don't have the whole header, drop packet. */
+       th = skb_header_pointer(skb, par->thoff, sizeof(_tcph), &_tcph);
+       if (th == NULL)
+               goto dropit;
+
+       /* Malformed. */
+       if (th->doff*4 < sizeof(*th))
+               goto dropit;
+
+       optlen = th->doff*4 - sizeof(*th);
+       if (!optlen)
+               goto out;
+
+       /* Truncated options. */
+       op = skb_header_pointer(skb, par->thoff + sizeof(*th), optlen, _opt);
+       if (op == NULL)
+               goto dropit;
+
+       for (i = 0; i < optlen; ) {
+               if (op[i] == TCPOPT_MSS
+                   && (optlen - i) >= TCPOLEN_MSS
+                   && op[i+1] == TCPOLEN_MSS) {
+                       u_int16_t mssval;
+
+                       mssval = (op[i+2] << 8) | op[i+3];
+
+                       return (mssval >= info->mss_min &&
+                               mssval <= info->mss_max) ^ info->invert;
+               }
+               if (op[i] < 2)
+                       i++;
+               else
+                       i += op[i+1] ? : 1;
+       }
+out:
+       return info->invert;
+
+dropit:
+       *par->hotdrop = true;
+       return false;
+}
+
+static struct xt_match tcpmss_mt_reg[] __read_mostly = {
+       {
+               .name           = "tcpmss",
+               .family         = NFPROTO_IPV4,
+               .match          = tcpmss_mt,
+               .matchsize      = sizeof(struct xt_tcpmss_match_info),
+               .proto          = IPPROTO_TCP,
+               .me             = THIS_MODULE,
+       },
+       {
+               .name           = "tcpmss",
+               .family         = NFPROTO_IPV6,
+               .match          = tcpmss_mt,
+               .matchsize      = sizeof(struct xt_tcpmss_match_info),
+               .proto          = IPPROTO_TCP,
+               .me             = THIS_MODULE,
+       },
+};
+
+static int __init tcpmss_mt_init(void)
+{
+       return xt_register_matches(tcpmss_mt_reg, ARRAY_SIZE(tcpmss_mt_reg));
+}
+
+static void __exit tcpmss_mt_exit(void)
+{
+       xt_unregister_matches(tcpmss_mt_reg, ARRAY_SIZE(tcpmss_mt_reg));
+}
+
+module_init(tcpmss_mt_init);
+module_exit(tcpmss_mt_exit);
old mode 100644 (file)
new mode 100755 (executable)
old mode 100644 (file)
new mode 100755 (executable)
old mode 100644 (file)
new mode 100755 (executable)
old mode 100644 (file)
new mode 100755 (executable)
old mode 100644 (file)
new mode 100755 (executable)
old mode 100644 (file)
new mode 100755 (executable)
old mode 100644 (file)
new mode 100755 (executable)
old mode 100644 (file)
new mode 100755 (executable)
old mode 100644 (file)
new mode 100755 (executable)
old mode 100644 (file)
new mode 100755 (executable)
old mode 100644 (file)
new mode 100755 (executable)
old mode 100644 (file)
new mode 100755 (executable)
old mode 100644 (file)
new mode 100755 (executable)
old mode 100644 (file)
new mode 100755 (executable)
old mode 100644 (file)
new mode 100755 (executable)
old mode 100644 (file)
new mode 100755 (executable)
old mode 100644 (file)
new mode 100755 (executable)
old mode 100644 (file)
new mode 100755 (executable)
old mode 100644 (file)
new mode 100755 (executable)
old mode 100644 (file)
new mode 100755 (executable)
old mode 100644 (file)
new mode 100755 (executable)
old mode 100644 (file)
new mode 100755 (executable)
old mode 100644 (file)
new mode 100755 (executable)
old mode 100644 (file)
new mode 100755 (executable)
old mode 100644 (file)
new mode 100755 (executable)
old mode 100644 (file)
new mode 100755 (executable)
old mode 100644 (file)
new mode 100755 (executable)
old mode 100644 (file)
new mode 100755 (executable)
old mode 100644 (file)
new mode 100755 (executable)
old mode 100644 (file)
new mode 100755 (executable)
old mode 100644 (file)
new mode 100755 (executable)
old mode 100644 (file)
new mode 100755 (executable)