/* Shared library add-on to iptables for IPV4OPTSSTRIP
 * This modules strip all the IP options.
 *
 * (C) 2001 by Fabrice MARIE <fabrice@netfilter.org>
 * This program is distributed under the terms of GNU GPL v2, 1991
 */

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <getopt.h>

#include <iptables.h>
#include <linux/netfilter_ipv4/ip_tables.h>

static void init(struct ipt_entry_target *t, unsigned int *nfcache) 
{
        *nfcache |= NFC_UNKNOWN;
}

static void help(void) 
{
	printf("IPV4OPTSSTRIP v%s target takes no option !! Make sure you use it in the mangle table.\n",
	       IPTABLES_VERSION);
}

static struct option opts[] = {
	{ 0 }
};

/* Function which parses command options; returns true if it
   ate an option */
static int
parse(int c, char **argv, int invert, unsigned int *flags,
      const struct ipt_entry *entry,
      struct ipt_entry_target **target)
{
	return 0;
}

static void
final_check(unsigned int flags)
{
}

/* Prints out the targinfo. */
static void
print(const struct ipt_ip *ip,
      const struct ipt_entry_target *target,
      int numeric)
{
	/* nothing to print, we don't take option... */
}

/* Saves the stuff in parsable form to stdout. */
static void
save(const struct ipt_ip *ip, const struct ipt_entry_target *target)
{
	/* nothing to print, we don't take option... */
}

static
struct iptables_target IPV4OPTSSTRIP
= { NULL,
    "IPV4OPTSSTRIP",
    IPTABLES_VERSION,
    IPT_ALIGN(0),
    IPT_ALIGN(0),
    &help,
    &init,
    &parse,
    &final_check,
    &print,
    &save,
    opts
};

void _init(void)
{
	register_target(&IPV4OPTSSTRIP);
}
