50241974c6b46367fcb03a29d4f3a43bd7578ac6
[openwrt-10.03/.git] / target / linux / generic-2.4 / patches / 620-netfilter_iprange.patch
1 --- a/Documentation/Configure.help
2 +++ b/Documentation/Configure.help
3 @@ -2986,6 +2986,14 @@ CONFIG_IP_NF_MATCH_TOS
4    If you want to compile it as a module, say M here and read
5    <file:Documentation/modules.txt>.  If unsure, say `N'.
6  
7 +iprange match support
8 +CONFIG_IP_NF_MATCH_IPRANGE
9 +  This option makes possible to match IP addresses against
10 +  IP address ranges.
11 +
12 +  If you want to compile it as a module, say M here and read
13 +  <file:Documentation/modules.txt>.  If unsure, say `N'.
14 +
15  Condition variable match support
16  CONFIG_IP_NF_MATCH_CONDITION
17    This option allows you to match firewall rules against condition
18 --- /dev/null
19 +++ b/include/linux/netfilter_ipv4/ipt_iprange.h
20 @@ -0,0 +1,23 @@
21 +#ifndef _IPT_IPRANGE_H
22 +#define _IPT_IPRANGE_H
23 +
24 +#define IPRANGE_SRC            0x01    /* Match source IP address */
25 +#define IPRANGE_DST            0x02    /* Match destination IP address */
26 +#define IPRANGE_SRC_INV                0x10    /* Negate the condition */
27 +#define IPRANGE_DST_INV                0x20    /* Negate the condition */
28 +
29 +struct ipt_iprange {
30 +       /* Inclusive: network order. */
31 +       u_int32_t min_ip, max_ip;
32 +};
33 +
34 +struct ipt_iprange_info
35 +{
36 +       struct ipt_iprange src;
37 +       struct ipt_iprange dst;
38 +
39 +       /* Flags from above */
40 +       u_int8_t flags;
41 +};
42 +
43 +#endif /* _IPT_IPRANGE_H */
44 --- a/net/ipv4/netfilter/Config.in
45 +++ b/net/ipv4/netfilter/Config.in
46 @@ -25,6 +25,7 @@ tristate 'IP tables support (required fo
47  if [ "$CONFIG_IP_NF_IPTABLES" != "n" ]; then
48  # The simple matches.
49    dep_tristate '  limit match support' CONFIG_IP_NF_MATCH_LIMIT $CONFIG_IP_NF_IPTABLES
50 +  dep_tristate '  IP range match support' CONFIG_IP_NF_MATCH_IPRANGE $CONFIG_IP_NF_IPTABLES
51    dep_tristate '  quota match support' CONFIG_IP_NF_MATCH_QUOTA $CONFIG_IP_NF_IPTABLES
52    dep_tristate '  MAC address match support' CONFIG_IP_NF_MATCH_MAC $CONFIG_IP_NF_IPTABLES
53    dep_tristate '  Packet type match support' CONFIG_IP_NF_MATCH_PKTTYPE $CONFIG_IP_NF_IPTABLES
54 --- /dev/null
55 +++ b/net/ipv4/netfilter/ipt_iprange.c
56 @@ -0,0 +1,101 @@
57 +/*
58 + * iptables module to match IP address ranges
59 + *   (c) 2003 Jozsef Kadlecsik <kadlec@blackhole.kfki.hu>
60 + *
61 + * Released under the terms of GNU GPLv2.
62 + *
63 + */
64 +#include <linux/module.h>
65 +#include <linux/skbuff.h>
66 +#include <linux/ip.h>
67 +#include <linux/netfilter_ipv4/ip_tables.h>
68 +#include <linux/netfilter_ipv4/ipt_iprange.h>
69 +
70 +MODULE_LICENSE("GPL");
71 +MODULE_AUTHOR("Jozsef Kadlecsik <kadlec@blackhole.kfki.hu>");
72 +MODULE_DESCRIPTION("iptables arbitrary IP range match module");
73 +
74 +#if 0
75 +#define DEBUGP printk
76 +#else
77 +#define DEBUGP(format, args...)
78 +#endif
79 +
80 +static int
81 +match(const struct sk_buff *skb,
82 +      const struct net_device *in,
83 +      const struct net_device *out,
84 +      const void *matchinfo,
85 +      int offset,
86 +      const void *hdr,
87 +      u_int16_t datalen,
88 +      int *hotdrop)
89 +{
90 +       const struct ipt_iprange_info *info = matchinfo;
91 +       const struct iphdr *iph = skb->nh.iph;
92 +       
93 +
94 +       if (info->flags & IPRANGE_SRC) {
95 +               if (((ntohl(iph->saddr) < ntohl(info->src.min_ip))
96 +                         || (ntohl(iph->saddr) > ntohl(info->src.max_ip)))
97 +                        ^ !!(info->flags & IPRANGE_SRC_INV)) {
98 +                       DEBUGP("src IP %u.%u.%u.%u NOT in range %s"
99 +                              "%u.%u.%u.%u-%u.%u.%u.%u\n",
100 +                               NIPQUAD(iph->saddr),
101 +                               info->flags & IPRANGE_SRC_INV ? "(INV) " : "",
102 +                               NIPQUAD(info->src.min_ip),
103 +                               NIPQUAD(info->src.max_ip));
104 +                       return 0;
105 +               }
106 +       }
107 +       if (info->flags & IPRANGE_DST) {
108 +               if (((ntohl(iph->daddr) < ntohl(info->dst.min_ip))
109 +                         || (ntohl(iph->daddr) > ntohl(info->dst.max_ip)))
110 +                        ^ !!(info->flags & IPRANGE_DST_INV)) {
111 +                       DEBUGP("dst IP %u.%u.%u.%u NOT in range %s"
112 +                              "%u.%u.%u.%u-%u.%u.%u.%u\n",
113 +                               NIPQUAD(iph->daddr),
114 +                               info->flags & IPRANGE_DST_INV ? "(INV) " : "",
115 +                               NIPQUAD(info->dst.min_ip),
116 +                               NIPQUAD(info->dst.max_ip));
117 +                       return 0;
118 +               }
119 +       }
120 +       return 1;
121 +}
122 +
123 +static int check(const char *tablename,
124 +                const struct ipt_ip *ip,
125 +                void *matchinfo,
126 +                unsigned int matchsize,
127 +                unsigned int hook_mask)
128 +{
129 +       /* verify size */
130 +       if (matchsize != IPT_ALIGN(sizeof(struct ipt_iprange_info)))
131 +               return 0;
132 +
133 +       return 1;
134 +}
135 +
136 +static struct ipt_match iprange_match = 
137 +{ 
138 +       .list = { NULL, NULL }, 
139 +       .name = "iprange", 
140 +       .match = &match, 
141 +       .checkentry = &check, 
142 +       .destroy = NULL, 
143 +       .me = THIS_MODULE
144 +};
145 +
146 +static int __init init(void)
147 +{
148 +       return ipt_register_match(&iprange_match);
149 +}
150 +
151 +static void __exit fini(void)
152 +{
153 +       ipt_unregister_match(&iprange_match);
154 +}
155 +
156 +module_init(init);
157 +module_exit(fini);
158 --- a/net/ipv4/netfilter/Makefile
159 +++ b/net/ipv4/netfilter/Makefile
160 @@ -81,6 +81,7 @@ obj-$(CONFIG_IP_NF_NAT) += iptable_nat.o
161  # matches
162  obj-$(CONFIG_IP_NF_MATCH_HELPER) += ipt_helper.o
163  obj-$(CONFIG_IP_NF_MATCH_LIMIT) += ipt_limit.o
164 +obj-$(CONFIG_IP_NF_MATCH_IPRANGE) += ipt_iprange.o
165  obj-$(CONFIG_IP_NF_MATCH_QUOTA) += ipt_quota.o
166  obj-$(CONFIG_IP_NF_MATCH_MARK) += ipt_mark.o
167  obj-$(CONFIG_IP_NF_MATCH_MAC) += ipt_mac.o