summaryrefslogtreecommitdiffstats
path: root/filter
diff options
context:
space:
mode:
authorEric Leblond <eric@inl.fr>2009-03-03 21:22:33 +0100
committerEric Leblond <eric@inl.fr>2009-03-06 20:31:23 +0100
commitc34eddedd3306749d6c03dd65aa55dff0ff512f3 (patch)
tree9eb0f188f5ad9e3840d3f2175319e5ffd31fd4d0 /filter
parent7fa52beb5545130431a8763acdd00d44bf993854 (diff)
ip2bin: add AF_BRIDGE family support.
This patch adds support for AF_BRIDGE family. It synchronizes code of IP2BIN module with the one of IP2STR.
Diffstat (limited to 'filter')
-rw-r--r--filter/ulogd_filter_IP2BIN.c28
1 files changed, 27 insertions, 1 deletions
diff --git a/filter/ulogd_filter_IP2BIN.c b/filter/ulogd_filter_IP2BIN.c
index 7abf699..0a71972 100644
--- a/filter/ulogd_filter_IP2BIN.c
+++ b/filter/ulogd_filter_IP2BIN.c
@@ -27,11 +27,13 @@
#include <string.h>
#include <arpa/inet.h>
#include <ulogd/ulogd.h>
+#include <netinet/if_ether.h>
#define IPADDR_LENGTH 128
enum input_keys {
KEY_OOB_FAMILY,
+ KEY_OOB_PROTOCOL,
KEY_IP_SADDR,
START_KEY = KEY_IP_SADDR,
KEY_IP_DADDR,
@@ -125,13 +127,37 @@ inline void uint32_to_ipv6(const uint32_t ipv4, struct in6_addr *ipv6)
static int ip2bin(struct ulogd_key* inp, int index, int oindex)
{
char family = ikey_get_u8(&inp[KEY_OOB_FAMILY]);
+ char convfamily = family;
unsigned char *addr8;
struct in6_addr *addr;
struct in6_addr ip4_addr;
char *buffer;
int i, written;
- switch (family) {
+ if (family == AF_BRIDGE) {
+ if (!pp_is_valid(inp, KEY_OOB_PROTOCOL)) {
+ ulogd_log(ULOGD_NOTICE,
+ "No protocol inside AF_BRIDGE packet\n");
+ return ULOGD_IRET_ERR;
+ }
+ switch (ikey_get_u16(&inp[KEY_OOB_PROTOCOL])) {
+ case ETH_P_IPV6:
+ convfamily = AF_INET6;
+ break;
+ case ETH_P_IP:
+ convfamily = AF_INET;
+ break;
+ case ETH_P_ARP:
+ convfamily = AF_INET;
+ break;
+ default:
+ ulogd_log(ULOGD_NOTICE,
+ "Unknown protocol inside AF_BRIDGE packet\n");
+ return ULOGD_IRET_ERR;
+ }
+ }
+
+ switch (convfamily) {
case AF_INET6:
addr = (struct in6_addr *)ikey_get_u128(&inp[index]);
break;