]> git.ipfire.org Git - thirdparty/iptables.git/commitdiff
icmp: split icmp type printing to header file
authorFlorian Westphal <fw@strlen.de>
Tue, 17 Apr 2018 22:09:04 +0000 (00:09 +0200)
committerFlorian Westphal <fw@strlen.de>
Thu, 19 Apr 2018 08:18:10 +0000 (10:18 +0200)
libebt_ip will get icmp support soon, unify icmp name
mapping a bit so we can re-use this code from libebt_ip.c.

It doesn't seem to be too useful to move to libxtables
(as its icmp specific), so add a hedaer file for this to reduce
copy & paste needs.

Signed-off-by: Florian Westphal <fw@strlen.de>
extensions/libip6t_icmp6.c
extensions/libipt_icmp.c
extensions/libxt_icmp.h [new file with mode: 0644]

index 37c2bcb8ede2acf2e198e13520fec9cf54ec99ae..45a71875722c47d24f13f485604453fa8a242696 100644 (file)
@@ -6,17 +6,13 @@
 #include <linux/netfilter_ipv6/ip6_tables.h>
 #include <netinet/icmp6.h>
 
+#include "libxt_icmp.h"
+
 enum {
        O_ICMPV6_TYPE = 0,
 };
 
-struct icmpv6_names {
-       const char *name;
-       uint8_t type;
-       uint8_t code_min, code_max;
-};
-
-static const struct icmpv6_names icmpv6_codes[] = {
+static const struct xt_icmp_names icmpv6_codes[] = {
        { "destination-unreachable", 1, 0, 0xFF },
        {   "no-route", 1, 0, 0 },
        {   "communication-prohibited", 1, 1, 1 },
@@ -58,34 +54,14 @@ static const struct icmpv6_names icmpv6_codes[] = {
 
 };
 
-static void
-print_icmpv6types(void)
-{
-       unsigned int i;
-       printf("Valid ICMPv6 Types:");
-
-       for (i = 0; i < ARRAY_SIZE(icmpv6_codes); ++i) {
-               if (i && icmpv6_codes[i].type == icmpv6_codes[i-1].type) {
-                       if (icmpv6_codes[i].code_min == icmpv6_codes[i-1].code_min
-                           && (icmpv6_codes[i].code_max
-                               == icmpv6_codes[i-1].code_max))
-                               printf(" (%s)", icmpv6_codes[i].name);
-                       else
-                               printf("\n   %s", icmpv6_codes[i].name);
-               }
-               else
-                       printf("\n%s", icmpv6_codes[i].name);
-       }
-       printf("\n");
-}
-
 static void icmp6_help(void)
 {
        printf(
 "icmpv6 match options:\n"
 "[!] --icmpv6-type typename    match icmpv6 type\n"
 "                              (or numeric type or type/code)\n");
-       print_icmpv6types();
+       printf("Valid ICMPv6 Types:");
+       xt_print_icmp_types(icmpv6_codes, ARRAY_SIZE(icmpv6_codes));
 }
 
 static const struct xt_option_entry icmp6_opts[] = {
index 680a5b0ceb89c6aab8b7f3909a5b8c6f6247df06..5418997668d4cc8597e8b0b6cc980cb952a4b40a 100644 (file)
@@ -5,6 +5,8 @@
 #include <limits.h> /* INT_MAX in ip6_tables.h */
 #include <linux/netfilter_ipv4/ip_tables.h>
 
+#include "libxt_icmp.h"
+
 /* special hack for icmp-type 'any': 
  * Up to kernel <=2.4.20 the problem was:
  * '-p icmp ' matches all icmp packets
@@ -17,13 +19,7 @@ enum {
        O_ICMP_TYPE = 0,
 };
 
-struct icmp_names {
-       const char *name;
-       uint8_t type;
-       uint8_t code_min, code_max;
-};
-
-static const struct icmp_names icmp_codes[] = {
+static const struct xt_icmp_names icmp_codes[] = {
        { "any", 0xFF, 0, 0xFF },
        { "echo-reply", 0, 0, 0xFF },
        /* Alias */ { "pong", 0, 0, 0xFF },
@@ -78,34 +74,14 @@ static const struct icmp_names icmp_codes[] = {
        { "address-mask-reply", 18, 0, 0xFF }
 };
 
-static void
-print_icmptypes(void)
-{
-       unsigned int i;
-       printf("Valid ICMP Types:");
-
-       for (i = 0; i < ARRAY_SIZE(icmp_codes); ++i) {
-               if (i && icmp_codes[i].type == icmp_codes[i-1].type) {
-                       if (icmp_codes[i].code_min == icmp_codes[i-1].code_min
-                           && (icmp_codes[i].code_max
-                               == icmp_codes[i-1].code_max))
-                               printf(" (%s)", icmp_codes[i].name);
-                       else
-                               printf("\n   %s", icmp_codes[i].name);
-               }
-               else
-                       printf("\n%s", icmp_codes[i].name);
-       }
-       printf("\n");
-}
-
 static void icmp_help(void)
 {
        printf(
 "icmp match options:\n"
 "[!] --icmp-type typename      match icmp type\n"
 "[!] --icmp-type type[/code]   (or numeric type or type/code)\n");
-       print_icmptypes();
+       printf("Valid ICMP Types:");
+       xt_print_icmp_types(icmp_codes, ARRAY_SIZE(icmp_codes));
 }
 
 static const struct xt_option_entry icmp_opts[] = {
diff --git a/extensions/libxt_icmp.h b/extensions/libxt_icmp.h
new file mode 100644 (file)
index 0000000..5820206
--- /dev/null
@@ -0,0 +1,25 @@
+struct xt_icmp_names {
+       const char *name;
+       uint8_t type;
+       uint8_t code_min, code_max;
+};
+
+static void xt_print_icmp_types(const struct xt_icmp_names *icmp_codes,
+                               unsigned int n_codes)
+{
+       unsigned int i;
+
+       for (i = 0; i < n_codes; ++i) {
+               if (i && icmp_codes[i].type == icmp_codes[i-1].type) {
+                       if (icmp_codes[i].code_min == icmp_codes[i-1].code_min
+                           && (icmp_codes[i].code_max
+                               == icmp_codes[i-1].code_max))
+                               printf(" (%s)", icmp_codes[i].name);
+                       else
+                               printf("\n   %s", icmp_codes[i].name);
+               }
+               else
+                       printf("\n%s", icmp_codes[i].name);
+       }
+       printf("\n");
+}