diff options
Diffstat (limited to 'filter/ulogd_filter_IP2BIN.c')
-rw-r--r-- | filter/ulogd_filter_IP2BIN.c | 86 |
1 files changed, 43 insertions, 43 deletions
diff --git a/filter/ulogd_filter_IP2BIN.c b/filter/ulogd_filter_IP2BIN.c index f1ca4ee..2667a2a 100644 --- a/filter/ulogd_filter_IP2BIN.c +++ b/filter/ulogd_filter_IP2BIN.c @@ -114,14 +114,42 @@ static struct ulogd_key ip2bin_keys[] = { static char ipbin_array[MAX_KEY - START_KEY + 1][FORMAT_IPV6_BUFSZ]; -static int ip2bin(struct ulogd_key *inp, int index, int oindex) +static void ip2bin(struct ulogd_key *inp, int i, struct ulogd_key *outp, int o, + uint8_t addr_family) { - char family = ikey_get_u8(&inp[KEY_OOB_FAMILY]); - char convfamily = family; - struct in6_addr *addr; - struct in6_addr ip4_addr; + struct in6_addr *addr, ip4_addr; + + switch (addr_family) { + case AF_INET6: + addr = (struct in6_addr *)ikey_get_u128(&inp[i]); + break; + case AF_INET: + /* Convert IPv4 to IPv4 in IPv6 */ + addr = &ip4_addr; + uint32_to_ipv6(ikey_get_u32(&inp[i]), addr); + break; + } + + format_ipv6(ipbin_array[o], sizeof(ipbin_array[o]), addr); + + okey_set_ptr(&outp[o], ipbin_array[o]); +} + +static int interp_ip2bin(struct ulogd_pluginstance *pi) +{ + struct ulogd_key *outp = pi->output.keys; + struct ulogd_key *inp = pi->input.keys; + uint8_t proto_family, addr_family; + int i, o; + + proto_family = ikey_get_u8(&inp[KEY_OOB_FAMILY]); - if (family == AF_BRIDGE) { + switch (proto_family) { + case AF_INET6: + case AF_INET: + addr_family = proto_family; + break; + case AF_BRIDGE: if (!pp_is_valid(inp, KEY_OOB_PROTOCOL)) { ulogd_log(ULOGD_NOTICE, "No protocol inside AF_BRIDGE packet\n"); @@ -129,56 +157,28 @@ static int ip2bin(struct ulogd_key *inp, int index, int oindex) } switch (ikey_get_u16(&inp[KEY_OOB_PROTOCOL])) { case ETH_P_IPV6: - convfamily = AF_INET6; + addr_family = AF_INET6; break; case ETH_P_IP: - convfamily = AF_INET; - break; case ETH_P_ARP: - convfamily = AF_INET; + addr_family = AF_INET; break; default: ulogd_log(ULOGD_NOTICE, "Unknown protocol inside AF_BRIDGE packet\n"); return ULOGD_IRET_ERR; } + break; + default: + /* TODO handle error */ + ulogd_log(ULOGD_NOTICE, "Unknown protocol family\n"); + return ULOGD_IRET_ERR; } - switch (convfamily) { - case AF_INET6: - addr = (struct in6_addr *)ikey_get_u128(&inp[index]); - break; - case AF_INET: - /* Convert IPv4 to IPv4 in IPv6 */ - addr = &ip4_addr; - uint32_to_ipv6(ikey_get_u32(&inp[index]), addr); - break; - default: - /* TODO handle error */ - ulogd_log(ULOGD_NOTICE, "Unknown protocol family\n"); - return ULOGD_IRET_ERR; - } - - format_ipv6(ipbin_array[oindex], sizeof(ipbin_array[oindex]), addr); - - return ULOGD_IRET_OK; -} - -static int interp_ip2bin(struct ulogd_pluginstance *pi) -{ - struct ulogd_key *ret = pi->output.keys; - struct ulogd_key *inp = pi->input.keys; - int i; - int fret; - /* Iter on all addr fields */ - for(i = START_KEY; i <= MAX_KEY; i++) { + for (i = START_KEY, o = 0; i <= MAX_KEY; i++, o++) { if (pp_is_valid(inp, i)) { - fret = ip2bin(inp, i, i - START_KEY); - if (fret != ULOGD_IRET_OK) - return fret; - okey_set_ptr(&ret[i - START_KEY], - ipbin_array[i - START_KEY]); + ip2bin(inp, i, outp, o, addr_family); } } |