-/* ulogd_MAC.c, Version $Revision: 1.1 $
+/* ulogd_MAC.c, Version $Revision: 1.2 $
*
* ulogd logging interpreter for MAC addresses, TIME, etc.
*
* (C) 2000 by Harald Welte <laforge@sunbeam.franken.de>
* This software is released under the terms of GNU GPL
*
- * $Id: ulogd_BASE.c,v 1.1 2000/08/02 08:51:15 laforge Exp laforge $
+ * $Id: ulogd_BASE.c,v 1.2 2000/08/02 12:15:44 laforge Exp $
*
*/
#include <linux/in.h>
#include <linux/tcp.h>
#include <linux/icmp.h>
+#include <linux/udp.h>
ulog_iret_t *_interp_mac(ulog_packet_msg_t *pkt)
{
ulog_iret_t *_interp_tcphdr(ulog_packet_msg_t *pkt)
{
struct iphdr *iph = (struct iphdr *) pkt->payload;
- struct tcphdr *tcph = (struct tcphdr *) (iph + iph->ihl);
+ void *protoh = (u_int32_t *)iph + iph->ihl;
+ struct tcphdr *tcph = (struct tcphdr *) protoh;
ulog_iret_t *ret, *ret2;
if (iph->protocol != IPPROTO_TCP)
ret = alloc_ret(ULOGD_RET_UINT16, "tcp.hdr.sport");
ret->value.ui16 = ntohs(tcph->source);
- ret->next = ret2 = alloc_ret(ULOGD_RET_UINT16, "tcp.hdr.sport");
- ret->value.ui16 = ntohs(tcph->dest);
+ ret->next = ret2 = alloc_ret(ULOGD_RET_UINT16, "tcp.hdr.dport");
+ ret2->value.ui16 = ntohs(tcph->dest);
ret2 = ret2->next = alloc_ret(ULOGD_RET_UINT32, "tcp.hdr.seq");
- ret->value.ui32 = ntohl(tcph->seq);
+ ret2->value.ui32 = ntohl(tcph->seq);
ret2 = ret2->next = alloc_ret(ULOGD_RET_UINT32, "tcp.hdr.ack_seq");
- ret->value.ui32 = ntohl(tcph->ack_seq);
+ ret2->value.ui32 = ntohl(tcph->ack_seq);
+
+ ret2 = ret2->next = alloc_ret(ULOGD_RET_UINT16, "tcp.hdr.window");
+ ret2->value.ui16 = ntohs(tcph->window);
+
+ if (tcph->urg) {
+ ret2 = ret2->next = alloc_ret(ULOGD_RET_BOOL, "tcp.hdr.urg");
+ ret2->value.b = 1;
+
+ ret2 = ret2->next = alloc_ret(ULOGD_RET_UINT16, "tcp.hdr.urgp");
+ ret2->value.ui16 = ntohs(tcph->urg_ptr);
+ }
+ if (tcph->ack) {
+ ret2 = ret2->next = alloc_ret(ULOGD_RET_BOOL, "tcp.hdr.ack");
+ ret2->value.b = 1;
+ }
+ if (tcph->psh) {
+ ret2 = ret2->next = alloc_ret(ULOGD_RET_BOOL, "tcp.hdr.psh");
+ ret2->value.b = 1;
+ }
+ if (tcph->rst) {
+ ret2 = ret2->next = alloc_ret(ULOGD_RET_BOOL, "tcp.hdr.rst");
+ ret2->value.b = 1;
+ }
+ if (tcph->syn) {
+ ret2 = ret2->next = alloc_ret(ULOGD_RET_BOOL, "tcp.hdr.syn");
+ ret2->value.b = 1;
+ }
+ if (tcph->fin) {
+ ret2 = ret2->next = alloc_ret(ULOGD_RET_BOOL, "tcp.hdr.fin");
+ ret2->value.b = 1;
+ }
+
+ return ret;
+}
+
+ulog_iret_t *_interp_udp(ulog_packet_msg_t *pkt)
+{
+ struct iphdr *iph = (struct iphdr *) pkt->payload;
+ void *protoh = (u_int32_t *)iph + iph->ihl;
+ struct udphdr *udph = protoh;
+ ulog_iret_t *ret, *ret2;
+
+ if (iph->protocol != IPPROTO_UDP)
+ return NULL;
+
+ ret = alloc_ret(ULOGD_RET_UINT16, "udp.hdr.sport");
+ ret->value.ui16 = ntohs(udph->source);
+
+ ret2 = ret->next = alloc_ret(ULOGD_RET_UINT16, "udp.hdr.dport");
+ ret2->value.ui16 = ntohs(udph->dest);
+
+ ret2 = ret2->next = alloc_ret(ULOGD_RET_UINT16, "udp.hdr.len");
+ ret2->value.ui16 = ntohs(udph->len);
return ret;
}
ulog_iret_t *_interp_icmp(ulog_packet_msg_t *pkt)
{
struct iphdr *iph = (struct iphdr *) pkt->payload;
- struct icmphdr *icmph = (struct icmphdr *) (iph + iph->ihl);
+ void *protoh = (u_int32_t *) (iph + iph->ihl);
+ struct icmphdr *icmph = protoh;
ulog_iret_t *ret, *ret2;
if (iph->protocol != IPPROTO_ICMP)
{ NULL, "ip.hdr", &_interp_iphdr },
{ NULL, "tcp.hdr", &_interp_tcphdr },
{ NULL, "icmp.hdr", &_interp_icmp },
+ { NULL, "udp.hdr", &_interp_udp },
{ NULL, "", NULL },
};
void _base_reg_ip(void)
#ifndef _ULOGD_H
#define _ULOGD_H
-/* ulogd, Version $Revision: 1.2 $
+/* ulogd, Version $Revision: 1.3 $
*
* first try of a logging daemon for my netfilter ULOG target
* for the linux 2.4 netfilter subsystem.
*
* this code is released under the terms of GNU GPL
*
- * $Id: ulogd.h,v 1.2 2000/08/02 12:16:42 laforge Exp laforge $
+ * $Id: ulogd.h,v 1.3 2000/08/02 12:20:55 laforge Exp $
*/
#include <libipulog/libipulog.h>
#define ULOGD_RET_UINT32 0x0013
#define ULOGD_RET_UINT64 0x0014
-#define ULOGD_RET_STRING 0x8020
+#define ULOGD_RET_BOOL 0x0050
#define ULOGD_RET_IPADDR 0x0100
/* types with lenght field*/
+#define ULOGD_RET_STRING 0x8020
+#define ULODG_RET_RAW 0x8030
+
#define ULOGD_RET_OTHER 0xffff
+
#define ULOGD_MAX_KEYLEN 32
#define ulogd_error(format, args...) fprintf(logfile, format, ## args)
u_int16_t type;
char key[ULOGD_MAX_KEYLEN];
union {
+ u_int8_t b;
u_int8_t ui8;
u_int16_t ui16;
u_int32_t ui32;