root/branches/renetcolSMP/src/dataFlowSet.c @ 166

Revision 166, 64.8 KB (checked in by andreu, 8 years ago)

RECORDFLOW option

  • Property svn:eol-style set to native
Line 
1/*
2 * File: dataFlowSet.c
3 *
4 * Authors: ANDREU Francois-Xavier
5 *
6 * Copyright (C) 2005-2011 GIP RENATER
7 */
8
9/*  This file is part of renetcol.
10 *
11 *  renetcol is free software; you can redistribute it and/or modify
12 *  it under the terms of the GNU General Public License as published by
13 *  the Free Software Foundation; either version 2 of the License, or
14 *  (at your option) any later version.
15 *
16 *  renetcol is distributed in the hope that it will be useful,
17 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
18 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19 *  GNU General Public License for more details.
20 *
21 *  You should have received a copy of the GNU General Public License
22 *  along with renetcol; if not, write to the Free Software
23 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
24 */
25
26#include "dataFlowSet.h"
27
28/*
29 * Check Data FlowSet
30 *
31 */
32#ifdef RECORDFLOW
33short
34checkDataFlowSet(short shift,
35                 struct MyPtrs *myPtrs,
36                 int myQueue,
37                 struct PrefixV4 *V4PTab,
38                 size_t nbPV4,
39                 struct PrefixV4 *V4STab,
40                 size_t nbSV4,
41                 FILE *curRFF)
42#else
43short
44checkDataFlowSet(short shift,
45                 struct MyPtrs *myPtrs,
46                 int myQueue,
47                 struct PrefixV4 *V4PTab,
48                 size_t nbPV4,
49                 struct PrefixV4 *V4STab,
50                 size_t nbSV4
51                 )
52#endif
53{
54  TplFlowSetPtr tmp = NULL;
55  TplOptionPtr tmpOpt = NULL;
56  FieldPtr pftmp = NULL;
57  FieldPtr secondPftmp = NULL;
58  unsigned short data_length = 0;
59  unsigned short flow_size = 0;
60  unsigned short oldOffset = *myPtrs->offsetV9Ptr;
61  unsigned short secondOffset = 0;
62  unsigned short secondOldOffset = 0;
63  int moreIsNecessary = 1;
64  int field_size = 0;
65  int cpt = 0;
66  int secondCpt = 0;
67  int overflow = 0;
68  int noEnd = 1;
69  int i = 0;
70  int j = 0;
71  int pos = 0;
72  int jdos = 0;
73  int posdos = 0;
74  unsigned char buffer1;
75  unsigned char buffer2[2];
76  unsigned char buffer4[4];
77  RulesPtr tmpRuleList = myPtrs->rulesListPtr;
78  RulesPtr tmpRL = myPtrs->rulesListPtr;
79  msgType myMsg;
80  char *msgTextIndex;
81
82  unsigned short tplMsgType = 11;
83  struct PrefixV4 prefixKey, *res, *res2, *resSub; /* for bsearch */
84#if defined(IPV4AGGIDSNMP)
85  struct PrefixV4 *res3;
86#endif
87#ifdef ASACC
88  struct AS asKey, *asres; /* for bsearch */
89#endif
90  struct AggCache agCache;
91  struct DoSCache dosCache;
92  dosCache.packets = 1;
93  dosCache.bytes = 1;
94  dosCache.endTime = 1;
95  dosCache.startTime = 1;
96  dosCache.sampling = myPtrs->currentRouterPtr->sampled;
97  int bool = 0; /* in IPV4 Agg mode enabled, we need to now if it's an IPv4 */
98  int isIPv6 = 0;
99  /* flow, we test on the field and then put bool at 1 */
100  int isMplsFlow = 0;
101  int paddingCounter = 0;
102  int crazyCounter = 0;
103#ifdef DEBUG
104  int flowCpt = 0;
105#endif
106
107  buffer2[1] = *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
108  (*myPtrs->offsetV9Ptr)++;
109  buffer2[0] = *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
110  (*myPtrs->offsetV9Ptr)++;
111  (*myPtrs->currentFlowsetIdPtr) = *((unsigned short*)&buffer2);
112  buffer2[1] = *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
113  (*myPtrs->offsetV9Ptr)++;
114  buffer2[0] = *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
115  (*myPtrs->offsetV9Ptr)++;
116  data_length = *((unsigned short*)&buffer2);
117  if (data_length == 0) {
118#ifdef DEBUG
119    fprintf (stderr, " dlg==0 <--| ");
120#endif
121/*     syslog(LOG_INFO, "data flowset length null; all next informations of this data flowset are not considered! flowset ID: %hu, from router: %lu.%lu.%lu.%lu", */
122/*         (*myPtrs->currentFlowsetIdPtr), */
123/*         (myPtrs->pcktPtr->ipH->srcAdd>>24), */
124/*         (myPtrs->pcktPtr->ipH->srcAdd<<8>>24), */
125/*         (myPtrs->pcktPtr->ipH->srcAdd<<16>>24), */
126/*         (myPtrs->pcktPtr->ipH->srcAdd<<24>>24)); */
127    return (-1);
128
129  }
130
131  if ( (tmp=existTplId(myPtrs->currentRouterPtr,
132                       myPtrs->currentHeaderV9Ptr->sourceId,
133                       (*myPtrs->currentFlowsetIdPtr)))!=NULL ) {
134    myPtrs->currentMIB->dataFlowSetNb += 1;
135#ifdef DEBUG
136    fprintf(stderr,
137            "{d id: %hu, lg %hu",
138            (*myPtrs->currentFlowsetIdPtr),
139            data_length);
140    if ( (*myPtrs->currentFlowsetIdPtr) > TRESHOLD_TEMPLATE_ID ) {
141        fprintf(stderr,"Bad TID from router: %lu.%lu.%lu.%lu\n",
142                (*myPtrs->currentFlowsetIdPtr),
143                (myPtrs->pcktPtr->ipH->srcAdd>>24),
144                (myPtrs->pcktPtr->ipH->srcAdd<<8>>24),
145                (myPtrs->pcktPtr->ipH->srcAdd<<16>>24),
146                (myPtrs->pcktPtr->ipH->srcAdd<<24>>24));
147        fprintf(stderr," Bytes : \n");
148        while ( ( myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr) ) > (myPtrs->ptr_buffer+1416) ){
149          buffer1= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));(*myPtrs->offsetV9Ptr)++;
150          tmp = *((unsigned char*)&buffer1);
151          fprintf (stderr, " %s ", tmp);
152        }
153        exit(-1);
154      return (data_length+shift);
155    }
156#endif
157    pftmp = tmp->lastField;
158    for (; pftmp; pftmp = pftmp->prev) {
159      flow_size += pftmp->fieldLength;
160    }
161    if ( data_length%flow_size >= 9 ) {
162      (*myPtrs->currentFlowsetNumberPtr) = myPtrs->currentHeaderV9Ptr->count;
163      syslog(LOG_INFO, "data flowset length not match with length from template definition, wrong template definition suspected; all next informations of this data flowset are not considered! sourceID: %lu flowset ID: %hu, from router: %lu.%lu.%lu.%lu",
164             myPtrs->currentHeaderV9Ptr->sourceId,
165             (*myPtrs->currentFlowsetIdPtr),
166             (myPtrs->pcktPtr->ipH->srcAdd>>24),
167             (myPtrs->pcktPtr->ipH->srcAdd<<8>>24),
168             (myPtrs->pcktPtr->ipH->srcAdd<<16>>24),
169             (myPtrs->pcktPtr->ipH->srcAdd<<24>>24));
170#ifdef DEBUG
171    fprintf (stderr, " dlg%flsz >=9 skip data ");
172#endif
173      return (data_length+shift);
174    }
175    if ( data_length >= 1452 ) {
176      syslog(LOG_INFO, "data flowset length too raised; all next informations of this data flowset are not considered! flowset ID: %hu, from router: %lu.%lu.%lu.%lu",
177             (*myPtrs->currentFlowsetIdPtr),
178             (myPtrs->pcktPtr->ipH->srcAdd>>24),
179             (myPtrs->pcktPtr->ipH->srcAdd<<8>>24),
180             (myPtrs->pcktPtr->ipH->srcAdd<<16>>24),
181             (myPtrs->pcktPtr->ipH->srcAdd<<24>>24));
182#ifdef DEBUG
183    fprintf (stderr, " dlg >= 1452 skip pckt ");
184#endif
185      return (-1);
186    }
187#if defined(IPV4AGGIDR) || defined(IPV4AGGIDSNMP)
188    agCache.routerAd = myPtrs->pcktPtr->ipH->srcAdd;
189#endif
190
191    pftmp = tmp->lastField;
192    secondPftmp = tmp->lastField;
193    secondOffset = *myPtrs->offsetV9Ptr;
194    secondOldOffset = secondOffset;
195    while ( (((*myPtrs->offsetV9Ptr)-48-shift) <= data_length)
196            && (overflow!=1) ) {
197      /*
198       * progression in a data flow Set
199       * notes:
200       *   48= IP header size + NetFlow header size
201       *   shift = shift because we have a template declaration
202       *           inside data templates
203       */
204      cpt++;
205      j = 0;
206      pos = (pftmp->fieldType)*MAX_RULES_PER_FIELD+j;
207      field_size = (int) pftmp->fieldLength;
208
209      /* special case: check yes on all flows from one router */
210      /* (phantom field nb 0) */
211      /* FIXME : this code is repeated, perhaps past before */
212      while ( ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+j))) != NULL ) {
213        if ( (((RuleDefPtr)(*(myPtrs->rulesAddressPtr+j)))->value->stor.lvalue)
214             == myPtrs->pcktPtr->ipH->srcAdd )
215          {
216            ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+j)))->check = 1;
217          }
218        j++;
219      }
220      j = 0;
221
222      /*
223       * Comparaison between the field value and the rules
224       * ... if one rule exist
225       * FIXME : warning, if no rules, no accounting ?
226       */
227      if (((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos))) != NULL) {
228        oldOffset = *myPtrs->offsetV9Ptr;
229        while (((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos))) != NULL){
230          /*
231           * while on one cache table line
232           */
233          *myPtrs->offsetV9Ptr = oldOffset;
234          switch ((int)
235                  (((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->operator)){
236          case 2:
237            /* operator: "=" */
238            switch (field_size) {
239            case 1:
240              buffer1 = *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
241              (*myPtrs->offsetV9Ptr)++;
242              /* rule check */
243              if (((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->stor.cvalue
244                  == *((unsigned char*)&buffer1)) {
245                ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check = 1;
246              }
247              /* end rule check */
248#if defined(IPV4AGGIDR) || defined(IPV4AGGIDSNMP)
249              if ((pftmp->fieldType==9)||(pftmp->fieldType==29)){
250                agCache.maskS = *((unsigned char*)&buffer1);
251              }
252              if ((pftmp->fieldType==13)||(pftmp->fieldType==30)){
253                agCache.maskD = *((unsigned char*)&buffer1);
254              }
255              if (pftmp->fieldType==60){
256                agCache.ipProt = *((unsigned char*)&buffer1);
257              }
258              if (pftmp->fieldType==4){
259                agCache.tProt = *((unsigned char*)&buffer1);
260              }
261              if (pftmp->fieldType==61){
262                agCache.sens = *((unsigned char*)&buffer1);
263              }
264              if (pftmp->fieldType==5){
265                agCache.dscp = *((unsigned char*)&buffer1);
266              }
267#endif
268              break;
269            case 2:
270              buffer2[1]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
271              (*myPtrs->offsetV9Ptr)++;
272              buffer2[0]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
273              (*myPtrs->offsetV9Ptr)++;
274              if (((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->stor.svalue
275                  == *((unsigned short*)&buffer2))
276                ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check = 1;
277              if (pftmp->fieldType==7){
278                agCache.sPort = *((unsigned short*)&buffer2);
279              }
280              if (pftmp->fieldType==11){
281                agCache.dPort = *((unsigned short*)&buffer2);
282              }
283#if defined(IPV4AGGIDR) || defined(IPV4AGGIDSNMP)
284              if (pftmp->fieldType==10){
285                agCache.inputSnmp = *((unsigned short*)&buffer2);
286              }
287              if (pftmp->fieldType==14){
288                agCache.outputSnmp = *((unsigned short*)&buffer2);
289              }
290#endif
291#ifdef ASACC
292              if (pftmp->fieldType==16){
293                agCache.asS = *((unsigned short*)&buffer2);
294              }
295              if (pftmp->fieldType==17){
296                agCache.asD = *((unsigned short*)&buffer2);
297              }
298#endif
299              break;
300            case 3:
301              buffer4[3]= 0;
302              buffer4[2]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
303              (*myPtrs->offsetV9Ptr)++;
304              buffer4[1]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
305              (*myPtrs->offsetV9Ptr)++;
306              buffer4[0]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
307              (*myPtrs->offsetV9Ptr)++;
308              if (((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->stor.lvalue
309                  == *((unsigned long*)&buffer4))
310                ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check = 1;
311              /* aggregation */
312              /* end aggregation */
313              if (pftmp->fieldType==70){
314                isMplsFlow = 1;
315              }
316              break;
317            case 4:
318              buffer4[3]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
319              (*myPtrs->offsetV9Ptr)++;
320              buffer4[2]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
321              (*myPtrs->offsetV9Ptr)++;
322              buffer4[1]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
323              (*myPtrs->offsetV9Ptr)++;
324              buffer4[0]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
325              (*myPtrs->offsetV9Ptr)++;
326              /* FIXME : here , add a check on the field type */
327              if ((pftmp->fieldType==8)||(pftmp->fieldType==12)
328                  ||(pftmp->fieldType==15)||(pftmp->fieldType==18)){
329                if ((((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->stor.lvalue)
330                    == (*((unsigned long*)&buffer4))>>(32-((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->mask)<<(32-((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->mask) )
331                  {
332                    ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check = 1;
333                  }
334              }
335              if ((pftmp->fieldType==10)||(pftmp->fieldType==14)){
336                if ((((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->stor.svalue)
337                    == ((unsigned short)*((unsigned long*)&buffer4)))
338                  {
339                    ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check = 1;
340                  }
341              }
342              if ((pftmp->fieldType==16)||(pftmp->fieldType==17)){
343                if ((((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->stor.svalue)
344                    == ((unsigned short)*((unsigned long*)&buffer4)))
345                  {
346                    ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check = 1;
347                  }
348              }
349              if (pftmp->fieldType==1){
350                agCache.bytes = *((unsigned long*)&buffer4);
351                if (
352                    ((unsigned long)((((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->stor.lvalue) + ( (((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->stor.lvalue)/5))
353                     >= (*((unsigned long*)&buffer4)))
354                    &&
355                    ( (unsigned long)((((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->stor.lvalue) - ( (((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->stor.lvalue)/5))
356                      <= (*((unsigned long*)&buffer4)) )
357                    )
358                  {
359                    ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check = 1;
360                  }
361              }
362              if (pftmp->fieldType==21){
363                 agCache.lastTime = *((unsigned long*)&buffer4);
364              }
365              if (pftmp->fieldType==22){
366                 agCache.firstTime = *((unsigned long*)&buffer4);
367              }
368#if defined(IPV4AGGIDR) || defined(IPV4AGGIDSNMP)
369              if (pftmp->fieldType==10){
370                agCache.inputSnmp = (unsigned short)*((unsigned long*)&buffer4);
371              }
372              if (pftmp->fieldType==14){
373                agCache.outputSnmp = (unsigned short)*((unsigned long*)&buffer4);
374              }
375              if ((pftmp->fieldType==8)){
376                bool = 1; /* very important, test if we have an IPv4 flow for Agg */
377                agCache.v4AdS = *((unsigned long*)&buffer4);
378              }
379              if ((pftmp->fieldType==12)){
380                agCache.v4AdD = *((unsigned long*)&buffer4);
381              }
382              if (pftmp->fieldType==1){
383                agCache.bytes = *((unsigned long*)&buffer4);
384              }
385              if (pftmp->fieldType==2){
386                agCache.pkts = *((unsigned long*)&buffer4);
387              }
388#endif
389#ifdef ASACC
390              if (pftmp->fieldType==16){
391                agCache.asS = (unsigned short)*((unsigned long*)&buffer4);
392              }
393              if (pftmp->fieldType==17){
394                agCache.asD = (unsigned short)*((unsigned long*)&buffer4);
395              }
396#endif
397              if (pftmp->fieldType==1){
398                      dosCache.bytes = *((unsigned long*)&buffer4);
399                      dosCache.sampling = myPtrs->currentRouterPtr->sampled;
400              }
401              if (pftmp->fieldType==2){
402                      dosCache.packets = *((unsigned long*)&buffer4);
403          }
404          if (pftmp->fieldType==21){
405                      dosCache.endTime = *((unsigned long*)&buffer4);
406          }
407          if (pftmp->fieldType==22){
408                      dosCache.startTime = *((unsigned long*)&buffer4);
409          }
410              break;
411            case 16:
412              if ((pftmp->fieldType==27)||(pftmp->fieldType==28)){
413                isIPv6 = 1;
414                for (i=0; i<4; i++) {
415                  buffer4[3]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
416                  (*myPtrs->offsetV9Ptr)++;
417                  buffer4[2]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
418                  (*myPtrs->offsetV9Ptr)++;
419                  buffer4[1]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
420                  (*myPtrs->offsetV9Ptr)++;
421                  buffer4[0]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
422                  (*myPtrs->offsetV9Ptr)++;
423                  if (1==moreIsNecessary){
424                    switch(i){
425                    case 0:
426                      if (((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->mask <= 32){
427                        if (ntohl(((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->stor.tabAdd6[i])
428                            ==
429                            (*((unsigned long*)&buffer4))>>(32-((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->mask)<<(32-((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->mask)
430                            )
431                          {
432                            ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check = 1;
433                            moreIsNecessary = 0;
434                          } else {
435                          ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check = 0;
436                          moreIsNecessary = 0;
437                        }
438                      } else {
439                        if (ntohl(((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->stor.tabAdd6[i])
440                            ==
441                            (*((unsigned long*)&buffer4))
442                            )
443                          {
444                            ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check = 1;
445                          } else {
446                          ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check = 0;
447                          moreIsNecessary = 0;
448                        }
449                      }
450                      break;
451                    case 1:
452                      if (((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->mask <= 64){
453                        if (ntohl(((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->stor.tabAdd6[i])
454                            ==
455                            (*((unsigned long*)&buffer4))>>(64-((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->mask)<<(64-((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->mask)
456                            )
457                          {
458                            ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check =
459                              ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check && 1;
460                            moreIsNecessary = 0;
461                          } else {
462                          ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check = 0;
463                          moreIsNecessary = 0;
464                        }
465                      } else {
466                        if (ntohl(((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->stor.tabAdd6[i])
467                            ==
468                            (*((unsigned long*)&buffer4))
469                            )
470                          {
471                            ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check =
472                              ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check && 1;
473                          } else {
474                          ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check = 0;
475                          moreIsNecessary = 0;
476                        }
477                      }
478                      break;
479                    case 2:
480                      if (((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->mask <= 96){
481                        if (ntohl(((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->stor.tabAdd6[i])
482                            ==
483                            (*((unsigned long*)&buffer4))>>(96-((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->mask)<<(96-((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->mask)
484                            )
485                          {
486                            ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check =
487                              ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check && 1;
488                            moreIsNecessary = 0;
489                          } else {
490                          ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check = 0;
491                        moreIsNecessary = 0;
492                        }
493                      } else {
494                        if (ntohl(((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->stor.tabAdd6[i])
495                            ==
496                            (*((unsigned long*)&buffer4))
497                            )
498                          {
499                            ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check =
500                              ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check && 1;
501                          } else {
502                          ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check = 0;
503                          moreIsNecessary = 0;
504                        }
505                      }
506                      break;
507                    case 3:
508                      if (((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->mask <= 128){
509                        if (ntohl(((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->stor.tabAdd6[i])
510                            ==
511                            (*((unsigned long*)&buffer4))>>(128-((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->mask)<<(128-((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->mask)
512                            )
513                          {
514                            ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check =
515                              ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check && 1;
516                          } else {
517                          ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check = 0;
518                          moreIsNecessary = 0;
519                        }
520                      } else {
521                        if (ntohl(((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->stor.tabAdd6[i])
522                            ==
523                            (*((unsigned long*)&buffer4))
524                            )
525                          {
526                            ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check =
527                              ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check && 1;
528                          } else {
529                          ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check = 0;
530                          moreIsNecessary = 0;
531                        }
532                      }
533                      break;
534                    default:
535                      break;
536                    } /* end of switch(i) */
537                  } /* end of if moreIsNecessary */
538#if defined IPV6AGGIDSNMP
539                  if ((pftmp->fieldType==27)){
540                    agCache.tabAdd6S[i] = *((unsigned long*)&buffer4);
541                  } else if ((pftmp->fieldType==28)){
542                    agCache.tabAdd6D[i] = *((unsigned long*)&buffer4);
543                  }
544#endif
545                }
546                moreIsNecessary = 1;
547                /* aggregation for IPv6 flows */
548
549                /* end aggregation */
550              } /* end of : if ((pftmp->fieldType==27)||(pftmp->fieldType==28)){ */
551              break;
552            default:
553              syslog(LOG_INFO, "Field size not known: %d\n", field_size);
554              for (i=0; i<field_size; i++){
555                (*myPtrs->offsetV9Ptr)++;
556              }
557              break;
558            }
559            break;
560          default:
561            syslog(LOG_INFO, "Operator not known: %d\n",
562                   (int)(((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->operator));
563            break;
564          }
565          j++;
566          pos = (pftmp->fieldType)*MAX_RULES_PER_FIELD+j;
567        } /* end while myPtrs->rulesAddressPtr */
568      } else {
569        /*
570         * no rule within this field type, but we must read the value
571         */
572        switch (field_size) {
573        case 1:
574          buffer1 = *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
575          (*myPtrs->offsetV9Ptr)++;
576#if defined(IPV4AGGIDR) || defined(IPV4AGGIDSNMP)
577          if ((pftmp->fieldType==9)||(pftmp->fieldType==29)){
578            agCache.maskS = *((unsigned char*)&buffer1);
579          }
580          if ((pftmp->fieldType==13)||(pftmp->fieldType==30)){
581            agCache.maskD = *((unsigned char*)&buffer1);
582          }
583          if (pftmp->fieldType==60){
584            agCache.ipProt = *((unsigned char*)&buffer1);
585          }
586          if (pftmp->fieldType==4){
587            agCache.tProt = *((unsigned char*)&buffer1);
588          }
589          if (pftmp->fieldType==61){
590            agCache.sens = *((unsigned char*)&buffer1);
591          }
592          if (pftmp->fieldType==5){
593            agCache.dscp = *((unsigned char*)&buffer1);
594          }
595#endif
596          break;
597        case 2:
598          buffer2[1]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
599          (*myPtrs->offsetV9Ptr)++;
600          buffer2[0]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
601          (*myPtrs->offsetV9Ptr)++;
602          if (pftmp->fieldType==7){
603            agCache.sPort = *((unsigned short*)&buffer2);
604          }
605          if (pftmp->fieldType==11){
606            agCache.dPort = *((unsigned short*)&buffer2);
607          }
608#if defined(IPV4AGGIDR) || defined(IPV4AGGIDSNMP)
609          if (pftmp->fieldType==10){
610            agCache.inputSnmp = *((unsigned short*)&buffer2);
611          }
612          if (pftmp->fieldType==14){
613            agCache.outputSnmp = *((unsigned short*)&buffer2);
614          }
615#endif
616#ifdef ASACC
617          if (pftmp->fieldType==16){
618            agCache.asS = *((unsigned short*)&buffer2);
619          }
620          if (pftmp->fieldType==17){
621            agCache.asD = *((unsigned short*)&buffer2);
622          }
623#endif
624          break;
625        case 3:
626          buffer4[3]= 0;
627          buffer4[2]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
628          (*myPtrs->offsetV9Ptr)++;
629          buffer4[1]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
630          (*myPtrs->offsetV9Ptr)++;
631          buffer4[0]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
632          (*myPtrs->offsetV9Ptr)++;
633          /* aggregation */
634          /* end aggregation */
635          if (pftmp->fieldType==70){
636            isMplsFlow = 1;
637          }
638          break;
639        case 4:
640          buffer4[3]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
641          (*myPtrs->offsetV9Ptr)++;
642          buffer4[2]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
643          (*myPtrs->offsetV9Ptr)++;
644          buffer4[1]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
645          (*myPtrs->offsetV9Ptr)++;
646          buffer4[0]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
647          (*myPtrs->offsetV9Ptr)++;
648#if defined(IPV4AGGIDR) || defined(IPV4AGGIDSNMP)
649          if (pftmp->fieldType==10){
650            agCache.inputSnmp = (unsigned short)*((unsigned long*)&buffer4);
651          }
652          if (pftmp->fieldType==14){
653            agCache.outputSnmp = (unsigned short)*((unsigned long*)&buffer4);
654          }
655          if ((pftmp->fieldType==8)){
656            bool = 1;
657            agCache.v4AdS = *((unsigned long*)&buffer4);
658          } else if ((pftmp->fieldType==12)){
659            agCache.v4AdD = *((unsigned long*)&buffer4);
660          } else if (pftmp->fieldType==1){
661            agCache.bytes = *((unsigned long*)&buffer4);
662          } else if (pftmp->fieldType==2){
663            agCache.pkts = *((unsigned long*)&buffer4);
664          }
665#endif
666#ifdef ASACC
667          if (pftmp->fieldType==16){
668            agCache.asS = (unsigned short)*((unsigned long*)&buffer4);
669          }
670          if (pftmp->fieldType==17){
671            agCache.asD = (unsigned short)*((unsigned long*)&buffer4);
672          }
673#endif
674                if (pftmp->fieldType==1){
675            dosCache.bytes = *((unsigned long*)&buffer4);
676                        dosCache.sampling = myPtrs->currentRouterPtr->sampled;
677          }
678                if (pftmp->fieldType==2){
679            dosCache.packets = *((unsigned long*)&buffer4);
680          }
681      if (pftmp->fieldType==21){
682                dosCache.endTime = *((unsigned long*)&buffer4);
683      }
684      if (pftmp->fieldType==22){
685                dosCache.startTime = *((unsigned long*)&buffer4);
686      }
687              if (pftmp->fieldType==21){
688                 agCache.lastTime = *((unsigned long*)&buffer4);
689              }
690              if (pftmp->fieldType==22){
691                 agCache.firstTime = *((unsigned long*)&buffer4);
692              }
693          break;
694        case 16:
695          if ((pftmp->fieldType==27)||(pftmp->fieldType==28)){
696            isIPv6 = 1;
697          }
698          for (i=0; i<4; i++) {
699            buffer4[3]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
700            (*myPtrs->offsetV9Ptr)++;
701            buffer4[2]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
702            (*myPtrs->offsetV9Ptr)++;
703            buffer4[1]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
704            (*myPtrs->offsetV9Ptr)++;
705            buffer4[0]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
706            (*myPtrs->offsetV9Ptr)++;
707#if defined IPV6AGGIDSNMP
708            if ((pftmp->fieldType==27)){
709              agCache.tabAdd6S[i] = *((unsigned long*)&buffer4);
710            } else if ((pftmp->fieldType==28)){
711              agCache.tabAdd6D[i] = *((unsigned long*)&buffer4);
712            }
713#endif
714          }
715          break;
716        default:
717          syslog(LOG_INFO,"UNKNOWN FIELDS LENGTH: %d ", field_size);
718          for (i=0; i<field_size; i++){
719            (*myPtrs->offsetV9Ptr)++;
720          }
721        }
722      } /* end if one cache table line existence */
723      if (cpt==tmp->fieldCount) {
724        /*
725         * end of one flow (not the flowset)
726         */
727        myPtrs->currentMIB->realFlowNb += 1;
728#ifdef DEBUG
729        flowCpt++;
730        fprintf(stderr," F%d ", flowCpt);
731#endif
732        /* put aggregation cache information to IPv4 Prefixes table */
733        /* Aggregation mode must be enable in ./configure options   */
734        /* first we must know if the address belong to our prefix   */
735        /*
736         * AS ACCOUNTING
737         */
738#if defined(ASACC) && defined(IPV4AGGIDSNMP)
739        if ( (bool == 1) && (isMplsFlow == 0) ){
740          asKey.as = agCache.asS;
741          asres = bsearch(&asKey, myPtrs->currentASTab, myPtrs->asNb, sizeof(struct AS), asGlobalCmp);
742          if (asres != NULL) {
743            if ( myPtrs->currentRouterPtr->snmpIndexList[agCache.inputSnmp] == 1  ) {
744#if defined(MULTISAMPLING)
745              if (myPtrs->currentRouterPtr->sampled != asres->sampling ){
746                /* OUT ("traffic from the AS")  */
747                asres->bytesNbOUT += agCache.bytes*myPtrs->currentRouterPtr->sampled/asres->sampling;
748                asres->pktsNbOUT += agCache.pkts*myPtrs->currentRouterPtr->sampled/asres->sampling;
749              }else{
750                asres->bytesNbOUT += agCache.bytes;
751                asres->pktsNbOUT += agCache.pkts;
752                (asres->flowNbOUT)++;
753              }
754#else
755              if (myPtrs->currentRouterPtr->sampled != 0 ){
756                /* OUT ("traffic from the AS")  */
757                asres->bytesNbOUT += agCache.bytes;
758                asres->pktsNbOUT += agCache.pkts;
759                (asres->flowNbOUT)++;
760              }
761              if (asres->sampling == 0
762                  && myPtrs->currentRouterPtr->sampled != 0){
763                asres->sampling = myPtrs->currentRouterPtr->sampled;
764              }
765#endif
766              asres = NULL;
767              asKey.as = agCache.asD;
768              asres = bsearch(&asKey, myPtrs->currentASTab, myPtrs->asNb, sizeof(struct AS), asGlobalCmp);
769              if (asres!=NULL){
770#if defined(MULTISAMPLING)
771                if (myPtrs->currentRouterPtr->sampled != asres->sampling ){
772                  /* IN ("traffic to the AS")  */
773                  asres->bytesNbIN += agCache.bytes*myPtrs->currentRouterPtr->sampled/asres->sampling;
774                  asres->pktsNbIN += agCache.pkts*myPtrs->currentRouterPtr->sampled/asres->sampling;
775                }else{
776                  asres->bytesNbIN += agCache.bytes;
777                  asres->pktsNbIN += agCache.pkts;
778                  (asres->flowNbIN)++;
779                }
780#else
781                if (myPtrs->currentRouterPtr->sampled != 0 ){
782                  /* IN ("traffic to the AS")  */
783                  asres->bytesNbIN += agCache.bytes;
784                  asres->pktsNbIN += agCache.pkts;
785                  (asres->flowNbIN)++;
786                }
787                if (asres->sampling == 0
788                    && myPtrs->currentRouterPtr->sampled != 0){
789                  asres->sampling = myPtrs->currentRouterPtr->sampled;
790                }
791#endif
792                asres = NULL;
793              }
794            }
795          } else {
796            asres = NULL;
797            asKey.as = agCache.asD;
798            asres = bsearch(&asKey, myPtrs->currentASTab, myPtrs->asNb, sizeof(struct AS), asGlobalCmp);
799            if (asres!=NULL){
800              if ( myPtrs->currentRouterPtr->snmpIndexList[agCache.inputSnmp] == 1  ) {
801#if defined(MULTISAMPLING)
802                if (myPtrs->currentRouterPtr->sampled != asres->sampling ){
803                  /* IN ("traffic to the AS")  */
804                  asres->bytesNbIN += agCache.bytes*myPtrs->currentRouterPtr->sampled/asres->sampling;
805                  asres->pktsNbIN += agCache.pkts*myPtrs->currentRouterPtr->sampled/asres->sampling;
806                }else{
807                  asres->bytesNbIN += agCache.bytes;
808                  asres->pktsNbIN += agCache.pkts;
809                  (asres->flowNbIN)++;
810                }
811#else
812                if (myPtrs->currentRouterPtr->sampled != 0 ){
813                  /* IN ("traffic to the AS")  */
814                  asres->bytesNbIN += agCache.bytes;
815                  asres->pktsNbIN += agCache.pkts;
816                  (asres->flowNbIN)++;
817                }
818                if (asres->sampling == 0
819                    && myPtrs->currentRouterPtr->sampled != 0){
820                  asres->sampling = myPtrs->currentRouterPtr->sampled;
821                }
822#endif
823              }
824            }
825          }
826        }
827#endif
828        if ( (bool == 1) && (isMplsFlow == 0) ){
829          /* Update the information db (aka RenetcolMIB) */
830          myPtrs->currentMIB->ipv4Bytes += agCache.bytes;
831          myPtrs->currentMIB->ipv4Pckts += agCache.pkts;
832          myPtrs->currentMIB->ipv4Flow += 1;
833          switch (agCache.tProt){
834          case 1:
835            myPtrs->currentMIB->ipv4IcmpFlowNb += 1;
836            myPtrs->currentMIB->ipv4IcmpBytesNb += agCache.bytes;
837            myPtrs->currentMIB->ipv4IcmpPktsNb += agCache.pkts;
838            break;
839          case 6:
840            myPtrs->currentMIB->ipv4TCPFlowNb += 1;
841            myPtrs->currentMIB->ipv4TCPBytesNb += agCache.bytes;
842            myPtrs->currentMIB->ipv4TCPPktsNb += agCache.pkts;
843            break;
844          case 17:
845            myPtrs->currentMIB->ipv4UDPFlowNb += 1;
846            myPtrs->currentMIB->ipv4UDPBytesNb += agCache.bytes;
847            myPtrs->currentMIB->ipv4UDPPktsNb += agCache.pkts;
848            break;
849          default:
850            myPtrs->currentMIB->ipv4OthersFlowNb += 1;
851            myPtrs->currentMIB->ipv4OthersBytesNb += agCache.bytes;
852            myPtrs->currentMIB->ipv4OthersPktsNb += agCache.pkts;
853            break;
854          }
855          if (agCache.pkts==1){
856            myPtrs->currentMIB->ipv4FlowSizePcktsE1 += 1;
857          } else if (agCache.pkts<10) {
858            myPtrs->currentMIB->ipv4FlowSizePcktsLT10 += 1;
859          } else if (agCache.pkts<100) {
860            myPtrs->currentMIB->ipv4FlowSizePcktsLT100 += 1;
861          } else if (agCache.pkts<1000) {
862            myPtrs->currentMIB->ipv4FlowSizePcktsLT1k += 1;
863          } else if (agCache.pkts<10000) {
864            myPtrs->currentMIB->ipv4FlowSizePcktsLT10k += 1;
865          } else if (agCache.pkts>=10000) {
866            myPtrs->currentMIB->ipv4FlowSizePcktsMT10k += 1;
867          }
868          if (agCache.bytes<50){
869            myPtrs->currentMIB->ipv4FlowSizeBytesLT50 += 1;
870          } else if (agCache.bytes<100) {
871            myPtrs->currentMIB->ipv4FlowSizeBytesLT100 += 1;
872          } else if (agCache.bytes<1000) {
873            myPtrs->currentMIB->ipv4FlowSizeBytesLT1k += 1;
874          } else if (agCache.bytes<10000) {
875            myPtrs->currentMIB->ipv4FlowSizeBytesLT10k += 1;
876          } else if (agCache.bytes<100000) {
877            myPtrs->currentMIB->ipv4FlowSizeBytesLT100k += 1;
878          } else if (agCache.bytes<1000000) {
879            myPtrs->currentMIB->ipv4FlowSizeBytesLT1M += 1;
880          } else if (agCache.bytes<10000000) {
881            myPtrs->currentMIB->ipv4FlowSizeBytesLT10M += 1;
882          } else if (agCache.bytes<100000000) {
883            myPtrs->currentMIB->ipv4FlowSizeBytesLT100M += 1;
884          } else if (agCache.bytes>=100000000) {
885            myPtrs->currentMIB->ipv4FlowSizeBytesMT100M += 1;
886          }
887          switch (agCache.dPort){
888    case 25:
889            myPtrs->currentMIB->ipv4MailFlowNb += 1;
890            myPtrs->currentMIB->ipv4MailBytesNb += agCache.bytes;
891            myPtrs->currentMIB->ipv4MailPcktsNb += agCache.pkts;
892            break;
893          case 53:
894            myPtrs->currentMIB->ipv4DNSFlowNb += 1;
895            myPtrs->currentMIB->ipv4DNSBytesNb += agCache.bytes;
896            myPtrs->currentMIB->ipv4DNSPcktsNb += agCache.pkts;
897            break;
898          case 80:
899            myPtrs->currentMIB->ipv4WebFlowNb += 1;
900            myPtrs->currentMIB->ipv4WebBytesNb += agCache.bytes;
901            myPtrs->currentMIB->ipv4WebPcktsNb += agCache.pkts;
902            break;
903          default:
904            myPtrs->currentMIB->ipv4OthersApFlowNb += 1;
905            myPtrs->currentMIB->ipv4OthersApBytesNb += agCache.bytes;
906            myPtrs->currentMIB->ipv4OthersApPcktsNb += agCache.pkts;
907            break;
908          }
909          /* end of mib update */
910        }
911        /*
912         * PREFIX &/or MATRIX ACCOUNTING
913         */
914#if defined(IPV4AGGIDR) || defined(IPV4AGGIDSNMP)
915        if ( (bool == 1) && (isMplsFlow == 0) ){
916          /*      prefixKey.beginning = agCache.v4AdS>>(32-agCache.maskS)<<(32-agCache.maskS); */
917          prefixKey.beginning = agCache.v4AdS;
918          res = bsearch(&prefixKey, V4PTab, nbPV4,
919                        sizeof(struct PrefixV4), prefGlobalCmp);
920          if (res!=NULL){
921            /* WE HAVE FOUND SOURCE ADDRESS IN OUR LIST */
922            if (res->hasSubnet == 1) {
923              resSub = NULL;
924              resSub = bsearch(&prefixKey, V4STab, nbSV4,
925                               sizeof(struct PrefixV4), prefGlobalCmp);
926              if (resSub != NULL) {
927                res = resSub;
928                resSub = NULL;
929              }
930            }
931#ifdef DEBUG
932            fprintf(stderr,"S %lu.%lu.%lu.%lu/%hu %lu.%lu.%lu.%lu/%hu Rs %lu Ps %lu SNMPin(hu) %hu\n",
933                    (agCache.v4AdS>>24),
934                    (agCache.v4AdS<<8>>24),
935                    (agCache.v4AdS<<16>>24),
936                    (agCache.v4AdS<<24>>24),
937                    (agCache.maskS),
938                    (agCache.v4AdD>>24),
939                    (agCache.v4AdD<<8>>24),
940                    (agCache.v4AdD<<16>>24),
941                    (agCache.v4AdD<<24>>24),
942                    (agCache.maskD),
943                    myPtrs->currentRouterPtr->sampled,
944                    res->sampling,
945                    agCache.inputSnmp);
946#endif
947#if defined(IPV4AGGIDR)
948            if ( myPtrs->routersID[res->routerNb] == agCache.routerAd  ) {
949#elif defined(IPV4AGGIDSNMP)
950              if ( myPtrs->currentRouterPtr->snmpIndexList[agCache.inputSnmp] == 1  ) {
951#endif
952                /* OUT ("traffic from the prefix/subnet")  */
953              if (agCache.firstTime>agCache.lastTime) {
954                 agCache.firstTimeCor = myPtrs->currentHeaderV9Ptr->boot_time - 0x100000000LL + (uint64_t)agCache.firstTime;
955                 agCache.lastTimeCor = myPtrs->currentHeaderV9Ptr->boot_time + (uint64_t)agCache.lastTime;
956              }else{
957                 agCache.firstTimeCor = myPtrs->currentHeaderV9Ptr->boot_time + (uint64_t)agCache.firstTime;
958                 agCache.lastTimeCor = myPtrs->currentHeaderV9Ptr->boot_time + (uint64_t)agCache.lastTime;
959              }
960#if defined(RECORDFLOW)
961        if (fprintf(curRFF,"%llu;%llu;%lu.%lu.%lu.%lu;%hu;%lu.%lu.%lu.%lu;%hu;%lu.%lu.%lu.%lu;%hu;%hu;%lu;%lu;%hu;%hu;%hu;%hu;%hu;%hu\n",
962                      agCache.firstTimeCor,
963                      agCache.lastTimeCor - agCache.firstTimeCor,
964                      (agCache.v4AdS>>24),
965                      (agCache.v4AdS<<8>>24),
966                      (agCache.v4AdS<<16>>24),
967                      (agCache.v4AdS<<24>>24),
968                      (agCache.maskS),
969                      (agCache.v4AdD>>24),
970                      (agCache.v4AdD<<8>>24),
971                      (agCache.v4AdD<<16>>24),
972                      (agCache.v4AdD<<24>>24),
973                      (agCache.maskD),
974                      (myPtrs->pcktPtr->ipH->srcAdd>>24),
975                      (myPtrs->pcktPtr->ipH->srcAdd<<8>>24),
976                      (myPtrs->pcktPtr->ipH->srcAdd<<16>>24),
977                      (myPtrs->pcktPtr->ipH->srcAdd<<24>>24),
978                      agCache.inputSnmp,
979                      agCache.outputSnmp,
980                      agCache.bytes,
981                      agCache.pkts,
982                      agCache.sPort,
983                      agCache.dPort,
984                      agCache.asS,
985                      agCache.asD,
986                      agCache.ipProt,
987                      agCache.tProt
988        ) == NULL ) {
989           printf(stderr, "%s", strerror(errno));
990         }
991#endif
992
993#if defined(MULTISAMPLING)
994                if (myPtrs->currentRouterPtr->sampled != res->sampling ){
995                  res->bytesNbOUT += agCache.bytes*myPtrs->currentRouterPtr->sampled/res->sampling;
996                  res->pktsNbOUT += agCache.pkts*myPtrs->currentRouterPtr->sampled/res->sampling;
997                  (res->flowNbOUT)++; /* FIXME : FIND SOMETHING*/
998                  if (agCache.dscp>>2 == FIRST_CoS) {
999                    res->firstCoSOUT += agCache.bytes*myPtrs->currentRouterPtr->sampled/res->sampling;
1000                  } else if (agCache.dscp>>2 == SECOND_CoS) {
1001                    res->secondCoSOUT += agCache.bytes*myPtrs->currentRouterPtr->sampled/res->sampling;
1002                  } else if (agCache.dscp>>2 == THIRD_CoS) {
1003                    res->thirdCoSOUT += agCache.bytes*myPtrs->currentRouterPtr->sampled/res->sampling;
1004                  } else {
1005                    res->fourthCoSOUT += agCache.bytes*myPtrs->currentRouterPtr->sampled/res->sampling;
1006                  }
1007                }else{
1008                  res->bytesNbOUT += agCache.bytes;
1009                  res->pktsNbOUT += agCache.pkts;
1010                  (res->flowNbOUT)++;
1011                  if (agCache.dscp>>2 == FIRST_CoS) {
1012                    res->firstCoSOUT += agCache.bytes;
1013                  } else if (agCache.dscp>>2 == SECOND_CoS) {
1014                    res->secondCoSOUT += agCache.bytes;
1015                  } else if (agCache.dscp>>2 == THIRD_CoS) {
1016                    res->thirdCoSOUT += agCache.bytes;
1017                  } else {
1018                    res->fourthCoSOUT += agCache.bytes;
1019                  }
1020                }
1021#else
1022                if (myPtrs->currentRouterPtr->sampled != 0 ){
1023                  res->bytesNbOUT += agCache.bytes;
1024                  res->pktsNbOUT += agCache.pkts;
1025                  (res->flowNbOUT)++;
1026                  if (agCache.dscp>>2 == FIRST_CoS) {
1027                    res->firstCoSOUT += agCache.bytes;
1028                  } else if (agCache.dscp>>2 == SECOND_CoS) {
1029                    res->secondCoSOUT += agCache.bytes;
1030                  } else if (agCache.dscp>>2 == THIRD_CoS) {
1031                    res->thirdCoSOUT += agCache.bytes;
1032                  } else {
1033                    res->fourthCoSOUT += agCache.bytes;
1034                  }
1035                }
1036                if (res->sampling == 0
1037                    && myPtrs->currentRouterPtr->sampled != 0){
1038                  res->sampling = myPtrs->currentRouterPtr->sampled;
1039                }
1040#endif
1041#if defined(IPV4AGGIDSNMP)
1042                /*              prefixKey.beginning = agCache.v4AdD>>(32-agCache.maskD)<<(32-agCache.maskD);*/
1043                prefixKey.beginning = agCache.v4AdD;
1044                res3 = bsearch(&prefixKey, V4PTab, nbPV4,
1045                               sizeof(struct PrefixV4), prefGlobalCmp);
1046                if (res3!=NULL){
1047                  /* res is supernet or subnet ? */
1048                  if (res3->hasSubnet == 1) {
1049                    resSub = NULL;
1050                    resSub = bsearch(&prefixKey, V4STab, nbSV4,
1051                                     sizeof(struct PrefixV4), prefGlobalCmp);
1052                    if (resSub != NULL) {
1053                      res3 = resSub;
1054                      resSub = NULL;
1055                    }
1056                  }
1057#ifdef DEBUG
1058            fprintf(stderr,"S&D %lu.%lu.%lu.%lu/%hu %lu.%lu.%lu.%lu/%hu Rs %lu Ps %lu SNMPin %hu\n",
1059                    (agCache.v4AdS>>24),
1060                    (agCache.v4AdS<<8>>24),
1061                    (agCache.v4AdS<<16>>24),
1062                    (agCache.v4AdS<<24>>24),
1063                    (agCache.maskS),
1064                    (agCache.v4AdD>>24),
1065                    (agCache.v4AdD<<8>>24),
1066                    (agCache.v4AdD<<16>>24),
1067                    (agCache.v4AdD<<24>>24),
1068                    (agCache.maskD),
1069                    myPtrs->currentRouterPtr->sampled,
1070                    res3->sampling,
1071                    agCache.inputSnmp);
1072#endif
1073#if defined(MULTISAMPLING)
1074                  if (myPtrs->currentRouterPtr->sampled != res3->sampling ){
1075                    res3->bytesNbIN += agCache.bytes*myPtrs->currentRouterPtr->sampled/res3->sampling;
1076                    res3->pktsNbIN += agCache.pkts*myPtrs->currentRouterPtr->sampled/res3->sampling;
1077                    (res3->flowNbIN)++;  /* FIXME : FIND SOMETHING */
1078                    if (agCache.dscp>>2 == FIRST_CoS) {
1079                      res3->firstCoSIN += agCache.bytes*myPtrs->currentRouterPtr->sampled/res3->sampling;
1080                    } else if (agCache.dscp>>2 == SECOND_CoS) {
1081                      res3->secondCoSIN += agCache.bytes*myPtrs->currentRouterPtr->sampled/res3->sampling;
1082                    } else if (agCache.dscp>>2 == THIRD_CoS) {
1083                      res3->thirdCoSIN += agCache.bytes*myPtrs->currentRouterPtr->sampled/res3->sampling;
1084                    } else {
1085                      res3->fourthCoSIN += agCache.bytes*myPtrs->currentRouterPtr->sampled/res3->sampling;
1086                    }
1087                  }else{
1088                    res3->bytesNbIN += agCache.bytes;
1089                    res3->pktsNbIN += agCache.pkts;
1090                    (res3->flowNbIN)++;
1091                    if (agCache.dscp>>2 == FIRST_CoS) {
1092                      res3->firstCoSIN += agCache.bytes;
1093                    } else if (agCache.dscp>>2 == SECOND_CoS) {
1094                      res3->secondCoSIN += agCache.bytes;
1095                    } else if (agCache.dscp>>2 == THIRD_CoS) {
1096                      res3->thirdCoSIN += agCache.bytes;
1097                    } else {
1098                      res3->fourthCoSIN += agCache.bytes;
1099                    }
1100                  }
1101#else
1102
1103                  if (myPtrs->currentRouterPtr->sampled != 0 ){
1104                    /* IN ("traffic to the prefix/subnet")  */
1105                    res3->bytesNbIN += agCache.bytes;
1106                    res3->pktsNbIN += agCache.pkts;
1107                    (res3->flowNbIN)++;
1108                    if (agCache.dscp>>2 == FIRST_CoS) {
1109                      res3->firstCoSIN += agCache.bytes;
1110                    } else if (agCache.dscp>>2 == SECOND_CoS) {
1111                      res3->secondCoSIN += agCache.bytes;
1112                    } else if (agCache.dscp>>2 == THIRD_CoS) {
1113                      res3->thirdCoSIN += agCache.bytes;
1114                    } else {
1115                      res3->fourthCoSIN += agCache.bytes;
1116                    }
1117                  }
1118                  if (res3->sampling == 0
1119                      && myPtrs->currentRouterPtr->sampled != 0){
1120                    res3->sampling = myPtrs->currentRouterPtr->sampled;
1121                  }
1122#endif
1123                }
1124#endif
1125#if defined(MATRIX) && defined(IPV4AGGIDR)
1126                /* inter-pop matrix Accounting */
1127                /*              prefixKey.beginning = agCache.v4AdD>>(32-agCache.maskD)<<(32-agCache.maskD);*/
1128                prefixKey.beginning = agCache.v4AdD;
1129                res2 = bsearch(&prefixKey, V4PTab, nbPV4,
1130                               sizeof(struct PrefixV4), prefGlobalCmp);
1131                if (res2!=NULL){
1132#if defined(MULTISAMPLING)
1133                  if (myPtrs->currentRouterPtr->sampled != res2->sampling ){
1134                    ((struct POP *)((myPtrs->matrixPOP)
1135                                    +((res->routerNb)*ROUTER_INDEX_MAX)
1136                                    +((res2->routerNb))))->pktsNb += agCache.pkts*myPtrs->currentRouterPtr->sampled/res2->sampling;
1137                    ((struct POP *)((myPtrs->matrixPOP)
1138                                    +((res->routerNb)*ROUTER_INDEX_MAX)
1139                                    +((res2->routerNb))))->bytesNb += agCache.bytes*myPtrs->currentRouterPtr->sampled/res2->sampling;
1140                    ((struct POP *)((myPtrs->matrixPOP)
1141                                    +((res->routerNb)*ROUTER_INDEX_MAX)
1142                                    +((res2->routerNb))))->flowNb++;
1143                  } else {
1144                    ((struct POP *)((myPtrs->matrixPOP)
1145                                    +((res->routerNb)*ROUTER_INDEX_MAX)
1146                                    +((res2->routerNb))))->pktsNb += agCache.pkts;
1147                    ((struct POP *)((myPtrs->matrixPOP)
1148                                    +((res->routerNb)*ROUTER_INDEX_MAX)
1149                                    +((res2->routerNb))))->bytesNb += agCache.bytes;
1150                    ((struct POP *)((myPtrs->matrixPOP)
1151                                    +((res->routerNb)*ROUTER_INDEX_MAX)
1152                                    +((res2->routerNb))))->flowNb++;
1153                  }
1154#else
1155                  ((struct POP *)((myPtrs->matrixPOP)
1156                                  +((res->routerNb)*ROUTER_INDEX_MAX)
1157                                  +((res2->routerNb))))->pktsNb += agCache.pkts;
1158                  ((struct POP *)((myPtrs->matrixPOP)
1159                                  +((res->routerNb)*ROUTER_INDEX_MAX)
1160                                  +((res2->routerNb))))->bytesNb += agCache.bytes;
1161                  ((struct POP *)((myPtrs->matrixPOP)
1162                                  +((res->routerNb)*ROUTER_INDEX_MAX)
1163                                  +((res2->routerNb))))->flowNb++;
1164#endif
1165                } else {
1166                  /* here we'll make the choice that in multisampling mode,
1167                   * the virtual POP that represent the reste of world will be
1168                   * recorded in 1:10 packets mode */
1169#if defined(MULTISAMPLING)
1170                  (
1171                   ((struct POP *)(myPtrs->matrixPOP)
1172                    +((res->routerNb)*ROUTER_INDEX_MAX)
1173                    +((ROUTER_INDEX_MAX-1))))->pktsNb += agCache.pkts*myPtrs->currentRouterPtr->sampled/10;
1174                  (
1175                   ((struct POP *)(myPtrs->matrixPOP)
1176                    +((res->routerNb)*ROUTER_INDEX_MAX)
1177                    +((ROUTER_INDEX_MAX-1))))->bytesNb += agCache.bytes*myPtrs->currentRouterPtr->sampled/10;
1178                  (
1179                   ((struct POP *)(myPtrs->matrixPOP)
1180                    +((res->routerNb)*ROUTER_INDEX_MAX)
1181                    +((ROUTER_INDEX_MAX-1))))->flowNb++;
1182#else
1183                  (
1184                   ((struct POP *)(myPtrs->matrixPOP)
1185                    +((res->routerNb)*ROUTER_INDEX_MAX)
1186                    +((ROUTER_INDEX_MAX-1))))->pktsNb += agCache.pkts;
1187                  (
1188                   ((struct POP *)(myPtrs->matrixPOP)
1189                    +((res->routerNb)*ROUTER_INDEX_MAX)
1190                    +((ROUTER_INDEX_MAX-1))))->bytesNb += agCache.bytes;
1191                  (
1192                   ((struct POP *)(myPtrs->matrixPOP)
1193                    +((res->routerNb)*ROUTER_INDEX_MAX)
1194                    +((ROUTER_INDEX_MAX-1))))->flowNb++;
1195#endif
1196                }
1197                /* end interpop matrix accounting */
1198#endif /* matrix */
1199              } else {
1200                /* doublon or bad reference in prefix list */
1201#if defined(IPV4AGGIDR)
1202              }
1203#elif defined(IPV4AGGIDSNMP)
1204            }
1205#endif
1206          } else { /* SOURCE ADDRESS DOESN'T IN OUR LIST */
1207            /*      prefixKey.beginning = agCache.v4AdD>>(32-agCache.maskD)<<(32-agCache.maskD); */
1208            prefixKey.beginning = agCache.v4AdD;
1209            res = bsearch(&prefixKey, V4PTab, nbPV4,
1210                          sizeof(struct PrefixV4), prefGlobalCmp);
1211            if (res!=NULL){
1212              /* DESTINATION ADDRESS IS IN OUR LIST */
1213              if (res->hasSubnet == 1) {
1214                resSub = NULL;
1215                resSub = bsearch(&prefixKey, V4STab, nbSV4,
1216                                 sizeof(struct PrefixV4), prefGlobalCmp);
1217                if (resSub != NULL) {
1218                  res = resSub;
1219                  resSub = NULL;
1220                }
1221              }
1222#ifdef DEBUG
1223            fprintf(stderr,"D %lu.%lu.%lu.%lu/%hu %lu.%lu.%lu.%lu/%hu Rs %lu Ps %lu R@ %lu.%lu.%lu.%lu SNMPin %hu\n",
1224                    (agCache.v4AdS>>24),
1225                    (agCache.v4AdS<<8>>24),
1226                    (agCache.v4AdS<<16>>24),
1227                    (agCache.v4AdS<<24>>24),
1228                    (agCache.maskS),
1229                    (agCache.v4AdD>>24),
1230                    (agCache.v4AdD<<8>>24),
1231                    (agCache.v4AdD<<16>>24),
1232                    (agCache.v4AdD<<24>>24),
1233                    (agCache.maskD),
1234                    myPtrs->currentRouterPtr->sampled,
1235                    res->sampling,
1236                    (myPtrs->pcktPtr->ipH->srcAdd>>24),
1237                    (myPtrs->pcktPtr->ipH->srcAdd<<8>>24),
1238                    (myPtrs->pcktPtr->ipH->srcAdd<<16>>24),
1239                    (myPtrs->pcktPtr->ipH->srcAdd<<24>>24),
1240                    agCache.inputSnmp);
1241#endif
1242#if defined(IPV4AGGIDSNMP)
1243              if ( myPtrs->currentRouterPtr->snmpIndexList[agCache.inputSnmp] == 1  ) {
1244#if defined(MULTISAMPLING)
1245                if (myPtrs->currentRouterPtr->sampled != res->sampling ){
1246                  res->bytesNbIN += agCache.bytes*myPtrs->currentRouterPtr->sampled/res->sampling;
1247                  res->pktsNbIN += agCache.pkts*myPtrs->currentRouterPtr->sampled/res->sampling;
1248                  (res->flowNbIN)++;
1249                  if (agCache.dscp>>2 == FIRST_CoS) {
1250                    res->firstCoSIN += agCache.bytes*myPtrs->currentRouterPtr->sampled/res->sampling;
1251                  } else if (agCache.dscp>>2 == SECOND_CoS) {
1252                    res->secondCoSIN += agCache.bytes*myPtrs->currentRouterPtr->sampled/res->sampling;
1253                  } else if (agCache.dscp>>2 == THIRD_CoS) {
1254                    res->thirdCoSIN += agCache.bytes*myPtrs->currentRouterPtr->sampled/res->sampling;
1255                  } else {
1256                    res->fourthCoSIN += agCache.bytes*myPtrs->currentRouterPtr->sampled/res->sampling;
1257                  }
1258                }else{
1259                  res->bytesNbIN += agCache.bytes;
1260                  res->pktsNbIN += agCache.pkts;
1261                  (res->flowNbIN)++;
1262                  if (agCache.dscp>>2 == FIRST_CoS) {
1263                    res->firstCoSIN += agCache.bytes;
1264                  } else if (agCache.dscp>>2 == SECOND_CoS) {
1265                    res->secondCoSIN += agCache.bytes;
1266                  } else if (agCache.dscp>>2 == THIRD_CoS) {
1267                    res->thirdCoSIN += agCache.bytes;
1268                  } else {
1269                    res->fourthCoSIN += agCache.bytes;
1270                  }
1271                }
1272#else
1273                if (myPtrs->currentRouterPtr->sampled != 0 ){
1274                  /* IN ("traffic to the prefix/subnet")  */
1275                  res->bytesNbIN += agCache.bytes;
1276                  res->pktsNbIN += agCache.pkts;
1277                  (res->flowNbIN)++;
1278                  if (agCache.dscp>>2 == FIRST_CoS) {
1279                    res->firstCoSIN += agCache.bytes;
1280                  } else if (agCache.dscp>>2 == SECOND_CoS) {
1281                    res->secondCoSIN += agCache.bytes;
1282                  } else if (agCache.dscp>>2 == THIRD_CoS) {
1283                    res->thirdCoSIN += agCache.bytes;
1284                  } else {
1285                    res->fourthCoSIN += agCache.bytes;
1286                  }
1287                }
1288#endif
1289              }
1290              if (agCache.firstTime>agCache.lastTime) {
1291                 agCache.firstTimeCor = myPtrs->currentHeaderV9Ptr->boot_time - 0x100000000LL + (uint64_t)agCache.firstTime;
1292                 agCache.lastTimeCor = myPtrs->currentHeaderV9Ptr->boot_time + (uint64_t)agCache.lastTime;
1293              }else{
1294                 agCache.firstTimeCor = myPtrs->currentHeaderV9Ptr->boot_time + (uint64_t)agCache.firstTime;
1295                 agCache.lastTimeCor = myPtrs->currentHeaderV9Ptr->boot_time + (uint64_t)agCache.lastTime;
1296              }
1297#if defined(RECORDFLOW)
1298        if (fprintf(curRFF,"%llu;%llu;%lu.%lu.%lu.%lu;%hu;%lu.%lu.%lu.%lu;%hu;%lu.%lu.%lu.%lu;%hu;%hu;%lu;%lu;%hu;%hu;%hu;%hu;%hu;%hu\n",
1299                      agCache.firstTimeCor,
1300                      agCache.lastTimeCor - agCache.firstTimeCor,
1301                      (agCache.v4AdS>>24),
1302                      (agCache.v4AdS<<8>>24),
1303                      (agCache.v4AdS<<16>>24),
1304                      (agCache.v4AdS<<24>>24),
1305                      (agCache.maskS),
1306                      (agCache.v4AdD>>24),
1307                      (agCache.v4AdD<<8>>24),
1308                      (agCache.v4AdD<<16>>24),
1309                      (agCache.v4AdD<<24>>24),
1310                      (agCache.maskD),
1311                      (myPtrs->pcktPtr->ipH->srcAdd>>24),
1312                      (myPtrs->pcktPtr->ipH->srcAdd<<8>>24),
1313                      (myPtrs->pcktPtr->ipH->srcAdd<<16>>24),
1314                      (myPtrs->pcktPtr->ipH->srcAdd<<24>>24),
1315                      agCache.inputSnmp,
1316                      agCache.outputSnmp,
1317                      agCache.bytes,
1318                      agCache.pkts,
1319                      agCache.sPort,
1320                      agCache.dPort,
1321                      agCache.asS,
1322                      agCache.asD,
1323                      agCache.ipProt,
1324                      agCache.tProt
1325        ) == NULL ) {
1326           printf(stderr, "%s", strerror(errno));
1327         }
1328#endif
1329#endif
1330#if defined(IPV4AGGIDR)
1331              if ( myPtrs->routersID[res->routerNb] == agCache.routerAd  ) {
1332#if defined(MULTISAMPLING)
1333                if (myPtrs->currentRouterPtr->sampled != res->sampling ){
1334                  res->bytesNbIN += agCache.bytes*myPtrs->currentRouterPtr->sampled/res->sampling;
1335                  res->pktsNbIN += agCache.pkts*myPtrs->currentRouterPtr->sampled/res->sampling;
1336                  (res->flowNbIN)++;
1337                  if (agCache.dscp>>2 == FIRST_CoS) {
1338                    res->firstCoSIN += agCache.bytes*myPtrs->currentRouterPtr->sampled/res->sampling;
1339                  } else if (agCache.dscp>>2 == SECOND_CoS) {
1340                    res->secondCoSIN += agCache.bytes*myPtrs->currentRouterPtr->sampled/res->sampling;
1341                  } else if (agCache.dscp>>2 == THIRD_CoS) {
1342                    res->thirdCoSIN += agCache.bytes*myPtrs->currentRouterPtr->sampled/res->sampling;
1343                  } else {
1344                    res->fourthCoSIN += agCache.bytes*myPtrs->currentRouterPtr->sampled/res->sampling;
1345                  }
1346                }else{
1347                  res->bytesNbIN += agCache.bytes;
1348                  res->pktsNbIN += agCache.pkts;
1349                  (res->flowNbIN)++;
1350                  if (agCache.dscp>>2 == FIRST_CoS) {
1351                    res->firstCoSIN += agCache.bytes;
1352                  } else if (agCache.dscp>>2 == SECOND_CoS) {
1353                    res->secondCoSIN += agCache.bytes;
1354                  } else if (agCache.dscp>>2 == THIRD_CoS) {
1355                    res->thirdCoSIN += agCache.bytes;
1356                  } else {
1357                    res->fourthCoSIN += agCache.bytes;
1358                  }
1359                }
1360#else
1361                if (myPtrs->currentRouterPtr->sampled != 0 ){
1362                  /* IN ("traffic to the prefix")  */
1363                  res->bytesNbIN += agCache.bytes;
1364                  res->pktsNbIN += agCache.pkts;
1365                  (res->flowNbIN)++;
1366                  if (agCache.dscp>>2 == FIRST_CoS) {
1367                    res->firstCoSIN += agCache.bytes;
1368                  } else if (agCache.dscp>>2 == SECOND_CoS) {
1369                    res->secondCoSIN += agCache.bytes;
1370                  } else if (agCache.dscp>>2 == THIRD_CoS) {
1371                    res->thirdCoSIN += agCache.bytes;
1372                  } else {
1373                    res->fourthCoSIN += agCache.bytes;
1374                  }
1375                }
1376#endif
1377              } else {
1378#if defined(MULTISAMPLING)
1379#if defined(MATRIX)
1380                  (
1381                   ((struct POP *)(myPtrs->matrixPOP)
1382                    +((ROUTER_INDEX_MAX-1)*ROUTER_INDEX_MAX)
1383                    +((res->routerNb))))->pktsNb += agCache.pkts*myPtrs->currentRouterPtr->sampled/10;
1384                  (
1385                   ((struct POP *)(myPtrs->matrixPOP)
1386                    +((ROUTER_INDEX_MAX-1)*ROUTER_INDEX_MAX)
1387                    +((res->routerNb))))->bytesNb += agCache.bytes*myPtrs->currentRouterPtr->sampled/10;
1388                  (
1389                   ((struct POP *)(myPtrs->matrixPOP)
1390                    +((ROUTER_INDEX_MAX-1)*ROUTER_INDEX_MAX)
1391                    +((res->routerNb))))->flowNb++;
1392#endif
1393#else
1394#if defined(MATRIX)
1395                  (
1396                   ((struct POP *)(myPtrs->matrixPOP)
1397                    +((ROUTER_INDEX_MAX-1)*ROUTER_INDEX_MAX)
1398                    +((res->routerNb))))->pktsNb += agCache.pkts;
1399                  (
1400                   ((struct POP *)(myPtrs->matrixPOP)
1401                    +((ROUTER_INDEX_MAX-1)*ROUTER_INDEX_MAX)
1402                    +((res->routerNb))))->bytesNb += agCache.bytes;
1403                  (
1404                   ((struct POP *)(myPtrs->matrixPOP)
1405                    +((ROUTER_INDEX_MAX-1)*ROUTER_INDEX_MAX)
1406                    +((res->routerNb))))->flowNb++;
1407#endif
1408#endif
1409              }
1410              if (res->sampling == 0
1411                  && myPtrs->currentRouterPtr->sampled != 0 ){
1412                res->sampling = myPtrs->currentRouterPtr->sampled;
1413              }
1414#endif
1415            } else { /* UNKNOW SUBNET CASE */
1416              /* UNKNOW SUBNET CASE                                        */
1417              /*                                                           */
1418              /* HERE : we are in the cases of the address/mask don't      */
1419              /*        belong to a prefix listed in the IPv4 prefix file  */
1420              /* possibilities :                                           */
1421              /*     -  prefix not referenced but allowed to be routed     */
1422              /*     -  prefix not referenced but not allowed to be routed */
1423              /*     -  spoofing                                           */
1424#ifdef PRINTUNKNOWNSUBNET
1425              fprintf(stderr, "%lu.%lu.%lu.%lu/%hu -> %lu.%lu.%lu.%lu/%hu (R:%lu.%lu.%lu.%lu) \n",
1426                      (agCache.v4AdS>>24),
1427                      (agCache.v4AdS<<8>>24),
1428                      (agCache.v4AdS<<16>>24),
1429                      (agCache.v4AdS<<24>>24),
1430                      (agCache.maskS),
1431                      (agCache.v4AdD>>24),
1432                      (agCache.v4AdD<<8>>24),
1433                      (agCache.v4AdD<<16>>24),
1434                      (agCache.v4AdD<<24>>24),
1435                      (agCache.maskD),
1436                      (myPtrs->pcktPtr->ipH->srcAdd>>24),
1437                      (myPtrs->pcktPtr->ipH->srcAdd<<8>>24),
1438                      (myPtrs->pcktPtr->ipH->srcAdd<<16>>24),
1439                      (myPtrs->pcktPtr->ipH->srcAdd<<24>>24)
1440                      );
1441#endif /* PRINTUNKNOWNSUBNET */
1442            }
1443          } /* end of the Destination prefix is in our list */
1444        } /* end of the prefix is in our list */
1445        bool = 0;
1446#endif /* (IPV4AGGIDR) || (IPV4AGGIDSNMP) */
1447        if ( ( isIPv6 == 1 ) && (isMplsFlow == 0) ){
1448#ifdef IPV6LINKAGG
1449          ((struct IndexV6 *)((myPtrs->currentV6IndexTab)
1450                              +((myPtrs->currentRouterPtr->ID)*MAX_INDEX_BY_ROUTER)
1451                              +(agCache.inputSnmp)))->routerIPAddress = myPtrs->currentRouterPtr->IpAddress;
1452          ((struct IndexV6 *)((myPtrs->currentV6IndexTab)
1453                              +((myPtrs->currentRouterPtr->ID)*MAX_INDEX_BY_ROUTER)
1454                              +(agCache.outputSnmp)))->routerIPAddress = myPtrs->currentRouterPtr->IpAddress;
1455          ((struct IndexV6 *)((myPtrs->currentV6IndexTab)
1456                              +((myPtrs->currentRouterPtr->ID)*MAX_INDEX_BY_ROUTER)
1457                              +(agCache.inputSnmp)))->indexSNMP = agCache.inputSnmp;
1458          ((struct IndexV6 *)((myPtrs->currentV6IndexTab)
1459                              +((myPtrs->currentRouterPtr->ID)*MAX_INDEX_BY_ROUTER)
1460                              +(agCache.outputSnmp)))->indexSNMP = agCache.outputSnmp;
1461          /* FIXME, error or warning if (indexSNMP != agCache.outputSnmp) */
1462          ((struct IndexV6 *)((myPtrs->currentV6IndexTab)
1463                              +((myPtrs->currentRouterPtr->ID)*MAX_INDEX_BY_ROUTER)
1464                              +(agCache.inputSnmp)))->hasStats = 1;
1465          ((struct IndexV6 *)((myPtrs->currentV6IndexTab)
1466                              +((myPtrs->currentRouterPtr->ID)*MAX_INDEX_BY_ROUTER)
1467                              +(agCache.outputSnmp)))->hasStats = 1;
1468          ((struct IndexV6 *)((myPtrs->currentV6IndexTab)
1469                              +((myPtrs->currentRouterPtr->ID)*MAX_INDEX_BY_ROUTER)
1470                              +(agCache.inputSnmp)))->bytesNbIN += agCache.bytes;
1471          ((struct IndexV6 *)((myPtrs->currentV6IndexTab)
1472                              +((myPtrs->currentRouterPtr->ID)*MAX_INDEX_BY_ROUTER)
1473                              +(agCache.outputSnmp)))->bytesNbOUT += agCache.bytes;
1474          ((struct IndexV6 *)((myPtrs->currentV6IndexTab)
1475                              +((myPtrs->currentRouterPtr->ID)*MAX_INDEX_BY_ROUTER)
1476                              +(agCache.inputSnmp)))->pktsNbIN += agCache.pkts;
1477          ((struct IndexV6 *)((myPtrs->currentV6IndexTab)
1478                              +((myPtrs->currentRouterPtr->ID)*MAX_INDEX_BY_ROUTER)
1479                              +(agCache.outputSnmp)))->pktsNbOUT += agCache.pkts;
1480          ((struct IndexV6 *)((myPtrs->currentV6IndexTab)
1481                              +((myPtrs->currentRouterPtr->ID)*MAX_INDEX_BY_ROUTER)
1482                              +(agCache.inputSnmp)))->flowNbIN++;
1483          ((struct IndexV6 *)((myPtrs->currentV6IndexTab)
1484                              +((myPtrs->currentRouterPtr->ID)*MAX_INDEX_BY_ROUTER)
1485                              +(agCache.outputSnmp)))->flowNbOUT++;
1486/*        fprintf(stderr,"IPV6LINKAGG;IN;%hu;OUT;%hu;router;%lu;bytes;%lu\n", */
1487/*                agCache.inputSnmp, */
1488/*                agCache.outputSnmp, */
1489/*                myPtrs->currentRouterPtr->IpAddress, */
1490/*                agCache.bytes */
1491/*               ); */
1492#endif /* IPV6LINKAGG */
1493          /* Update the information db (aka RenetcolMIB) */
1494          myPtrs->currentMIB->ipv6Bytes += agCache.bytes;
1495          myPtrs->currentMIB->ipv6Pckts += agCache.pkts;
1496          myPtrs->currentMIB->ipv6Flow += 1;
1497          switch (agCache.tProt){
1498          case 1:
1499            myPtrs->currentMIB->ipv6IcmpFlowNb += 1;
1500            myPtrs->currentMIB->ipv6IcmpBytesNb += agCache.bytes;
1501            myPtrs->currentMIB->ipv6IcmpPktsNb += agCache.pkts;
1502            break;
1503          case 6:
1504            myPtrs->currentMIB->ipv6TCPFlowNb += 1;
1505            myPtrs->currentMIB->ipv6TCPBytesNb += agCache.bytes;
1506            myPtrs->currentMIB->ipv6TCPPktsNb += agCache.pkts;
1507            break;
1508          case 17:
1509            myPtrs->currentMIB->ipv6UDPFlowNb += 1;
1510            myPtrs->currentMIB->ipv6UDPBytesNb += agCache.bytes;
1511            myPtrs->currentMIB->ipv6UDPPktsNb += agCache.pkts;
1512            break;
1513          default:
1514            myPtrs->currentMIB->ipv6OthersFlowNb += 1;
1515            myPtrs->currentMIB->ipv6OthersBytesNb += agCache.bytes;
1516            myPtrs->currentMIB->ipv6OthersPktsNb += agCache.pkts;
1517            break;
1518          }
1519          if (agCache.pkts==1){
1520            myPtrs->currentMIB->ipv6FlowSizePcktsE1 += 1;
1521          } else if (agCache.pkts<10) {
1522            myPtrs->currentMIB->ipv6FlowSizePcktsLT10 += 1;
1523          } else if (agCache.pkts<100) {
1524            myPtrs->currentMIB->ipv6FlowSizePcktsLT100 += 1;
1525          } else if (agCache.pkts<1000) {
1526            myPtrs->currentMIB->ipv6FlowSizePcktsLT1k += 1;
1527          } else if (agCache.pkts<10000) {
1528            myPtrs->currentMIB->ipv6FlowSizePcktsLT10k += 1;
1529          } else if (agCache.pkts>=10000) {
1530            myPtrs->currentMIB->ipv6FlowSizePcktsMT10k += 1;
1531          }
1532          if (agCache.bytes<50){
1533            myPtrs->currentMIB->ipv6FlowSizeBytesLT50 += 1;
1534          } else if (agCache.bytes<100) {
1535            myPtrs->currentMIB->ipv6FlowSizeBytesLT100 += 1;
1536          } else if (agCache.bytes<1000) {
1537            myPtrs->currentMIB->ipv6FlowSizeBytesLT1k += 1;
1538          } else if (agCache.bytes<10000) {
1539            myPtrs->currentMIB->ipv6FlowSizeBytesLT10k += 1;
1540          } else if (agCache.bytes<100000) {
1541            myPtrs->currentMIB->ipv6FlowSizeBytesLT100k += 1;
1542          } else if (agCache.bytes<1000000) {
1543            myPtrs->currentMIB->ipv6FlowSizeBytesLT1M += 1;
1544          } else if (agCache.bytes<10000000) {
1545            myPtrs->currentMIB->ipv6FlowSizeBytesLT10M += 1;
1546          } else if (agCache.bytes<100000000) {
1547            myPtrs->currentMIB->ipv6FlowSizeBytesLT100M += 1;
1548          } else if (agCache.bytes>=100000000) {
1549            myPtrs->currentMIB->ipv6FlowSizeBytesMT100M += 1;
1550          }
1551          switch (agCache.dPort){
1552          case 53:
1553            myPtrs->currentMIB->ipv6DNSFlowNb += 1;
1554            myPtrs->currentMIB->ipv6DNSBytesNb += agCache.bytes;
1555            myPtrs->currentMIB->ipv6DNSPcktsNb += agCache.pkts;
1556            break;
1557          case 80:
1558            myPtrs->currentMIB->ipv6WebFlowNb += 1;
1559            myPtrs->currentMIB->ipv6WebBytesNb += agCache.bytes;
1560            myPtrs->currentMIB->ipv6WebPcktsNb += agCache.pkts;
1561            break;
1562          default:
1563            myPtrs->currentMIB->ipv6OthersApFlowNb += 1;
1564            myPtrs->currentMIB->ipv6OthersApBytesNb += agCache.bytes;
1565            myPtrs->currentMIB->ipv6OthersApPcktsNb += agCache.pkts;
1566            break;
1567          }
1568          /* end of mib update */
1569          isIPv6 = 0;
1570        }
1571        isMplsFlow = 0;
1572
1573        /* DoS DETECTION */
1574    if ( dosCache.endTime-dosCache.startTime > 1000 ) {
1575      if ( ( (dosCache.packets*dosCache.sampling)/((dosCache.endTime-dosCache.startTime)/1000) > MAX_PKTS_DOS )
1576          && ((dosCache.bytes)/(dosCache.packets) < RATIO_DOS ) ) {
1577        jdos = 0;
1578        posdos = 69*MAX_RULES_PER_FIELD+jdos;
1579        while ( ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+posdos))) != NULL ) {
1580          ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+posdos)))->check = 1;
1581          jdos++;
1582          posdos = 69*MAX_RULES_PER_FIELD+jdos;
1583        }
1584      }
1585    } else { /* flow duration <= 1000ms , we divide by 1 (sec) */
1586      if ( ( (dosCache.packets*dosCache.sampling) > MAX_PKTS_DOS )
1587          & ((dosCache.bytes)/(dosCache.packets) < RATIO_DOS ) ) {
1588        jdos = 0;
1589        posdos = 69*MAX_RULES_PER_FIELD+jdos;
1590        while ( ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+posdos))) != NULL ) {
1591          ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+posdos)))->check = 1;
1592          jdos++;
1593          posdos = 69*MAX_RULES_PER_FIELD+jdos;
1594        }
1595      }
1596    }
1597    dosCache.packets = 1;
1598    dosCache.bytes = 1;
1599    dosCache.endTime = 1;
1600    dosCache.startTime = 1;
1601
1602        /*
1603         *
1604         * SOCKET OUTPUT TO A REMOTE CLIENT
1605         *
1606         * switch the rules definition (check & fieldToRecord),
1607         * we send the flow or a part of the flow to a remote host or a file.
1608         * In a first time (until release 0.0.7, the information was sent via
1609         * the process renetcolSender with an IPC message queue. But, the perf
1610         * of IPC Msg was very bad with a default system compilation.
1611         * So, now, we send information directly from here through sockets.
1612         */
1613        tmpRuleList = myPtrs->rulesListPtr;
1614        tmpRL = myPtrs->rulesListPtr;
1615        while (tmpRuleList){
1616          RuleDefPtr tmpRuleDefList = tmpRuleList->def;
1617          unsigned short check = 1;
1618          int s=0;
1619          secondOffset = secondOldOffset;
1620          while (tmpRuleDefList){
1621            check = check && tmpRuleDefList->check;
1622            tmpRuleDefList->check = 0;
1623            tmpRuleDefList = tmpRuleDefList->next;
1624          }
1625          if ( (tmpRuleList->def != NULL) && (check == 1)) {
1626            /* msg building */
1627            secondPftmp = tmp->lastField;
1628            msgTextIndex = mempcpy(mempcpy(mempcpy(myMsg.text,
1629                                                   &tplMsgType,
1630                                                   sizeof(unsigned short)
1631                                                   ),
1632                                           &tmpRuleList->id,
1633                                           sizeof(tmpRuleList->id)
1634                                           ),
1635                                   &myPtrs->currentRouterPtr->IpAddress,
1636                                   sizeof(unsigned long)
1637                                   );
1638            msgTextIndex = mempcpy(mempcpy(mempcpy(msgTextIndex,
1639                                                   &tmp->sourceId,
1640                                                   sizeof(unsigned long)
1641                                                   ),
1642                                           &tmp->templateFlowSetId,
1643                                           sizeof(tmp->templateFlowSetId)
1644                                           ),
1645                                   myPtrs->ptr_buffer+secondOffset,
1646                                   flow_size
1647                                   );
1648            myMsg.type = 1;
1649
1650
1651            /* NEW transfert type */
1652            for ( ; tmpRL; tmpRL=tmpRL->next){
1653              if (tmpRL->id == tmpRuleList->id){
1654                s = sendMessage(tmpRL->host->sockId, myMsg.text, sizeof(myMsg.text),
1655                                tmpRL->host->hostAddressPtr);
1656              }
1657            }
1658            /* FIXME : perhaps check "s" */
1659            noEnd = 1;
1660            secondCpt=0;
1661          } /* end if check */
1662          tmpRuleList = tmpRuleList->next;
1663          tmpRL = myPtrs->rulesListPtr; /* ticket #11 */
1664          secondPftmp = tmp->lastField;
1665        } /* end while tmpRuleList */
1666        /*
1667         * end redirection
1668         */
1669        secondOffset = *myPtrs->offsetV9Ptr;
1670        secondOldOffset = secondOffset;
1671        pftmp = tmp->lastField;
1672        cpt=0;
1673        (*myPtrs->currentFlowsetNumberPtr)++; /* pointer on the flows number */
1674        if (((*myPtrs->offsetV9Ptr)-48-shift+flow_size) > data_length){
1675          overflow = 1; /* buffer index not correct */
1676        }
1677      } else {
1678        /* not the flow end, progress in field list */
1679        pftmp = pftmp->prev;
1680      }
1681    } /* end of the while on one flow record */
1682
1683    while ( ((*myPtrs->offsetV9Ptr)-48-shift) < data_length ) {
1684      (*myPtrs->offsetV9Ptr)++; /* if padding */
1685      paddingCounter++;
1686#ifdef DEBUG
1687        fprintf(stderr,", pC: %d ", paddingCounter);
1688#endif
1689      if ( paddingCounter > 8 ) {
1690        syslog(LOG_INFO,"padding too high: %d ", paddingCounter);
1691#ifdef DEBUG
1692        fprintf(stderr,", pC: %d <--| ", paddingCounter);
1693#endif
1694        return (-1);
1695      }
1696    }
1697    while ( (*myPtrs->offsetV9Ptr)-48-shift > data_length ) {
1698      (*myPtrs->offsetV9Ptr)--; /* crazy loop (when bug appears in template def) */
1699      crazyCounter++;
1700    }
1701#ifdef DEBUG
1702    if (crazyCounter != 0){ fprintf(stderr," crazyCounter: %d ", crazyCounter); }
1703#endif
1704    if (crazyCounter!=0) { syslog(LOG_INFO,"crazyCounter: %d ", crazyCounter);}
1705
1706#ifdef DEBUG
1707    fprintf(stderr,"(%hu,%hu)}", data_length, data_length+shift);
1708#endif
1709
1710    return (data_length+shift);
1711    /* end new place */
1712
1713  } else {
1714    /*
1715     *
1716     *
1717     *  OPTIONAL TEMPLATE
1718     *
1719     *
1720     */
1721    if ((tmpOpt=existTplOptId(myPtrs->currentRouterPtr, myPtrs->currentHeaderV9Ptr->sourceId,
1722                              (*myPtrs->currentFlowsetIdPtr)))!=NULL) {
1723
1724      myPtrs->currentMIB->optDataFlowSetNb += 1;
1725#ifdef DEBUG
1726      fprintf(stderr,"<d id: %hu, lg %hu", (*myPtrs->currentFlowsetIdPtr), data_length);
1727#endif
1728      for ( i=0; i<(tmpOpt->optionScopeLg/4); i++){
1729        /* FIXME : today we skip the scope fields, it's bad :( */
1730        if ((pftmp=tmpOpt->lastField)!=NULL) {
1731          for (j=0; j<pftmp->fieldLength; j++) {
1732            (*myPtrs->offsetV9Ptr)++;
1733          }
1734          pftmp = pftmp->prev;
1735        }
1736      }
1737      while (pftmp != NULL) {
1738        if (pftmp->fieldLength==1){
1739          buffer1 = *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr)); (*myPtrs->offsetV9Ptr)++;
1740        }
1741        if (pftmp->fieldLength==2){
1742          buffer2[1]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr)); (*myPtrs->offsetV9Ptr)++;
1743          buffer2[0]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr)); (*myPtrs->offsetV9Ptr)++;
1744        }
1745        if (pftmp->fieldLength==4){
1746          buffer4[3]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr)); (*myPtrs->offsetV9Ptr)++;
1747          buffer4[2]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr)); (*myPtrs->offsetV9Ptr)++;
1748          buffer4[1]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr)); (*myPtrs->offsetV9Ptr)++;
1749          buffer4[0]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr)); (*myPtrs->offsetV9Ptr)++;
1750          if (pftmp->fieldType==34||pftmp->fieldType==50){
1751            if ((*((unsigned long*)&buffer4)==1)
1752                || (*((unsigned long*)&buffer4)==10)
1753                || (*((unsigned long*)&buffer4)==20)
1754                || (*((unsigned long*)&buffer4)==100)
1755                || (*((unsigned long*)&buffer4)==1000)) {
1756              if (myPtrs->currentRouterPtr->sampled != *((unsigned long*)&buffer4) ) {
1757#ifdef DEBUGAGG
1758                fprintf(stderr,"\n SV (p) %lu != %lu (r)", *((unsigned long*)&buffer4),
1759                        myPtrs->currentRouterPtr->sampled);
1760#endif
1761                syslog(LOG_INFO,"Sampling value change for router : %lu.%lu.%lu.%lu, old: %lu, new: %lu",
1762                       (myPtrs->pcktPtr->ipH->srcAdd>>24),
1763                       (myPtrs->pcktPtr->ipH->srcAdd<<8>>24),
1764                       (myPtrs->pcktPtr->ipH->srcAdd<<16>>24),
1765                       (myPtrs->pcktPtr->ipH->srcAdd<<24>>24),
1766                       myPtrs->currentRouterPtr->sampled,
1767                       *((unsigned long*)&buffer4)
1768                       );
1769                myPtrs->currentRouterPtr->sampled = *((unsigned long*)&buffer4);
1770              }
1771            }else{
1772              syslog(LOG_INFO,"Sampling value not standard for router : %lu.%lu.%lu.%lu, value : %lu",
1773                     (myPtrs->pcktPtr->ipH->srcAdd>>24),
1774                     (myPtrs->pcktPtr->ipH->srcAdd<<8>>24),
1775                     (myPtrs->pcktPtr->ipH->srcAdd<<16>>24),
1776                     (myPtrs->pcktPtr->ipH->srcAdd<<24>>24),
1777                     *((unsigned long*)&buffer4)
1778                     );
1779            }
1780          }
1781        }
1782        pftmp = pftmp->prev;
1783      }
1784      if ( pftmp == NULL ) {
1785        while ((*myPtrs->offsetV9Ptr)%4 != 0) {
1786          (*myPtrs->offsetV9Ptr)++;
1787#ifdef DEBUG
1788          fprintf(stderr," p ");
1789#endif
1790        }
1791      } else {
1792        fprintf(stderr,"PB ");
1793      }
1794#ifdef DEBUG
1795      fprintf(stderr,">");
1796#endif
1797      myPtrs->currentMIB->realFlowNb += 1;
1798      return (data_length+shift);
1799    } else {
1800      /*
1801       * template unknown, we skip the data
1802       */
1803      (*myPtrs->offsetV9Ptr)+=(data_length-4);
1804      (*myPtrs->currentFlowsetNumberPtr)+= 1 ;
1805      /*      (*myPtrs->currentFlowsetNumberPtr) = myPtrs->currentHeaderV9Ptr->count;*/
1806#ifdef DEBUG
1807      fprintf(stderr, " U, r: %lu.%lu.%lu.%lu, sourceId: %lu, TID: %hu ",
1808              (myPtrs->pcktPtr->ipH->srcAdd>>24),
1809              (myPtrs->pcktPtr->ipH->srcAdd<<8>>24),
1810              (myPtrs->pcktPtr->ipH->srcAdd<<16>>24),
1811              (myPtrs->pcktPtr->ipH->srcAdd<<24>>24),
1812              myPtrs->currentHeaderV9Ptr->sourceId,
1813              (*myPtrs->currentFlowsetIdPtr)
1814              );
1815      fprintf(stderr,"(%hu,%hu) ", data_length, data_length+shift);
1816#endif
1817      return (data_length+shift);
1818    }
1819  }
1820}
Note: See TracBrowser for help on using the browser.