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