%PDF- %PDF-
Direktori : /backups/router/usr/local/include/flowd/ |
Current File : //backups/router/usr/local/include/flowd/store-v2.h |
/* $Id: store-v2.h,v 1.2 2005/08/21 11:16:05 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_V2_H #define _STORE_v2_H #if defined(HAVE_SYS_CDEFS_H) # include <sys/cdefs.h> /* For __packed, etc on platforms that have it */ #endif #if defined(__GNUC__) && !defined(__packed) # define __packed __attribute__((__packed__)) #endif #include "addr.h" #include "store.h" #define STORE_V2_MAGIC 0x012cf047 #define STORE_V2_VERSION 0x00000002 /* Start of flow log file */ struct store_v2_header { u_int32_t magic; u_int32_t version; u_int32_t start_time; u_int32_t flags; /* Currently 0 */ } __packed; /* * Optional flow fields, specify what is stored for the flow * NB - the flow records appear in this order on disk */ #define STORE_V2_FIELD_TAG (1U) #define STORE_V2_FIELD_RECV_TIME (1U<<1) #define STORE_V2_FIELD_PROTO_FLAGS_TOS (1U<<2) #define STORE_V2_FIELD_AGENT_ADDR4 (1U<<3) #define STORE_V2_FIELD_AGENT_ADDR6 (1U<<4) #define STORE_V2_FIELD_SRC_ADDR4 (1U<<5) #define STORE_V2_FIELD_SRC_ADDR6 (1U<<6) #define STORE_V2_FIELD_DST_ADDR4 (1U<<7) #define STORE_V2_FIELD_DST_ADDR6 (1U<<8) #define STORE_V2_FIELD_GATEWAY_ADDR4 (1U<<9) #define STORE_V2_FIELD_GATEWAY_ADDR6 (1U<<10) #define STORE_V2_FIELD_SRCDST_PORT (1U<<11) #define STORE_V2_FIELD_PACKETS (1U<<12) #define STORE_V2_FIELD_OCTETS (1U<<13) #define STORE_V2_FIELD_IF_INDICES (1U<<14) #define STORE_V2_FIELD_AGENT_INFO (1U<<15) #define STORE_V2_FIELD_FLOW_TIMES (1U<<16) #define STORE_V2_FIELD_AS_INFO (1U<<17) #define STORE_V2_FIELD_FLOW_ENGINE_INFO (1U<<18) /* ... more one day */ #define STORE_V2_FIELD_CRC32 (1U<<30) #define STORE_V2_FIELD_RESERVED (1U<<31) /* For extension header */ #define STORE_V2_FIELD_ALL (((1U<<19)-1)|STORE_V2_FIELD_CRC32) /* Useful combinations */ #define STORE_V2_FIELD_AGENT_ADDR (STORE_V2_FIELD_AGENT_ADDR4|\ STORE_V2_FIELD_AGENT_ADDR6) #define STORE_V2_FIELD_SRC_ADDR (STORE_V2_FIELD_SRC_ADDR4|\ STORE_V2_FIELD_SRC_ADDR6) #define STORE_V2_FIELD_DST_ADDR (STORE_V2_FIELD_DST_ADDR4|\ STORE_V2_FIELD_DST_ADDR6) #define STORE_V2_FIELD_SRCDST_ADDR (STORE_V2_FIELD_SRC_ADDR|\ STORE_V2_FIELD_DST_ADDR) #define STORE_V2_FIELD_GATEWAY_ADDR (STORE_V2_FIELD_GATEWAY_ADDR4|\ STORE_V2_FIELD_GATEWAY_ADDR6) #define STORE_V2_DISPLAY_ALL STORE_V2_FIELD_ALL #define STORE_V2_DISPLAY_BRIEF (STORE_V2_FIELD_TAG|\ STORE_V2_FIELD_RECV_TIME|\ STORE_V2_FIELD_PROTO_FLAGS_TOS|\ STORE_V2_FIELD_SRCDST_PORT|\ STORE_V2_FIELD_PACKETS|\ STORE_V2_FIELD_OCTETS|\ STORE_V2_FIELD_SRCDST_ADDR|\ STORE_V2_FIELD_AGENT_ADDR4|\ STORE_V2_FIELD_AGENT_ADDR6) /* Start of flow record - present for every flow */ struct store_v2_flow { u_int32_t fields; } __packed; /* * 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_v2_flow_TAG { u_int32_t tag; /* set by filter */ } __packed; /* Optional flow field - present if STORE_FIELD_RECV_TIME */ struct store_v2_flow_RECV_TIME { u_int32_t recv_sec; } __packed; /* Optional flow field - present if STORE_FIELD_PROTO_FLAGS_TOS */ struct store_v2_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_v2_flow_AGENT_ADDR4 { struct store_addr4 flow_agent_addr; } __packed; struct store_v2_flow_AGENT_ADDR6 { struct store_addr6 flow_agent_addr; } __packed; /* Optional flow field - present if STORE_FIELD_SRC_ADDR4 */ struct store_v2_flow_SRC_ADDR4 { struct store_addr4 src_addr; } __packed; /* Optional flow field - present if STORE_FIELD_DST_ADDR4 */ struct store_v2_flow_DST_ADDR4 { struct store_addr4 dst_addr; } __packed; /* Optional flow field - present if STORE_FIELD_SRC_ADDR6 */ struct store_v2_flow_SRC_ADDR6 { struct store_addr6 src_addr; } __packed; /* Optional flow field - present if STORE_FIELD_DST_ADDR6 */ struct store_v2_flow_DST_ADDR6 { struct store_addr6 dst_addr; } __packed; /* Optional flow field - present if STORE_FIELD_GATEWAY_ADDR */ struct store_v2_flow_GATEWAY_ADDR4 { struct store_addr4 gateway_addr; } __packed; struct store_v2_flow_GATEWAY_ADDR6 { struct store_addr6 gateway_addr; } __packed; /* Optional flow field - present if STORE_FIELD_SRCDST_PORT */ struct store_v2_flow_SRCDST_PORT { u_int16_t src_port; u_int16_t dst_port; } __packed; /* Optional flow field - present if STORE_FIELD_PACKETS */ struct store_v2_flow_PACKETS { u_int64_t flow_packets; } __packed; /* Optional flow field - present if STORE_FIELD_OCTETS */ struct store_v2_flow_OCTETS { u_int64_t flow_octets; } __packed; /* Optional flow field - present if STORE_FIELD_IF_INDICES */ struct store_v2_flow_IF_INDICES { u_int16_t if_index_in; u_int16_t if_index_out; } __packed; /* Optional flow field - present if STORE_FIELD_AGENT_INFO */ struct store_v2_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_v2_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_v2_flow_AS_INFO { u_int16_t src_as; u_int16_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_v2_flow_FLOW_ENGINE_INFO { u_int8_t engine_type; u_int8_t engine_id; u_int16_t pad; u_int32_t flow_sequence; } __packed; /* Optional flow field - present if STORE_FIELD_CRC32 */ struct store_v2_flow_CRC32 { u_int32_t crc32; } __packed; /* A abstract flow record (all fields included) */ struct store_v2_flow_complete { struct store_v2_flow hdr; struct store_v2_flow_TAG tag; struct store_v2_flow_RECV_TIME recv_time; struct store_v2_flow_PROTO_FLAGS_TOS pft; struct xaddr agent_addr; struct xaddr src_addr; struct xaddr dst_addr; struct xaddr gateway_addr; struct store_v2_flow_SRCDST_PORT ports; struct store_v2_flow_PACKETS packets; struct store_v2_flow_OCTETS octets; struct store_v2_flow_IF_INDICES ifndx; struct store_v2_flow_AGENT_INFO ainfo; struct store_v2_flow_FLOW_TIMES ftimes; struct store_v2_flow_AS_INFO asinf; struct store_v2_flow_FLOW_ENGINE_INFO finf; struct store_v2_flow_CRC32 crc32; } __packed; int store_v2_get_header(int fd, struct store_v2_header *hdr, char *ebuf, int elen); int store_v2_get_flow(int fd, struct store_v2_flow_complete *f, char *ebuf, int elen); int store_v2_check_header(int fd, char *ebuf, int elen); int store_v2_put_header(int fd, char *ebuf, int elen); int store_v2_put_flow(int fd, struct store_v2_flow_complete *flow, u_int32_t fieldmask, char *ebuf, int elen); int store_v2_validate_header(struct store_v2_header *hdr, char *ebuf, int elen); int store_v2_calc_flow_len(struct store_v2_flow *hdr); int store_v2_flow_deserialise(u_int8_t *buf, int len, struct store_v2_flow_complete *f, char *ebuf, int elen); int store_v2_flow_serialise(struct store_v2_flow_complete *f, u_int8_t *buf, int buflen, int *flowlen, char *ebuf, int elen); int store_v2_flow_convert(struct store_v2_flow_complete *fv2, struct store_flow_complete *f); #endif /* _STORE_V2_H */