00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef COMMON_H
00019 #define COMMON_H
00020
00021 #include <cc++/socket.h>
00022
00023 #ifdef CCXX_NAMESPACES
00024 using namespace std;
00025 using namespace ost;
00026 #endif
00027
00028 #ifdef PACKAGE
00029 #undef PACKAGE
00030 #endif
00031
00032 #ifdef VERSION
00033 #undef VERSION
00034 #endif
00035
00036 #ifdef HAVE_CONFIG_H
00037 #include "config.h"
00038 #endif
00039
00040 #ifdef HAVE_STRING_H
00041 #include <string.h>
00042 #endif
00043
00044 #ifdef HAVE_STRINGS_H
00045 #include <strings.h>
00046 #endif
00047
00048
00049 #define PANOPTIS_EXECNAME "panoptis"
00050
00051
00052
00053 #define MAX_V9_PACKET_BODY 1
00054
00055
00056 typedef unsigned int uint32_t;
00057 typedef unsigned short int uint16_t;
00058 typedef unsigned char uint8_t;
00059
00060
00061 typedef struct V1Header {
00062 uint16_t version;
00063 uint16_t count;
00064 uint32_t SysUptime;
00065 uint32_t unix_secs;
00066 uint32_t unix_nsecs;
00067 } V1Header;
00068
00069 typedef struct V5Header {
00070 uint16_t version;
00071 uint16_t count;
00072 uint32_t SysUptime;
00073 uint32_t unix_secs;
00074 uint32_t unix_nsecs;
00075 uint32_t flow_sequence;
00076 uint8_t engine_type;
00077 uint8_t engine_id;
00078 } V5Header;
00079
00080 typedef struct V8Header {
00081 uint16_t version;
00082 uint16_t count;
00083 uint32_t SysUptime;
00084 uint32_t unix_secs;
00085 uint32_t unix_nsecs;
00086 uint32_t flow_sequence;
00087 uint8_t engine_type;
00088 uint8_t engine_id;
00089 uint8_t aggregation;
00090 uint8_t agg_version;
00091 } V8Header;
00092
00093 typedef struct V9Header {
00094 uint16_t version;
00095 uint16_t count;
00096 uint32_t SysUptime;
00097 uint32_t unix_secs;
00098 uint32_t pck_sequence;
00099 uint32_t sourceId;
00100 } V9Header;
00101
00102 typedef struct V1Body {
00103 uint32_t srcaddr;
00104 uint32_t dstaddr;
00105 uint32_t nexthop;
00106 uint16_t input;
00107 uint16_t output;
00108 uint32_t dPkts;
00109 uint32_t dOctets;
00110 uint32_t First;
00111 uint32_t Last;
00112 uint16_t srcport;
00113 uint16_t dstport;
00114 uint16_t pad;
00115 uint8_t prot;
00116 uint8_t tos;
00117 uint8_t tcp_flags;
00118 uint8_t pad2;
00119 uint16_t pad3;
00120 uint32_t reserved1;
00121 uint32_t reserved2;
00122 } V1Body;
00123
00124 typedef struct V5Body {
00125 uint32_t srcaddr;
00126 uint32_t dstaddr;
00127 uint32_t nexthop;
00128 uint16_t input;
00129 uint16_t output;
00130 uint32_t dPkts;
00131 uint32_t dOctets;
00132 uint32_t First;
00133 uint32_t Last;
00134 uint16_t srcport;
00135 uint16_t dstport;
00136 uint8_t pad;
00137 uint8_t tcp_flags;
00138 uint8_t prot;
00139 uint8_t tos;
00140 uint16_t dst_as;
00141 uint16_t src_as;
00142 uint8_t dst_mask;
00143 uint8_t src_mask;
00144 uint16_t pad2;
00145 } V5Body;
00146
00147 typedef struct V8BodyAS {
00148 uint32_t flows;
00149 uint32_t dPkts;
00150 uint32_t dOctets;
00151 uint32_t First;
00152 uint32_t Last;
00153 uint16_t src_as;
00154 uint16_t dst_as;
00155 uint16_t input;
00156 uint16_t output;
00157 } V8BodyAS;
00158
00159 typedef struct V8BodyPP {
00160 uint32_t flows;
00161 uint32_t dPkts;
00162 uint32_t dOctets;
00163 uint32_t First;
00164 uint32_t Last;
00165 uint8_t prot;
00166 uint8_t pad;
00167 uint16_t reserved;
00168 uint16_t srcport;
00169 uint16_t dstport;
00170 } V8BodyPP;
00171
00172 typedef struct V8BodySP {
00173 uint32_t flows;
00174 uint32_t dPkts;
00175 uint32_t dOctets;
00176 uint32_t First;
00177 uint32_t Last;
00178 uint32_t src_prefix;
00179 uint8_t src_mask;
00180 uint8_t pad;
00181 uint16_t src_as;
00182 uint16_t input;
00183 } V8BodySP;
00184
00185 typedef struct V8BodyDP {
00186 uint32_t flows;
00187 uint32_t dPkts;
00188 uint32_t dOctets;
00189 uint32_t First;
00190 uint32_t Last;
00191 uint32_t dst_prefix;
00192 uint8_t dst_mask;
00193 uint8_t pad;
00194 uint16_t dst_as;
00195 uint16_t output;
00196 } V8BodyDP;
00197
00198 typedef struct V8BodyPR {
00199 uint32_t flows;
00200 uint32_t dPkts;
00201 uint32_t dOctets;
00202 uint32_t First;
00203 uint32_t Last;
00204 uint32_t src_prefix;
00205 uint32_t dst_prefix;
00206 uint8_t dst_mask;
00207 uint8_t src_mask;
00208 uint16_t resrerved;
00209 uint16_t src_as;
00210 uint16_t dst_as;
00211 uint16_t input;
00212 uint16_t output;
00213 } V8BodyPR;
00214
00215 typedef struct V9Body {
00216 uint8_t bytes[MAX_V9_PACKET_BODY];
00217 } V9Body;
00218
00219 #define NETFLOW_V1 1
00220 #define NETFLOW_V5 5
00221 #define NETFLOW_V8 8
00222 #define NETFLOW_V9 9
00223
00224 #define MAX(A, B) (A > B ? A : B)
00225
00226 #define V1_HEADER_LEN sizeof(V1Header)
00227 #define V5_HEADER_LEN sizeof(V5Header)
00228 #define V8_HEADER_LEN sizeof(V8Header)
00229 #define V9_HEADER_LEN sizeof(V9Header)
00230
00231 #define V1_BODY_LEN sizeof(V1Body)
00232 #define V5_BODY_LEN sizeof(V5Body)
00233 #define V8AS_BODY_LEN sizeof(V8BodyAS)
00234 #define V8PP_BODY_LEN sizeof(V8BodyPP)
00235 #define V8SP_BODY_LEN sizeof(V8BodySP)
00236 #define V8DP_BODY_LEN sizeof(V8BodyDP)
00237 #define V8PR_BODY_LEN sizeof(V8BodyPR)
00238 #define V9_BODY_LEN sizeof(V9Body)
00239
00240 #define MAXBODY1 MAX(V1_BODY_LEN, V5_BODY_LEN)
00241 #define MAXBODY2 MAX(MAXBODY1, V8AS_BODY_LEN)
00242 #define MAXBODY3 MAX(MAXBODY2, V8PP_BODY_LEN)
00243 #define MAXBODY4 MAX(MAXBODY3, V8SP_BODY_LEN)
00244 #define MAXBODY5 MAX(MAXBODY4, V8DP_BODY_LEN)
00245 #define MAXBODY6 MAX(MAXBODY5, V8PR_BODY_LEN)
00246
00247 #define MAX_FLOW_BODY MAX(MAXBODY6, V9_BODY_LEN)
00248
00249 #define V1_MAX_FLOWS 25
00250 #define V5_MAX_FLOWS 30
00251 #define V8AS_MAX_FLOWS 51
00252 #define V8PP_MAX_FLOWS 51
00253 #define V8SP_MAX_FLOWS 44
00254 #define V8DP_MAX_FLOWS 44
00255 #define V8PR_MAX_FLOWS 35
00256
00257 #define V9_MAX_FLOWS 1 // UDP = 64Kbytes, Min Flowset = 20+12+N*6. Max Packet = 20+12+N*6 <=> N=(32-MAXPACKET)/6
00258
00259 #define MAXFL1 MAX(V1_MAX_FLOWS, V5_MAX_FLOWS)
00260 #define MAXFL2 MAX(MAXFL1, V8AS_MAX_FLOWS)
00261 #define MAXFL3 MAX(MAXFL2, V8PP_MAX_FLOWS)
00262 #define MAXFL4 MAX(MAXFL3, V8SP_MAX_FLOWS)
00263 #define MAXFL5 MAX(MAXFL4, V8DP_MAX_FLOWS)
00264 #define MAXFL6 MAX(MAXFL5, V8PR_MAX_FLOWS)
00265
00266 #define MAX_FLOWS MAX(MAXFL5, V9_MAX_FLOWS)
00267
00268 #define V1_MAX_DG_SIZE (V1_HEADER_LEN + V1_MAX_FLOWS * V1_BODY_LEN)
00269 #define V5_MAX_DG_SIZE (V5_HEADER_LEN + V5_MAX_FLOWS * V5_BODY_LEN)
00270 #define V8AS_MAX_DG_SIZE (V8_HEADER_LEN + V8AS_MAX_FLOWS * V8AS_BODY_LEN)
00271 #define V8PP_MAX_DG_SIZE (V8_HEADER_LEN + V8PP_MAX_FLOWS * V8PP_BODY_LEN)
00272 #define V8SP_MAX_DG_SIZE (V8_HEADER_LEN + V8SP_MAX_FLOWS * V8SP_BODY_LEN)
00273 #define V8DP_MAX_DG_SIZE (V8_HEADER_LEN + V8DP_MAX_FLOWS * V8DP_BODY_LEN)
00274 #define V8PR_MAX_DG_SIZE (V8_HEADER_LEN + V8PR_MAX_FLOWS * V8PR_BODY_LEN)
00275 #define V9_MAX_DG_SIZE (V9_HEADER_LEN + V9_MAX_FLOWS * V9_BODY_LEN)
00276
00277 #define MAX8_1 MAX(V8AS_MAX_DG_SIZE, V8PP_MAX_DG_SIZE)
00278 #define MAX8_2 MAX(MAX8_1, V8SP_MAX_DG_SIZE)
00279 #define MAX8_3 MAX(MAX8_2, V8DP_MAX_DG_SIZE)
00280 #define MAX8 MAX(MAX8_3, V8PR_MAX_DG_SIZE)
00281 #define MAX8_9 MAX(MAX8, V9_MAX_DG_SIZE)
00282 #define MAX1_5 MAX(V1_MAX_DG_SIZE, V5_MAX_DG_SIZE)
00283
00284 #define MAX_DATAGRAM_LEN MAX(MAX1_5, MAX8_9)
00285
00286 #define AGGR_AS 0x01
00287 #define AGGR_PP 0x02
00288 #define AGGR_SP 0x03
00289 #define AGGR_DP 0x04
00290 #define AGGR_PR 0x05
00291
00292 #define AS_ISSET(x) (AGGR_AS == x)
00293 #define PP_ISSET(x) (AGGR_PP == x)
00294 #define SP_ISSET(x) (AGGR_SP == x)
00295 #define DP_ISSET(x) (AGGR_DP == x)
00296 #define PR_ISSET(x) (AGGR_PR == x)
00297
00298
00299 #define TALK_FLOWS 1
00300 #define TALK_PACKETS 2
00301
00302 #endif