diff options
author | Eric Leblond <eric@inl.fr> | 2009-03-03 21:22:33 +0100 |
---|---|---|
committer | Eric Leblond <eric@inl.fr> | 2009-03-06 20:31:23 +0100 |
commit | c34eddedd3306749d6c03dd65aa55dff0ff512f3 (patch) | |
tree | 9eb0f188f5ad9e3840d3f2175319e5ffd31fd4d0 /filter/ulogd_filter_IP2BIN.c | |
parent | 7fa52beb5545130431a8763acdd00d44bf993854 (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/ulogd_filter_IP2BIN.c')
-rw-r--r-- | filter/ulogd_filter_IP2BIN.c | 28 |
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; |