diff options
Diffstat (limited to 'input/packet')
-rw-r--r-- | input/packet/Makefile.am | 8 | ||||
-rw-r--r-- | input/packet/ulogd_inppkt_ULOG.c | 332 |
2 files changed, 0 insertions, 340 deletions
diff --git a/input/packet/Makefile.am b/input/packet/Makefile.am index 851c608..20c51ec 100644 --- a/input/packet/Makefile.am +++ b/input/packet/Makefile.am @@ -7,14 +7,6 @@ pkglib_LTLIBRARIES = ulogd_inppkt_UNIXSOCK.la ulogd_inppkt_UNIXSOCK_la_SOURCES = ulogd_inppkt_UNIXSOCK.c ulogd_inppkt_UNIXSOCK_la_LDFLAGS = -avoid-version -module -if BUILD_ULOG -pkglib_LTLIBRARIES += ulogd_inppkt_ULOG.la - -ulogd_inppkt_ULOG_la_SOURCES = ulogd_inppkt_ULOG.c -ulogd_inppkt_ULOG_la_LDFLAGS = -avoid-version -module -ulogd_inppkt_ULOG_la_LIBADD = ../../libipulog/libipulog.la -endif - if BUILD_NFLOG pkglib_LTLIBRARIES += ulogd_inppkt_NFLOG.la diff --git a/input/packet/ulogd_inppkt_ULOG.c b/input/packet/ulogd_inppkt_ULOG.c deleted file mode 100644 index 2eb994c..0000000 --- a/input/packet/ulogd_inppkt_ULOG.c +++ /dev/null @@ -1,332 +0,0 @@ -/* ulogd_inppkt_ULOG.c - stackable input plugin for ULOG packets -> ulogd2 - * - * (C) 2004-2005 by Harald Welte <laforge@gnumonks.org> - */ - -#include <unistd.h> -#include <stdlib.h> -#include <arpa/inet.h> -#include <string.h> - - -#include <ulogd/ulogd.h> -#include <libipulog/libipulog.h> - -#ifndef ULOGD_NLGROUP_DEFAULT -#define ULOGD_NLGROUP_DEFAULT 32 -#endif - -/* Size of the socket receive memory. Should be at least the same size as the - * 'nlbufsiz' module loadtime parameter of ipt_ULOG.o - * If you have _big_ in-kernel queues, you may have to increase this number. ( - * --qthreshold 100 * 1500 bytes/packet = 150kB */ -#define ULOGD_RMEM_DEFAULT 131071 - -/* Size of the receive buffer for the netlink socket. Should be at least of - * RMEM_DEFAULT size. */ -#define ULOGD_BUFSIZE_DEFAULT 150000 - -struct ulog_input { - struct ipulog_handle *libulog_h; - unsigned char *libulog_buf; - struct ulogd_fd ulog_fd; -}; - -/* configuration entries */ - -static struct config_keyset libulog_kset = { - .num_ces = 4, - .ces = { - { - .key = "bufsize", - .type = CONFIG_TYPE_INT, - .options = CONFIG_OPT_NONE, - .u.value = ULOGD_BUFSIZE_DEFAULT, - }, - { - .key = "nlgroup", - .type = CONFIG_TYPE_INT, - .options = CONFIG_OPT_NONE, - .u.value = ULOGD_NLGROUP_DEFAULT, - }, - { - .key = "rmem", - .type = CONFIG_TYPE_INT, - .options = CONFIG_OPT_NONE, - .u.value = ULOGD_RMEM_DEFAULT, - }, - { - .key = "numeric_label", - .type = CONFIG_TYPE_INT, - .options = CONFIG_OPT_NONE, - .u.value = 0, - }, - - } -}; -enum ulog_keys { - ULOG_KEY_RAW_MAC = 0, - ULOG_KEY_RAW_PCKT, - ULOG_KEY_RAW_PCKTLEN, - ULOG_KEY_RAW_PCKTCOUNT, - ULOG_KEY_OOB_PREFIX, - ULOG_KEY_OOB_TIME_SEC, - ULOG_KEY_OOB_TIME_USEC, - ULOG_KEY_OOB_MARK, - ULOG_KEY_OOB_IN, - ULOG_KEY_OOB_OUT, - ULOG_KEY_OOB_HOOK, - ULOG_KEY_RAW_MAC_LEN, - ULOG_KEY_OOB_FAMILY, - ULOG_KEY_OOB_PROTOCOL, - ULOG_KEY_RAW_LABEL, -}; - -static struct ulogd_key output_keys[] = { - [ULOG_KEY_RAW_MAC] = { - .type = ULOGD_RET_RAW, - .flags = ULOGD_RETF_NONE, - .name = "raw.mac", - .ipfix = { - .vendor = IPFIX_VENDOR_IETF, - .field_id = IPFIX_sourceMacAddress, - }, - }, - [ULOG_KEY_RAW_PCKT] = { - .type = ULOGD_RET_RAW, - .flags = ULOGD_RETF_NONE, - .name = "raw.pkt", - .ipfix = { - .vendor = IPFIX_VENDOR_NETFILTER, - .field_id = 1, - }, - }, - [ULOG_KEY_RAW_PCKTLEN] = { - .type = ULOGD_RET_UINT32, - .flags = ULOGD_RETF_NONE, - .name = "raw.pktlen", - .ipfix = { - .vendor = IPFIX_VENDOR_IETF, - .field_id = 1 - }, - }, - [ULOG_KEY_RAW_PCKTCOUNT] = { - .type = ULOGD_RET_UINT32, - .flags = ULOGD_RETF_NONE, - .name = "raw.pktcount", - .ipfix = { - .vendor = IPFIX_VENDOR_IETF, - .field_id = 2 - }, - }, - [ULOG_KEY_OOB_PREFIX] = { - .type = ULOGD_RET_STRING, - .flags = ULOGD_RETF_NONE, - .name = "oob.prefix", - }, - [ULOG_KEY_OOB_TIME_SEC] = { - .type = ULOGD_RET_UINT32, - .flags = ULOGD_RETF_NONE, - .name = "oob.time.sec", - .ipfix = { - .vendor = IPFIX_VENDOR_IETF, - .field_id = 22 - }, - }, - [ULOG_KEY_OOB_TIME_USEC] = { - .type = ULOGD_RET_UINT32, - .flags = ULOGD_RETF_NONE, - .name = "oob.time.usec", - }, - [ULOG_KEY_OOB_MARK] = { - .type = ULOGD_RET_UINT32, - .flags = ULOGD_RETF_NONE, - .name = "oob.mark", - }, - [ULOG_KEY_OOB_IN] = { - .type = ULOGD_RET_STRING, - .flags = ULOGD_RETF_NONE, - .name = "oob.in", - }, - [ULOG_KEY_OOB_OUT] = { - .type = ULOGD_RET_STRING, - .flags = ULOGD_RETF_NONE, - .name = "oob.out", - }, - [ULOG_KEY_OOB_HOOK] = { - .type = ULOGD_RET_UINT8, - .flags = ULOGD_RETF_NONE, - .name = "oob.hook", - .ipfix = { - .vendor = IPFIX_VENDOR_NETFILTER, - .field_id = IPFIX_NF_hook, - }, - }, - [ULOG_KEY_RAW_MAC_LEN] = { - .type = ULOGD_RET_UINT16, - .flags = ULOGD_RETF_NONE, - .name = "raw.mac_len", - }, - [ULOG_KEY_OOB_FAMILY] = { - .type = ULOGD_RET_UINT8, - .flags = ULOGD_RETF_NONE, - .name = "oob.family", - }, - [ULOG_KEY_OOB_PROTOCOL] = { - .type = ULOGD_RET_UINT16, - .flags = ULOGD_RETF_NONE, - .name = "oob.protocol", - }, - [ULOG_KEY_RAW_LABEL] = { - .type = ULOGD_RET_UINT8, - .flags = ULOGD_RETF_NONE, - .name = "raw.label", - }, - -}; - -static int interp_packet(struct ulogd_pluginstance *ip, ulog_packet_msg_t *pkt) -{ - struct ulogd_key *ret = ip->output.keys; - - if (pkt->mac_len) { - okey_set_ptr(&ret[ULOG_KEY_RAW_MAC], pkt->mac); - okey_set_u16(&ret[ULOG_KEY_RAW_MAC_LEN], pkt->mac_len); - } - - okey_set_u8(&ret[ULOG_KEY_RAW_LABEL], ip->config_kset->ces[3].u.value); - - /* include pointer to raw ipv4 packet */ - okey_set_ptr(&ret[ULOG_KEY_RAW_PCKT], pkt->payload); - okey_set_u32(&ret[ULOG_KEY_RAW_PCKTLEN], pkt->data_len); - okey_set_u32(&ret[ULOG_KEY_RAW_PCKTCOUNT], 1); - - okey_set_ptr(&ret[ULOG_KEY_OOB_PREFIX], pkt->prefix); - - /* god knows why timestamp_usec contains crap if timestamp_sec == 0 - * if (pkt->timestamp_sec || pkt->timestamp_usec) { */ - if (pkt->timestamp_sec) { - okey_set_u32(&ret[ULOG_KEY_OOB_TIME_SEC], pkt->timestamp_sec); - okey_set_u32(&ret[ULOG_KEY_OOB_TIME_USEC], pkt->timestamp_usec); - } else { - ret[ULOG_KEY_OOB_TIME_SEC].flags &= ~ULOGD_RETF_VALID; - ret[ULOG_KEY_OOB_TIME_USEC].flags &= ~ULOGD_RETF_VALID; - } - - okey_set_u32(&ret[ULOG_KEY_OOB_MARK], pkt->mark); - okey_set_ptr(&ret[ULOG_KEY_OOB_IN], pkt->indev_name); - okey_set_ptr(&ret[ULOG_KEY_OOB_OUT], pkt->outdev_name); - - okey_set_u8(&ret[ULOG_KEY_OOB_HOOK], pkt->hook); - - /* ULOG is IPv4 only */ - okey_set_u8(&ret[ULOG_KEY_OOB_FAMILY], AF_INET); - /* Undef in ULOG but necessary */ - okey_set_u16(&ret[ULOG_KEY_OOB_PROTOCOL], 0); - - ulogd_propagate_results(ip); - return 0; -} - -static int ulog_read_cb(int fd, unsigned int what, void *param) -{ - struct ulogd_pluginstance *upi = (struct ulogd_pluginstance *)param; - struct ulogd_pluginstance *npi = NULL; - struct ulog_input *u = (struct ulog_input *) &upi->private; - ulog_packet_msg_t *upkt; - int len; - - if (!(what & ULOGD_FD_READ)) - return 0; - - while ((len = ipulog_read(u->libulog_h, u->libulog_buf, - upi->config_kset->ces[0].u.value))) { - if (len <= 0) { - if (errno == EAGAIN) - break; - /* this is not supposed to happen */ - ulogd_log(ULOGD_ERROR, "ipulog_read = %d! " - "ipulog_errno = %d (%s), " - "errno = %d (%s)\n", - len, ipulog_errno, - ipulog_strerror(ipulog_errno), - errno, strerror(errno)); - break; - } - while ((upkt = ipulog_get_packet(u->libulog_h, - u->libulog_buf, len))) { - /* since we support the re-use of one instance in - * several different stacks, we duplicate the message - * to let them know */ - llist_for_each_entry(npi, &upi->plist, plist) - interp_packet(npi, upkt); - interp_packet(upi, upkt); - } - } - return 0; -} - -static int init(struct ulogd_pluginstance *upi) -{ - struct ulog_input *ui = (struct ulog_input *) &upi->private; - - ui->libulog_buf = malloc(upi->config_kset->ces[0].u.value); - if (!ui->libulog_buf) { - ulogd_log(ULOGD_ERROR, "Out of memory\n"); - goto out_buf; - } - - ui->libulog_h = ipulog_create_handle( - ipulog_group2gmask(upi->config_kset->ces[1].u.value), - upi->config_kset->ces[2].u.value); - if (!ui->libulog_h) { - ulogd_log(ULOGD_ERROR, "Can't create ULOG handle\n"); - goto out_handle; - } - - ui->ulog_fd.fd = ipulog_get_fd(ui->libulog_h); - ui->ulog_fd.cb = &ulog_read_cb; - ui->ulog_fd.data = upi; - ui->ulog_fd.when = ULOGD_FD_READ; - - ulogd_register_fd(&ui->ulog_fd); - - return 0; - -out_handle: - free(ui->libulog_buf); -out_buf: - return -1; -} - -static int fini(struct ulogd_pluginstance *pi) -{ - struct ulog_input *ui = (struct ulog_input *)pi->private; - - ulogd_unregister_fd(&ui->ulog_fd); - - return 0; -} - -struct ulogd_plugin libulog_plugin = { - .name = "ULOG", - .input = { - .type = ULOGD_DTYPE_SOURCE, - .keys = NULL, - .num_keys = 0, - }, - .output = { - .type = ULOGD_DTYPE_RAW, - .keys = output_keys, - .num_keys = ARRAY_SIZE(output_keys), - }, - .start = &init, - .stop = &fini, - .config_kset = &libulog_kset, - .version = VERSION, -}; - -void __attribute__ ((constructor)) initializer(void) -{ - ulogd_register_plugin(&libulog_plugin); -} |