root/trunk/src/dataFlowSet.c @ 50

Revision 50, 34.0 KB (checked in by andreu, 15 years ago)

remove rrdwrap.h link in renetcolAgg.h, add field 1 redirection in dataFlowSet.c

  • Property svn:eol-style set to native
RevLine 
[2]1/*
2 * File: dataFlowSet.c
3 *
[15]4 * Authors: ANDREU Francois-Xavier
[2]5 *
[28]6 * Copyright (C) 2005 2006 2007 GIP RENATER
[2]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/*
[22]29 * Check Data FlowSet
[2]30 *
31 */
[27]32short 
33checkDataFlowSet(short shift,
[23]34                 struct MyPtrs *myPtrs,
35                 int myQueue,
36                 struct PrefixV4 *V4PTab,
37                 size_t nbPV4
38                 )
[2]39{
[30]40  TplFlowSetPtr tmp = NULL;
41  TplOptionPtr tmpOpt = NULL;
42  FieldPtr pftmp = NULL;
43  FieldPtr secondPftmp = NULL;
[2]44  unsigned short data_length = 0;
45  unsigned short flow_size = 0;
[23]46  unsigned short oldOffset = *myPtrs->offsetV9Ptr;
[2]47  unsigned short secondOffset = 0;
48  unsigned short secondOldOffset = 0;
[14]49  int moreIsNecessary = 1;
[2]50  int field_size = 0;
51  int cpt = 0;
52  int secondCpt = 0;
53  int overflow = 0;
54  int noEnd = 1;
[16]55  int i = 0;
56  int j = 0;
[2]57  int pos = 0;
58  unsigned char buffer1; 
59  unsigned char buffer2[2];
60  unsigned char buffer4[4];
[23]61  RulesPtr tmpRuleList = myPtrs->rulesListPtr;
[36]62  RulesPtr tmpRL = myPtrs->rulesListPtr;
[2]63  msgType myMsg;
64  char *msgTextIndex;
[36]65  char *msgToSend;
[2]66  unsigned short tplMsgType = 11;
[36]67  struct PrefixV4 prefixKey, *res, *res2; /* for bsearch */
[16]68  struct AggCache agCache;
[22]69  int bool = 0; /* in IPV4 Agg mode enabled, we need to now if it's an IPv4 */
70                /* flow, we test on the field and then put bool at 1 */
[27]71  int isMplsFlow = 0;
72  int paddingCounter = 0;
73  int crazyCounter = 0;
74
[20]75#ifdef CRIHAN
[22]76  struct IPFLowCache ipFirstCache;
77  struct MPLSFlowCache mplsFirstCache;
78  unsigned long firstTime = 0;
79  unsigned long lastTime = 0;
[2]80
[18]81  ipFirstCache.ipProt = 0;
82  ipFirstCache.bytes = 0;
83  ipFirstCache.pkts = 0;
84  ipFirstCache.inSnmp = 0;
85  ipFirstCache.outSnmp = 0;
86  ipFirstCache.v4AdS = 0;
87  ipFirstCache.v4AdD = 0;
88  ipFirstCache.tProt = 0;
89  ipFirstCache.sPort = 0;
90  ipFirstCache.dPort = 0;
91  ipFirstCache.maskD = 0;
92  ipFirstCache.maskS = 0;
93  ipFirstCache.routerAd = 0;
94  ipFirstCache.liveTime = 0;
95  mplsFirstCache.ipProt = 0;
96  mplsFirstCache.v4AdS = 0;
97  mplsFirstCache.v4AdD = 0;
98  mplsFirstCache.routerAd = 0;
99  mplsFirstCache.mplsLabel1 = 0;
[20]100#endif /* CRIHAN */
[19]101
[23]102  buffer2[1] = *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));(*myPtrs->offsetV9Ptr)++;
103  buffer2[0] = *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));(*myPtrs->offsetV9Ptr)++;
104  (*myPtrs->currentFlowsetIdPtr) = *((unsigned short*)&buffer2);
105  buffer2[1] = *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));(*myPtrs->offsetV9Ptr)++;
106  buffer2[0] = *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));(*myPtrs->offsetV9Ptr)++;
[2]107  data_length = *((unsigned short*)&buffer2);
[30]108
[29]109  if ( (tmp=existTplId(myPtrs->currentRouterPtr, myPtrs->currentHeaderV9Ptr->sourceId,
110                      (*myPtrs->currentFlowsetIdPtr)))!=NULL ) {
111#ifdef DEBUG
[30]112    fprintf(stderr,"{d id: %hu, lg %hu", (*myPtrs->currentFlowsetIdPtr), data_length);
[34]113    if ( (*myPtrs->currentFlowsetIdPtr) > TRESHOLD_TEMPLATE_ID ) {
[30]114/*      fprintf(stderr,"Bad TID from router: %lu.%lu.%lu.%lu\n", */
115/*              (*myPtrs->currentFlowsetIdPtr), */
116/*              (myPtrs->pcktPtr->ipH->srcAdd>>24), */
117/*              (myPtrs->pcktPtr->ipH->srcAdd<<8>>24), */
118/*              (myPtrs->pcktPtr->ipH->srcAdd<<16>>24), */
119/*              (myPtrs->pcktPtr->ipH->srcAdd<<24>>24)); */
120/*      fprintf(stderr," Bytes : \n"); */
121/*      while ( ( myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr) ) > (myPtrs->ptr_buffer+1416) ){ */
122/*        buffer1= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));(*myPtrs->offsetV9Ptr)++; */
123/*        tmp = *((unsigned char*)&buffer1); */
124/*        fprintf (stderr, " %s ", tmp); */
125/*      } */
126/*      exit(-1); */
127      return (data_length+shift);
128    }
[29]129#endif
[2]130    pftmp = tmp->lastField;
131    for (; pftmp; pftmp = pftmp->prev) {
132      flow_size += pftmp->fieldLength;
133    }
134    if ( data_length%flow_size >= 9 ) {
[23]135      (*myPtrs->currentFlowsetNumberPtr) = myPtrs->currentHeaderV9Ptr->count;
[2]136      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! flowset ID: %hu, from router: %lu.%lu.%lu.%lu",
[23]137             (*myPtrs->currentFlowsetIdPtr),
138             (myPtrs->pcktPtr->ipH->srcAdd>>24),
139             (myPtrs->pcktPtr->ipH->srcAdd<<8>>24),
140             (myPtrs->pcktPtr->ipH->srcAdd<<16>>24),
141             (myPtrs->pcktPtr->ipH->srcAdd<<24>>24));
[2]142      return (data_length+shift);
143    }
[27]144    if ( data_length >= 1452 ) {
145      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",
146             (*myPtrs->currentFlowsetIdPtr),
147             (myPtrs->pcktPtr->ipH->srcAdd>>24),
148             (myPtrs->pcktPtr->ipH->srcAdd<<8>>24),
149             (myPtrs->pcktPtr->ipH->srcAdd<<16>>24),
150             (myPtrs->pcktPtr->ipH->srcAdd<<24>>24));
151      return (-1);
152    }
[22]153#ifdef IPV4AGG
[23]154    agCache.routerAd = myPtrs->pcktPtr->ipH->srcAdd;
[22]155#endif
[18]156
[20]157#ifdef CRIHAN
[23]158    ipFirstCache.routerAd = myPtrs->pcktPtr->ipH->srcAdd;
159    mplsFirstCache.routerAd = myPtrs->pcktPtr->ipH->srcAdd;
[20]160#endif /* CRIHAN */
[18]161
[2]162    pftmp = tmp->lastField;
163    secondPftmp = tmp->lastField;   
[23]164    secondOffset = *myPtrs->offsetV9Ptr;
[2]165    secondOldOffset = secondOffset;
[23]166    while ( (((*myPtrs->offsetV9Ptr)-48-shift) <= data_length) && (overflow!=1) ) {
[2]167      /*
[29]168       * progression in a data flow Set
[2]169       * notes:
170       *   48=header ip + header netf
171       *   shift = shift if there is a template declaration
172       */
173      cpt++;
[27]174      j = 0;
[47]175      pos = (pftmp->fieldType)*MAX_RULES_PER_FIELD+j;
[2]176      field_size = (int) pftmp->fieldLength;
[27]177     
178      /* special case: check yes on all flows from one router (phantom field nb 0) */
[47]179      /* FIXME : this code is repeated, perhaps past before */
180      while ( ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+j))) != NULL ) {
[27]181        if  ( (((RuleDefPtr)(*(myPtrs->rulesAddressPtr+j)))->value->stor.lvalue)
182              == myPtrs->pcktPtr->ipH->srcAdd )
183          {
184            ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+j)))->check = 1;
185          }     
186        j++;
187      }   
188      j = 0;
189     
[2]190      /*
191       * Comparaison between the field value and the rules
192       * ... if one rule exist
[27]193       * FIXME : warning, if no rules, no accounting ?
[2]194       */
[23]195      if (((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos))) != NULL) {
196        oldOffset = *myPtrs->offsetV9Ptr;
197        while (((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos))) != NULL){
[2]198          /*
199           * while on one cache table line
200           */
[23]201          *myPtrs->offsetV9Ptr = oldOffset;
[2]202          switch ((int)
[23]203                  (((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->operator)){
[2]204          case 2:
[27]205            /* operator: "=" */ 
[2]206            switch (field_size) {
207            case 1:
[23]208              buffer1 = *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr)); (*myPtrs->offsetV9Ptr)++;
[17]209              /* rule check */
[23]210              if (((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->stor.cvalue
[2]211                  == *((unsigned char*)&buffer1)) {
[23]212                ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check = 1;
[16]213              }
[17]214              /* end rule check */
[22]215#ifdef IPV4AGG
216              if ((pftmp->fieldType==9)||(pftmp->fieldType==29)){
217                agCache.maskS = *((unsigned char*)&buffer1);
218              }
219              if ((pftmp->fieldType==13)||(pftmp->fieldType==30)){
220                agCache.maskD = *((unsigned char*)&buffer1);
221              }
222              if (pftmp->fieldType==60){
223                agCache.ipProt = *((unsigned char*)&buffer1);
224              }
225              if (pftmp->fieldType==4){
226                agCache.tProt = *((unsigned char*)&buffer1);
227              }
228              if (pftmp->fieldType==61){
229                agCache.sens = *((unsigned char*)&buffer1);
230              }
231              if (pftmp->fieldType==5){
232                agCache.dscp = *((unsigned char*)&buffer1);
233              }
234#endif       
[20]235#ifdef CRIHAN
[17]236              if ((pftmp->fieldType==9)||(pftmp->fieldType==29)){
[18]237                ipFirstCache.maskS = *((unsigned char*)&buffer1);
[17]238              }
239              if ((pftmp->fieldType==13)||(pftmp->fieldType==30)){
[18]240                ipFirstCache.maskD = *((unsigned char*)&buffer1);
[17]241              }
[18]242              if (pftmp->fieldType==60){
243                ipFirstCache.ipProt = *((unsigned char*)&buffer1);
244                mplsFirstCache.ipProt = *((unsigned char*)&buffer1);
245              }
246              if (pftmp->fieldType==4){
247                ipFirstCache.tProt = *((unsigned char*)&buffer1);
248              }
[22]249#endif
[2]250              break;
251            case 2:
[23]252              buffer2[1]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr)); (*myPtrs->offsetV9Ptr)++;
253              buffer2[0]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr)); (*myPtrs->offsetV9Ptr)++;
254              if (((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->stor.svalue
[2]255                  == *((unsigned short*)&buffer2))
[23]256                ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check = 1;
[22]257#ifdef IPV4AGG
258              if (pftmp->fieldType==10){
259                agCache.idSnmp = *((unsigned short*)&buffer2);
260              }
261#endif
[20]262#ifdef CRIHAN
[17]263              if (pftmp->fieldType==10){
[18]264                ipFirstCache.inSnmp = *((unsigned short*)&buffer2);
[17]265              }
[18]266              if (pftmp->fieldType==14){
267                ipFirstCache.outSnmp = *((unsigned short*)&buffer2);
268              }
269              if (pftmp->fieldType==7){
270                ipFirstCache.sPort = *((unsigned short*)&buffer2);
271              }
272              if (pftmp->fieldType==11){
273                ipFirstCache.dPort = *((unsigned short*)&buffer2);
274              }
[22]275#endif
[2]276              break;
[17]277            case 3:
278              buffer4[3]= 0;
[23]279              buffer4[2]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr)); (*myPtrs->offsetV9Ptr)++;
280              buffer4[1]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr)); (*myPtrs->offsetV9Ptr)++;
281              buffer4[0]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr)); (*myPtrs->offsetV9Ptr)++;
282              if (((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->stor.lvalue
[17]283                  == *((unsigned long*)&buffer4))
[23]284                ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check = 1;
[17]285              /* aggregation */
286              /* end aggregation */
[27]287              if (pftmp->fieldType==70){
288                isMplsFlow = 1;
289              }
[20]290#ifdef CRIHAN
[18]291              if (pftmp->fieldType==70){
292                mplsFirstCache.mplsLabel1 = (*((unsigned long*)&buffer4))>>4;
293              }
[22]294#endif
[17]295              break;
[2]296            case 4:
[23]297              buffer4[3]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr)); (*myPtrs->offsetV9Ptr)++;
298              buffer4[2]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr)); (*myPtrs->offsetV9Ptr)++;
299              buffer4[1]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr)); (*myPtrs->offsetV9Ptr)++;
300              buffer4[0]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr)); (*myPtrs->offsetV9Ptr)++;
[15]301              /* FIXME : here , add a check on the field type */
[16]302              if ((pftmp->fieldType==8)||(pftmp->fieldType==12)){
[23]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) )
[16]305                  {
[23]306                    ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check = 1;
[16]307                  }
[29]308              }
[22]309#ifdef IPV4AGG
310              if ((pftmp->fieldType==8)){
[27]311                bool = 1; /* very important, test if we have an IPv4 flow for Agg */
[22]312                agCache.v4AdS = *((unsigned long*)&buffer4);
313              }
314              if ((pftmp->fieldType==12)){
315                agCache.v4AdD = *((unsigned long*)&buffer4);
316              }
317              if (pftmp->fieldType==1){
318                agCache.bytes = *((unsigned long*)&buffer4);
[50]319                if ((((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->stor.lvalue)
320                    == (*((unsigned long*)&buffer4)) )
321                  {
322                    ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check = 1;
323                  }
[22]324              }
325              if (pftmp->fieldType==2){
326                agCache.pkts = *((unsigned long*)&buffer4);
327              }
328#endif
[20]329#ifdef CRIHAN
[18]330              if (pftmp->fieldType==8){
331                ipFirstCache.v4AdS = *((unsigned long*)&buffer4);
[19]332                mplsFirstCache.v4AdS = *((unsigned long*)&buffer4);
[17]333              }
[18]334              if (pftmp->fieldType==12){
335                ipFirstCache.v4AdD = *((unsigned long*)&buffer4);
[19]336                mplsFirstCache.v4AdD = *((unsigned long*)&buffer4);
[17]337              }
338              if (pftmp->fieldType==1){
[18]339                ipFirstCache.bytes = *((unsigned long*)&buffer4);
[17]340              }
341              if (pftmp->fieldType==2){
[18]342                ipFirstCache.pkts = *((unsigned long*)&buffer4);
[17]343              }
[18]344              if (pftmp->fieldType==22){
345                firstTime = *((unsigned long*)&buffer4);
346              }
347              if (pftmp->fieldType==21){
348                lastTime = *((unsigned long*)&buffer4);
349              }
[22]350#endif
[2]351              break;
352            case 16:
353              for (i=0; i<4; i++) {
[23]354                buffer4[3]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr)); (*myPtrs->offsetV9Ptr)++;
355                buffer4[2]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr)); (*myPtrs->offsetV9Ptr)++;
356                buffer4[1]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr)); (*myPtrs->offsetV9Ptr)++;
357                buffer4[0]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr)); (*myPtrs->offsetV9Ptr)++;
[14]358                if (1==moreIsNecessary){
359                  switch(i){
360                  case 0:
[23]361                    if (((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->mask <= 32){
362                      if (ntohl(((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->stor.tabAdd6[i])
[14]363                          ==
[23]364                          (*((unsigned long*)&buffer4))>>(32-((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->mask)<<(32-((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->mask)
[14]365                          )
366                        {
[23]367                          ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check = 1;
[14]368                          moreIsNecessary = 0;
369                        } else {
[23]370                          ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check = 0;
[14]371                          moreIsNecessary = 0;
372                        }
[2]373                    } else {
[23]374                      if (ntohl(((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->stor.tabAdd6[i])
[14]375                          ==
376                          (*((unsigned long*)&buffer4))
377                          )
378                        {
[23]379                          ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check = 1;
[14]380                        } else {
[23]381                          ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check = 0;
[14]382                          moreIsNecessary = 0;
383                        }
[2]384                    }
[14]385                    break;
386                  case 1:
[23]387                    if (((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->mask <= 64){
388                      if (ntohl(((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->stor.tabAdd6[i])
[14]389                          ==
[23]390                          (*((unsigned long*)&buffer4))>>(64-((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->mask)<<(64-((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->mask)
[14]391                          )
392                        {
[23]393                          ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check =
394                            ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check && 1;
[14]395                          moreIsNecessary = 0;
396                        } else {
[23]397                          ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check = 0;
[14]398                          moreIsNecessary = 0;
399                        }
400                    } else {
[23]401                      if (ntohl(((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->stor.tabAdd6[i])
[14]402                          ==
403                          (*((unsigned long*)&buffer4))
404                          )
405                        {
[23]406                          ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check =
407                            ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check && 1;
[14]408                        } else {
[23]409                          ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check = 0;
[14]410                          moreIsNecessary = 0;
411                        }
412                    }
413                    break;
414                  case 2:
[23]415                    if (((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->mask <= 96){
416                      if (ntohl(((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->stor.tabAdd6[i])
[14]417                          ==
[23]418                          (*((unsigned long*)&buffer4))>>(96-((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->mask)<<(96-((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->mask)
[14]419                          )
420                        {
[23]421                          ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check =
422                            ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check && 1;
[14]423                          moreIsNecessary = 0;
424                        } else {
[23]425                          ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check = 0;
[14]426                          moreIsNecessary = 0;
427                        }
428                    } else {
[23]429                      if (ntohl(((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->stor.tabAdd6[i])
[14]430                          ==
431                          (*((unsigned long*)&buffer4))
432                          )
433                        {
[23]434                          ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check =
435                            ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check && 1;
[14]436                        } else {
[23]437                          ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check = 0;
[14]438                          moreIsNecessary = 0;
439                        }
440                    }
441                    break;
442                  case 3:
[23]443                    if (((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->mask <= 128){
444                      if (ntohl(((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->stor.tabAdd6[i])
[14]445                          ==
[23]446                          (*((unsigned long*)&buffer4))>>(128-((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->mask)<<(128-((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->mask)
[14]447                          )
448                        {
[23]449                          ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check =
450                            ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check && 1;
[14]451                        } else {
[23]452                          ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check = 0;
[14]453                          moreIsNecessary = 0;
454                        }
455                    } else {
[23]456                      if (ntohl(((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->stor.tabAdd6[i])
[14]457                          ==
458                          (*((unsigned long*)&buffer4))
459                          )
460                        {
[23]461                          ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check =
462                            ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check && 1;
[14]463                        } else {
[23]464                          ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check = 0;
[14]465                          moreIsNecessary = 0;
466                        }
467                    }
468                    break;
469                  default:
470                    break;
471                  } /* end of switch(i) */
472                } /* end of if moreIsNecessary */
[2]473              }
[14]474              moreIsNecessary = 1;
[22]475              /* aggregation for IPv6 flows */
[16]476             
477              /* end aggregation */
[2]478              break;
479            default:
480              syslog(LOG_INFO, "Field size not known: %d\n", field_size);
481              for (i=0; i<field_size; i++){
[23]482                (*myPtrs->offsetV9Ptr)++;
[2]483              }
484              break;
485            }
486            break;
487          default:
488            syslog(LOG_INFO, "Operator not known: %d\n",
[23]489                   (int)(((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->operator));
[2]490            break;
491          }
492          j++;
493          pos = (pftmp->fieldType)*10+j;
[23]494        } /* end while myPtrs->rulesAddressPtr */
[2]495      } else {
496        /*
[22]497         * no rule within this field type, but we must read the value
[2]498         */
499        switch (field_size) {
500        case 1:
[23]501          buffer1 = *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr)); (*myPtrs->offsetV9Ptr)++;
[22]502#ifdef IPV4AGG
503          if ((pftmp->fieldType==9)||(pftmp->fieldType==29)){
504            agCache.maskS = *((unsigned char*)&buffer1);
505          }
506          if ((pftmp->fieldType==13)||(pftmp->fieldType==30)){
507            agCache.maskD = *((unsigned char*)&buffer1);
508          }
509          if (pftmp->fieldType==60){
510            agCache.ipProt = *((unsigned char*)&buffer1);
511          }
512          if (pftmp->fieldType==4){
513            agCache.tProt = *((unsigned char*)&buffer1);
514          }
515          if (pftmp->fieldType==61){
516            agCache.sens = *((unsigned char*)&buffer1);
517          }
518          if (pftmp->fieldType==5){
519            agCache.dscp = *((unsigned char*)&buffer1);
520          }       
521#endif
[20]522#ifdef CRIHAN
[17]523          if ((pftmp->fieldType==9)||(pftmp->fieldType==29)){
[18]524            ipFirstCache.maskS = *((unsigned char*)&buffer1);
[17]525          }
526          if ((pftmp->fieldType==13)||(pftmp->fieldType==30)){
[18]527            ipFirstCache.maskD = *((unsigned char*)&buffer1);
[17]528          }
[18]529          if (pftmp->fieldType==60){
530            ipFirstCache.ipProt = *((unsigned char*)&buffer1);
531            mplsFirstCache.ipProt = *((unsigned char*)&buffer1);
[17]532          }
[18]533          if (pftmp->fieldType==4){
534            ipFirstCache.tProt = *((unsigned char*)&buffer1);
[17]535          }
[22]536#endif
[2]537          break;
538        case 2:
[23]539          buffer2[1]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr)); (*myPtrs->offsetV9Ptr)++;
540          buffer2[0]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr)); (*myPtrs->offsetV9Ptr)++;
[22]541#ifdef IPV4AGG
[17]542          if (pftmp->fieldType==10){
543            agCache.idSnmp = *((unsigned short*)&buffer2);
544          }       
[22]545#endif
[20]546#ifdef CRIHAN
[18]547          if (pftmp->fieldType==10){
548            ipFirstCache.inSnmp = *((unsigned short*)&buffer2);
549          }
550          if (pftmp->fieldType==14){
551            ipFirstCache.outSnmp = *((unsigned short*)&buffer2);
552          }
553          if (pftmp->fieldType==7){
554            ipFirstCache.sPort = *((unsigned short*)&buffer2);
555          }
556          if (pftmp->fieldType==11){
557            ipFirstCache.dPort = *((unsigned short*)&buffer2);
558          }
[22]559#endif
[2]560          break;
[17]561        case 3:
562          buffer4[3]= 0;
[23]563          buffer4[2]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr)); (*myPtrs->offsetV9Ptr)++;
564          buffer4[1]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr)); (*myPtrs->offsetV9Ptr)++;
565          buffer4[0]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr)); (*myPtrs->offsetV9Ptr)++;
[17]566          /* aggregation */
567          /* end aggregation */
[27]568          if (pftmp->fieldType==70){
569            isMplsFlow = 1;
570          }
[20]571#ifdef CRIHAN
[18]572          if (pftmp->fieldType==70){
573            mplsFirstCache.mplsLabel1 = (*((unsigned long*)&buffer4))>>4;
574          }
[22]575#endif
[17]576          break;
[2]577        case 4:
[23]578          buffer4[3]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr)); (*myPtrs->offsetV9Ptr)++;
579          buffer4[2]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr)); (*myPtrs->offsetV9Ptr)++;
580          buffer4[1]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr)); (*myPtrs->offsetV9Ptr)++;
581          buffer4[0]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr)); (*myPtrs->offsetV9Ptr)++;
[22]582#ifdef IPV4AGG
583          if ((pftmp->fieldType==8)){
584            bool = 1;
585            agCache.v4AdS = *((unsigned long*)&buffer4);
586          } else if ((pftmp->fieldType==12)){
587            agCache.v4AdD = *((unsigned long*)&buffer4);
588          } else if (pftmp->fieldType==1){
589            agCache.bytes = *((unsigned long*)&buffer4);
590          } else if (pftmp->fieldType==2){
591            agCache.pkts = *((unsigned long*)&buffer4);
592          }
593#endif
[20]594#ifdef CRIHAN
[18]595          if (pftmp->fieldType==8){
596            ipFirstCache.v4AdS = *((unsigned long*)&buffer4);
[19]597            mplsFirstCache.v4AdS = *((unsigned long*)&buffer4);
[17]598          }
[18]599          if (pftmp->fieldType==12){
600            ipFirstCache.v4AdD = *((unsigned long*)&buffer4);
[19]601            mplsFirstCache.v4AdD = *((unsigned long*)&buffer4);
[18]602          }
603          if (pftmp->fieldType==1){
604            ipFirstCache.bytes = *((unsigned long*)&buffer4);
605          }
606          if (pftmp->fieldType==2){
607            ipFirstCache.pkts = *((unsigned long*)&buffer4);
608          }
609          if (pftmp->fieldType==22){
610            firstTime = *((unsigned long*)&buffer4);
611          }
612          if (pftmp->fieldType==21){
613            lastTime = *((unsigned long*)&buffer4);
614          }
[22]615#endif
[2]616          break;
617        case 16:
618          for (i=0; i<4; i++) {
[23]619            buffer2[1]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr)); (*myPtrs->offsetV9Ptr)++;
620            buffer2[0]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr)); (*myPtrs->offsetV9Ptr)++;
621            buffer2[1]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr)); (*myPtrs->offsetV9Ptr)++;
622            buffer2[0]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr)); (*myPtrs->offsetV9Ptr)++;
[2]623          }
[22]624          /* aggregation IPv6 */         
[16]625          /* end aggregation */
[2]626          break;
627        default:
628          syslog(LOG_INFO,"UNKNOWN FIELDS LENGTH: %d ", field_size);
629          for (i=0; i<field_size; i++){
[23]630            (*myPtrs->offsetV9Ptr)++;
[2]631          }
632        }
633      } /* end if one cache table line existence */
634      if (cpt==tmp->fieldCount) {
635        /*
636         * end of one flow (not the flowset)
637         */
[20]638#ifdef CRIHAN
[18]639        if ( mplsFirstCache.mplsLabel1 == 0 ) {
[23]640          (myPtrs->tabIPPtr+(*myPtrs->ipNbPtr))->ipProt = ipFirstCache.ipProt;
[18]641          ipFirstCache.ipProt = 0;
[23]642          (myPtrs->tabIPPtr+(*myPtrs->ipNbPtr))->bytes = ipFirstCache.bytes;
[18]643          ipFirstCache.bytes = 0;
[23]644          (myPtrs->tabIPPtr+(*myPtrs->ipNbPtr))->pkts = ipFirstCache.pkts;
[18]645          ipFirstCache.pkts = 0;
[23]646          (myPtrs->tabIPPtr+(*myPtrs->ipNbPtr))->inSnmp = ipFirstCache.inSnmp;
[18]647          ipFirstCache.inSnmp = 0;
[23]648          (myPtrs->tabIPPtr+(*myPtrs->ipNbPtr))->outSnmp = ipFirstCache.outSnmp;
[18]649          ipFirstCache.outSnmp = 0;
[23]650          (myPtrs->tabIPPtr+(*myPtrs->ipNbPtr))->v4AdS = ipFirstCache.v4AdS;
[18]651          ipFirstCache.outSnmp = 0;
[23]652          (myPtrs->tabIPPtr+(*myPtrs->ipNbPtr))->v4AdD = ipFirstCache.v4AdD;
[18]653          ipFirstCache.v4AdD = 0;
[23]654          (myPtrs->tabIPPtr+(*myPtrs->ipNbPtr))->tProt = ipFirstCache.tProt;
[18]655          ipFirstCache.tProt = 0;
[23]656          (myPtrs->tabIPPtr+(*myPtrs->ipNbPtr))->sPort = ipFirstCache.sPort;
[18]657          ipFirstCache.sPort = 0;
[23]658          (myPtrs->tabIPPtr+(*myPtrs->ipNbPtr))->dPort = ipFirstCache.dPort;
[18]659          ipFirstCache.dPort = 0;
[23]660          (myPtrs->tabIPPtr+(*myPtrs->ipNbPtr))->maskD = ipFirstCache.maskD;
[18]661          ipFirstCache.maskD = 0;
[23]662          (myPtrs->tabIPPtr+(*myPtrs->ipNbPtr))->maskS = ipFirstCache.maskS;
[18]663          ipFirstCache.maskS = 0;
[23]664          (myPtrs->tabIPPtr+(*myPtrs->ipNbPtr))->routerAd = ipFirstCache.routerAd;
665          (myPtrs->tabIPPtr+(*myPtrs->ipNbPtr))->liveTime = lastTime - firstTime;
[18]666          firstTime = 0; lastTime = 0;
[23]667          (*myPtrs->ipNbPtr)++;
[18]668        } else {
[23]669          (myPtrs->tabMPLSPtr+(*myPtrs->mplsNbPtr))->ipProt = mplsFirstCache.ipProt;
[18]670          mplsFirstCache.ipProt = 0;
[23]671          (myPtrs->tabMPLSPtr+(*myPtrs->mplsNbPtr))->v4AdS =  mplsFirstCache.v4AdS;
[18]672          mplsFirstCache.v4AdS = 0;
[23]673          (myPtrs->tabMPLSPtr+(*myPtrs->mplsNbPtr))->v4AdD =  mplsFirstCache.v4AdD;
[18]674          mplsFirstCache.v4AdD = 0;
[23]675          (myPtrs->tabMPLSPtr+(*myPtrs->mplsNbPtr))->routerAd =  mplsFirstCache.routerAd;
676          (myPtrs->tabMPLSPtr+(*myPtrs->mplsNbPtr))->mplsLabel1 =  mplsFirstCache.mplsLabel1;
[18]677          mplsFirstCache.mplsLabel1 = 0;
[23]678          (*myPtrs->mplsNbPtr)++;
[18]679        }
[22]680#endif 
681        /* put aggregation cache information to IPv4 Prefixes table */
[23]682        /* Aggregation mode must be enable in ./configure options   */
683        /* first we must know if the address belong to our prefix   */
[36]684        myPtrs->nbFluxTT++;
[22]685#ifdef IPV4AGG
[27]686        if ( (bool == 1) && (isMplsFlow == 0) ){
[22]687          prefixKey.beginning = agCache.v4AdS>>(32-agCache.maskS)<<(32-agCache.maskS);
688          res = bsearch(&prefixKey, V4PTab, nbPV4,
[27]689                        sizeof(struct PrefixV4), prefGlobalCmp);
690          if (res!=NULL){
691            if ( myPtrs->routersID[res->routerNb] == agCache.routerAd  ) {
[36]692              myPtrs->nbFluxSR4++;
[27]693              /* OUT ("traffic from the prefix/subnet")  */
694              res->bytesNbOUT += agCache.bytes;
695              res->pktsNbOUT += agCache.pkts;
696              (res->flowNbOUT)++;
[36]697              /* inter-pop matrix Accounting */
698              prefixKey.beginning = agCache.v4AdD>>(32-agCache.maskD)<<(32-agCache.maskD);
699              res2 = bsearch(&prefixKey, V4PTab, nbPV4,
700                            sizeof(struct PrefixV4), prefGlobalCmp);
701              if (res2!=NULL){
702                myPtrs->nbFluxIR4++;
703                ((struct POP *)((myPtrs->matrixPOP)
704                                +((res->routerNb)*ROUTER_INDEX_MAX)
705                                +((res2->routerNb))))->pktsNb += agCache.pkts;
706                ((struct POP *)((myPtrs->matrixPOP)
707                                +((res->routerNb)*ROUTER_INDEX_MAX)
708                                +((res2->routerNb))))->bytesNb += agCache.bytes;
709                ((struct POP *)((myPtrs->matrixPOP)
710                                +((res->routerNb)*ROUTER_INDEX_MAX)
711                                +((res2->routerNb))))->flowNb++;
712              } else {
713                myPtrs->nbFluxSE++;
714                (
715                 ((struct POP *)(myPtrs->matrixPOP)
716                 +((res->routerNb)*ROUTER_INDEX_MAX)
717                 +((ROUTER_INDEX_MAX-1))))->pktsNb += agCache.pkts;
718                (
719                 ((struct POP *)(myPtrs->matrixPOP)
720                 +((res->routerNb)*ROUTER_INDEX_MAX)
721                 +((ROUTER_INDEX_MAX-1))))->bytesNb += agCache.bytes;
722                (
723                 ((struct POP *)(myPtrs->matrixPOP)
724                 +((res->routerNb)*ROUTER_INDEX_MAX)
725                 +((ROUTER_INDEX_MAX-1))))->flowNb++;
726              }
727              /* end interpop matrix accounting */
[27]728            } else {
729              /* doublon or bad reference in prefix list */
[22]730            }
[23]731          } else {
732            prefixKey.beginning = agCache.v4AdD>>(32-agCache.maskD)<<(32-agCache.maskD);
733            res = bsearch(&prefixKey, V4PTab, nbPV4,
[27]734                          sizeof(struct PrefixV4), prefGlobalCmp);
735            if (res!=NULL){
736              if ( myPtrs->routersID[res->routerNb] == agCache.routerAd  ) {
737                /* IN ("traffic to the prefix")  */
738                res->bytesNbIN += agCache.bytes;
739                res->pktsNbIN += agCache.pkts;
740                (res->flowNbIN)++;
741              } else {
742                /* doublon or bad reference in prefix list */
743               
744/*              fprintf(stderr, "IN NC: %lu.%lu.%lu.%lu/%hu -> %lu.%lu.%lu.%lu/%hu R:%lu.%lu.%lu.%lu \n", */
745/*                      (agCache.v4AdS>>24), */
746/*                      (agCache.v4AdS<<8>>24),  */
747/*                      (agCache.v4AdS<<16>>24),  */
748/*                      (agCache.v4AdS<<24>>24),  */
749/*                      (agCache.maskS),  */
750/*                      (agCache.v4AdD>>24),  */
751/*                      (agCache.v4AdD<<8>>24),  */
752/*                      (agCache.v4AdD<<16>>24),  */
753/*                      (agCache.v4AdD<<24>>24),  */
754/*                      (agCache.maskD),  */
755/*                      (myPtrs->pcktPtr->ipH->srcAdd>>24),  */
756/*                      (myPtrs->pcktPtr->ipH->srcAdd<<8>>24), */
757/*                      (myPtrs->pcktPtr->ipH->srcAdd<<16>>24), */
758/*                      (myPtrs->pcktPtr->ipH->srcAdd<<24>>24) */
759/*                      ); */
[23]760              }
761            } else {
762              /* HERE : we are in the cases of the address/mask don't      */
763              /*        belong to a prefix listed in the IPv4 prefix file  */
764              /* possibilities :                                           */
765              /*     -  prefix not referenced but allowed to be routed     */
766              /*     -  prefix not referenced but not allowed to be routed */
767              /*     -  spoofing                                           */
[36]768              myPtrs->nbFluxUK++;
[32]769#ifdef PRINTUNKNOWNSUBNET 
770              fprintf(stderr, "%lu.%lu.%lu.%lu/%hu -> %lu.%lu.%lu.%lu/%hu (R:%lu.%lu.%lu.%lu) \n",
771                      (agCache.v4AdS>>24),
772                      (agCache.v4AdS<<8>>24),
773                      (agCache.v4AdS<<16>>24),
774                      (agCache.v4AdS<<24>>24),
775                      (agCache.maskS),
776                      (agCache.v4AdD>>24),
777                      (agCache.v4AdD<<8>>24),
778                      (agCache.v4AdD<<16>>24),
779                      (agCache.v4AdD<<24>>24),
780                      (agCache.maskD),
781                      (myPtrs->pcktPtr->ipH->srcAdd>>24),
782                      (myPtrs->pcktPtr->ipH->srcAdd<<8>>24),
783                      (myPtrs->pcktPtr->ipH->srcAdd<<16>>24),
784                      (myPtrs->pcktPtr->ipH->srcAdd<<24>>24)
785                      );
786#endif
[23]787            }
788          }
[22]789        }
790        bool = 0;
[27]791        isMplsFlow = 0;
[22]792#endif
[2]793        /*
794         * Redirection if needed
795         * switch the rules definition (check & fieldToRecord),
[27]796         * we send the flow or a part of the flow to a remote host or a file.
797         * In a first time (until release 0.0.7, the information was sent via
798         * the process renetcolSender with an IPC message queue. But, the perf
[47]799         * of IPC Msg was very bad with a default system compilation.
800         * So, now, we send information directly from here.
[2]801         */
[23]802        tmpRuleList = myPtrs->rulesListPtr;
[36]803        tmpRL = myPtrs->rulesListPtr;
[2]804        while (tmpRuleList){
[27]805          RuleDefPtr tmpRuleDefList = tmpRuleList->def;
[2]806          unsigned short check = 1;
[36]807          int s=0;
[2]808          secondOffset = secondOldOffset;
809          while (tmpRuleDefList){
810            check = check && tmpRuleDefList->check;
811            tmpRuleDefList->check = 0;
812            tmpRuleDefList = tmpRuleDefList->next;
813          }
814          if ( (tmpRuleList->def != NULL) && (check == 1)) {
815            /* msg building */
816            secondPftmp = tmp->lastField;
[36]817            msgTextIndex = mempcpy(mempcpy(mempcpy(myMsg.text,   
[2]818                                                   &tplMsgType,
819                                                   sizeof(unsigned short)
820                                                   ),
821                                           &tmpRuleList->id,
822                                           sizeof(tmpRuleList->id)
823                                           ),
[23]824                                   &myPtrs->currentRouterPtr->IpAddress,
[2]825                                   sizeof(unsigned long)
826                                   );
827            msgTextIndex = mempcpy(mempcpy(mempcpy(msgTextIndex,
828                                                   &tmp->sourceId,
829                                                   sizeof(unsigned long)
830                                                   ),
831                                           &tmp->templateFlowSetId,
832                                           sizeof(tmp->templateFlowSetId)
833                                           ),
[23]834                                   myPtrs->ptr_buffer+secondOffset,
[2]835                                   flow_size
836                                   );
837            myMsg.type = 1;
[27]838            /* OLD transfert type */
[36]839/*          msgSend( myQueue, myMsg); */
[27]840            /* NEW transfert type */
[36]841            for ( ; tmpRL; tmpRL=tmpRL->next){
[47]842              if (tmpRL->id == tmpRuleList->id){       
[36]843                s = sendMessage(tmpRL->host->sockId, myMsg.text, sizeof(myMsg.text),
844                                tmpRL->host->hostAddressPtr);
845              }
846            }
[27]847            /* FIXME : perhaps check "s" */
[2]848            noEnd = 1;
849            secondCpt=0;
850          } /* end if check */
851          tmpRuleList = tmpRuleList->next;
[47]852          tmpRL = myPtrs->rulesListPtr; /* ticket #11 */
[2]853          secondPftmp = tmp->lastField;
854        } /* end while tmpRuleList */
855        /*
856         * end redirection
857         */
[23]858        secondOffset = *myPtrs->offsetV9Ptr;
[2]859        secondOldOffset = secondOffset;
860        pftmp = tmp->lastField;
861        cpt=0;
[23]862        (*myPtrs->currentFlowsetNumberPtr)++; /* pointer on the flows number */
863        if (((*myPtrs->offsetV9Ptr)-48-shift+flow_size) > data_length){
[2]864          overflow = 1; /* buffer index not correct */
865        }
866      } else {
867        /* not the flow end, progress in field list */
868        pftmp = pftmp->prev;
869      }
[29]870    } /* end of the while on one flow record */
[32]871   
[30]872    while ( ((*myPtrs->offsetV9Ptr)-48-shift) < data_length ) {
873      (*myPtrs->offsetV9Ptr)++; /* if padding */
874      paddingCounter++;
875      if ( paddingCounter > 8 ) {
[29]876#ifdef DEBUG
[30]877        fprintf(stderr," padding too high: %d ", paddingCounter);
878#endif
879        syslog(LOG_INFO,"padding too high: %d ", paddingCounter);
880        return (-1);
881      }
882    }
883    while ( (*myPtrs->offsetV9Ptr)-48-shift > data_length ) {
884      (*myPtrs->offsetV9Ptr)--; /* crazy loop (when bug appears in template def) */
885      crazyCounter++;
886    }
887#ifdef DEBUG
888    if (crazyCounter != 0){ fprintf(stderr," crazyCounter: %d ", crazyCounter); }
889#endif
890    if (crazyCounter!=0) { syslog(LOG_INFO,"crazyCounter: %d ", crazyCounter);}
891   
892#ifdef DEBUG
[29]893    fprintf(stderr,"}");
894#endif
[30]895
896    return (data_length+shift);
897    /* end new place */
898   
[2]899  }else{
[30]900    /*
901     *
902     *
903     *       Optional template
904     *
905     *
906     */
[29]907    if ((tmpOpt=existTplOptId(myPtrs->currentRouterPtr, myPtrs->currentHeaderV9Ptr->sourceId,
908                              (*myPtrs->currentFlowsetIdPtr)))!=NULL) {       
[30]909#ifdef DEBUG
910      fprintf(stderr,"<d id: %hu, lg %hu", (*myPtrs->currentFlowsetIdPtr), data_length);
911#endif     
[29]912      for ( i=0; i<(tmpOpt->optionScopeLg/4); i++){
913        /* FIXME : today we skip the scope fields, it's bad :( */ 
[30]914        if ((pftmp=tmpOpt->lastField)!=NULL) {
[29]915          for (j=0; j<pftmp->fieldLength; j++) {
916            (*myPtrs->offsetV9Ptr)++;
917          }
918          pftmp = pftmp->prev;
919        }
920      }
921      while (pftmp != NULL) {
922        if (pftmp->fieldLength==1){
923          buffer1 = *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr)); (*myPtrs->offsetV9Ptr)++;
924        }
925        if (pftmp->fieldLength==2){
926          buffer2[1]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr)); (*myPtrs->offsetV9Ptr)++;
927          buffer2[0]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr)); (*myPtrs->offsetV9Ptr)++;
928        }
929        if (pftmp->fieldLength==4){
930          buffer4[3]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr)); (*myPtrs->offsetV9Ptr)++;
931          buffer4[2]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr)); (*myPtrs->offsetV9Ptr)++;
932          buffer4[1]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr)); (*myPtrs->offsetV9Ptr)++;
933          buffer4[0]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr)); (*myPtrs->offsetV9Ptr)++;
934          if (pftmp->fieldType==34){
[34]935            if ((*((unsigned long*)&buffer4)==1)
936                || (*((unsigned long*)&buffer4)==10)
937                || (*((unsigned long*)&buffer4)==1000)) {
938              if (myPtrs->currentRouterPtr->sampled != *((unsigned long*)&buffer4) ) {
[30]939#ifdef DEBUGAGG
[34]940                fprintf(stderr,"\n SV (p) %lu != %lu (r)", *((unsigned long*)&buffer4),
941                        myPtrs->currentRouterPtr->sampled);
[30]942#endif                     
[34]943                myPtrs->currentRouterPtr->sampled = *((unsigned long*)&buffer4);
944                for (i=0; i<nbPV4; i++) {
945                  /* we update the PrefixV4 structure with the sampled information */
946                  if ( myPtrs->currentRouterPtr->IpAddress == myPtrs->routersID[V4PTab[i].routerNb]) {
947                    V4PTab[i].sampling = *((unsigned long*)&buffer4);
948                    myPtrs->secondV4Tab[i].sampling = *((unsigned long*)&buffer4);
949                  }
[29]950                }
951              }
952            }
953          }
954        }       
955        pftmp = pftmp->prev;
956      }
957      if ( pftmp == NULL ) {
958        while ((*myPtrs->offsetV9Ptr)%4 != 0) {
959          (*myPtrs->offsetV9Ptr)++;
[30]960#ifdef DEBUG
961          fprintf(stderr," p ");
962#endif
[29]963        }
964      } else {
965        fprintf(stderr,"PB ");
966      }
967#ifdef DEBUG
968      fprintf(stderr,">");
969#endif
[30]970      return (data_length+shift);
[29]971    } else {
972      /*
973       * template unknown, we skip this all the data
974       */
975      (*myPtrs->offsetV9Ptr)+=(data_length-4);
976      (*myPtrs->currentFlowsetNumberPtr) = myPtrs->currentHeaderV9Ptr->count;
977#ifdef DEBUG
978      fprintf(stderr, " U, r: %lu.%lu.%lu.%lu, sourceId: %lu, TID: %hu",
979              (myPtrs->pcktPtr->ipH->srcAdd>>24),
980              (myPtrs->pcktPtr->ipH->srcAdd<<8>>24),
981              (myPtrs->pcktPtr->ipH->srcAdd<<16>>24),
982              (myPtrs->pcktPtr->ipH->srcAdd<<24>>24),
983              myPtrs->currentHeaderV9Ptr->sourceId,
984              (*myPtrs->currentFlowsetIdPtr)
985              );
986#endif
[30]987      return (data_length+shift);
[29]988    }
[2]989  }
990}
Note: See TracBrowser for help on using the browser.