root/trunk/src/dataFlowSet.c @ 85

Revision 85, 37.9 KB (checked in by andreu, 14 years ago)

#ticket 24

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