%PDF- %PDF-
| Direktori : /backups/router/usr/local/include/flowd/ |
| Current File : //backups/router/usr/local/include/flowd/store.h |
/* $Id: store.h,v 1.31 2008/04/23 01:54:26 djm Exp $ */
/*
* Copyright (c) 2004,2005 Damien Miller <djm@mindrot.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/* On-disk storage format */
#ifndef _STORE_H
#define _STORE_H
#include "flowd-common.h"
#include "addr.h"
/* On-disk address formats for v4 and v6 addresses */
struct store_addr6 {
u_int8_t d[16];
} __packed;
struct store_addr4 {
u_int8_t d[4];
} __packed;
#define STORE_VER_MIN_MASK ((1 << 5) - 1)
#define STORE_VER_MAJ_MASK ((1 << 3) - 1)
#define STORE_MKVER(maj,min) (((maj & STORE_VER_MAJ_MASK) << 5) | \
(min & STORE_VER_MIN_MASK))
#define STORE_VER_GET_MAJ(ver) ((ver >> 5) & STORE_VER_MAJ_MASK)
#define STORE_VER_GET_MIN(ver) (ver & STORE_VER_MIN_MASK)
#define STORE_VER_MAJOR 3
#define STORE_VER_MINOR 0
#define STORE_VERSION STORE_MKVER(STORE_VER_MAJOR, STORE_VER_MINOR)
/* Start of flow record - present for every flow */
struct store_flow {
u_int8_t version;
u_int8_t len_words; /* len in 4 byte words not inc hdr */
u_int16_t reserved;
u_int32_t fields;
} __packed;
/*
* Optional flow fields, specify what is stored for the flow
* NB - the flow records appear in this order on disk
*/
#define STORE_FIELD_TAG (1U)
#define STORE_FIELD_RECV_TIME (1U<<1)
#define STORE_FIELD_PROTO_FLAGS_TOS (1U<<2)
#define STORE_FIELD_AGENT_ADDR4 (1U<<3)
#define STORE_FIELD_AGENT_ADDR6 (1U<<4)
#define STORE_FIELD_SRC_ADDR4 (1U<<5)
#define STORE_FIELD_SRC_ADDR6 (1U<<6)
#define STORE_FIELD_DST_ADDR4 (1U<<7)
#define STORE_FIELD_DST_ADDR6 (1U<<8)
#define STORE_FIELD_GATEWAY_ADDR4 (1U<<9)
#define STORE_FIELD_GATEWAY_ADDR6 (1U<<10)
#define STORE_FIELD_SRCDST_PORT (1U<<11)
#define STORE_FIELD_PACKETS (1U<<12)
#define STORE_FIELD_OCTETS (1U<<13)
#define STORE_FIELD_IF_INDICES (1U<<14)
#define STORE_FIELD_AGENT_INFO (1U<<15)
#define STORE_FIELD_FLOW_TIMES (1U<<16)
#define STORE_FIELD_AS_INFO (1U<<17)
#define STORE_FIELD_FLOW_ENGINE_INFO (1U<<18)
/* ... more one day */
#define STORE_FIELD_CRC32 (1U<<30)
#define STORE_FIELD_RESERVED (1U<<31) /* For extension header */
#define STORE_FIELD_ALL (((1U<<19)-1)|STORE_FIELD_CRC32)
/* Useful combinations */
#define STORE_FIELD_AGENT_ADDR (STORE_FIELD_AGENT_ADDR4|\
STORE_FIELD_AGENT_ADDR6)
#define STORE_FIELD_SRC_ADDR (STORE_FIELD_SRC_ADDR4|\
STORE_FIELD_SRC_ADDR6)
#define STORE_FIELD_DST_ADDR (STORE_FIELD_DST_ADDR4|\
STORE_FIELD_DST_ADDR6)
#define STORE_FIELD_SRCDST_ADDR (STORE_FIELD_SRC_ADDR|\
STORE_FIELD_DST_ADDR)
#define STORE_FIELD_GATEWAY_ADDR (STORE_FIELD_GATEWAY_ADDR4|\
STORE_FIELD_GATEWAY_ADDR6)
#define STORE_DISPLAY_ALL STORE_FIELD_ALL
#define STORE_DISPLAY_BRIEF (STORE_FIELD_TAG|\
STORE_FIELD_RECV_TIME|\
STORE_FIELD_PROTO_FLAGS_TOS|\
STORE_FIELD_SRCDST_PORT|\
STORE_FIELD_PACKETS|\
STORE_FIELD_OCTETS|\
STORE_FIELD_SRCDST_ADDR|\
STORE_FIELD_AGENT_ADDR4|\
STORE_FIELD_AGENT_ADDR6)
/*
* Optional flow records
* NB. suffixes must match the corresponding STORE_FIELD_ define (see store.c)
*/
/* Optional flow field - present if STORE_FIELD_TAG */
struct store_flow_TAG {
u_int32_t tag; /* set by filter */
} __packed;
/* Optional flow field - present if STORE_FIELD_RECV_TIME */
struct store_flow_RECV_TIME {
u_int32_t recv_sec;
u_int32_t recv_usec;
} __packed;
/* Optional flow field - present if STORE_FIELD_PROTO_FLAGS_TOS */
struct store_flow_PROTO_FLAGS_TOS {
u_int8_t tcp_flags;
u_int8_t protocol;
u_int8_t tos;
u_int8_t pad;
} __packed;
/* Optional flow field - present if STORE_FIELD_AGENT_ADDR */
struct store_flow_AGENT_ADDR4 {
struct store_addr4 flow_agent_addr;
} __packed;
struct store_flow_AGENT_ADDR6 {
struct store_addr6 flow_agent_addr;
} __packed;
/* Optional flow field - present if STORE_FIELD_SRC_ADDR4 */
struct store_flow_SRC_ADDR4 {
struct store_addr4 src_addr;
} __packed;
/* Optional flow field - present if STORE_FIELD_DST_ADDR4 */
struct store_flow_DST_ADDR4 {
struct store_addr4 dst_addr;
} __packed;
/* Optional flow field - present if STORE_FIELD_SRC_ADDR6 */
struct store_flow_SRC_ADDR6 {
struct store_addr6 src_addr;
} __packed;
/* Optional flow field - present if STORE_FIELD_DST_ADDR6 */
struct store_flow_DST_ADDR6 {
struct store_addr6 dst_addr;
} __packed;
/* Optional flow field - present if STORE_FIELD_GATEWAY_ADDR */
struct store_flow_GATEWAY_ADDR4 {
struct store_addr4 gateway_addr;
} __packed;
struct store_flow_GATEWAY_ADDR6 {
struct store_addr6 gateway_addr;
} __packed;
/* Optional flow field - present if STORE_FIELD_SRCDST_PORT */
struct store_flow_SRCDST_PORT {
u_int16_t src_port;
u_int16_t dst_port;
} __packed;
/* Optional flow field - present if STORE_FIELD_PACKETS */
struct store_flow_PACKETS {
u_int64_t flow_packets;
} __packed;
/* Optional flow field - present if STORE_FIELD_OCTETS */
struct store_flow_OCTETS {
u_int64_t flow_octets;
} __packed;
/* Optional flow field - present if STORE_FIELD_IF_INDICES */
struct store_flow_IF_INDICES {
u_int32_t if_index_in;
u_int32_t if_index_out;
} __packed;
/* Optional flow field - present if STORE_FIELD_AGENT_INFO */
struct store_flow_AGENT_INFO {
u_int32_t sys_uptime_ms;
u_int32_t time_sec;
u_int32_t time_nanosec;
u_int16_t netflow_version;
u_int16_t pad;
} __packed;
/* Optional flow field - present if STORE_FIELD_FLOW_TIMES */
struct store_flow_FLOW_TIMES {
u_int32_t flow_start;
u_int32_t flow_finish;
} __packed;
/* Optional flow field - present if STORE_FIELD_AS_INFO */
struct store_flow_AS_INFO {
u_int32_t src_as;
u_int32_t dst_as;
u_int8_t src_mask;
u_int8_t dst_mask;
u_int16_t pad;
} __packed;
/* Optional flow field - present if STORE_FIELD_FLOW_ENGINE_INFO */
struct store_flow_FLOW_ENGINE_INFO {
u_int16_t engine_type;
u_int16_t engine_id;
u_int32_t flow_sequence;
u_int32_t source_id;
} __packed;
/* Optional flow field - present if STORE_FIELD_CRC32 */
struct store_flow_CRC32 {
u_int32_t crc32;
} __packed;
/* A abstract flow record (all fields included) */
struct store_flow_complete {
struct store_flow hdr;
struct store_flow_TAG tag;
struct store_flow_RECV_TIME recv_time;
struct store_flow_PROTO_FLAGS_TOS pft;
struct xaddr agent_addr;
struct xaddr src_addr;
struct xaddr dst_addr;
struct xaddr gateway_addr;
struct store_flow_SRCDST_PORT ports;
struct store_flow_PACKETS packets;
struct store_flow_OCTETS octets;
struct store_flow_IF_INDICES ifndx;
struct store_flow_AGENT_INFO ainfo;
struct store_flow_FLOW_TIMES ftimes;
struct store_flow_AS_INFO asinf;
struct store_flow_FLOW_ENGINE_INFO finf;
struct store_flow_CRC32 crc32;
} __packed;
/* Error codes for store log functions */
#define STORE_ERR_OK 0x00
#define STORE_ERR_EOF 0x01
#define STORE_ERR_BAD_MAGIC 0x02
#define STORE_ERR_UNSUP_VERSION 0x03
#define STORE_ERR_BUFFER_SIZE 0x04
#define STORE_ERR_FLOW_INVALID 0x05
#define STORE_ERR_CRC_MISMATCH 0x06
#define STORE_ERR_INTERNAL 0x07
#define STORE_ERR_IO 0x08
#define STORE_ERR_IO_SEEK 0x09
#define STORE_ERR_CORRUPT 0x10
/* file descriptor oriented interface (tries to back out on failure */
int store_put_buf(int fd, char *buf, int len, char *ebuf, int elen);
int store_get_flow(int fd, struct store_flow_complete *f, char *ebuf, int elen);
int store_put_flow(int fd, struct store_flow_complete *flow,
u_int32_t fieldmask, char *ebuf, int elen);
/* Simple FILE* oriented interface, doesn't backout on failure */
int store_read_flow(FILE *f, struct store_flow_complete *flow, char *ebuf,
int elen);
int store_write_flow(FILE *f, struct store_flow_complete *flow,
u_int32_t fieldmask, char *ebuf, int elen);
/* Serialisation and deserialisation */
int store_flow_deserialise(u_int8_t *buf, int len,
struct store_flow_complete *f, char *ebuf, int elen);
int store_flow_serialise(struct store_flow_complete *f, u_int8_t *buf, int buflen,
int *flowlen, char *ebuf, int elen);
int store_flow_serialise_masked(struct store_flow_complete *f, u_int32_t mask,
u_int8_t *buf, int buflen, int *flowlen, char *ebuf, int elen);
int store_calc_flow_len(struct store_flow *hdr);
/* Formatting and conversion */
void store_format_flow(struct store_flow_complete *flow, char *buf,
size_t len, int utc_flag, u_int32_t display_mask, int hostorder);
void store_format_flow_flowtools_csv(struct store_flow_complete *flow,
char *buf, size_t len, int utc_flag, u_int32_t display_mask,
int hostorder);
void store_swab_flow(struct store_flow_complete *flow, int to_net);
/* Utility functions */
const char *iso_time(time_t t, int utc_flag);
const char *interval_time(time_t t);
u_int64_t store_ntohll(u_int64_t v);
u_int64_t store_htonll(u_int64_t v);
#endif /* _STORE_H */