]> err.no Git - linux-2.6/commitdiff
[NETFILTER]: x_tables: unify IPv4/IPv6 esp match
authorYasuyuki Kozakai <yasuyuki.kozakai@toshiba.co.jp>
Sat, 1 Apr 2006 10:22:30 +0000 (02:22 -0800)
committerDavid S. Miller <davem@davemloft.net>
Sat, 1 Apr 2006 10:22:30 +0000 (02:22 -0800)
This unifies ipt_esp and ip6t_esp to xt_esp. Please note that now
a user program needs to specify IPPROTO_ESP as protocol to use esp match
with IPv6. This means that ip6tables requires '-p esp' like iptables.

Signed-off-by: Yasuyuki Kozakai <yasuyuki.kozakai@toshiba.co.jp>
Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/netfilter/xt_esp.h [new file with mode: 0644]
include/linux/netfilter_ipv4/ipt_esp.h
include/linux/netfilter_ipv6/ip6t_esp.h
net/ipv4/netfilter/Kconfig
net/ipv4/netfilter/Makefile
net/ipv6/netfilter/Kconfig
net/ipv6/netfilter/Makefile
net/ipv6/netfilter/ip6t_esp.c [deleted file]
net/netfilter/Kconfig
net/netfilter/Makefile
net/netfilter/xt_esp.c [moved from net/ipv4/netfilter/ipt_esp.c with 51% similarity]

diff --git a/include/linux/netfilter/xt_esp.h b/include/linux/netfilter/xt_esp.h
new file mode 100644 (file)
index 0000000..9380fb1
--- /dev/null
@@ -0,0 +1,14 @@
+#ifndef _XT_ESP_H
+#define _XT_ESP_H
+
+struct xt_esp
+{
+       u_int32_t spis[2];      /* Security Parameter Index */
+       u_int8_t  invflags;     /* Inverse flags */
+};
+
+/* Values for "invflags" field in struct xt_esp. */
+#define XT_ESP_INV_SPI 0x01    /* Invert the sense of spi. */
+#define XT_ESP_INV_MASK        0x01    /* All possible flags. */
+
+#endif /*_XT_ESP_H*/
index c782a83e53e0d472fe8ce3621df17dd9244d44b8..78296e7eeff98f729d60598662e5e0b650f6e9fd 100644 (file)
@@ -1,16 +1,10 @@
 #ifndef _IPT_ESP_H
 #define _IPT_ESP_H
 
-struct ipt_esp
-{
-       u_int32_t spis[2];                      /* Security Parameter Index */
-       u_int8_t  invflags;                     /* Inverse flags */
-};
+#include <linux/netfilter/xt_esp.h>
 
-
-
-/* Values for "invflags" field in struct ipt_esp. */
-#define IPT_ESP_INV_SPI                0x01    /* Invert the sense of spi. */
-#define IPT_ESP_INV_MASK       0x01    /* All possible flags. */
+#define ipt_esp xt_esp
+#define IPT_ESP_INV_SPI                XT_ESP_INV_SPI
+#define IPT_ESP_INV_MASK       XT_ESP_INV_MASK
 
 #endif /*_IPT_ESP_H*/
index a91b6abc8079e37a56d5713af4a9fc5cedce8c38..f62eaf53c16cbe5b5f6bf1783ba3ffcb248e53d4 100644 (file)
@@ -1,14 +1,10 @@
 #ifndef _IP6T_ESP_H
 #define _IP6T_ESP_H
 
-struct ip6t_esp
-{
-       u_int32_t spis[2];                      /* Security Parameter Index */
-       u_int8_t  invflags;                     /* Inverse flags */
-};
+#include <linux/netfilter/xt_esp.h>
 
-/* Values for "invflags" field in struct ip6t_esp. */
-#define IP6T_ESP_INV_SPI               0x01    /* Invert the sense of spi. */
-#define IP6T_ESP_INV_MASK      0x01    /* All possible flags. */
+#define ip6t_esp xt_esp
+#define IP6T_ESP_INV_SPI       XT_ESP_INV_SPI
+#define IP6T_ESP_INV_MASK      XT_ESP_INV_MASK
 
 #endif /*_IP6T_ESP_H*/
index 882b842c25d4a30010473e4079e501e9ca9a6097..ebbd644fa8c4e8821a7196ef900e2683ca20598f 100644 (file)
@@ -272,12 +272,12 @@ config IP_NF_MATCH_DSCP
 
          To compile it as a module, choose M here.  If unsure, say N.
 
-config IP_NF_MATCH_AH_ESP
-       tristate "AH/ESP match support"
+config IP_NF_MATCH_AH
+       tristate "AH match support"
        depends on IP_NF_IPTABLES
        help
-         These two match extensions (`ah' and `esp') allow you to match a
-         range of SPIs inside AH or ESP headers of IPSec packets.
+         This match extension allows you to match a range of SPIs
+         inside AH header of IPSec packets.
 
          To compile it as a module, choose M here.  If unsure, say N.
 
index f2cd9a6c5b917fdfb3797e6282dd6b133238c4cb..09ae167632e75fefaffe0e1b6a010b329adb77ea 100644 (file)
@@ -59,7 +59,7 @@ obj-$(CONFIG_IP_NF_MATCH_TOS) += ipt_tos.o
 obj-$(CONFIG_IP_NF_MATCH_RECENT) += ipt_recent.o
 obj-$(CONFIG_IP_NF_MATCH_ECN) += ipt_ecn.o
 obj-$(CONFIG_IP_NF_MATCH_DSCP) += ipt_dscp.o
-obj-$(CONFIG_IP_NF_MATCH_AH_ESP) += ipt_ah.o ipt_esp.o
+obj-$(CONFIG_IP_NF_MATCH_AH) += ipt_ah.o
 obj-$(CONFIG_IP_NF_MATCH_TTL) += ipt_ttl.o
 obj-$(CONFIG_IP_NF_MATCH_ADDRTYPE) += ipt_addrtype.o
 
index 98f78759f1abbd635deb45b2cafe6793d93b0c26..bdd569fc66cb0e7e77ba7a4147eca54877bc8a03 100644 (file)
@@ -115,11 +115,11 @@ config IP6_NF_MATCH_IPV6HEADER
 
          To compile it as a module, choose M here.  If unsure, say N.
 
-config IP6_NF_MATCH_AHESP
-       tristate "AH/ESP match support"
+config IP6_NF_MATCH_AH
+       tristate "AH match support"
        depends on IP6_NF_IPTABLES
        help
-         This module allows one to match AH and ESP packets.
+         This module allows one to match AH packets.
 
          To compile it as a module, choose M here.  If unsure, say N.
 
index 8436a1a1731f4129dcc58b7dcb6d7e8b5e0f23e0..c38717011e647fa3735337abd8b89698e91b181c 100644 (file)
@@ -8,7 +8,7 @@ obj-$(CONFIG_IP6_NF_MATCH_RT) += ip6t_rt.o
 obj-$(CONFIG_IP6_NF_MATCH_OPTS) += ip6t_hbh.o ip6t_dst.o
 obj-$(CONFIG_IP6_NF_MATCH_IPV6HEADER) += ip6t_ipv6header.o
 obj-$(CONFIG_IP6_NF_MATCH_FRAG) += ip6t_frag.o
-obj-$(CONFIG_IP6_NF_MATCH_AHESP) += ip6t_esp.o ip6t_ah.o
+obj-$(CONFIG_IP6_NF_MATCH_AH) += ip6t_ah.o
 obj-$(CONFIG_IP6_NF_MATCH_EUI64) += ip6t_eui64.o
 obj-$(CONFIG_IP6_NF_MATCH_MULTIPORT) += ip6t_multiport.o
 obj-$(CONFIG_IP6_NF_MATCH_OWNER) += ip6t_owner.o
diff --git a/net/ipv6/netfilter/ip6t_esp.c b/net/ipv6/netfilter/ip6t_esp.c
deleted file mode 100644 (file)
index 36bedad..0000000
+++ /dev/null
@@ -1,115 +0,0 @@
-/* Kernel module to match ESP parameters. */
-/* (C) 2001-2002 Andras Kis-Szabo <kisza@sch.bme.hu>
- *
- * 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 <linux/types.h>
-#include <net/checksum.h>
-#include <net/ipv6.h>
-
-#include <linux/netfilter_ipv6/ip6_tables.h>
-#include <linux/netfilter_ipv6/ip6t_esp.h>
-
-MODULE_LICENSE("GPL");
-MODULE_DESCRIPTION("IPv6 ESP match");
-MODULE_AUTHOR("Andras Kis-Szabo <kisza@sch.bme.hu>");
-
-#if 0
-#define DEBUGP printk
-#else
-#define DEBUGP(format, args...)
-#endif
-
-/* Returns 1 if the spi is matched by the range, 0 otherwise */
-static inline int
-spi_match(u_int32_t min, u_int32_t max, u_int32_t spi, int invert)
-{
-       int r=0;
-       DEBUGP("esp spi_match:%c 0x%x <= 0x%x <= 0x%x",invert? '!':' ',
-              min,spi,max);
-       r=(spi >= min && spi <= max) ^ invert;
-       DEBUGP(" result %s\n",r? "PASS\n" : "FAILED\n");
-       return r;
-}
-
-static int
-match(const struct sk_buff *skb,
-      const struct net_device *in,
-      const struct net_device *out,
-      const struct xt_match *match,
-      const void *matchinfo,
-      int offset,
-      unsigned int protoff,
-      int *hotdrop)
-{
-       struct ip_esp_hdr _esp, *eh;
-       const struct ip6t_esp *espinfo = matchinfo;
-       unsigned int ptr;
-
-       /* Make sure this isn't an evil packet */
-       /*DEBUGP("ipv6_esp entered \n");*/
-
-       if (ipv6_find_hdr(skb, &ptr, NEXTHDR_ESP, NULL) < 0)
-               return 0;
-
-       eh = skb_header_pointer(skb, ptr, sizeof(_esp), &_esp);
-       if (eh == NULL) {
-               *hotdrop = 1;
-               return 0;
-       }
-
-       DEBUGP("IPv6 ESP SPI %u %08X\n", ntohl(eh->spi), ntohl(eh->spi));
-
-       return (eh != NULL)
-               && spi_match(espinfo->spis[0], espinfo->spis[1],
-                             ntohl(eh->spi),
-                             !!(espinfo->invflags & IP6T_ESP_INV_SPI));
-}
-
-/* Called when user tries to insert an entry of this type. */
-static int
-checkentry(const char *tablename,
-          const void *ip,
-          const struct xt_match *match,
-          void *matchinfo,
-          unsigned int matchinfosize,
-          unsigned int hook_mask)
-{
-       const struct ip6t_esp *espinfo = matchinfo;
-
-       if (espinfo->invflags & ~IP6T_ESP_INV_MASK) {
-               DEBUGP("ip6t_esp: unknown flags %X\n",
-                        espinfo->invflags);
-               return 0;
-       }
-       return 1;
-}
-
-static struct ip6t_match esp_match = {
-       .name           = "esp",
-       .match          = match,
-       .matchsize      = sizeof(struct ip6t_esp),
-       .checkentry     = checkentry,
-       .me             = THIS_MODULE,
-};
-
-static int __init ip6t_esp_init(void)
-{
-       return ip6t_register_match(&esp_match);
-}
-
-static void __exit ip6t_esp_fini(void)
-{
-       ip6t_unregister_match(&esp_match);
-}
-
-module_init(ip6t_esp_init);
-module_exit(ip6t_esp_fini);
index 332acb37b3855e698c239adfc8d42f48ae203528..5fe51894b1208e19ced083ef99a5a950ce651d1a 100644 (file)
@@ -231,6 +231,15 @@ config NETFILTER_XT_MATCH_DCCP
          If you want to compile it as a module, say M here and read
          <file:Documentation/modules.txt>.  If unsure, say `N'.
 
+config NETFILTER_XT_MATCH_ESP
+       tristate '"ESP" match support'
+       depends on NETFILTER_XTABLES
+       help
+         This match extension allows you to match a range of SPIs
+         inside ESP header of IPSec packets.
+
+         To compile it as a module, choose M here.  If unsure, say N.
+
 config NETFILTER_XT_MATCH_HELPER
        tristate '"helper" match support'
        depends on NETFILTER_XTABLES
index 9558727f5e7944c31fbd7c41d53f8385f46253f5..8f02486101abd32eb281cd385f06a0c19ce55341 100644 (file)
@@ -35,6 +35,7 @@ obj-$(CONFIG_NETFILTER_XT_MATCH_CONNBYTES) += xt_connbytes.o
 obj-$(CONFIG_NETFILTER_XT_MATCH_CONNMARK) += xt_connmark.o
 obj-$(CONFIG_NETFILTER_XT_MATCH_CONNTRACK) += xt_conntrack.o
 obj-$(CONFIG_NETFILTER_XT_MATCH_DCCP) += xt_dccp.o
+obj-$(CONFIG_NETFILTER_XT_MATCH_ESP) += xt_esp.o
 obj-$(CONFIG_NETFILTER_XT_MATCH_HELPER) += xt_helper.o
 obj-$(CONFIG_NETFILTER_XT_MATCH_LENGTH) += xt_length.o
 obj-$(CONFIG_NETFILTER_XT_MATCH_LIMIT) += xt_limit.o
similarity index 51%
rename from net/ipv4/netfilter/ipt_esp.c
rename to net/netfilter/xt_esp.c
index 3840b417a3c51c7b669eaa6121bd28d2cfaa458e..9dad6281e0c1084f606a53b7fd0866cb70bc2cc0 100644 (file)
@@ -9,16 +9,22 @@
 
 #include <linux/module.h>
 #include <linux/skbuff.h>
+#include <linux/in.h>
 #include <linux/ip.h>
 
-#include <linux/netfilter_ipv4/ipt_esp.h>
+#include <linux/netfilter/xt_esp.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("Yon Uriarte <yon@astaro.de>");
-MODULE_DESCRIPTION("iptables ESP SPI match module");
+MODULE_DESCRIPTION("x_tables ESP SPI match module");
+MODULE_ALIAS("ipt_esp");
+MODULE_ALIAS("ip6t_esp");
 
-#ifdef DEBUG_CONNTRACK
+#if 0
 #define duprintf(format, args...) printk(format , ## args)
 #else
 #define duprintf(format, args...)
@@ -28,11 +34,11 @@ MODULE_DESCRIPTION("iptables ESP SPI match module");
 static inline int
 spi_match(u_int32_t min, u_int32_t max, u_int32_t spi, int invert)
 {
-       int r=0;
-        duprintf("esp spi_match:%c 0x%x <= 0x%x <= 0x%x",invert? '!':' ',
-               min,spi,max);
-       r=(spi >= min && spi <= max) ^ invert;
-       duprintf(" result %s\n",r? "PASS" : "FAILED");
+       int r = 0;
+       duprintf("esp spi_match:%c 0x%x <= 0x%x <= 0x%x", invert ? '!' : ' ',
+                min, spi, max);
+       r = (spi >= min && spi <= max) ^ invert;
+       duprintf(" result %s\n", r ? "PASS" : "FAILED");
        return r;
 }
 
@@ -47,14 +53,13 @@ match(const struct sk_buff *skb,
       int *hotdrop)
 {
        struct ip_esp_hdr _esp, *eh;
-       const struct ipt_esp *espinfo = matchinfo;
+       const struct xt_esp *espinfo = matchinfo;
 
        /* Must not be a fragment. */
        if (offset)
                return 0;
 
-       eh = skb_header_pointer(skb, protoff,
-                               sizeof(_esp), &_esp);
+       eh = skb_header_pointer(skb, protoff, sizeof(_esp), &_esp);
        if (eh == NULL) {
                /* We've been asked to examine this packet, and we
                 * can't.  Hence, no choice but to drop.
@@ -64,9 +69,8 @@ match(const struct sk_buff *skb,
                return 0;
        }
 
-       return spi_match(espinfo->spis[0], espinfo->spis[1],
-                        ntohl(eh->spi),
-                        !!(espinfo->invflags & IPT_ESP_INV_SPI));
+       return spi_match(espinfo->spis[0], espinfo->spis[1], ntohl(eh->spi),
+                        !!(espinfo->invflags & XT_ESP_INV_SPI));
 }
 
 /* Called when user tries to insert an entry of this type. */
@@ -78,34 +82,55 @@ checkentry(const char *tablename,
           unsigned int matchinfosize,
           unsigned int hook_mask)
 {
-       const struct ipt_esp *espinfo = matchinfo;
+       const struct xt_esp *espinfo = matchinfo;
 
-       /* Must specify no unknown invflags */
-       if (espinfo->invflags & ~IPT_ESP_INV_MASK) {
-               duprintf("ipt_esp: unknown flags %X\n", espinfo->invflags);
+       if (espinfo->invflags & ~XT_ESP_INV_MASK) {
+               duprintf("xt_esp: unknown flags %X\n", espinfo->invflags);
                return 0;
        }
+
        return 1;
 }
 
-static struct ipt_match esp_match = {
+static struct xt_match esp_match = {
        .name           = "esp",
-       .match          = match,
-       .matchsize      = sizeof(struct ipt_esp),
+       .family         = AF_INET,
        .proto          = IPPROTO_ESP,
-       .checkentry     = checkentry,
+       .match          = &match,
+       .matchsize      = sizeof(struct xt_esp),
+       .checkentry     = &checkentry,
        .me             = THIS_MODULE,
 };
 
-static int __init ipt_esp_init(void)
+static struct xt_match esp6_match = {
+       .name           = "esp",
+       .family         = AF_INET6,
+       .proto          = IPPROTO_ESP,
+       .match          = &match,
+       .matchsize      = sizeof(struct xt_esp),
+       .checkentry     = &checkentry,
+       .me             = THIS_MODULE,
+};
+
+static int __init xt_esp_init(void)
 {
-       return ipt_register_match(&esp_match);
+       int ret;
+       ret = xt_register_match(&esp_match);
+       if (ret)
+               return ret;
+
+       ret = xt_register_match(&esp6_match);
+       if (ret)
+               xt_unregister_match(&esp_match);
+
+       return ret;
 }
 
-static void __exit ipt_esp_fini(void)
+static void __exit xt_esp_cleanup(void)
 {
-       ipt_unregister_match(&esp_match);
+       xt_unregister_match(&esp_match);
+       xt_unregister_match(&esp6_match);
 }
 
-module_init(ipt_esp_init);
-module_exit(ipt_esp_fini);
+module_init(xt_esp_init);
+module_exit(xt_esp_cleanup);