root/trunk/src/dataFlowSet.c @ 113

Revision 113, 47.7 KB (checked in by andreu, 14 years ago)

ticket#27 : new global structure for counters.
some bug correction in renetcol.c

  • Property svn:eol-style set to native
Line 
1/*
2 * File: dataFlowSet.c
3 *
4 * Authors: ANDREU Francois-Xavier
5 *
6 * Copyright (C) 2005 - 2009 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 */
32short 
33checkDataFlowSet(short shift,
34                 struct MyPtrs *myPtrs,
35                 int myQueue,
36                 struct PrefixV4 *V4PTab,
37                 size_t nbPV4,
38                 struct PrefixV4 *V4STab,
39                 size_t nbSV4
40                 )
41{
42  TplFlowSetPtr tmp = NULL;
43  TplOptionPtr tmpOpt = NULL;
44  FieldPtr pftmp = NULL;
45  FieldPtr secondPftmp = NULL;
46  unsigned short data_length = 0;
47  unsigned short flow_size = 0;
48  unsigned short oldOffset = *myPtrs->offsetV9Ptr;
49  unsigned short secondOffset = 0;
50  unsigned short secondOldOffset = 0;
51  int moreIsNecessary = 1;
52  int field_size = 0;
53  int cpt = 0;
54  int secondCpt = 0;
55  int overflow = 0;
56  int noEnd = 1;
57  int i = 0;
58  int j = 0;
59  int pos = 0;
60  unsigned char buffer1; 
61  unsigned char buffer2[2];
62  unsigned char buffer4[4];
63  RulesPtr tmpRuleList = myPtrs->rulesListPtr;
64  RulesPtr tmpRL = myPtrs->rulesListPtr;
65  msgType myMsg;
66  char *msgTextIndex;
67
68  unsigned short tplMsgType = 11;
69  struct PrefixV4 prefixKey, *res, *res2, *resSub; /* for bsearch */
70#if defined(IPV4AGGIDSNMP)
71  struct PrefixV4 *res3;
72#endif
73#ifdef ASACC
74  struct AS asKey, *asres; /* for bsearch */
75#endif
76  struct AggCache agCache;
77  int bool = 0; /* in IPV4 Agg mode enabled, we need to now if it's an IPv4 */
78  int isIPv6 = 0;
79  /* flow, we test on the field and then put bool at 1 */
80  int isMplsFlow = 0;
81  int paddingCounter = 0;
82  int crazyCounter = 0;
83#ifdef DEBUG
84  int flowCpt = 0;
85#endif
86
87  buffer2[1] = *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
88  (*myPtrs->offsetV9Ptr)++;
89  buffer2[0] = *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
90  (*myPtrs->offsetV9Ptr)++;
91  (*myPtrs->currentFlowsetIdPtr) = *((unsigned short*)&buffer2);
92  buffer2[1] = *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
93  (*myPtrs->offsetV9Ptr)++;
94  buffer2[0] = *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
95  (*myPtrs->offsetV9Ptr)++;
96  data_length = *((unsigned short*)&buffer2);
97  if (data_length == 0) {
98#ifdef DEBUG   
99    fprintf (stderr, " dlg==0 <--| ");
100#endif
101/*     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", */
102/*         (*myPtrs->currentFlowsetIdPtr), */
103/*         (myPtrs->pcktPtr->ipH->srcAdd>>24), */
104/*         (myPtrs->pcktPtr->ipH->srcAdd<<8>>24), */
105/*         (myPtrs->pcktPtr->ipH->srcAdd<<16>>24), */
106/*         (myPtrs->pcktPtr->ipH->srcAdd<<24>>24)); */
107    return (-1);
108
109  }
110
111  if ( (tmp=existTplId(myPtrs->currentRouterPtr,
112                       myPtrs->currentHeaderV9Ptr->sourceId,
113                       (*myPtrs->currentFlowsetIdPtr)))!=NULL ) {
114    myPtrs->currentMIB->dataFlowSetNb += 1;
115#ifdef DEBUG
116    fprintf(stderr,
117            "{d id: %hu, lg %hu",
118            (*myPtrs->currentFlowsetIdPtr),
119            data_length);
120    if ( (*myPtrs->currentFlowsetIdPtr) > TRESHOLD_TEMPLATE_ID ) {
121        fprintf(stderr,"Bad TID from router: %lu.%lu.%lu.%lu\n",
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        fprintf(stderr," Bytes : \n");
128        while ( ( myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr) ) > (myPtrs->ptr_buffer+1416) ){
129          buffer1= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));(*myPtrs->offsetV9Ptr)++;
130          tmp = *((unsigned char*)&buffer1);
131          fprintf (stderr, " %s ", tmp);
132        }
133        exit(-1);
134      return (data_length+shift);
135    }
136#endif
137    pftmp = tmp->lastField;
138    for (; pftmp; pftmp = pftmp->prev) {
139      flow_size += pftmp->fieldLength;
140    }
141    if ( data_length%flow_size >= 9 ) {
142      (*myPtrs->currentFlowsetNumberPtr) = myPtrs->currentHeaderV9Ptr->count;
143      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",
144             myPtrs->currentHeaderV9Ptr->sourceId,
145             (*myPtrs->currentFlowsetIdPtr),
146             (myPtrs->pcktPtr->ipH->srcAdd>>24),
147             (myPtrs->pcktPtr->ipH->srcAdd<<8>>24),
148             (myPtrs->pcktPtr->ipH->srcAdd<<16>>24),
149             (myPtrs->pcktPtr->ipH->srcAdd<<24>>24));
150#ifdef DEBUG   
151    fprintf (stderr, " dlg%flsz >=9 skip data ");
152#endif
153      return (data_length+shift);
154    }
155    if ( data_length >= 1452 ) {
156      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",
157             (*myPtrs->currentFlowsetIdPtr),
158             (myPtrs->pcktPtr->ipH->srcAdd>>24),
159             (myPtrs->pcktPtr->ipH->srcAdd<<8>>24),
160             (myPtrs->pcktPtr->ipH->srcAdd<<16>>24),
161             (myPtrs->pcktPtr->ipH->srcAdd<<24>>24));
162#ifdef DEBUG   
163    fprintf (stderr, " dlg >= 1452 skip pckt ");
164#endif
165      return (-1);
166    }
167#if defined(IPV4AGGIDR) || defined(IPV4AGGIDSNMP)
168    agCache.routerAd = myPtrs->pcktPtr->ipH->srcAdd;
169#endif
170
171    pftmp = tmp->lastField;
172    secondPftmp = tmp->lastField;   
173    secondOffset = *myPtrs->offsetV9Ptr;
174    secondOldOffset = secondOffset;
175    while ( (((*myPtrs->offsetV9Ptr)-48-shift) <= data_length)
176            && (overflow!=1) ) {
177      /*
178       * progression in a data flow Set
179       * notes:
180       *   48= IP header size + NetFlow header size
181       *   shift = shift because we have a template declaration
182       *           inside data templates
183       */
184      cpt++;
185      j = 0;
186      pos = (pftmp->fieldType)*MAX_RULES_PER_FIELD+j;
187      field_size = (int) pftmp->fieldLength;
188
189      /* special case: check yes on all flows from one router */
190      /* (phantom field nb 0) */
191      /* FIXME : this code is repeated, perhaps past before */
192      while ( ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+j))) != NULL ) {
193        if ( (((RuleDefPtr)(*(myPtrs->rulesAddressPtr+j)))->value->stor.lvalue)
194             == myPtrs->pcktPtr->ipH->srcAdd )
195          {
196            ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+j)))->check = 1;
197          }     
198        j++;
199      }   
200      j = 0;
201
202      /*
203       * Comparaison between the field value and the rules
204       * ... if one rule exist
205       * FIXME : warning, if no rules, no accounting ?
206       */
207      if (((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos))) != NULL) {
208        oldOffset = *myPtrs->offsetV9Ptr;
209        while (((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos))) != NULL){
210          /*
211           * while on one cache table line
212           */
213          *myPtrs->offsetV9Ptr = oldOffset;
214          switch ((int)
215                  (((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->operator)){
216          case 2:
217            /* operator: "=" */ 
218            switch (field_size) {
219            case 1:
220              buffer1 = *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
221              (*myPtrs->offsetV9Ptr)++;
222              /* rule check */
223              if (((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->stor.cvalue
224                  == *((unsigned char*)&buffer1)) {
225                ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check = 1;
226              }
227              /* end rule check */
228#if defined(IPV4AGGIDR) || defined(IPV4AGGIDSNMP)
229              if ((pftmp->fieldType==9)||(pftmp->fieldType==29)){
230                agCache.maskS = *((unsigned char*)&buffer1);
231              }
232              if ((pftmp->fieldType==13)||(pftmp->fieldType==30)){
233                agCache.maskD = *((unsigned char*)&buffer1);
234              }
235              if (pftmp->fieldType==60){
236                agCache.ipProt = *((unsigned char*)&buffer1);
237              }
238              if (pftmp->fieldType==4){
239                agCache.tProt = *((unsigned char*)&buffer1);
240              }
241              if (pftmp->fieldType==61){
242                agCache.sens = *((unsigned char*)&buffer1);
243              }
244              if (pftmp->fieldType==5){
245                agCache.dscp = *((unsigned char*)&buffer1);
246              }
247#endif       
248              break;
249            case 2:
250              buffer2[1]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
251              (*myPtrs->offsetV9Ptr)++;
252              buffer2[0]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
253              (*myPtrs->offsetV9Ptr)++;
254              if (((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->stor.svalue
255                  == *((unsigned short*)&buffer2))
256                ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check = 1;
257#if defined(IPV4AGGIDR) || defined(IPV4AGGIDSNMP)
258              if (pftmp->fieldType==10){
259                agCache.inputSnmp = *((unsigned short*)&buffer2);
260              }
261              if (pftmp->fieldType==14){
262                agCache.outputSnmp = *((unsigned short*)&buffer2);
263              }
264#endif
265#ifdef ASACC
266              if (pftmp->fieldType==16){
267                agCache.asS = *((unsigned short*)&buffer2);
268              }   
269              if (pftmp->fieldType==17){
270                agCache.asD = *((unsigned short*)&buffer2);
271              }
272#endif
273              break;
274            case 3:
275              buffer4[3]= 0;
276              buffer4[2]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
277              (*myPtrs->offsetV9Ptr)++;
278              buffer4[1]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
279              (*myPtrs->offsetV9Ptr)++;
280              buffer4[0]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
281              (*myPtrs->offsetV9Ptr)++;
282              if (((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->stor.lvalue
283                  == *((unsigned long*)&buffer4))
284                ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check = 1;
285              /* aggregation */
286              /* end aggregation */
287              if (pftmp->fieldType==70){
288                isMplsFlow = 1;
289              }
290              break;
291            case 4:
292              buffer4[3]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
293              (*myPtrs->offsetV9Ptr)++;
294              buffer4[2]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
295              (*myPtrs->offsetV9Ptr)++;
296              buffer4[1]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
297              (*myPtrs->offsetV9Ptr)++;
298              buffer4[0]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
299              (*myPtrs->offsetV9Ptr)++;
300              /* FIXME : here , add a check on the field type */
301              if ((pftmp->fieldType==8)||(pftmp->fieldType==12)
302                  ||(pftmp->fieldType==15)||(pftmp->fieldType==18)){
303                if ((((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->stor.lvalue)
304                    == (*((unsigned long*)&buffer4))>>(32-((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->mask)<<(32-((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->mask) )
305                  {
306                    ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check = 1;
307                  }
308              }
309              if ((pftmp->fieldType==10)||(pftmp->fieldType==14)){
310                if ((((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->stor.svalue)
311                    == ((unsigned short)*((unsigned long*)&buffer4)))
312                  {
313                    ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check = 1;
314                  }
315              }
316              if ((pftmp->fieldType==16)||(pftmp->fieldType==17)){
317                if ((((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->stor.svalue)
318                    == ((unsigned short)*((unsigned long*)&buffer4)))
319                  {
320                    ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check = 1;
321                  }
322              }
323              if (pftmp->fieldType==1){
324                agCache.bytes = *((unsigned long*)&buffer4);
325                if (
326                    ((unsigned long)((((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->stor.lvalue) + ( (((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->stor.lvalue)*10/100))
327                     >= (*((unsigned long*)&buffer4)))
328                    &&
329                    ( (unsigned long)((((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->stor.lvalue) - ( (((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->stor.lvalue)*10/100))
330                      <= (*((unsigned long*)&buffer4)) )
331                    )
332                  {
333                    ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check = 1;
334                  }
335              }
336#if defined(IPV4AGGIDR) || defined(IPV4AGGIDSNMP)
337              if (pftmp->fieldType==10){
338                agCache.inputSnmp = (unsigned short)*((unsigned long*)&buffer4);
339              }
340              if (pftmp->fieldType==14){
341                agCache.outputSnmp = (unsigned short)*((unsigned long*)&buffer4);
342              }
343              if ((pftmp->fieldType==8)){
344                bool = 1; /* very important, test if we have an IPv4 flow for Agg */
345                agCache.v4AdS = *((unsigned long*)&buffer4);
346              }
347              if ((pftmp->fieldType==12)){
348                agCache.v4AdD = *((unsigned long*)&buffer4);
349              }
350              if (pftmp->fieldType==1){
351                agCache.bytes = *((unsigned long*)&buffer4);
352              }
353              if (pftmp->fieldType==2){
354                agCache.pkts = *((unsigned long*)&buffer4);
355              }
356#endif
357#ifdef ASACC
358              if (pftmp->fieldType==16){
359                agCache.asS = (unsigned short)*((unsigned long*)&buffer4);
360              }   
361              if (pftmp->fieldType==17){
362                agCache.asD = (unsigned short)*((unsigned long*)&buffer4);
363              }
364#endif
365              break;
366            case 16:
367              if ((pftmp->fieldType==27)||(pftmp->fieldType==28)){
368                isIPv6 = 1;
369                for (i=0; i<4; i++) {
370                  buffer4[3]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
371                  (*myPtrs->offsetV9Ptr)++;
372                  buffer4[2]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
373                  (*myPtrs->offsetV9Ptr)++;
374                  buffer4[1]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
375                  (*myPtrs->offsetV9Ptr)++;
376                  buffer4[0]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
377                  (*myPtrs->offsetV9Ptr)++;
378                  if (1==moreIsNecessary){
379                    switch(i){
380                    case 0:
381                      if (((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->mask <= 32){
382                        if (ntohl(((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->stor.tabAdd6[i])
383                            ==
384                            (*((unsigned long*)&buffer4))>>(32-((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->mask)<<(32-((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->mask)
385                            )
386                          {
387                            ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check = 1;
388                            moreIsNecessary = 0;
389                          } else {
390                          ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check = 0;
391                          moreIsNecessary = 0;
392                        }
393                      } else {
394                        if (ntohl(((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->stor.tabAdd6[i])
395                            ==
396                            (*((unsigned long*)&buffer4))
397                            )
398                          {
399                            ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check = 1;
400                          } else {
401                          ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check = 0;
402                          moreIsNecessary = 0;
403                        }
404                      }
405                      break;
406                    case 1:
407                      if (((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->mask <= 64){
408                        if (ntohl(((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->stor.tabAdd6[i])
409                            ==
410                            (*((unsigned long*)&buffer4))>>(64-((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->mask)<<(64-((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->mask)
411                            )
412                          {
413                            ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check =
414                              ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check && 1;
415                            moreIsNecessary = 0;
416                          } else {
417                          ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check = 0;
418                          moreIsNecessary = 0;
419                        }
420                      } else {
421                        if (ntohl(((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->stor.tabAdd6[i])
422                            ==
423                            (*((unsigned long*)&buffer4))
424                            )
425                          {
426                            ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check =
427                              ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check && 1;
428                          } else {
429                          ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check = 0;
430                          moreIsNecessary = 0;
431                        }
432                      }
433                      break;
434                    case 2:
435                      if (((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->mask <= 96){
436                        if (ntohl(((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->stor.tabAdd6[i])
437                            ==
438                            (*((unsigned long*)&buffer4))>>(96-((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->mask)<<(96-((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->mask)
439                            )
440                          {
441                            ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check =
442                              ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check && 1;
443                            moreIsNecessary = 0;
444                          } else {
445                          ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check = 0;
446                        moreIsNecessary = 0;
447                        }
448                      } else {
449                        if (ntohl(((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->stor.tabAdd6[i])
450                            ==
451                            (*((unsigned long*)&buffer4))
452                            )
453                          {
454                            ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check =
455                              ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check && 1;
456                          } else {
457                          ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check = 0;
458                          moreIsNecessary = 0;
459                        }
460                      }
461                      break;
462                    case 3:
463                      if (((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->mask <= 128){
464                        if (ntohl(((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->stor.tabAdd6[i])
465                            ==
466                            (*((unsigned long*)&buffer4))>>(128-((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->mask)<<(128-((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->mask)
467                            )
468                          {
469                            ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check =
470                              ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check && 1;
471                          } else {
472                          ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check = 0;
473                          moreIsNecessary = 0;
474                        }
475                      } else {
476                        if (ntohl(((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->stor.tabAdd6[i])
477                            ==
478                            (*((unsigned long*)&buffer4))
479                            )
480                          {
481                            ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check =
482                              ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check && 1;
483                          } else {
484                          ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check = 0;
485                          moreIsNecessary = 0;
486                        }
487                      }
488                      break;
489                    default:
490                      break;
491                    } /* end of switch(i) */
492                  } /* end of if moreIsNecessary */
493#if defined IPV6AGGIDSNMP
494                  if ((pftmp->fieldType==27)){
495                    agCache.tabAdd6S[i] = *((unsigned long*)&buffer4);
496                  } else if ((pftmp->fieldType==28)){
497                    agCache.tabAdd6D[i] = *((unsigned long*)&buffer4);
498                  }
499#endif
500                }
501                moreIsNecessary = 1;
502                /* aggregation for IPv6 flows */
503               
504                /* end aggregation */
505              } /* end of : if ((pftmp->fieldType==27)||(pftmp->fieldType==28)){ */
506              break;
507            default:
508              syslog(LOG_INFO, "Field size not known: %d\n", field_size);
509              for (i=0; i<field_size; i++){
510                (*myPtrs->offsetV9Ptr)++;
511              }
512              break;
513            }
514            break;
515          default:
516            syslog(LOG_INFO, "Operator not known: %d\n",
517                   (int)(((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->operator));
518            break;
519          }
520          j++;
521          pos = (pftmp->fieldType)*MAX_RULES_PER_FIELD+j;
522        } /* end while myPtrs->rulesAddressPtr */
523      } else {
524        /*
525         * no rule within this field type, but we must read the value
526         */
527        switch (field_size) {
528        case 1:
529          buffer1 = *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
530          (*myPtrs->offsetV9Ptr)++;
531#if defined(IPV4AGGIDR) || defined(IPV4AGGIDSNMP)
532          if ((pftmp->fieldType==9)||(pftmp->fieldType==29)){
533            agCache.maskS = *((unsigned char*)&buffer1);
534          }
535          if ((pftmp->fieldType==13)||(pftmp->fieldType==30)){
536            agCache.maskD = *((unsigned char*)&buffer1);
537          }
538          if (pftmp->fieldType==60){
539            agCache.ipProt = *((unsigned char*)&buffer1);
540          }
541          if (pftmp->fieldType==4){
542            agCache.tProt = *((unsigned char*)&buffer1);
543          }
544          if (pftmp->fieldType==61){
545            agCache.sens = *((unsigned char*)&buffer1);
546          }
547          if (pftmp->fieldType==5){
548            agCache.dscp = *((unsigned char*)&buffer1);
549          }       
550#endif
551          break;
552        case 2:
553          buffer2[1]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
554          (*myPtrs->offsetV9Ptr)++;
555          buffer2[0]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
556          (*myPtrs->offsetV9Ptr)++;
557#if defined(IPV4AGGIDR) || defined(IPV4AGGIDSNMP)
558          if (pftmp->fieldType==10){
559            agCache.inputSnmp = *((unsigned short*)&buffer2);
560          }       
561          if (pftmp->fieldType==14){
562            agCache.outputSnmp = *((unsigned short*)&buffer2);
563          }       
564#endif
565#ifdef ASACC
566          if (pftmp->fieldType==16){
567            agCache.asS = *((unsigned short*)&buffer2);
568          }       
569          if (pftmp->fieldType==17){
570            agCache.asD = *((unsigned short*)&buffer2);
571          }
572#endif
573          break;
574        case 3:
575          buffer4[3]= 0;
576          buffer4[2]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
577          (*myPtrs->offsetV9Ptr)++;
578          buffer4[1]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
579          (*myPtrs->offsetV9Ptr)++;
580          buffer4[0]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
581          (*myPtrs->offsetV9Ptr)++;
582          /* aggregation */
583          /* end aggregation */
584          if (pftmp->fieldType==70){
585            isMplsFlow = 1;
586          }
587          break;
588        case 4:
589          buffer4[3]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
590          (*myPtrs->offsetV9Ptr)++;
591          buffer4[2]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
592          (*myPtrs->offsetV9Ptr)++;
593          buffer4[1]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
594          (*myPtrs->offsetV9Ptr)++;
595          buffer4[0]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
596          (*myPtrs->offsetV9Ptr)++;
597#if defined(IPV4AGGIDR) || defined(IPV4AGGIDSNMP)
598          if (pftmp->fieldType==10){
599            agCache.inputSnmp = (unsigned short)*((unsigned long*)&buffer4);
600          }
601          if (pftmp->fieldType==14){
602            agCache.outputSnmp = (unsigned short)*((unsigned long*)&buffer4);
603          }
604          if ((pftmp->fieldType==8)){
605            bool = 1;
606            agCache.v4AdS = *((unsigned long*)&buffer4);
607          } else if ((pftmp->fieldType==12)){
608            agCache.v4AdD = *((unsigned long*)&buffer4);
609          } else if (pftmp->fieldType==1){
610            agCache.bytes = *((unsigned long*)&buffer4);
611          } else if (pftmp->fieldType==2){
612            agCache.pkts = *((unsigned long*)&buffer4);
613          }
614#endif
615#ifdef ASACC
616          if (pftmp->fieldType==16){
617            agCache.asS = (unsigned short)*((unsigned long*)&buffer4);
618          }       
619          if (pftmp->fieldType==17){
620            agCache.asD = (unsigned short)*((unsigned long*)&buffer4);
621          }
622#endif
623          break;
624        case 16:
625          if ((pftmp->fieldType==27)||(pftmp->fieldType==28)){
626            isIPv6 = 1;
627          }
628          for (i=0; i<4; i++) {
629            buffer4[3]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
630            (*myPtrs->offsetV9Ptr)++;
631            buffer4[2]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
632            (*myPtrs->offsetV9Ptr)++;
633            buffer4[1]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
634            (*myPtrs->offsetV9Ptr)++;
635            buffer4[0]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
636            (*myPtrs->offsetV9Ptr)++;
637#if defined IPV6AGGIDSNMP
638            if ((pftmp->fieldType==27)){
639              agCache.tabAdd6S[i] = *((unsigned long*)&buffer4);
640            } else if ((pftmp->fieldType==28)){
641              agCache.tabAdd6D[i] = *((unsigned long*)&buffer4);
642            }
643#endif
644          }
645          break;
646        default:
647          syslog(LOG_INFO,"UNKNOWN FIELDS LENGTH: %d ", field_size);
648          for (i=0; i<field_size; i++){
649            (*myPtrs->offsetV9Ptr)++;
650          }
651        }
652      } /* end if one cache table line existence */
653      if (cpt==tmp->fieldCount) {
654        /*
655         * end of one flow (not the flowset)
656         */
657        myPtrs->currentMIB->realFlowNb += 1;
658#ifdef DEBUG
659        flowCpt++;
660        fprintf(stderr," F%d ", flowCpt);
661#endif 
662        /* put aggregation cache information to IPv4 Prefixes table */
663        /* Aggregation mode must be enable in ./configure options   */
664        /* first we must know if the address belong to our prefix   */
665        /*
666         * AS ACCOUNTING
667         */
668#if defined(ASACC) && defined(IPV4AGGIDSNMP)
669        if ( (bool == 1) && (isMplsFlow == 0) ){
670          asKey.as = agCache.asS;
671          asres = bsearch(&asKey, myPtrs->currentASTab, myPtrs->asNb, sizeof(struct AS), asGlobalCmp);
672          if (asres != NULL) {
673            if ( myPtrs->currentRouterPtr->snmpIndexList[agCache.inputSnmp] == 1  ) {
674#if defined(MULTISAMPLING)
675              if (myPtrs->currentRouterPtr->sampled != asres->sampling ){
676                /* OUT ("traffic from the AS")  */
677                asres->bytesNbOUT += agCache.bytes*myPtrs->currentRouterPtr->sampled/asres->sampling;
678                asres->pktsNbOUT += agCache.pkts*myPtrs->currentRouterPtr->sampled/asres->sampling;
679              }else{
680                asres->bytesNbOUT += agCache.bytes;
681                asres->pktsNbOUT += agCache.pkts;
682                (asres->flowNbOUT)++;
683              }
684#else
685              if (myPtrs->currentRouterPtr->sampled != 0 ){
686                /* OUT ("traffic from the AS")  */
687                asres->bytesNbOUT += agCache.bytes;
688                asres->pktsNbOUT += agCache.pkts;
689                (asres->flowNbOUT)++;
690              }
691              if (asres->sampling == 0
692                  && myPtrs->currentRouterPtr->sampled != 0){
693                asres->sampling = myPtrs->currentRouterPtr->sampled;
694              }
695#endif
696              asres = NULL;
697              asKey.as = agCache.asD;
698              asres = bsearch(&asKey, myPtrs->currentASTab, myPtrs->asNb, sizeof(struct AS), asGlobalCmp);
699              if (asres!=NULL){
700#if defined(MULTISAMPLING)
701                if (myPtrs->currentRouterPtr->sampled != asres->sampling ){
702                  /* IN ("traffic to the AS")  */
703                  asres->bytesNbIN += agCache.bytes*myPtrs->currentRouterPtr->sampled/asres->sampling;
704                  asres->pktsNbIN += agCache.pkts*myPtrs->currentRouterPtr->sampled/asres->sampling;
705                }else{
706                  asres->bytesNbIN += agCache.bytes;
707                  asres->pktsNbIN += agCache.pkts;
708                  (asres->flowNbIN)++;
709                }
710#else
711                if (myPtrs->currentRouterPtr->sampled != 0 ){
712                  /* IN ("traffic to the AS")  */
713                  asres->bytesNbIN += agCache.bytes;
714                  asres->pktsNbIN += agCache.pkts;
715                  (asres->flowNbIN)++;
716                }
717                if (asres->sampling == 0
718                    && myPtrs->currentRouterPtr->sampled != 0){
719                  asres->sampling = myPtrs->currentRouterPtr->sampled;
720                }
721#endif
722                asres = NULL;
723              }
724            }
725          } else {
726            asres = NULL;
727            asKey.as = agCache.asD;
728            asres = bsearch(&asKey, myPtrs->currentASTab, myPtrs->asNb, sizeof(struct AS), asGlobalCmp);
729            if (asres!=NULL){
730              if ( myPtrs->currentRouterPtr->snmpIndexList[agCache.inputSnmp] == 1  ) {
731#if defined(MULTISAMPLING)
732                if (myPtrs->currentRouterPtr->sampled != asres->sampling ){
733                  /* IN ("traffic to the AS")  */
734                  asres->bytesNbIN += agCache.bytes*myPtrs->currentRouterPtr->sampled/asres->sampling;
735                  asres->pktsNbIN += agCache.pkts*myPtrs->currentRouterPtr->sampled/asres->sampling;
736                }else{
737                  asres->bytesNbIN += agCache.bytes;
738                  asres->pktsNbIN += agCache.pkts;
739                  (asres->flowNbIN)++;
740                }
741#else
742                if (myPtrs->currentRouterPtr->sampled != 0 ){
743                  /* IN ("traffic to the AS")  */
744                  asres->bytesNbIN += agCache.bytes;
745                  asres->pktsNbIN += agCache.pkts;
746                  (asres->flowNbIN)++;
747                }
748                if (asres->sampling == 0
749                    && myPtrs->currentRouterPtr->sampled != 0){
750                  asres->sampling = myPtrs->currentRouterPtr->sampled;
751                }
752#endif
753              }
754            }
755          }
756        }
757#endif
758        /*
759         * PREFIX &/or MATRIX ACCOUNTING
760         */
761#if defined(IPV4AGGIDR) || defined(IPV4AGGIDSNMP)
762        if ( (bool == 1) && (isMplsFlow == 0) ){
763          prefixKey.beginning = agCache.v4AdS>>(32-agCache.maskS)<<(32-agCache.maskS);
764          res = bsearch(&prefixKey, V4PTab, nbPV4,
765                        sizeof(struct PrefixV4), prefGlobalCmp);
766          if (res!=NULL){
767            /* WE HAVE FOUND SOURCE ADDRESS IN OUR LIST */
768            if (res->hasSubnet == 1) {
769              resSub = NULL;
770              resSub = bsearch(&prefixKey, V4STab, nbSV4,
771                               sizeof(struct PrefixV4), prefGlobalCmp);
772              if (resSub != NULL) {
773                res = resSub;
774                resSub = NULL;
775              }
776            }
777#ifdef DEBUG
778            fprintf(stderr,"S %lu.%lu.%lu.%lu/%hu %lu.%lu.%lu.%lu/%hu Rs %lu Ps %lu SNMPin(hu) %hu\n",
779                    (agCache.v4AdS>>24),
780                    (agCache.v4AdS<<8>>24),
781                    (agCache.v4AdS<<16>>24),
782                    (agCache.v4AdS<<24>>24),
783                    (agCache.maskS),
784                    (agCache.v4AdD>>24),
785                    (agCache.v4AdD<<8>>24),
786                    (agCache.v4AdD<<16>>24),
787                    (agCache.v4AdD<<24>>24),
788                    (agCache.maskD),
789                    myPtrs->currentRouterPtr->sampled,
790                    res->sampling,
791                    agCache.inputSnmp);
792#endif
793#if defined(IPV4AGGIDR)
794            if ( myPtrs->routersID[res->routerNb] == agCache.routerAd  ) {
795#elif defined(IPV4AGGIDSNMP)
796              if ( myPtrs->currentRouterPtr->snmpIndexList[agCache.inputSnmp] == 1  ) {       
797#endif
798                /* OUT ("traffic from the prefix/subnet")  */
799#if defined(MULTISAMPLING)
800                if (myPtrs->currentRouterPtr->sampled != res->sampling ){
801                  res->bytesNbOUT += agCache.bytes*myPtrs->currentRouterPtr->sampled/res->sampling;
802                  res->pktsNbOUT += agCache.pkts*myPtrs->currentRouterPtr->sampled/res->sampling;
803                  /* (res->flowNbOUT)++; FIXME : FIND SOMETHING*/
804                  if (agCache.dscp>>2 == FIRST_CoS) {
805                    res->firstCoSOUT += agCache.bytes*myPtrs->currentRouterPtr->sampled/res->sampling;
806                  } else if (agCache.dscp>>2 == SECOND_CoS) {
807                    res->secondCoSOUT += agCache.bytes*myPtrs->currentRouterPtr->sampled/res->sampling;
808                  } else if (agCache.dscp>>2 == THIRD_CoS) {
809                    res->thirdCoSOUT += agCache.bytes*myPtrs->currentRouterPtr->sampled/res->sampling;
810                  } else {
811                    res->fourthCoSOUT += agCache.bytes*myPtrs->currentRouterPtr->sampled/res->sampling;
812                  }
813                }else{
814                  res->bytesNbOUT += agCache.bytes;
815                  res->pktsNbOUT += agCache.pkts;
816                  (res->flowNbOUT)++;
817                  if (agCache.dscp>>2 == FIRST_CoS) {
818                    res->firstCoSOUT += agCache.bytes;
819                  } else if (agCache.dscp>>2 == SECOND_CoS) {
820                    res->secondCoSOUT += agCache.bytes;
821                  } else if (agCache.dscp>>2 == THIRD_CoS) {
822                    res->thirdCoSOUT += agCache.bytes;
823                  } else {
824                    res->fourthCoSOUT += agCache.bytes;
825                  }
826                }
827#else
828                if (myPtrs->currentRouterPtr->sampled != 0 ){
829                  res->bytesNbOUT += agCache.bytes;
830                  res->pktsNbOUT += agCache.pkts;
831                  (res->flowNbOUT)++;
832                  if (agCache.dscp>>2 == FIRST_CoS) {
833                    res->firstCoSOUT += agCache.bytes;
834                  } else if (agCache.dscp>>2 == SECOND_CoS) {
835                    res->secondCoSOUT += agCache.bytes;
836                  } else if (agCache.dscp>>2 == THIRD_CoS) {
837                    res->thirdCoSOUT += agCache.bytes;
838                  } else {
839                    res->fourthCoSOUT += agCache.bytes;
840                  }
841                }
842                if (res->sampling == 0
843                    && myPtrs->currentRouterPtr->sampled != 0){
844                  res->sampling = myPtrs->currentRouterPtr->sampled;
845                }
846#endif
847#if defined(IPV4AGGIDSNMP)
848                prefixKey.beginning = agCache.v4AdD>>(32-agCache.maskD)<<(32-agCache.maskD);
849                res3 = bsearch(&prefixKey, V4PTab, nbPV4,
850                               sizeof(struct PrefixV4), prefGlobalCmp);
851                if (res3!=NULL){
852                  /* res is supernet or subnet ? */
853                  if (res3->hasSubnet == 1) {
854                    resSub = NULL;
855                    resSub = bsearch(&prefixKey, V4STab, nbSV4,
856                                     sizeof(struct PrefixV4), prefGlobalCmp);
857                    if (resSub != NULL) {
858                      res3 = resSub;
859                      resSub = NULL;
860                    }
861                  }
862#ifdef DEBUG
863            fprintf(stderr,"S&D %lu.%lu.%lu.%lu/%hu %lu.%lu.%lu.%lu/%hu Rs %lu Ps %lu SNMPin %hu\n",
864                    (agCache.v4AdS>>24),
865                    (agCache.v4AdS<<8>>24),
866                    (agCache.v4AdS<<16>>24),
867                    (agCache.v4AdS<<24>>24),
868                    (agCache.maskS),
869                    (agCache.v4AdD>>24),
870                    (agCache.v4AdD<<8>>24),
871                    (agCache.v4AdD<<16>>24),
872                    (agCache.v4AdD<<24>>24),
873                    (agCache.maskD),
874                    myPtrs->currentRouterPtr->sampled,
875                    res3->sampling,
876                    agCache.inputSnmp);
877#endif
878#if defined(MULTISAMPLING)
879                  if (myPtrs->currentRouterPtr->sampled != res3->sampling ){
880                    res3->bytesNbIN += agCache.bytes*myPtrs->currentRouterPtr->sampled/res3->sampling;
881                    res3->pktsNbIN += agCache.pkts*myPtrs->currentRouterPtr->sampled/res3->sampling;
882                    /* (res3->flowNbIN)++;  FIXME : FIND SOMETHING */
883                    if (agCache.dscp>>2 == FIRST_CoS) {
884                      res3->firstCoSIN += agCache.bytes*myPtrs->currentRouterPtr->sampled/res3->sampling;
885                    } else if (agCache.dscp>>2 == SECOND_CoS) {
886                      res3->secondCoSIN += agCache.bytes*myPtrs->currentRouterPtr->sampled/res3->sampling;
887                    } else if (agCache.dscp>>2 == THIRD_CoS) {
888                      res3->thirdCoSIN += agCache.bytes*myPtrs->currentRouterPtr->sampled/res3->sampling;
889                    } else {
890                      res3->fourthCoSIN += agCache.bytes*myPtrs->currentRouterPtr->sampled/res3->sampling;
891                    }
892                  }else{
893                    res3->bytesNbIN += agCache.bytes;
894                    res3->pktsNbIN += agCache.pkts;
895                    (res3->flowNbIN)++;
896                    if (agCache.dscp>>2 == FIRST_CoS) {
897                      res3->firstCoSIN += agCache.bytes;
898                    } else if (agCache.dscp>>2 == SECOND_CoS) {
899                      res3->secondCoSIN += agCache.bytes;
900                    } else if (agCache.dscp>>2 == THIRD_CoS) {
901                      res3->thirdCoSIN += agCache.bytes;
902                    } else {
903                      res3->fourthCoSIN += agCache.bytes;
904                    }
905                  }
906#else
907                  if (myPtrs->currentRouterPtr->sampled != 0 ){
908                    /* IN ("traffic to the prefix/subnet")  */
909                    res3->bytesNbIN += agCache.bytes;
910                    res3->pktsNbIN += agCache.pkts;
911                    (res3->flowNbIN)++;
912                    if (agCache.dscp>>2 == FIRST_CoS) {
913                      res3->firstCoSIN += agCache.bytes;
914                    } else if (agCache.dscp>>2 == SECOND_CoS) {
915                      res3->secondCoSIN += agCache.bytes;
916                    } else if (agCache.dscp>>2 == THIRD_CoS) {
917                      res3->thirdCoSIN += agCache.bytes;
918                    } else {
919                      res3->fourthCoSIN += agCache.bytes;
920                    }
921                  }
922                  if (res3->sampling == 0
923                      && myPtrs->currentRouterPtr->sampled != 0){
924                    res3->sampling = myPtrs->currentRouterPtr->sampled;
925                  }
926#endif
927                }
928#endif
929#if defined(MATRIX) && defined(IPV4AGGIDR)
930                /* inter-pop matrix Accounting */
931                prefixKey.beginning = agCache.v4AdD>>(32-agCache.maskD)<<(32-agCache.maskD);
932                res2 = bsearch(&prefixKey, V4PTab, nbPV4,
933                               sizeof(struct PrefixV4), prefGlobalCmp);
934                if (res2!=NULL){               
935                  ((struct POP *)((myPtrs->matrixPOP)
936                                  +((res->routerNb)*ROUTER_INDEX_MAX)
937                                  +((res2->routerNb))))->pktsNb += agCache.pkts;
938                  ((struct POP *)((myPtrs->matrixPOP)
939                                  +((res->routerNb)*ROUTER_INDEX_MAX)
940                                  +((res2->routerNb))))->bytesNb += agCache.bytes;
941                  ((struct POP *)((myPtrs->matrixPOP)
942                                  +((res->routerNb)*ROUTER_INDEX_MAX)
943                                  +((res2->routerNb))))->flowNb++;
944                } else {
945                  (
946                   ((struct POP *)(myPtrs->matrixPOP)
947                    +((res->routerNb)*ROUTER_INDEX_MAX)
948                    +((ROUTER_INDEX_MAX-1))))->pktsNb += agCache.pkts;
949                  (
950                   ((struct POP *)(myPtrs->matrixPOP)
951                    +((res->routerNb)*ROUTER_INDEX_MAX)
952                    +((ROUTER_INDEX_MAX-1))))->bytesNb += agCache.bytes;
953                  (
954                   ((struct POP *)(myPtrs->matrixPOP)
955                    +((res->routerNb)*ROUTER_INDEX_MAX)
956                    +((ROUTER_INDEX_MAX-1))))->flowNb++;
957                }
958                /* end interpop matrix accounting */
959#endif /* matrix */
960              } else {
961                /* doublon or bad reference in prefix list */
962#if defined(IPV4AGGIDR)
963              }
964#elif defined(IPV4AGGIDSNMP)
965            }
966#endif
967          } else { /* SOURCE ADDRESS DOESN'T IN OUR LIST */
968            prefixKey.beginning = agCache.v4AdD>>(32-agCache.maskD)<<(32-agCache.maskD);
969            res = bsearch(&prefixKey, V4PTab, nbPV4,
970                          sizeof(struct PrefixV4), prefGlobalCmp);
971            if (res!=NULL){
972              /* DESTINATION ADDRESS IS IN OUR LIST */
973              if (res->hasSubnet == 1) {
974                resSub = NULL;
975                resSub = bsearch(&prefixKey, V4STab, nbSV4,
976                                 sizeof(struct PrefixV4), prefGlobalCmp);
977                if (resSub != NULL) {
978                  res = resSub;
979                  resSub = NULL;
980                }
981              }
982#ifdef DEBUG
983            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",
984                    (agCache.v4AdS>>24),
985                    (agCache.v4AdS<<8>>24),
986                    (agCache.v4AdS<<16>>24),
987                    (agCache.v4AdS<<24>>24),
988                    (agCache.maskS),
989                    (agCache.v4AdD>>24),
990                    (agCache.v4AdD<<8>>24),
991                    (agCache.v4AdD<<16>>24),
992                    (agCache.v4AdD<<24>>24),
993                    (agCache.maskD),
994                    myPtrs->currentRouterPtr->sampled,
995                    res->sampling,
996                    (myPtrs->pcktPtr->ipH->srcAdd>>24),
997                    (myPtrs->pcktPtr->ipH->srcAdd<<8>>24),
998                    (myPtrs->pcktPtr->ipH->srcAdd<<16>>24),
999                    (myPtrs->pcktPtr->ipH->srcAdd<<24>>24),
1000                    agCache.inputSnmp);
1001#endif
1002#if defined(IPV4AGGIDSNMP)
1003              if ( myPtrs->currentRouterPtr->snmpIndexList[agCache.inputSnmp] == 1  ) {
1004#if defined(MULTISAMPLING)
1005                if (myPtrs->currentRouterPtr->sampled != res->sampling ){
1006                  res->bytesNbIN += agCache.bytes*myPtrs->currentRouterPtr->sampled/res->sampling;
1007                  res->pktsNbIN += agCache.pkts*myPtrs->currentRouterPtr->sampled/res->sampling;
1008                  if (agCache.dscp>>2 == FIRST_CoS) {
1009                    res->firstCoSIN += agCache.bytes*myPtrs->currentRouterPtr->sampled/res->sampling;
1010                  } else if (agCache.dscp>>2 == SECOND_CoS) {
1011                    res->secondCoSIN += agCache.bytes*myPtrs->currentRouterPtr->sampled/res->sampling;
1012                  } else if (agCache.dscp>>2 == THIRD_CoS) {
1013                    res->thirdCoSIN += agCache.bytes*myPtrs->currentRouterPtr->sampled/res->sampling;
1014                  } else {
1015                    res->fourthCoSIN += agCache.bytes*myPtrs->currentRouterPtr->sampled/res->sampling;
1016                  }
1017                }else{
1018                  res->bytesNbIN += agCache.bytes;
1019                  res->pktsNbIN += agCache.pkts;
1020                  (res->flowNbIN)++;
1021                  if (agCache.dscp>>2 == FIRST_CoS) {
1022                    res->firstCoSIN += agCache.bytes;
1023                  } else if (agCache.dscp>>2 == SECOND_CoS) {
1024                    res->secondCoSIN += agCache.bytes;
1025                  } else if (agCache.dscp>>2 == THIRD_CoS) {
1026                    res->thirdCoSIN += agCache.bytes;
1027                  } else {
1028                    res->fourthCoSIN += agCache.bytes;
1029                  }
1030                }
1031#else
1032                if (myPtrs->currentRouterPtr->sampled != 0 ){
1033                  /* IN ("traffic to the prefix/subnet")  */
1034                  res->bytesNbIN += agCache.bytes;
1035                  res->pktsNbIN += agCache.pkts;
1036                  (res->flowNbIN)++;
1037                  if (agCache.dscp>>2 == FIRST_CoS) {
1038                    res->firstCoSIN += agCache.bytes;
1039                  } else if (agCache.dscp>>2 == SECOND_CoS) {
1040                    res->secondCoSIN += agCache.bytes;
1041                  } else if (agCache.dscp>>2 == THIRD_CoS) {
1042                    res->thirdCoSIN += agCache.bytes;
1043                  } else {
1044                    res->fourthCoSIN += agCache.bytes;
1045                  }
1046                }
1047#endif
1048              }
1049#endif
1050#if defined(IPV4AGGIDR)
1051              if ( myPtrs->routersID[res->routerNb] == agCache.routerAd  ) {
1052                if (myPtrs->currentRouterPtr->sampled != 0 ){
1053                  /* IN ("traffic to the prefix")  */
1054                  res->bytesNbIN += agCache.bytes;
1055                  res->pktsNbIN += agCache.pkts;
1056                  (res->flowNbIN)++;
1057                  if (agCache.dscp>>2 == FIRST_CoS) {
1058                    res->firstCoSIN += agCache.bytes;
1059                  } else if (agCache.dscp>>2 == SECOND_CoS) {
1060                    res->secondCoSIN += agCache.bytes;
1061                  } else if (agCache.dscp>>2 == THIRD_CoS) {
1062                    res->thirdCoSIN += agCache.bytes;
1063                  } else {
1064                    res->fourthCoSIN += agCache.bytes;
1065                  }
1066                }
1067              }
1068              if (res->sampling == 0
1069                  && myPtrs->currentRouterPtr->sampled != 0 ){
1070                res->sampling = myPtrs->currentRouterPtr->sampled;
1071              }
1072#endif
1073            } else {
1074              /* UNKNOW SUBNET CASE                                        */
1075              /*                                                           */
1076              /* HERE : we are in the cases of the address/mask don't      */
1077              /*        belong to a prefix listed in the IPv4 prefix file  */
1078              /* possibilities :                                           */
1079              /*     -  prefix not referenced but allowed to be routed     */
1080              /*     -  prefix not referenced but not allowed to be routed */
1081              /*     -  spoofing                                           */
1082#ifdef PRINTUNKNOWNSUBNET 
1083              fprintf(stderr, "%lu.%lu.%lu.%lu/%hu -> %lu.%lu.%lu.%lu/%hu (R:%lu.%lu.%lu.%lu) \n",
1084                      (agCache.v4AdS>>24),
1085                      (agCache.v4AdS<<8>>24),
1086                      (agCache.v4AdS<<16>>24),
1087                      (agCache.v4AdS<<24>>24),
1088                      (agCache.maskS),
1089                      (agCache.v4AdD>>24),
1090                      (agCache.v4AdD<<8>>24),
1091                      (agCache.v4AdD<<16>>24),
1092                      (agCache.v4AdD<<24>>24),
1093                      (agCache.maskD),
1094                      (myPtrs->pcktPtr->ipH->srcAdd>>24),
1095                      (myPtrs->pcktPtr->ipH->srcAdd<<8>>24),
1096                      (myPtrs->pcktPtr->ipH->srcAdd<<16>>24),
1097                      (myPtrs->pcktPtr->ipH->srcAdd<<24>>24)
1098                      );
1099#endif /* PRINTUNKNOWNSUBNET */
1100            }
1101          } /* end of the Destination prefix is in our list */
1102        } /* end of the prefix is in our list */
1103        bool = 0;
1104#endif /* (IPV4AGGIDR) || (IPV4AGGIDSNMP) */
1105#ifdef IPV6LINKAGG
1106        if ( ( isIPv6 == 1 ) && (isMplsFlow == 0) ){
1107          ((struct IndexV6 *)((myPtrs->currentV6IndexTab)
1108                              +((myPtrs->currentRouterPtr->ID)*MAX_INDEX_BY_ROUTER)
1109                              +(agCache.inputSnmp)))->routerIPAddress = myPtrs->currentRouterPtr->IpAddress;
1110          ((struct IndexV6 *)((myPtrs->currentV6IndexTab)
1111                              +((myPtrs->currentRouterPtr->ID)*MAX_INDEX_BY_ROUTER)
1112                              +(agCache.outputSnmp)))->routerIPAddress = myPtrs->currentRouterPtr->IpAddress;
1113          ((struct IndexV6 *)((myPtrs->currentV6IndexTab)
1114                              +((myPtrs->currentRouterPtr->ID)*MAX_INDEX_BY_ROUTER)
1115                              +(agCache.inputSnmp)))->indexSNMP = agCache.inputSnmp;
1116          ((struct IndexV6 *)((myPtrs->currentV6IndexTab)
1117                              +((myPtrs->currentRouterPtr->ID)*MAX_INDEX_BY_ROUTER)
1118                              +(agCache.outputSnmp)))->indexSNMP = agCache.outputSnmp;
1119          /* FIXME, error or warning if (indexSNMP != agCache.outputSnmp) */
1120          ((struct IndexV6 *)((myPtrs->currentV6IndexTab)
1121                              +((myPtrs->currentRouterPtr->ID)*MAX_INDEX_BY_ROUTER)
1122                              +(agCache.inputSnmp)))->hasStats = 1;
1123          ((struct IndexV6 *)((myPtrs->currentV6IndexTab)
1124                              +((myPtrs->currentRouterPtr->ID)*MAX_INDEX_BY_ROUTER)
1125                              +(agCache.outputSnmp)))->hasStats = 1;
1126          ((struct IndexV6 *)((myPtrs->currentV6IndexTab)
1127                              +((myPtrs->currentRouterPtr->ID)*MAX_INDEX_BY_ROUTER)
1128                              +(agCache.inputSnmp)))->bytesNbIN += agCache.bytes;
1129          ((struct IndexV6 *)((myPtrs->currentV6IndexTab)
1130                              +((myPtrs->currentRouterPtr->ID)*MAX_INDEX_BY_ROUTER)
1131                              +(agCache.outputSnmp)))->bytesNbOUT += agCache.bytes;
1132          ((struct IndexV6 *)((myPtrs->currentV6IndexTab)
1133                              +((myPtrs->currentRouterPtr->ID)*MAX_INDEX_BY_ROUTER)
1134                              +(agCache.inputSnmp)))->pktsNbIN += agCache.pkts;
1135          ((struct IndexV6 *)((myPtrs->currentV6IndexTab)
1136                              +((myPtrs->currentRouterPtr->ID)*MAX_INDEX_BY_ROUTER)
1137                              +(agCache.outputSnmp)))->pktsNbOUT += agCache.pkts;
1138          ((struct IndexV6 *)((myPtrs->currentV6IndexTab)
1139                              +((myPtrs->currentRouterPtr->ID)*MAX_INDEX_BY_ROUTER)
1140                              +(agCache.inputSnmp)))->flowNbIN++;
1141          ((struct IndexV6 *)((myPtrs->currentV6IndexTab)
1142                              +((myPtrs->currentRouterPtr->ID)*MAX_INDEX_BY_ROUTER)
1143                              +(agCache.outputSnmp)))->flowNbOUT++;
1144          isIPv6 = 0;
1145/*        fprintf(stderr,"IPV6LINKAGG;IN;%hu;OUT;%hu;router;%lu;bytes;%lu\n", */
1146/*                agCache.inputSnmp, */
1147/*                agCache.outputSnmp, */
1148/*                myPtrs->currentRouterPtr->IpAddress, */
1149/*                agCache.bytes */
1150/*               ); */
1151        }
1152#endif /* IPV6LINKAGG */
1153        isMplsFlow = 0;
1154        /*
1155         *
1156         * SOCKET OUTPUT TO A REMOTE CLIENT
1157         *
1158         * switch the rules definition (check & fieldToRecord),
1159         * we send the flow or a part of the flow to a remote host or a file.
1160         * In a first time (until release 0.0.7, the information was sent via
1161         * the process renetcolSender with an IPC message queue. But, the perf
1162         * of IPC Msg was very bad with a default system compilation.
1163         * So, now, we send information directly from here through sockets.
1164         */
1165        tmpRuleList = myPtrs->rulesListPtr;
1166        tmpRL = myPtrs->rulesListPtr;
1167        while (tmpRuleList){
1168          RuleDefPtr tmpRuleDefList = tmpRuleList->def;
1169          unsigned short check = 1;
1170          int s=0;
1171          secondOffset = secondOldOffset;
1172          while (tmpRuleDefList){
1173            check = check && tmpRuleDefList->check;
1174            tmpRuleDefList->check = 0;
1175            tmpRuleDefList = tmpRuleDefList->next;
1176          }
1177          if ( (tmpRuleList->def != NULL) && (check == 1)) {
1178            /* msg building */
1179            secondPftmp = tmp->lastField;
1180            msgTextIndex = mempcpy(mempcpy(mempcpy(myMsg.text,   
1181                                                   &tplMsgType,
1182                                                   sizeof(unsigned short)
1183                                                   ),
1184                                           &tmpRuleList->id,
1185                                           sizeof(tmpRuleList->id)
1186                                           ),
1187                                   &myPtrs->currentRouterPtr->IpAddress,
1188                                   sizeof(unsigned long)
1189                                   );
1190            msgTextIndex = mempcpy(mempcpy(mempcpy(msgTextIndex,
1191                                                   &tmp->sourceId,
1192                                                   sizeof(unsigned long)
1193                                                   ),
1194                                           &tmp->templateFlowSetId,
1195                                           sizeof(tmp->templateFlowSetId)
1196                                           ),
1197                                   myPtrs->ptr_buffer+secondOffset,
1198                                   flow_size
1199                                   );
1200            myMsg.type = 1;
1201             
1202
1203            /* NEW transfert type */
1204            for ( ; tmpRL; tmpRL=tmpRL->next){
1205              if (tmpRL->id == tmpRuleList->id){       
1206                s = sendMessage(tmpRL->host->sockId, myMsg.text, sizeof(myMsg.text),
1207                                tmpRL->host->hostAddressPtr);
1208              }
1209            }
1210            /* FIXME : perhaps check "s" */
1211            noEnd = 1;
1212            secondCpt=0;
1213          } /* end if check */
1214          tmpRuleList = tmpRuleList->next;
1215          tmpRL = myPtrs->rulesListPtr; /* ticket #11 */
1216          secondPftmp = tmp->lastField;
1217        } /* end while tmpRuleList */
1218        /*
1219         * end redirection
1220         */
1221        secondOffset = *myPtrs->offsetV9Ptr;
1222        secondOldOffset = secondOffset;
1223        pftmp = tmp->lastField;
1224        cpt=0;
1225        (*myPtrs->currentFlowsetNumberPtr)++; /* pointer on the flows number */
1226        if (((*myPtrs->offsetV9Ptr)-48-shift+flow_size) > data_length){
1227          overflow = 1; /* buffer index not correct */
1228        }
1229      } else {
1230        /* not the flow end, progress in field list */
1231        pftmp = pftmp->prev;
1232      }   
1233    } /* end of the while on one flow record */
1234       
1235    while ( ((*myPtrs->offsetV9Ptr)-48-shift) < data_length ) {
1236      (*myPtrs->offsetV9Ptr)++; /* if padding */
1237      paddingCounter++;
1238#ifdef DEBUG
1239        fprintf(stderr,", pC: %d ", paddingCounter);
1240#endif
1241      if ( paddingCounter > 8 ) {
1242        syslog(LOG_INFO,"padding too high: %d ", paddingCounter);
1243#ifdef DEBUG
1244        fprintf(stderr,", pC: %d <--| ", paddingCounter);
1245#endif
1246        return (-1);
1247      }
1248    }
1249    while ( (*myPtrs->offsetV9Ptr)-48-shift > data_length ) {
1250      (*myPtrs->offsetV9Ptr)--; /* crazy loop (when bug appears in template def) */
1251      crazyCounter++;
1252    }
1253#ifdef DEBUG
1254    if (crazyCounter != 0){ fprintf(stderr," crazyCounter: %d ", crazyCounter); }
1255#endif
1256    if (crazyCounter!=0) { syslog(LOG_INFO,"crazyCounter: %d ", crazyCounter);}
1257     
1258#ifdef DEBUG
1259    fprintf(stderr,"(%hu,%hu)}", data_length, data_length+shift);
1260#endif
1261     
1262    return (data_length+shift);
1263    /* end new place */
1264
1265  } else {
1266    /*
1267     *
1268     *
1269     *  OPTIONAL TEMPLATE
1270     *
1271     *
1272     */
1273    if ((tmpOpt=existTplOptId(myPtrs->currentRouterPtr, myPtrs->currentHeaderV9Ptr->sourceId,
1274                              (*myPtrs->currentFlowsetIdPtr)))!=NULL) {       
1275
1276      myPtrs->currentMIB->optDataFlowSetNb += 1;
1277#ifdef DEBUG
1278      fprintf(stderr,"<d id: %hu, lg %hu", (*myPtrs->currentFlowsetIdPtr), data_length);
1279#endif
1280      for ( i=0; i<(tmpOpt->optionScopeLg/4); i++){
1281        /* FIXME : today we skip the scope fields, it's bad :( */ 
1282        if ((pftmp=tmpOpt->lastField)!=NULL) {
1283          for (j=0; j<pftmp->fieldLength; j++) {
1284            (*myPtrs->offsetV9Ptr)++;
1285          }
1286          pftmp = pftmp->prev;
1287        }
1288      }
1289      while (pftmp != NULL) {
1290        if (pftmp->fieldLength==1){
1291          buffer1 = *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr)); (*myPtrs->offsetV9Ptr)++;
1292        }
1293        if (pftmp->fieldLength==2){
1294          buffer2[1]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr)); (*myPtrs->offsetV9Ptr)++;
1295          buffer2[0]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr)); (*myPtrs->offsetV9Ptr)++;
1296        }
1297        if (pftmp->fieldLength==4){
1298          buffer4[3]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr)); (*myPtrs->offsetV9Ptr)++;
1299          buffer4[2]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr)); (*myPtrs->offsetV9Ptr)++;
1300          buffer4[1]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr)); (*myPtrs->offsetV9Ptr)++;
1301          buffer4[0]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr)); (*myPtrs->offsetV9Ptr)++;
1302          if (pftmp->fieldType==34||pftmp->fieldType==50){
1303            if ((*((unsigned long*)&buffer4)==1)
1304                || (*((unsigned long*)&buffer4)==10)
1305                || (*((unsigned long*)&buffer4)==100)
1306                || (*((unsigned long*)&buffer4)==1000)) {
1307              if (myPtrs->currentRouterPtr->sampled != *((unsigned long*)&buffer4) ) {
1308#ifdef DEBUGAGG
1309                fprintf(stderr,"\n SV (p) %lu != %lu (r)", *((unsigned long*)&buffer4),
1310                        myPtrs->currentRouterPtr->sampled);
1311#endif
1312                syslog(LOG_INFO,"Sampling value change for router : %lu.%lu.%lu.%lu, old: %lu, new: %lu",
1313                       (myPtrs->pcktPtr->ipH->srcAdd>>24),
1314                       (myPtrs->pcktPtr->ipH->srcAdd<<8>>24),
1315                       (myPtrs->pcktPtr->ipH->srcAdd<<16>>24),
1316                       (myPtrs->pcktPtr->ipH->srcAdd<<24>>24),
1317                       myPtrs->currentRouterPtr->sampled,
1318                       *((unsigned long*)&buffer4)
1319                       );
1320                myPtrs->currentRouterPtr->sampled = *((unsigned long*)&buffer4);
1321              }
1322            }else{
1323              syslog(LOG_INFO,"Sampling value not standard for router : %lu.%lu.%lu.%lu, value : %lu",
1324                     (myPtrs->pcktPtr->ipH->srcAdd>>24),
1325                     (myPtrs->pcktPtr->ipH->srcAdd<<8>>24),
1326                     (myPtrs->pcktPtr->ipH->srcAdd<<16>>24),
1327                     (myPtrs->pcktPtr->ipH->srcAdd<<24>>24),
1328                     *((unsigned long*)&buffer4)
1329                     );
1330            }
1331          }
1332        }       
1333        pftmp = pftmp->prev;
1334      }
1335      if ( pftmp == NULL ) {
1336        while ((*myPtrs->offsetV9Ptr)%4 != 0) {
1337          (*myPtrs->offsetV9Ptr)++;
1338#ifdef DEBUG
1339          fprintf(stderr," p ");
1340#endif
1341        }
1342      } else {
1343        fprintf(stderr,"PB ");
1344      }
1345#ifdef DEBUG
1346      fprintf(stderr,">");
1347#endif
1348      myPtrs->currentMIB->realFlowNb += 1;
1349      return (data_length+shift);
1350    } else {
1351      /*
1352       * template unknown, we skip the data
1353       */
1354      (*myPtrs->offsetV9Ptr)+=(data_length-4);
1355      (*myPtrs->currentFlowsetNumberPtr)+= 1 ;
1356      /*      (*myPtrs->currentFlowsetNumberPtr) = myPtrs->currentHeaderV9Ptr->count;*/
1357#ifdef DEBUG
1358      fprintf(stderr, " U, r: %lu.%lu.%lu.%lu, sourceId: %lu, TID: %hu ",
1359              (myPtrs->pcktPtr->ipH->srcAdd>>24),
1360              (myPtrs->pcktPtr->ipH->srcAdd<<8>>24),
1361              (myPtrs->pcktPtr->ipH->srcAdd<<16>>24),
1362              (myPtrs->pcktPtr->ipH->srcAdd<<24>>24),
1363              myPtrs->currentHeaderV9Ptr->sourceId,
1364              (*myPtrs->currentFlowsetIdPtr)
1365              );
1366      fprintf(stderr,"(%hu,%hu) ", data_length, data_length+shift);
1367#endif
1368      return (data_length+shift);
1369    }
1370  }
1371}
Note: See TracBrowser for help on using the browser.