|
|
@@ -0,0 +1,265 @@
|
|
|
+--- a/extensions/libxt_multiport.c
|
|
|
++++ b/extensions/libxt_multiport.c
|
|
|
+@@ -15,21 +15,6 @@
|
|
|
+ #include <linux/netfilter/xt_multiport.h>
|
|
|
+
|
|
|
+ /* Function which prints out usage message. */
|
|
|
+-static void multiport_help(void)
|
|
|
+-{
|
|
|
+- printf(
|
|
|
+-"multiport match options:\n"
|
|
|
+-" --source-ports port[,port,port...]\n"
|
|
|
+-" --sports ...\n"
|
|
|
+-" match source port(s)\n"
|
|
|
+-" --destination-ports port[,port,port...]\n"
|
|
|
+-" --dports ...\n"
|
|
|
+-" match destination port(s)\n"
|
|
|
+-" --ports port[,port,port]\n"
|
|
|
+-" match both source and destination port(s)\n"
|
|
|
+-" NOTE: this kernel does not support port ranges in multiport.\n");
|
|
|
+-}
|
|
|
+-
|
|
|
+ static void multiport_help_v1(void)
|
|
|
+ {
|
|
|
+ printf(
|
|
|
+@@ -72,26 +57,6 @@ proto_to_name(u_int8_t proto)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+-static unsigned int
|
|
|
+-parse_multi_ports(const char *portstring, u_int16_t *ports, const char *proto)
|
|
|
+-{
|
|
|
+- char *buffer, *cp, *next;
|
|
|
+- unsigned int i;
|
|
|
+-
|
|
|
+- buffer = strdup(portstring);
|
|
|
+- if (!buffer) xtables_error(OTHER_PROBLEM, "strdup failed");
|
|
|
+-
|
|
|
+- for (cp=buffer, i=0; cp && i<XT_MULTI_PORTS; cp=next,i++)
|
|
|
+- {
|
|
|
+- next=strchr(cp, ',');
|
|
|
+- if (next) *next++='\0';
|
|
|
+- ports[i] = xtables_parse_port(cp, proto);
|
|
|
+- }
|
|
|
+- if (cp) xtables_error(PARAMETER_PROBLEM, "too many ports specified");
|
|
|
+- free(buffer);
|
|
|
+- return i;
|
|
|
+-}
|
|
|
+-
|
|
|
+ static void
|
|
|
+ parse_multi_ports_v1(const char *portstring,
|
|
|
+ struct xt_multiport_v1 *multiinfo,
|
|
|
+@@ -155,73 +120,6 @@ check_proto(u_int16_t pnum, u_int8_t inv
|
|
|
+ /* Function which parses command options; returns true if it
|
|
|
+ ate an option */
|
|
|
+ static int
|
|
|
+-__multiport_parse(int c, char **argv, int invert, unsigned int *flags,
|
|
|
+- struct xt_entry_match **match, u_int16_t pnum,
|
|
|
+- u_int8_t invflags)
|
|
|
+-{
|
|
|
+- const char *proto;
|
|
|
+- struct xt_multiport *multiinfo
|
|
|
+- = (struct xt_multiport *)(*match)->data;
|
|
|
+-
|
|
|
+- switch (c) {
|
|
|
+- case '1':
|
|
|
+- xtables_check_inverse(optarg, &invert, &optind, 0, argv);
|
|
|
+- proto = check_proto(pnum, invflags);
|
|
|
+- multiinfo->count = parse_multi_ports(optarg,
|
|
|
+- multiinfo->ports, proto);
|
|
|
+- multiinfo->flags = XT_MULTIPORT_SOURCE;
|
|
|
+- break;
|
|
|
+-
|
|
|
+- case '2':
|
|
|
+- xtables_check_inverse(optarg, &invert, &optind, 0, argv);
|
|
|
+- proto = check_proto(pnum, invflags);
|
|
|
+- multiinfo->count = parse_multi_ports(optarg,
|
|
|
+- multiinfo->ports, proto);
|
|
|
+- multiinfo->flags = XT_MULTIPORT_DESTINATION;
|
|
|
+- break;
|
|
|
+-
|
|
|
+- case '3':
|
|
|
+- xtables_check_inverse(optarg, &invert, &optind, 0, argv);
|
|
|
+- proto = check_proto(pnum, invflags);
|
|
|
+- multiinfo->count = parse_multi_ports(optarg,
|
|
|
+- multiinfo->ports, proto);
|
|
|
+- multiinfo->flags = XT_MULTIPORT_EITHER;
|
|
|
+- break;
|
|
|
+-
|
|
|
+- default:
|
|
|
+- return 0;
|
|
|
+- }
|
|
|
+-
|
|
|
+- if (invert)
|
|
|
+- xtables_error(PARAMETER_PROBLEM,
|
|
|
+- "multiport does not support invert");
|
|
|
+-
|
|
|
+- if (*flags)
|
|
|
+- xtables_error(PARAMETER_PROBLEM,
|
|
|
+- "multiport can only have one option");
|
|
|
+- *flags = 1;
|
|
|
+- return 1;
|
|
|
+-}
|
|
|
+-
|
|
|
+-static int
|
|
|
+-multiport_parse(int c, char **argv, int invert, unsigned int *flags,
|
|
|
+- const void *e, struct xt_entry_match **match)
|
|
|
+-{
|
|
|
+- const struct ipt_entry *entry = e;
|
|
|
+- return __multiport_parse(c, argv, invert, flags, match,
|
|
|
+- entry->ip.proto, entry->ip.invflags);
|
|
|
+-}
|
|
|
+-
|
|
|
+-static int
|
|
|
+-multiport_parse6(int c, char **argv, int invert, unsigned int *flags,
|
|
|
+- const void *e, struct xt_entry_match **match)
|
|
|
+-{
|
|
|
+- const struct ip6t_entry *entry = e;
|
|
|
+- return __multiport_parse(c, argv, invert, flags, match,
|
|
|
+- entry->ipv6.proto, entry->ipv6.invflags);
|
|
|
+-}
|
|
|
+-
|
|
|
+-static int
|
|
|
+ __multiport_parse_v1(int c, char **argv, int invert, unsigned int *flags,
|
|
|
+ struct xt_entry_match **match, u_int16_t pnum,
|
|
|
+ u_int8_t invflags)
|
|
|
+@@ -314,55 +212,6 @@ print_port(u_int16_t port, u_int8_t prot
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Prints out the matchinfo. */
|
|
|
+-static void
|
|
|
+-__multiport_print(const struct xt_entry_match *match, int numeric,
|
|
|
+- u_int16_t proto)
|
|
|
+-{
|
|
|
+- const struct xt_multiport *multiinfo
|
|
|
+- = (const struct xt_multiport *)match->data;
|
|
|
+- unsigned int i;
|
|
|
+-
|
|
|
+- printf("multiport ");
|
|
|
+-
|
|
|
+- switch (multiinfo->flags) {
|
|
|
+- case XT_MULTIPORT_SOURCE:
|
|
|
+- printf("sports ");
|
|
|
+- break;
|
|
|
+-
|
|
|
+- case XT_MULTIPORT_DESTINATION:
|
|
|
+- printf("dports ");
|
|
|
+- break;
|
|
|
+-
|
|
|
+- case XT_MULTIPORT_EITHER:
|
|
|
+- printf("ports ");
|
|
|
+- break;
|
|
|
+-
|
|
|
+- default:
|
|
|
+- printf("ERROR ");
|
|
|
+- break;
|
|
|
+- }
|
|
|
+-
|
|
|
+- for (i=0; i < multiinfo->count; i++) {
|
|
|
+- printf("%s", i ? "," : "");
|
|
|
+- print_port(multiinfo->ports[i], proto, numeric);
|
|
|
+- }
|
|
|
+- printf(" ");
|
|
|
+-}
|
|
|
+-
|
|
|
+-static void multiport_print(const void *ip_void,
|
|
|
+- const struct xt_entry_match *match, int numeric)
|
|
|
+-{
|
|
|
+- const struct ipt_ip *ip = ip_void;
|
|
|
+- __multiport_print(match, numeric, ip->proto);
|
|
|
+-}
|
|
|
+-
|
|
|
+-static void multiport_print6(const void *ip_void,
|
|
|
+- const struct xt_entry_match *match, int numeric)
|
|
|
+-{
|
|
|
+- const struct ip6t_ip6 *ip = ip_void;
|
|
|
+- __multiport_print(match, numeric, ip->proto);
|
|
|
+-}
|
|
|
+-
|
|
|
+ static void __multiport_print_v1(const struct xt_entry_match *match,
|
|
|
+ int numeric, u_int16_t proto)
|
|
|
+ {
|
|
|
+@@ -419,48 +268,6 @@ static void multiport_print6_v1(const vo
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Saves the union ipt_matchinfo in parsable form to stdout. */
|
|
|
+-static void __multiport_save(const struct xt_entry_match *match,
|
|
|
+- u_int16_t proto)
|
|
|
+-{
|
|
|
+- const struct xt_multiport *multiinfo
|
|
|
+- = (const struct xt_multiport *)match->data;
|
|
|
+- unsigned int i;
|
|
|
+-
|
|
|
+- switch (multiinfo->flags) {
|
|
|
+- case XT_MULTIPORT_SOURCE:
|
|
|
+- printf("--sports ");
|
|
|
+- break;
|
|
|
+-
|
|
|
+- case XT_MULTIPORT_DESTINATION:
|
|
|
+- printf("--dports ");
|
|
|
+- break;
|
|
|
+-
|
|
|
+- case XT_MULTIPORT_EITHER:
|
|
|
+- printf("--ports ");
|
|
|
+- break;
|
|
|
+- }
|
|
|
+-
|
|
|
+- for (i=0; i < multiinfo->count; i++) {
|
|
|
+- printf("%s", i ? "," : "");
|
|
|
+- print_port(multiinfo->ports[i], proto, 1);
|
|
|
+- }
|
|
|
+- printf(" ");
|
|
|
+-}
|
|
|
+-
|
|
|
+-static void multiport_save(const void *ip_void,
|
|
|
+- const struct xt_entry_match *match)
|
|
|
+-{
|
|
|
+- const struct ipt_ip *ip = ip_void;
|
|
|
+- __multiport_save(match, ip->proto);
|
|
|
+-}
|
|
|
+-
|
|
|
+-static void multiport_save6(const void *ip_void,
|
|
|
+- const struct xt_entry_match *match)
|
|
|
+-{
|
|
|
+- const struct ip6t_ip6 *ip = ip_void;
|
|
|
+- __multiport_save(match, ip->proto);
|
|
|
+-}
|
|
|
+-
|
|
|
+ static void __multiport_save_v1(const struct xt_entry_match *match,
|
|
|
+ u_int16_t proto)
|
|
|
+ {
|
|
|
+@@ -514,34 +321,6 @@ static struct xtables_match multiport_mt
|
|
|
+ {
|
|
|
+ .family = NFPROTO_IPV4,
|
|
|
+ .name = "multiport",
|
|
|
+- .revision = 0,
|
|
|
+- .version = XTABLES_VERSION,
|
|
|
+- .size = XT_ALIGN(sizeof(struct xt_multiport)),
|
|
|
+- .userspacesize = XT_ALIGN(sizeof(struct xt_multiport)),
|
|
|
+- .help = multiport_help,
|
|
|
+- .parse = multiport_parse,
|
|
|
+- .final_check = multiport_check,
|
|
|
+- .print = multiport_print,
|
|
|
+- .save = multiport_save,
|
|
|
+- .extra_opts = multiport_opts,
|
|
|
+- },
|
|
|
+- {
|
|
|
+- .family = NFPROTO_IPV6,
|
|
|
+- .name = "multiport",
|
|
|
+- .revision = 0,
|
|
|
+- .version = XTABLES_VERSION,
|
|
|
+- .size = XT_ALIGN(sizeof(struct xt_multiport)),
|
|
|
+- .userspacesize = XT_ALIGN(sizeof(struct xt_multiport)),
|
|
|
+- .help = multiport_help,
|
|
|
+- .parse = multiport_parse6,
|
|
|
+- .final_check = multiport_check,
|
|
|
+- .print = multiport_print6,
|
|
|
+- .save = multiport_save6,
|
|
|
+- .extra_opts = multiport_opts,
|
|
|
+- },
|
|
|
+- {
|
|
|
+- .family = NFPROTO_IPV4,
|
|
|
+- .name = "multiport",
|
|
|
+ .version = XTABLES_VERSION,
|
|
|
+ .revision = 1,
|
|
|
+ .size = XT_ALIGN(sizeof(struct xt_multiport_v1)),
|