root/trunk/src/dataFlowSet.c @ 112

Revision 112, 47.5 KB (checked in by andreu, 14 years ago)

syntax error

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