From 9e7b77aaf9c8d4de1d3a454e021ddd0fd822eda1 Mon Sep 17 00:00:00 2001 From: "/C=EU/ST=EU/CN=Pablo Neira Ayuso/emailAddress=pablo@netfilter.org" Date: Wed, 9 Apr 2008 11:06:50 +0000 Subject: add missing ulogd_filter_MAC2STR --- filter/ulogd_filter_MAC2STR.c | 111 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 filter/ulogd_filter_MAC2STR.c (limited to 'filter') diff --git a/filter/ulogd_filter_MAC2STR.c b/filter/ulogd_filter_MAC2STR.c new file mode 100644 index 0000000..38d0565 --- /dev/null +++ b/filter/ulogd_filter_MAC2STR.c @@ -0,0 +1,111 @@ +/* ulogd_filter_MAC2STR.c, Version $Revision: 1500 $ + * + * ulogd interpreter plugin for HWMAC + * + * (C) 2008 by Eric Leblond + * + * Based on ulogd_filter_IFINDEX.c Harald Welte + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id: ulogd_filter_IFINDEX.c 1500 2005-10-03 16:54:02Z laforge $ + */ + +#include +#include +#include +#include +#include + +#define IPADDR_LENGTH 128 + +enum input_keys { + KEY_RAW_MAC, + KEY_RAW_MACLEN, +}; + +enum output_keys { + KEY_MAC_SADDR, +}; + +static struct ulogd_key mac2str_inp[] = { + [KEY_RAW_MAC] = { + .type = ULOGD_RET_RAW, + .flags = ULOGD_RETF_NONE, + .name = "raw.mac", + }, + [KEY_RAW_MACLEN] = { + .type = ULOGD_RET_UINT16, + .flags = ULOGD_RETF_NONE, + .name = "raw.mac_len", + }, + +}; + +static struct ulogd_key mac2str_keys[] = { + { + .type = ULOGD_RET_STRING, + .flags = ULOGD_RETF_FREE, + .name = "mac.saddr.str", + }, +}; + +static int interp_mac2str(struct ulogd_pluginstance *pi) +{ + struct ulogd_key *ret = pi->output.keys; + struct ulogd_key *inp = pi->input.keys; + + if (pp_is_valid(inp, KEY_RAW_MAC)) { + unsigned char *mac = (unsigned char *) GET_VALUE(inp, KEY_RAW_MAC).ptr; + int len = GET_VALUE(inp, KEY_RAW_MACLEN).ui16; + char *mac_str = calloc(len/sizeof(char)*3, sizeof(char)); + char *buf_cur = mac_str; + int i; + + if (mac_str == NULL) + return -1; + + for (i = 0; i < len; i++) + buf_cur += sprintf(buf_cur, "%02x%c", mac[i], + i == len - 1 ? 0 : ':'); + + ret[KEY_MAC_SADDR].u.value.ptr = mac_str; + ret[KEY_MAC_SADDR].flags |= ULOGD_RETF_VALID; + } + + return 0; +} + +static struct ulogd_plugin mac2str_pluging = { + .name = "MAC2STR", + .input = { + .keys = mac2str_inp, + .num_keys = ARRAY_SIZE(mac2str_inp), + .type = ULOGD_DTYPE_PACKET, + }, + .output = { + .keys = mac2str_keys, + .num_keys = ARRAY_SIZE(mac2str_keys), + .type = ULOGD_DTYPE_PACKET, + }, + .interp = &interp_mac2str, + .version = ULOGD_VERSION, +}; + +void __attribute__ ((constructor)) init(void); + +void init(void) +{ + ulogd_register_plugin(&mac2str_pluging); +} -- cgit v1.2.3