From c34eddedd3306749d6c03dd65aa55dff0ff512f3 Mon Sep 17 00:00:00 2001 From: Eric Leblond Date: Tue, 3 Mar 2009 21:22:33 +0100 Subject: 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. --- filter/ulogd_filter_IP2BIN.c | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) (limited to 'filter') 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 #include #include +#include #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; -- cgit v1.2.3