From 71a6e372f82b6c50c14c8034a974f3ad5983314d Mon Sep 17 00:00:00 2001 From: Florian Westphal Date: Wed, 18 Apr 2018 00:09:04 +0200 Subject: icmp: split icmp type printing to header file 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 --- extensions/libip6t_icmp6.c | 34 +++++----------------------------- extensions/libipt_icmp.c | 34 +++++----------------------------- extensions/libxt_icmp.h | 25 +++++++++++++++++++++++++ 3 files changed, 35 insertions(+), 58 deletions(-) create mode 100644 extensions/libxt_icmp.h (limited to 'extensions') diff --git a/extensions/libip6t_icmp6.c b/extensions/libip6t_icmp6.c index 37c2bcb8..45a71875 100644 --- a/extensions/libip6t_icmp6.c +++ b/extensions/libip6t_icmp6.c @@ -6,17 +6,13 @@ #include #include +#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[] = { diff --git a/extensions/libipt_icmp.c b/extensions/libipt_icmp.c index 680a5b0c..54189976 100644 --- a/extensions/libipt_icmp.c +++ b/extensions/libipt_icmp.c @@ -5,6 +5,8 @@ #include /* INT_MAX in ip6_tables.h */ #include +#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 index 00000000..5820206e --- /dev/null +++ b/extensions/libxt_icmp.h @@ -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"); +} -- cgit v1.2.3