8e0f4ac
--- ebtables2.orig/extensions/ebt_AUDIT.c	1970-01-01 01:00:00.000000000 +0100
8e0f4ac
+++ ebtables2.orig/extensions/ebt_AUDIT.c	2011-01-07 10:53:46.680329228 +0100
8e0f4ac
@@ -0,0 +1,110 @@ 
8e0f4ac
+
8e0f4ac
+#include <stdio.h>
8e0f4ac
+#include <stdlib.h>
8e0f4ac
+#include <string.h>
8e0f4ac
+#include <getopt.h>
8e0f4ac
+#include "../include/ebtables_u.h"
8e0f4ac
+#include <linux/netfilter/xt_AUDIT.h>
8e0f4ac
+
8e0f4ac
+#define AUDIT_TYPE  '1'
8e0f4ac
+static struct option opts[] =
8e0f4ac
+{
8e0f4ac
+	{ "audit-type" , required_argument, 0, AUDIT_TYPE },
8e0f4ac
+	{ 0 }
8e0f4ac
+};
8e0f4ac
+
8e0f4ac
+static void print_help()
8e0f4ac
+{
8e0f4ac
+	printf(
8e0f4ac
+	"AUDIT target options:\n"
8e0f4ac
+	" --audit-type TYPE          : Set action type to record.\n");
8e0f4ac
+}
8e0f4ac
+
8e0f4ac
+static void init(struct ebt_entry_target *target)
8e0f4ac
+{
8e0f4ac
+	struct xt_AUDIT_info *info = (struct xt_AUDIT_info *) target->data;
8e0f4ac
+
8e0f4ac
+	info->type = 0;
8e0f4ac
+}
8e0f4ac
+
8e0f4ac
+static int parse(int c, char **argv, int argc,
8e0f4ac
+   const struct ebt_u_entry *entry, unsigned int *flags,
8e0f4ac
+   struct ebt_entry_target **target)
8e0f4ac
+{
8e0f4ac
+	struct xt_AUDIT_info *info = (struct xt_AUDIT_info *) (*target)->data;
8e0f4ac
+
8e0f4ac
+	switch (c) {
8e0f4ac
+	case AUDIT_TYPE:
8e0f4ac
+		ebt_check_option2(flags, AUDIT_TYPE);
8e0f4ac
+
8e0f4ac
+		if (!strcasecmp(optarg, "accept"))
8e0f4ac
+			info->type = XT_AUDIT_TYPE_ACCEPT;
8e0f4ac
+		else if (!strcasecmp(optarg, "drop"))
8e0f4ac
+			info->type = XT_AUDIT_TYPE_DROP;
8e0f4ac
+		else if (!strcasecmp(optarg, "reject"))
8e0f4ac
+			info->type = XT_AUDIT_TYPE_REJECT;
8e0f4ac
+		else
8e0f4ac
+			ebt_print_error2("Bad action type value `%s'", optarg);
8e0f4ac
+
8e0f4ac
+		break;
8e0f4ac
+	 default:
8e0f4ac
+		return 0;
8e0f4ac
+	}
8e0f4ac
+	return 1;
8e0f4ac
+}
8e0f4ac
+
8e0f4ac
+static void final_check(const struct ebt_u_entry *entry,
8e0f4ac
+   const struct ebt_entry_match *match, const char *name,
8e0f4ac
+   unsigned int hookmask, unsigned int time)
8e0f4ac
+{
8e0f4ac
+}
8e0f4ac
+
8e0f4ac
+static void print(const struct ebt_u_entry *entry,
8e0f4ac
+   const struct ebt_entry_target *target)
8e0f4ac
+{
8e0f4ac
+	const struct xt_AUDIT_info *info =
8e0f4ac
+		(const struct xt_AUDIT_info *) target->data;
8e0f4ac
+
8e0f4ac
+	printf("--audit-type ");
8e0f4ac
+
8e0f4ac
+	switch(info->type) {
8e0f4ac
+	case XT_AUDIT_TYPE_ACCEPT:
8e0f4ac
+		printf("accept");
8e0f4ac
+		break;
8e0f4ac
+	case XT_AUDIT_TYPE_DROP:
8e0f4ac
+		printf("drop");
8e0f4ac
+		break;
8e0f4ac
+	case XT_AUDIT_TYPE_REJECT:
8e0f4ac
+		printf("reject");
8e0f4ac
+		break;
8e0f4ac
+	}
8e0f4ac
+}
8e0f4ac
+
8e0f4ac
+static int compare(const struct ebt_entry_target *t1,
8e0f4ac
+   const struct ebt_entry_target *t2)
8e0f4ac
+{
8e0f4ac
+	const struct xt_AUDIT_info *info1 =
8e0f4ac
+		(const struct xt_AUDIT_info *) t1->data;
8e0f4ac
+	const struct xt_AUDIT_info *info2 =
8e0f4ac
+		(const struct xt_AUDIT_info *) t2->data;
8e0f4ac
+
8e0f4ac
+	return info1->type == info2->type;
8e0f4ac
+}
8e0f4ac
+
8e0f4ac
+static struct ebt_u_target AUDIT_target =
8e0f4ac
+{
8e0f4ac
+	.name		= "AUDIT",
8e0f4ac
+	.size		= sizeof(struct xt_AUDIT_info),
8e0f4ac
+	.help		= print_help,
8e0f4ac
+	.init		= init,
8e0f4ac
+	.parse		= parse,
8e0f4ac
+	.final_check	= final_check,
8e0f4ac
+	.print		= print,
8e0f4ac
+	.compare	= compare,
8e0f4ac
+	.extra_ops	= opts,
8e0f4ac
+};
8e0f4ac
+
8e0f4ac
+void _init(void)
8e0f4ac
+{
8e0f4ac
+	ebt_register_target(&AUDIT_target);
8e0f4ac
+}
8e0f4ac
--- ebtables2.orig/extensions/Makefile	2011-01-07 10:55:28.077246240 +0100
8e0f4ac
+++ ebtables2.orig/extensions/Makefile	2011-01-07 10:53:46.686329230 +0100
8e0f4ac
@@ -1,7 +1,7 @@ 
8e0f4ac
 #! /usr/bin/make
8e0f4ac
 
8e0f4ac
 EXT_FUNC+=802_3 nat arp arpreply ip ip6 standard log redirect vlan mark_m mark \
8e0f4ac
-          pkttype stp among limit ulog nflog
8e0f4ac
+          pkttype stp among limit ulog nflog AUDIT
8e0f4ac
 EXT_TABLES+=filter nat broute
8e0f4ac
 EXT_OBJS+=$(foreach T,$(EXT_FUNC), extensions/ebt_$(T).o)
8e0f4ac
 EXT_OBJS+=$(foreach T,$(EXT_TABLES), extensions/ebtable_$(T).o)
8e0f4ac
--- a/include/linux/netfilter/xt_AUDIT.h	
8e0f4ac
+++ a/include/linux/netfilter/xt_AUDIT.h	
8e0f4ac
@@ -0,0 +1,30 @@ 
8e0f4ac
+/*
8e0f4ac
+ * Header file for iptables xt_AUDIT target
8e0f4ac
+ *
8e0f4ac
+ * (C) 2010-2011 Thomas Graf <tgraf@redhat.com>
8e0f4ac
+ * (C) 2010-2011 Red Hat, Inc.
8e0f4ac
+ *
8e0f4ac
+ * This program is free software; you can redistribute it and/or modify
8e0f4ac
+ * it under the terms of the GNU General Public License version 2 as
8e0f4ac
+ * published by the Free Software Foundation.
8e0f4ac
+ */
8e0f4ac
+
8e0f4ac
+#ifndef _XT_AUDIT_TARGET_H
8e0f4ac
+#define _XT_AUDIT_TARGET_H
8e0f4ac
+
8e0f4ac
+#include <linux/types.h>
8e0f4ac
+
8e0f4ac
+enum {
8e0f4ac
+	XT_AUDIT_TYPE_ACCEPT = 0,
8e0f4ac
+	XT_AUDIT_TYPE_DROP,
8e0f4ac
+	XT_AUDIT_TYPE_REJECT,
8e0f4ac
+	__XT_AUDIT_TYPE_MAX,
8e0f4ac
+};
8e0f4ac
+
8e0f4ac
+#define XT_AUDIT_TYPE_MAX (__XT_AUDIT_TYPE_MAX - 1)
8e0f4ac
+
8e0f4ac
+struct xt_AUDIT_info {
8e0f4ac
+	__u8 type; /* XT_AUDIT_TYPE_* */
8e0f4ac
+};
8e0f4ac
+
8e0f4ac
+#endif /* _XT_AUDIT_TARGET_H */