1 /* 2 * Argus Software. Argus files - Utilities include files 3 * Copyright (c) 2000-2015 QoSient, LLC 4 * All rights reserved. 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation; either version 2, or (at your option) 9 * any later version. 10 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 16 * You should have received a copy of the GNU General Public License 17 * along with this program; if not, write to the Free Software 18 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 19 * 20 */ 21 22 /* 23 * Copyright (c) 1993, 1994 Carnegie Mellon University. 24 * All rights reserved. 25 * 26 * Permission to use, copy, modify, and distribute this software and 27 * its documentation for any purpose and without fee is hereby granted, 28 * provided that the above copyright notice appear in all copies and 29 * that both that copyright notice and this permission notice appear 30 * in supporting documentation, and that the name of CMU not be 31 * used in advertising or publicity pertaining to distribution of the 32 * software without specific, written prior permission. 33 * 34 * CMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING 35 * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL 36 * CMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR 37 * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, 38 * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, 39 * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 40 * SOFTWARE. 41 * 42 */ 43 44 /* 45 * $Id: //depot/argus/argus/argus/ArgusUtil.h#33 $ 46 * $DateTime: 2015/04/06 10:38:44 $ 47 * $Change: 2973 $ 48 */ 49 50 51 /* ArgusUtil.h */ 52 53 #ifndef ArgusUtil_h 54 #define ArgusUtil_h 55 56 #if defined(HAVE_STDLIB_H) 57 #include <stdlib.h> 58 #endif 59 60 #if defined(HAVE_STRINGS_H) 61 #include <strings.h> 62 #endif 63 64 #include <sys/time.h> 65 #include <sys/socket.h> 66 67 #include <net/if.h> 68 69 #include <argus_compat.h> 70 71 #include <argus_def.h> 72 #include <argus_out.h> 73 #include <argus_util.h> 74 75 #define ARGUS_NOLOCK 0 76 #define ARGUS_LOCK 1 77 78 #define ARGUS_RFILE_LIST 1 79 #define ARGUS_WFILE_LIST 2 80 #define ARGUS_DEVICE_LIST 3 81 #define ARGUS_OUTPUT_LIST 4 82 #define ARGUS_EVENT_LIST 5 83 #define ARGUS_BIND_ADDR_LIST 6 84 85 struct ArgusListObjectStruct { 86 struct ArgusListObjectStruct *nxt; 87 void *obj; 88 }; 89 90 struct ArgusListRecord { 91 struct ArgusListObjectStruct *nxt; 92 struct ArgusRecordHeader argus; 93 }; 94 95 struct ArgusListStruct { 96 struct ArgusListObjectStruct *start; 97 struct ArgusListObjectStruct *end; 98 99 #if defined(ARGUS_THREADS) 100 pthread_mutex_t lock; 101 pthread_cond_t cond; 102 #endif 103 unsigned int count, pushed, popped, loaded; 104 struct timeval outputTime, reportTime; 105 }; 106 107 108 #define ARGUS_PROCESS_NEXT_PASS 0x10 109 110 /* 111 struct ArgusQueueHeader { 112 struct ArgusQueueHeader *prv, *nxt; 113 struct ArgusQueueStruct *queue; 114 struct timeval lasttime, qtime; 115 unsigned int status; 116 }; 117 118 struct ArgusQueueStruct { 119 struct ArgusQueueHeader qhdr; 120 int count, turns, timeout, status, reclaim; 121 #if defined(ARGUS_THREADS) 122 pthread_mutex_t lock; 123 #endif 124 struct ArgusQueueHeader *start, *end; 125 struct ArgusFlowStruct **array; 126 }; 127 */ 128 129 #include <ArgusOutput.h> 130 131 132 #define ARGUS_READINGPREHDR 1 133 #define ARGUS_READINGHDR 2 134 #define ARGUS_READINGBLOCK 4 135 136 #define ARGUS_WAS_FUNCTIONAL 0x10 137 #define ARGUS_SOCKET_COMPLETE 0x20 138 #define ARGUS_MAXRECORD 0x40000 139 140 struct ArgusSocketStruct { 141 struct ArgusListStruct *ArgusSocketList; 142 int fd, status, cnt, expectedSize, errornum; 143 int ArgusLastRecord, ArgusReadState; 144 struct timeval lastwrite; 145 struct ArgusRecordStruct *rec; 146 int length, writen; 147 struct sockaddr sock; 148 char *filename; 149 void *obj; 150 unsigned char *ptr, buf[ARGUS_MAXRECORD]; 151 }; 152 153 typedef int (*ArgusHandler)(struct ArgusSocketStruct *, unsigned char *, int, void *); 154 155 156 #if defined(ArgusUtil) 157 158 #if defined(_LITTLE_ENDIAN) 159 void ArgusNtoH (struct ArgusRecord *); 160 void ArgusHtoN (struct ArgusRecord *); 161 #endif 162 163 long long ArgusTimeDiff (struct timeval *, struct timeval *); 164 unsigned long long ArgusAbsTimeDiff (struct timeval *, struct timeval *); 165 166 struct ArgusListStruct *ArgusNewList(void); 167 void ArgusDeleteList(struct ArgusListStruct *, int); 168 169 int ArgusListEmpty (struct ArgusListStruct *); 170 int ArgusGetListCount (struct ArgusListStruct *); 171 172 int ArgusPushFrontList(struct ArgusListStruct *, struct ArgusListRecord *, int); 173 int ArgusPushBackList (struct ArgusListStruct *, struct ArgusListRecord *, int); 174 struct ArgusListRecord *ArgusPopFrontList (struct ArgusListStruct *, int); 175 void ArgusLoadList(struct ArgusListStruct *, struct ArgusListStruct *); 176 177 struct ArgusQueueStruct *ArgusNewQueue (void); 178 void ArgusDeleteQueue (struct ArgusQueueStruct *); 179 180 int ArgusGetQueueCount(struct ArgusQueueStruct *); 181 182 void ArgusPushQueue(struct ArgusQueueStruct *, struct ArgusQueueHeader *, int); 183 int ArgusAddToQueue(struct ArgusQueueStruct *, struct ArgusQueueHeader *, int); 184 185 struct ArgusQueueHeader *ArgusPopQueue(struct ArgusQueueStruct *, int); 186 struct ArgusQueueHeader *ArgusPopBackQueue (struct ArgusQueueStruct *queue, int type); 187 struct ArgusQueueHeader *ArgusRemoveFromQueue(struct ArgusQueueStruct *, struct ArgusQueueHeader *, int); 188 189 int ArgusCheckTimeout(struct ArgusModelerStruct *, struct timeval *, struct timeval *); 190 191 void ArgusProcessQueue(struct ArgusModelerStruct *, struct ArgusQueueStruct *, int); 192 void ArgusEmptyQueue(struct ArgusQueueStruct *); 193 194 void ArgusDeleteObject(struct ArgusFlowStruct *); 195 196 struct ArgusHashTableHeader *ArgusFindHashObject (struct ArgusHashTable *, struct ArgusSystemFlow *, unsigned short); 197 extern struct ArgusHashTableHeader *ArgusAddHashEntry (struct ArgusHashTable *, struct ArgusFlowStruct *, struct ArgusHashStruct *); 198 void ArgusRemoveHashEntry (struct ArgusHashTableHeader *); 199 200 struct ArgusSocketStruct * ArgusNewSocket (int fd); 201 void ArgusDeleteSocket (struct ArgusOutputStruct *, struct ArgusClientData *); 202 int ArgusReadSocket (struct ArgusSocketStruct *, ArgusHandler, void *); 203 int ArgusWriteSocket (struct ArgusOutputStruct *, struct ArgusClientData *, struct ArgusRecordStruct *); 204 int ArgusWriteOutSocket (struct ArgusOutputStruct *, struct ArgusClientData *); 205 206 char *ArgusGetFlowString (struct ArgusFlowStruct *); 207 208 char *ArgusGetName(struct ArgusParserStruct *, unsigned char *); 209 char *ArgusGetV6Name(struct ArgusParserStruct *, unsigned char *); 210 211 void ArgusSetChroot(char *); 212 213 #ifdef ARGUSDEBUG 214 extern void ArgusDebug (int, char *, ...); 215 #endif 216 217 struct timeval *RaMinTime (struct timeval *, struct timeval *); 218 struct timeval *RaMaxTime (struct timeval *, struct timeval *); 219 220 float RaDeltaFloatTime (struct timeval *, struct timeval *); 221 222 int RaDiffTime (struct timeval *, struct timeval *, struct timeval *); 223 float RaGetFloatDuration (struct ArgusRecordStruct *); 224 float RaGetFloatSrcDuration (struct ArgusRecordStruct *); 225 float RaGetFloatDstDuration (struct ArgusRecordStruct *); 226 double ArgusFetchDuration (struct ArgusRecordStruct *); 227 double ArgusFetchSrcDuration (struct ArgusRecordStruct *); 228 double ArgusFetchDstDuration (struct ArgusRecordStruct *); 229 double ArgusFetchLoad (struct ArgusRecordStruct *); 230 double ArgusFetchSrcLoad (struct ArgusRecordStruct *); 231 double ArgusFetchDstLoad (struct ArgusRecordStruct *); 232 double ArgusFetchLoss (struct ArgusRecordStruct *); 233 double ArgusFetchSrcLoss (struct ArgusRecordStruct *); 234 double ArgusFetchDstLoss (struct ArgusRecordStruct *); 235 double ArgusFetchPercentLoss (struct ArgusRecordStruct *); 236 double ArgusFetchPercentSrcLoss (struct ArgusRecordStruct *); 237 double ArgusFetchPercentDstLoss (struct ArgusRecordStruct *); 238 double ArgusFetchRate (struct ArgusRecordStruct *); 239 double ArgusFetchSrcRate (struct ArgusRecordStruct *); 240 double ArgusFetchDstRate (struct ArgusRecordStruct *); 241 double ArgusFetchAppByteRatio (struct ArgusRecordStruct *); 242 243 #else 244 245 246 #if defined(_LITTLE_ENDIAN) 247 extern void ArgusNtoH (struct ArgusRecord *); 248 extern void ArgusHtoN (struct ArgusRecord *); 249 #endif 250 251 extern long long ArgusTimeDiff (struct timeval *, struct timeval *); 252 extern unsigned long long ArgusAbsTimeDiff (struct timeval *, struct timeval *); 253 extern struct ArgusListStruct *ArgusNewList(void); 254 extern void ArgusDeleteList(struct ArgusListStruct *, int); 255 256 extern int ArgusListEmpty (struct ArgusListStruct *); 257 extern int ArgusGetListCount (struct ArgusListStruct *); 258 259 extern int ArgusPushFrontList(struct ArgusListStruct *, struct ArgusListRecord *, int); 260 extern int ArgusPushBackList (struct ArgusListStruct *, struct ArgusListRecord *, int); 261 extern struct ArgusListRecord *ArgusPopFrontList (struct ArgusListStruct *, int); 262 extern void ArgusLoadList(struct ArgusListStruct *, struct ArgusListStruct *); 263 264 extern struct ArgusQueueStruct *ArgusNewQueue (void); 265 extern int ArgusDeleteQueue (struct ArgusQueueStruct *); 266 267 extern int ArgusGetQueueCount(struct ArgusQueueStruct *); 268 269 extern void ArgusPushQueue(struct ArgusQueueStruct *, struct ArgusQueueHeader *, int); 270 extern int ArgusAddToQueue(struct ArgusQueueStruct *, struct ArgusQueueHeader *, int); 271 272 extern struct ArgusQueueHeader *ArgusPopQueue(struct ArgusQueueStruct *, int); 273 struct ArgusQueueHeader *ArgusPopBackQueue (struct ArgusQueueStruct *queue, int type); 274 extern struct ArgusQueueHeader *ArgusRemoveFromQueue(struct ArgusQueueStruct *, struct ArgusQueueHeader *, int); 275 276 extern int ArgusCheckTimeout(struct ArgusModelerStruct *, struct timeval *, struct timeval *); 277 278 extern void ArgusProcessQueue(struct ArgusModelerStruct *, struct ArgusQueueStruct *, int); 279 extern void ArgusEmptyQueue(struct ArgusQueueStruct *); 280 281 extern void ArgusDeleteObject(struct ArgusFlowStruct *obj); 282 283 struct ArgusHashTableHeader *ArgusFindHashObject (struct ArgusHashTable *, struct ArgusSystemFlow *, unsigned short); 284 extern struct ArgusHashTableHeader *ArgusAddHashEntry (struct ArgusHashTable *, struct ArgusFlowStruct *, struct ArgusHashStruct *); 285 extern void ArgusRemoveHashEntry (struct ArgusHashTableHeader *); 286 287 extern struct ArgusSocketStruct * ArgusNewSocket (int fd); 288 extern void ArgusDeleteSocket (struct ArgusOutputStruct *, struct ArgusClientData *); 289 extern int ArgusWriteSocket (struct ArgusOutputStruct *, struct ArgusClientData *, struct ArgusRecordStruct *); 290 extern int ArgusWriteOutSocket (struct ArgusOutputStruct *, struct ArgusClientData *); 291 292 extern char *ArgusGetFlowString (struct ArgusFlowStruct *); 293 294 extern char *ArgusGetName(struct ArgusParserStruct *, unsigned char *); 295 extern char *ArgusGetV6Name(struct ArgusParserStruct *, unsigned char *); 296 297 extern void ArgusSetChroot(char *); 298 299 #ifdef ARGUSDEBUG 300 extern void ArgusDebug (int, char *, ...); 301 #endif 302 303 304 extern struct timeval *RaMinTime (struct timeval *, struct timeval *); 305 extern struct timeval *RaMaxTime (struct timeval *, struct timeval *); 306 307 extern float RaDeltaFloatTime (struct timeval *, struct timeval *); 308 309 extern int RaDiffTime (struct timeval *, struct timeval *, struct timeval *); 310 extern float RaGetFloatDuration (struct ArgusRecordStruct *); 311 extern float RaGetFloatSrcDuration (struct ArgusRecordStruct *); 312 extern float RaGetFloatDstDuration (struct ArgusRecordStruct *); 313 extern double ArgusFetchDuration (struct ArgusRecordStruct *); 314 extern double ArgusFetchSrcDuration (struct ArgusRecordStruct *); 315 extern double ArgusFetchDstDuration (struct ArgusRecordStruct *); 316 extern double ArgusFetchLoad (struct ArgusRecordStruct *); 317 extern double ArgusFetchSrcLoad (struct ArgusRecordStruct *); 318 extern double ArgusFetchDstLoad (struct ArgusRecordStruct *); 319 extern double ArgusFetchLoss (struct ArgusRecordStruct *); 320 extern double ArgusFetchSrcLoss (struct ArgusRecordStruct *); 321 extern double ArgusFetchDstLoss (struct ArgusRecordStruct *); 322 extern double ArgusFetchPercentLoss (struct ArgusRecordStruct *); 323 extern double ArgusFetchPercentSrcLoss (struct ArgusRecordStruct *); 324 extern double ArgusFetchPercentDstLoss (struct ArgusRecordStruct *); 325 extern double ArgusFetchRate (struct ArgusRecordStruct *); 326 extern double ArgusFetchSrcRate (struct ArgusRecordStruct *); 327 extern double ArgusFetchDstRate (struct ArgusRecordStruct *); 328 extern double ArgusFetchAppByteRatio (struct ArgusRecordStruct *); 329 330 #endif 331 #endif 332