root/trunk/src/dataFlowSet.c @ 94

Revision 94, 43.6 KB (checked in by andreu, 14 years ago)

IPv6 aggregation : prefix reading

  • Property svn:eol-style set to native
Line 
1/*
2 * File: dataFlowSet.c
3 *
4 * Authors: ANDREU Francois-Xavier
5 *
6 * Copyright (C) 2005 - 2009 GIP RENATER
7 */
8
9/*  This file is part of renetcol.
10 *
11 *  renetcol is free software; you can redistribute it and/or modify
12 *  it under the terms of the GNU General Public License as published by
13 *  the Free Software Foundation; either version 2 of the License, or
14 *  (at your option) any later version.
15 *
16 *  renetcol is distributed in the hope that it will be useful,
17 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
18 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19 *  GNU General Public License for more details.
20 *
21 *  You should have received a copy of the GNU General Public License
22 *  along with renetcol; if not, write to the Free Software
23 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
24 */
25
26#include "dataFlowSet.h"
27
28/*
29 * Check Data FlowSet
30 *
31 */
32short 
33checkDataFlowSet(short shift,
34                 struct MyPtrs *myPtrs,
35                 int myQueue,
36                 struct PrefixV4 *V4PTab,
37                 size_t nbPV4,
38                 struct PrefixV4 *V4STab,
39                 size_t nbSV4
40                 )
41{
42  TplFlowSetPtr tmp = NULL;
43  TplOptionPtr tmpOpt = NULL;
44  FieldPtr pftmp = NULL;
45  FieldPtr secondPftmp = NULL;
46  unsigned short data_length = 0;
47  unsigned short flow_size = 0;
48  unsigned short oldOffset = *myPtrs->offsetV9Ptr;
49  unsigned short secondOffset = 0;
50  unsigned short secondOldOffset = 0;
51  int moreIsNecessary = 1;
52  int field_size = 0;
53  int cpt = 0;
54  int secondCpt = 0;
55  int overflow = 0;
56  int noEnd = 1;
57  int i = 0;
58  int j = 0;
59  int pos = 0;
60  unsigned char buffer1; 
61  unsigned char buffer2[2];
62  unsigned char buffer4[4];
63  RulesPtr tmpRuleList = myPtrs->rulesListPtr;
64  RulesPtr tmpRL = myPtrs->rulesListPtr;
65  msgType myMsg;
66  char *msgTextIndex;
67
68  unsigned short tplMsgType = 11;
69  struct PrefixV4 prefixKey, *res, *res2, *resSub; /* for bsearch */
70#if defined(IPV4AGGIDSNMP)
71  struct PrefixV4 *res3;
72#endif
73#ifdef ASACC
74  struct AS asKey, *asres; /* for bsearch */
75#endif
76  struct AggCache agCache;
77  int bool = 0; /* in IPV4 Agg mode enabled, we need to now if it's an IPv4 */
78  /* 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==16)||(pftmp->fieldType==17)){
302                if ((((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->stor.svalue)
303                    == ((unsigned short)*((unsigned long*)&buffer4)))
304                  {
305                    ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check = 1;
306                  }
307              }
308              if (pftmp->fieldType==1){
309                agCache.bytes = *((unsigned long*)&buffer4);
310                if (
311                    ((unsigned long)((((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->stor.lvalue) + ( (((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->stor.lvalue)*10/100))
312                     >= (*((unsigned long*)&buffer4)))
313                    &&
314                    ( (unsigned long)((((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->stor.lvalue) - ( (((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->stor.lvalue)*10/100))
315                      <= (*((unsigned long*)&buffer4)) )
316                    )
317                  {
318                    ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check = 1;
319                  }
320              }
321#if defined(IPV4AGGIDR) || defined(IPV4AGGIDSNMP)
322              if (pftmp->fieldType==10){
323                agCache.inputSnmp = (unsigned short)*((unsigned long*)&buffer4);
324              }
325              if (pftmp->fieldType==14){
326                agCache.outputSnmp = (unsigned short)*((unsigned long*)&buffer4);
327              }
328              if ((pftmp->fieldType==8)){
329                bool = 1; /* very important, test if we have an IPv4 flow for Agg */
330                agCache.v4AdS = *((unsigned long*)&buffer4);
331              }
332              if ((pftmp->fieldType==12)){
333                agCache.v4AdD = *((unsigned long*)&buffer4);
334              }
335              if (pftmp->fieldType==1){
336                agCache.bytes = *((unsigned long*)&buffer4);
337              }
338              if (pftmp->fieldType==2){
339                agCache.pkts = *((unsigned long*)&buffer4);
340              }
341#endif
342#ifdef ASACC
343              if (pftmp->fieldType==16){
344                agCache.asS = (unsigned short)*((unsigned long*)&buffer4);
345              }   
346              if (pftmp->fieldType==17){
347                agCache.asD = (unsigned short)*((unsigned long*)&buffer4);
348              }
349#endif
350              break;
351            case 16:
352              for (i=0; i<4; i++) {
353                buffer4[3]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
354                (*myPtrs->offsetV9Ptr)++;
355                buffer4[2]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
356                (*myPtrs->offsetV9Ptr)++;
357                buffer4[1]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
358                (*myPtrs->offsetV9Ptr)++;
359                buffer4[0]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
360                (*myPtrs->offsetV9Ptr)++;
361                if (1==moreIsNecessary){
362                  switch(i){
363                  case 0:
364                    if (((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->mask <= 32){
365                      if (ntohl(((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->stor.tabAdd6[i])
366                          ==
367                          (*((unsigned long*)&buffer4))>>(32-((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->mask)<<(32-((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->mask)
368                          )
369                        {
370                          ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check = 1;
371                          moreIsNecessary = 0;
372                        } else {
373                        ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check = 0;
374                        moreIsNecessary = 0;
375                      }
376                    } else {
377                      if (ntohl(((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->stor.tabAdd6[i])
378                          ==
379                          (*((unsigned long*)&buffer4))
380                          )
381                        {
382                          ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check = 1;
383                        } else {
384                        ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check = 0;
385                        moreIsNecessary = 0;
386                      }
387                    }
388                    break;
389                  case 1:
390                    if (((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->mask <= 64){
391                      if (ntohl(((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->stor.tabAdd6[i])
392                          ==
393                          (*((unsigned long*)&buffer4))>>(64-((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->mask)<<(64-((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->mask)
394                          )
395                        {
396                          ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check =
397                            ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check && 1;
398                          moreIsNecessary = 0;
399                        } else {
400                        ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check = 0;
401                        moreIsNecessary = 0;
402                      }
403                    } else {
404                      if (ntohl(((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->stor.tabAdd6[i])
405                          ==
406                          (*((unsigned long*)&buffer4))
407                          )
408                        {
409                          ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check =
410                            ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check && 1;
411                        } else {
412                        ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check = 0;
413                        moreIsNecessary = 0;
414                      }
415                    }
416                    break;
417                  case 2:
418                    if (((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->mask <= 96){
419                      if (ntohl(((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->stor.tabAdd6[i])
420                          ==
421                          (*((unsigned long*)&buffer4))>>(96-((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->mask)<<(96-((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->mask)
422                          )
423                        {
424                          ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check =
425                            ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check && 1;
426                          moreIsNecessary = 0;
427                        } else {
428                        ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check = 0;
429                        moreIsNecessary = 0;
430                      }
431                    } else {
432                      if (ntohl(((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->stor.tabAdd6[i])
433                          ==
434                          (*((unsigned long*)&buffer4))
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                    }
444                    break;
445                  case 3:
446                    if (((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->mask <= 128){
447                      if (ntohl(((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->stor.tabAdd6[i])
448                          ==
449                          (*((unsigned long*)&buffer4))>>(128-((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->mask)<<(128-((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->mask)
450                          )
451                        {
452                          ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check =
453                            ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check && 1;
454                        } else {
455                        ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check = 0;
456                        moreIsNecessary = 0;
457                      }
458                    } else {
459                      if (ntohl(((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->value->stor.tabAdd6[i])
460                          ==
461                          (*((unsigned long*)&buffer4))
462                          )
463                        {
464                          ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check =
465                            ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check && 1;
466                        } else {
467                        ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->check = 0;
468                        moreIsNecessary = 0;
469                      }
470                    }
471                    break;
472                  default:
473                    break;
474                  } /* end of switch(i) */
475                } /* end of if moreIsNecessary */
476              }
477              moreIsNecessary = 1;
478              /* aggregation for IPv6 flows */
479
480              /* end aggregation */
481              break;
482            default:
483              syslog(LOG_INFO, "Field size not known: %d\n", field_size);
484              for (i=0; i<field_size; i++){
485                (*myPtrs->offsetV9Ptr)++;
486              }
487              break;
488            }
489            break;
490          default:
491            syslog(LOG_INFO, "Operator not known: %d\n",
492                   (int)(((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->operator));
493            break;
494          }
495          j++;
496          pos = (pftmp->fieldType)*MAX_RULES_PER_FIELD+j;
497        } /* end while myPtrs->rulesAddressPtr */
498      } else {
499        /*
500         * no rule within this field type, but we must read the value
501         */
502        switch (field_size) {
503        case 1:
504          buffer1 = *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
505          (*myPtrs->offsetV9Ptr)++;
506#if defined(IPV4AGGIDR) || defined(IPV4AGGIDSNMP)
507          if ((pftmp->fieldType==9)||(pftmp->fieldType==29)){
508            agCache.maskS = *((unsigned char*)&buffer1);
509          }
510          if ((pftmp->fieldType==13)||(pftmp->fieldType==30)){
511            agCache.maskD = *((unsigned char*)&buffer1);
512          }
513          if (pftmp->fieldType==60){
514            agCache.ipProt = *((unsigned char*)&buffer1);
515          }
516          if (pftmp->fieldType==4){
517            agCache.tProt = *((unsigned char*)&buffer1);
518          }
519          if (pftmp->fieldType==61){
520            agCache.sens = *((unsigned char*)&buffer1);
521          }
522          if (pftmp->fieldType==5){
523            agCache.dscp = *((unsigned char*)&buffer1);
524          }       
525#endif
526          break;
527        case 2:
528          buffer2[1]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
529          (*myPtrs->offsetV9Ptr)++;
530          buffer2[0]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
531          (*myPtrs->offsetV9Ptr)++;
532#if defined(IPV4AGGIDR) || defined(IPV4AGGIDSNMP)
533          if (pftmp->fieldType==10){
534            agCache.inputSnmp = *((unsigned short*)&buffer2);
535          }       
536          if (pftmp->fieldType==14){
537            agCache.outputSnmp = *((unsigned short*)&buffer2);
538          }       
539#endif
540#ifdef ASACC
541          if (pftmp->fieldType==16){
542            agCache.asS = *((unsigned short*)&buffer2);
543          }       
544          if (pftmp->fieldType==17){
545            agCache.asD = *((unsigned short*)&buffer2);
546          }
547#endif
548          break;
549        case 3:
550          buffer4[3]= 0;
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          /* aggregation */
558          /* end aggregation */
559          if (pftmp->fieldType==70){
560            isMplsFlow = 1;
561          }
562          break;
563        case 4:
564          buffer4[3]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
565          (*myPtrs->offsetV9Ptr)++;
566          buffer4[2]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
567          (*myPtrs->offsetV9Ptr)++;
568          buffer4[1]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
569          (*myPtrs->offsetV9Ptr)++;
570          buffer4[0]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
571          (*myPtrs->offsetV9Ptr)++;
572#if defined(IPV4AGGIDR) || defined(IPV4AGGIDSNMP)
573          if (pftmp->fieldType==10){
574            agCache.inputSnmp = (unsigned short)*((unsigned long*)&buffer4);
575          }
576          if (pftmp->fieldType==14){
577            agCache.outputSnmp = (unsigned short)*((unsigned long*)&buffer4);
578          }
579          if ((pftmp->fieldType==8)){
580            bool = 1;
581            agCache.v4AdS = *((unsigned long*)&buffer4);
582          } else if ((pftmp->fieldType==12)){
583            agCache.v4AdD = *((unsigned long*)&buffer4);
584          } else if (pftmp->fieldType==1){
585            agCache.bytes = *((unsigned long*)&buffer4);
586          } else if (pftmp->fieldType==2){
587            agCache.pkts = *((unsigned long*)&buffer4);
588          }
589#endif
590#ifdef ASACC
591          if (pftmp->fieldType==16){
592            agCache.asS = (unsigned short)*((unsigned long*)&buffer4);
593          }       
594          if (pftmp->fieldType==17){
595            agCache.asD = (unsigned short)*((unsigned long*)&buffer4);
596          }
597#endif
598          break;
599        case 16:
600          for (i=0; i<4; i++) {
601            buffer2[1]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
602            (*myPtrs->offsetV9Ptr)++;
603            buffer2[0]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
604            (*myPtrs->offsetV9Ptr)++;
605            buffer2[1]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
606            (*myPtrs->offsetV9Ptr)++;
607            buffer2[0]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr));
608            (*myPtrs->offsetV9Ptr)++;
609          }
610          /* aggregation IPv6 */         
611          /* end aggregation */
612          break;
613        default:
614          syslog(LOG_INFO,"UNKNOWN FIELDS LENGTH: %d ", field_size);
615          for (i=0; i<field_size; i++){
616            (*myPtrs->offsetV9Ptr)++;
617          }
618        }
619      } /* end if one cache table line existence */
620      if (cpt==tmp->fieldCount) {
621        /*
622         * end of one flow (not the flowset)
623         */
624
625        /* put aggregation cache information to IPv4 Prefixes table */
626        /* Aggregation mode must be enable in ./configure options   */
627        /* first we must know if the address belong to our prefix   */
628        /*
629         * AS ACCOUNTING
630         */
631#if defined(ASACC) && defined(IPV4AGGIDSNMP)
632        if ( (bool == 1) && (isMplsFlow == 0) ){
633          asKey.as = agCache.asS;
634          asres = bsearch(&asKey, myPtrs->currentASTab, myPtrs->asNb, sizeof(struct AS), asGlobalCmp);
635          if (asres != NULL) {
636            if ( myPtrs->currentRouterPtr->snmpIndexList[agCache.inputSnmp] == 1  ) {
637#if defined(MULTISAMPLING)
638              if (myPtrs->currentRouterPtr->sampled != asres->sampling ){
639                /* OUT ("traffic from the AS")  */
640                asres->bytesNbOUT += agCache.bytes*myPtrs->currentRouterPtr->sampled/asres->sampling;
641                asres->pktsNbOUT += agCache.pkts*myPtrs->currentRouterPtr->sampled/asres->sampling;
642              }else{
643                asres->bytesNbOUT += agCache.bytes;
644                asres->pktsNbOUT += agCache.pkts;
645                (asres->flowNbOUT)++;
646              }
647#else
648              if (myPtrs->currentRouterPtr->sampled != 0 ){
649                /* OUT ("traffic from the AS")  */
650                asres->bytesNbOUT += agCache.bytes;
651                asres->pktsNbOUT += agCache.pkts;
652                (asres->flowNbOUT)++;
653              }
654              if (asres->sampling == 0
655                  && myPtrs->currentRouterPtr->sampled != 0){
656                asres->sampling = myPtrs->currentRouterPtr->sampled;
657              }
658#endif
659              asres = NULL;
660              asKey.as = agCache.asD;
661              asres = bsearch(&asKey, myPtrs->currentASTab, myPtrs->asNb, sizeof(struct AS), asGlobalCmp);
662              if (asres!=NULL){
663#if defined(MULTISAMPLING)
664                if (myPtrs->currentRouterPtr->sampled != asres->sampling ){
665                  /* IN ("traffic to the AS")  */
666                  asres->bytesNbIN += agCache.bytes*myPtrs->currentRouterPtr->sampled/asres->sampling;
667                  asres->pktsNbIN += agCache.pkts*myPtrs->currentRouterPtr->sampled/asres->sampling;
668                }else{
669                  asres->bytesNbIN += agCache.bytes;
670                  asres->pktsNbIN += agCache.pkts;
671                  (asres->flowNbIN)++;
672                }
673#else
674                if (myPtrs->currentRouterPtr->sampled != 0 ){
675                  /* IN ("traffic to the AS")  */
676                  asres->bytesNbIN += agCache.bytes;
677                  asres->pktsNbIN += agCache.pkts;
678                  (asres->flowNbIN)++;
679                }
680                if (asres->sampling == 0
681                    && myPtrs->currentRouterPtr->sampled != 0){
682                  asres->sampling = myPtrs->currentRouterPtr->sampled;
683                }
684#endif
685                asres = NULL;
686              }
687            }
688          } else {
689            asres = NULL;
690            asKey.as = agCache.asD;
691            asres = bsearch(&asKey, myPtrs->currentASTab, myPtrs->asNb, sizeof(struct AS), asGlobalCmp);
692            if (asres!=NULL){
693              if ( myPtrs->currentRouterPtr->snmpIndexList[agCache.inputSnmp] == 1  ) {
694#if defined(MULTISAMPLING)
695                if (myPtrs->currentRouterPtr->sampled != asres->sampling ){
696                  /* IN ("traffic to the AS")  */
697                  asres->bytesNbIN += agCache.bytes*myPtrs->currentRouterPtr->sampled/asres->sampling;
698                  asres->pktsNbIN += agCache.pkts*myPtrs->currentRouterPtr->sampled/asres->sampling;
699                }else{
700                  asres->bytesNbIN += agCache.bytes;
701                  asres->pktsNbIN += agCache.pkts;
702                  (asres->flowNbIN)++;
703                }
704#else
705                if (myPtrs->currentRouterPtr->sampled != 0 ){
706                  /* IN ("traffic to the AS")  */
707                  asres->bytesNbIN += agCache.bytes;
708                  asres->pktsNbIN += agCache.pkts;
709                  (asres->flowNbIN)++;
710                }
711                if (asres->sampling == 0
712                    && myPtrs->currentRouterPtr->sampled != 0){
713                  asres->sampling = myPtrs->currentRouterPtr->sampled;
714                }
715#endif
716              }
717            }
718          }
719        }
720#endif
721        /*
722         * PREFIX &/or MATRIX ACCOUNTING
723         */
724#if defined(IPV4AGGIDR) || defined(IPV4AGGIDSNMP)
725        if ( (bool == 1) && (isMplsFlow == 0) ){
726          prefixKey.beginning = agCache.v4AdS>>(32-agCache.maskS)<<(32-agCache.maskS);
727          res = bsearch(&prefixKey, V4PTab, nbPV4,
728                        sizeof(struct PrefixV4), prefGlobalCmp);
729          if (res!=NULL){
730            /* WE HAVE FOUND SOURCE ADDRESS IN OUR LIST */
731            if (res->hasSubnet == 1) {
732              resSub = NULL;
733              resSub = bsearch(&prefixKey, V4STab, nbSV4,
734                               sizeof(struct PrefixV4), prefGlobalCmp);
735              if (resSub != NULL) {
736                res = resSub;
737                resSub = NULL;
738              }
739            }
740#ifdef DEBUG
741            fprintf(stderr,"S %lu.%lu.%lu.%lu/%hu %lu.%lu.%lu.%lu/%hu Rs %lu Ps %lu SNMPin(hu) %hu\n",
742                    (agCache.v4AdS>>24),
743                    (agCache.v4AdS<<8>>24),
744                    (agCache.v4AdS<<16>>24),
745                    (agCache.v4AdS<<24>>24),
746                    (agCache.maskS),
747                    (agCache.v4AdD>>24),
748                    (agCache.v4AdD<<8>>24),
749                    (agCache.v4AdD<<16>>24),
750                    (agCache.v4AdD<<24>>24),
751                    (agCache.maskD),
752                    myPtrs->currentRouterPtr->sampled,
753                    res->sampling,
754                    agCache.inputSnmp);
755#endif
756#if defined(IPV4AGGIDR)
757            if ( myPtrs->routersID[res->routerNb] == agCache.routerAd  ) {
758#elif defined(IPV4AGGIDSNMP)
759              if ( myPtrs->currentRouterPtr->snmpIndexList[agCache.inputSnmp] == 1  ) {       
760#endif
761                /* OUT ("traffic from the prefix/subnet")  */
762#if defined(MULTISAMPLING)
763                if (myPtrs->currentRouterPtr->sampled != res->sampling ){
764                  res->bytesNbOUT += agCache.bytes*myPtrs->currentRouterPtr->sampled/res->sampling;
765                  res->pktsNbOUT += agCache.pkts*myPtrs->currentRouterPtr->sampled/res->sampling;
766                  /* (res->flowNbOUT)++; FIXME : FIND SOMETHING*/
767                  if (agCache.dscp>>2 == FIRST_CoS) {
768                    res->firstCoSOUT += agCache.bytes*myPtrs->currentRouterPtr->sampled/res->sampling;
769                  } else if (agCache.dscp>>2 == SECOND_CoS) {
770                    res->secondCoSOUT += agCache.bytes*myPtrs->currentRouterPtr->sampled/res->sampling;
771                  } else if (agCache.dscp>>2 == THIRD_CoS) {
772                    res->thirdCoSOUT += agCache.bytes*myPtrs->currentRouterPtr->sampled/res->sampling;
773                  } else {
774                    res->fourthCoSOUT += agCache.bytes*myPtrs->currentRouterPtr->sampled/res->sampling;
775                  }
776                }else{
777                  res->bytesNbOUT += agCache.bytes;
778                  res->pktsNbOUT += agCache.pkts;
779                  (res->flowNbOUT)++;
780                  if (agCache.dscp>>2 == FIRST_CoS) {
781                    res->firstCoSOUT += agCache.bytes;
782                  } else if (agCache.dscp>>2 == SECOND_CoS) {
783                    res->secondCoSOUT += agCache.bytes;
784                  } else if (agCache.dscp>>2 == THIRD_CoS) {
785                    res->thirdCoSOUT += agCache.bytes;
786                  } else {
787                    res->fourthCoSOUT += agCache.bytes;
788                  }
789                }
790#else
791                if (myPtrs->currentRouterPtr->sampled != 0 ){
792                  res->bytesNbOUT += agCache.bytes;
793                  res->pktsNbOUT += agCache.pkts;
794                  (res->flowNbOUT)++;
795                  if (agCache.dscp>>2 == FIRST_CoS) {
796                    res->firstCoSOUT += agCache.bytes;
797                  } else if (agCache.dscp>>2 == SECOND_CoS) {
798                    res->secondCoSOUT += agCache.bytes;
799                  } else if (agCache.dscp>>2 == THIRD_CoS) {
800                    res->thirdCoSOUT += agCache.bytes;
801                  } else {
802                    res->fourthCoSOUT += agCache.bytes;
803                  }
804                }
805                if (res->sampling == 0
806                    && myPtrs->currentRouterPtr->sampled != 0){
807                  res->sampling = myPtrs->currentRouterPtr->sampled;
808                }
809#endif
810#if defined(IPV4AGGIDSNMP)
811                prefixKey.beginning = agCache.v4AdD>>(32-agCache.maskD)<<(32-agCache.maskD);
812                res3 = bsearch(&prefixKey, V4PTab, nbPV4,
813                               sizeof(struct PrefixV4), prefGlobalCmp);
814                if (res3!=NULL){
815                  /* res is supernet or subnet ? */
816                  if (res3->hasSubnet == 1) {
817                    resSub = NULL;
818                    resSub = bsearch(&prefixKey, V4STab, nbSV4,
819                                     sizeof(struct PrefixV4), prefGlobalCmp);
820                    if (resSub != NULL) {
821                      res3 = resSub;
822                      resSub = NULL;
823                    }
824                  }
825#ifdef DEBUG
826            fprintf(stderr,"S&D %lu.%lu.%lu.%lu/%hu %lu.%lu.%lu.%lu/%hu Rs %lu Ps %lu SNMPin %hu\n",
827                    (agCache.v4AdS>>24),
828                    (agCache.v4AdS<<8>>24),
829                    (agCache.v4AdS<<16>>24),
830                    (agCache.v4AdS<<24>>24),
831                    (agCache.maskS),
832                    (agCache.v4AdD>>24),
833                    (agCache.v4AdD<<8>>24),
834                    (agCache.v4AdD<<16>>24),
835                    (agCache.v4AdD<<24>>24),
836                    (agCache.maskD),
837                    myPtrs->currentRouterPtr->sampled,
838                    res3->sampling,
839                    agCache.inputSnmp);
840#endif
841#if defined(MULTISAMPLING)
842                  if (myPtrs->currentRouterPtr->sampled != res3->sampling ){
843                    res3->bytesNbIN += agCache.bytes*myPtrs->currentRouterPtr->sampled/res3->sampling;
844                    res3->pktsNbIN += agCache.pkts*myPtrs->currentRouterPtr->sampled/res3->sampling;
845                    /* (res3->flowNbIN)++;  FIXME : FIND SOMETHING */
846                    if (agCache.dscp>>2 == FIRST_CoS) {
847                      res3->firstCoSIN += agCache.bytes*myPtrs->currentRouterPtr->sampled/res3->sampling;
848                    } else if (agCache.dscp>>2 == SECOND_CoS) {
849                      res3->secondCoSIN += agCache.bytes*myPtrs->currentRouterPtr->sampled/res3->sampling;
850                    } else if (agCache.dscp>>2 == THIRD_CoS) {
851                      res3->thirdCoSIN += agCache.bytes*myPtrs->currentRouterPtr->sampled/res3->sampling;
852                    } else {
853                      res3->fourthCoSIN += agCache.bytes*myPtrs->currentRouterPtr->sampled/res3->sampling;
854                    }
855                  }else{
856                    res3->bytesNbIN += agCache.bytes;
857                    res3->pktsNbIN += agCache.pkts;
858                    (res3->flowNbIN)++;
859                    if (agCache.dscp>>2 == FIRST_CoS) {
860                      res3->firstCoSIN += agCache.bytes;
861                    } else if (agCache.dscp>>2 == SECOND_CoS) {
862                      res3->secondCoSIN += agCache.bytes;
863                    } else if (agCache.dscp>>2 == THIRD_CoS) {
864                      res3->thirdCoSIN += agCache.bytes;
865                    } else {
866                      res3->fourthCoSIN += agCache.bytes;
867                    }
868                  }
869#else
870                  if (myPtrs->currentRouterPtr->sampled != 0 ){
871                    /* IN ("traffic to the prefix/subnet")  */
872                    res3->bytesNbIN += agCache.bytes;
873                    res3->pktsNbIN += agCache.pkts;
874                    (res3->flowNbIN)++;
875                    if (agCache.dscp>>2 == FIRST_CoS) {
876                      res3->firstCoSIN += agCache.bytes;
877                    } else if (agCache.dscp>>2 == SECOND_CoS) {
878                      res3->secondCoSIN += agCache.bytes;
879                    } else if (agCache.dscp>>2 == THIRD_CoS) {
880                      res3->thirdCoSIN += agCache.bytes;
881                    } else {
882                      res3->fourthCoSIN += agCache.bytes;
883                    }
884                  }
885                  if (res3->sampling == 0
886                      && myPtrs->currentRouterPtr->sampled != 0){
887                    res3->sampling = myPtrs->currentRouterPtr->sampled;
888                  }
889#endif
890                }
891#endif
892#if defined(MATRIX) && defined(IPV4AGGIDR)
893                /* inter-pop matrix Accounting */
894                prefixKey.beginning = agCache.v4AdD>>(32-agCache.maskD)<<(32-agCache.maskD);
895                res2 = bsearch(&prefixKey, V4PTab, nbPV4,
896                               sizeof(struct PrefixV4), prefGlobalCmp);
897                if (res2!=NULL){               
898                  ((struct POP *)((myPtrs->matrixPOP)
899                                  +((res->routerNb)*ROUTER_INDEX_MAX)
900                                  +((res2->routerNb))))->pktsNb += agCache.pkts;
901                  ((struct POP *)((myPtrs->matrixPOP)
902                                  +((res->routerNb)*ROUTER_INDEX_MAX)
903                                  +((res2->routerNb))))->bytesNb += agCache.bytes;
904                  ((struct POP *)((myPtrs->matrixPOP)
905                                  +((res->routerNb)*ROUTER_INDEX_MAX)
906                                  +((res2->routerNb))))->flowNb++;
907                } else {
908                  (
909                   ((struct POP *)(myPtrs->matrixPOP)
910                    +((res->routerNb)*ROUTER_INDEX_MAX)
911                    +((ROUTER_INDEX_MAX-1))))->pktsNb += agCache.pkts;
912                  (
913                   ((struct POP *)(myPtrs->matrixPOP)
914                    +((res->routerNb)*ROUTER_INDEX_MAX)
915                    +((ROUTER_INDEX_MAX-1))))->bytesNb += agCache.bytes;
916                  (
917                   ((struct POP *)(myPtrs->matrixPOP)
918                    +((res->routerNb)*ROUTER_INDEX_MAX)
919                    +((ROUTER_INDEX_MAX-1))))->flowNb++;
920                }
921                /* end interpop matrix accounting */
922#endif /* matrix */
923              } else {
924                /* doublon or bad reference in prefix list */
925#if defined(IPV4AGGIDR)
926              }
927#elif defined(IPV4AGGIDSNMP)
928            }
929#endif
930          } else { /* SOURCE ADDRESS DOESN'T IN OUR LIST */
931            prefixKey.beginning = agCache.v4AdD>>(32-agCache.maskD)<<(32-agCache.maskD);
932            res = bsearch(&prefixKey, V4PTab, nbPV4,
933                          sizeof(struct PrefixV4), prefGlobalCmp);
934            if (res!=NULL){
935              /* DESTINATION ADDRESS IS IN OUR LIST */
936              if (res->hasSubnet == 1) {
937                resSub = NULL;
938                resSub = bsearch(&prefixKey, V4STab, nbSV4,
939                                 sizeof(struct PrefixV4), prefGlobalCmp);
940                if (resSub != NULL) {
941                  res = resSub;
942                  resSub = NULL;
943                }
944              }
945#ifdef DEBUG
946            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",
947                    (agCache.v4AdS>>24),
948                    (agCache.v4AdS<<8>>24),
949                    (agCache.v4AdS<<16>>24),
950                    (agCache.v4AdS<<24>>24),
951                    (agCache.maskS),
952                    (agCache.v4AdD>>24),
953                    (agCache.v4AdD<<8>>24),
954                    (agCache.v4AdD<<16>>24),
955                    (agCache.v4AdD<<24>>24),
956                    (agCache.maskD),
957                    myPtrs->currentRouterPtr->sampled,
958                    res->sampling,
959                    (myPtrs->pcktPtr->ipH->srcAdd>>24),
960                    (myPtrs->pcktPtr->ipH->srcAdd<<8>>24),
961                    (myPtrs->pcktPtr->ipH->srcAdd<<16>>24),
962                    (myPtrs->pcktPtr->ipH->srcAdd<<24>>24),
963                    agCache.inputSnmp);
964#endif
965#if defined(IPV4AGGIDSNMP)
966              if ( myPtrs->currentRouterPtr->snmpIndexList[agCache.inputSnmp] == 1  ) {
967#if defined(MULTISAMPLING)
968                if (myPtrs->currentRouterPtr->sampled != res->sampling ){
969                  res->bytesNbIN += agCache.bytes*myPtrs->currentRouterPtr->sampled/res->sampling;
970                  res->pktsNbIN += agCache.pkts*myPtrs->currentRouterPtr->sampled/res->sampling;
971                  if (agCache.dscp>>2 == FIRST_CoS) {
972                    res->firstCoSIN += agCache.bytes*myPtrs->currentRouterPtr->sampled/res->sampling;
973                  } else if (agCache.dscp>>2 == SECOND_CoS) {
974                    res->secondCoSIN += agCache.bytes*myPtrs->currentRouterPtr->sampled/res->sampling;
975                  } else if (agCache.dscp>>2 == THIRD_CoS) {
976                    res->thirdCoSIN += agCache.bytes*myPtrs->currentRouterPtr->sampled/res->sampling;
977                  } else {
978                    res->fourthCoSIN += agCache.bytes*myPtrs->currentRouterPtr->sampled/res->sampling;
979                  }
980                }else{
981                  res->bytesNbIN += agCache.bytes;
982                  res->pktsNbIN += agCache.pkts;
983                  (res->flowNbIN)++;
984                  if (agCache.dscp>>2 == FIRST_CoS) {
985                    res->firstCoSIN += agCache.bytes;
986                  } else if (agCache.dscp>>2 == SECOND_CoS) {
987                    res->secondCoSIN += agCache.bytes;
988                  } else if (agCache.dscp>>2 == THIRD_CoS) {
989                    res->thirdCoSIN += agCache.bytes;
990                  } else {
991                    res->fourthCoSIN += agCache.bytes;
992                  }
993                }
994#else
995                if (myPtrs->currentRouterPtr->sampled != 0 ){
996                  /* IN ("traffic to the prefix/subnet")  */
997                  res->bytesNbIN += agCache.bytes;
998                  res->pktsNbIN += agCache.pkts;
999                  (res->flowNbIN)++;
1000                  if (agCache.dscp>>2 == FIRST_CoS) {
1001                    res->firstCoSIN += agCache.bytes;
1002                  } else if (agCache.dscp>>2 == SECOND_CoS) {
1003                    res->secondCoSIN += agCache.bytes;
1004                  } else if (agCache.dscp>>2 == THIRD_CoS) {
1005                    res->thirdCoSIN += agCache.bytes;
1006                  } else {
1007                    res->fourthCoSIN += agCache.bytes;
1008                  }
1009                }
1010#endif
1011              }
1012#endif
1013#if defined(IPV4AGGIDR)
1014              if ( myPtrs->routersID[res->routerNb] == agCache.routerAd  ) {
1015                if (myPtrs->currentRouterPtr->sampled != 0 ){
1016                  /* IN ("traffic to the prefix")  */
1017                  res->bytesNbIN += agCache.bytes;
1018                  res->pktsNbIN += agCache.pkts;
1019                  (res->flowNbIN)++;
1020                  if (agCache.dscp>>2 == FIRST_CoS) {
1021                    res->firstCoSIN += agCache.bytes;
1022                  } else if (agCache.dscp>>2 == SECOND_CoS) {
1023                    res->secondCoSIN += agCache.bytes;
1024                  } else if (agCache.dscp>>2 == THIRD_CoS) {
1025                    res->thirdCoSIN += agCache.bytes;
1026                  } else {
1027                    res->fourthCoSIN += agCache.bytes;
1028                  }
1029                }
1030              }
1031              if (res->sampling == 0
1032                  && myPtrs->currentRouterPtr->sampled != 0 ){
1033                res->sampling = myPtrs->currentRouterPtr->sampled;
1034              }
1035#endif
1036            } else {
1037              /* UNKNOW SUBNET CASE                                        */
1038              /*                                                           */
1039              /* HERE : we are in the cases of the address/mask don't      */
1040              /*        belong to a prefix listed in the IPv4 prefix file  */
1041              /* possibilities :                                           */
1042              /*     -  prefix not referenced but allowed to be routed     */
1043              /*     -  prefix not referenced but not allowed to be routed */
1044              /*     -  spoofing                                           */
1045#ifdef PRINTUNKNOWNSUBNET 
1046              fprintf(stderr, "%lu.%lu.%lu.%lu/%hu -> %lu.%lu.%lu.%lu/%hu (R:%lu.%lu.%lu.%lu) \n",
1047                      (agCache.v4AdS>>24),
1048                      (agCache.v4AdS<<8>>24),
1049                      (agCache.v4AdS<<16>>24),
1050                      (agCache.v4AdS<<24>>24),
1051                      (agCache.maskS),
1052                      (agCache.v4AdD>>24),
1053                      (agCache.v4AdD<<8>>24),
1054                      (agCache.v4AdD<<16>>24),
1055                      (agCache.v4AdD<<24>>24),
1056                      (agCache.maskD),
1057                      (myPtrs->pcktPtr->ipH->srcAdd>>24),
1058                      (myPtrs->pcktPtr->ipH->srcAdd<<8>>24),
1059                      (myPtrs->pcktPtr->ipH->srcAdd<<16>>24),
1060                      (myPtrs->pcktPtr->ipH->srcAdd<<24>>24)
1061                      );
1062#endif /* PRINTUNKNOWNSUBNET */
1063            }
1064          } /* end of the Destination prefix is in our list */
1065        } /* end of the prefix is in our list */
1066        bool = 0;
1067        isMplsFlow = 0;
1068#endif /* (IPV4AGGIDR) || (IPV4AGGIDSNMP) */
1069        /*
1070         *
1071         * SOCKET OUTPUT TO A REMOTE CLIENT
1072         *
1073         * switch the rules definition (check & fieldToRecord),
1074         * we send the flow or a part of the flow to a remote host or a file.
1075         * In a first time (until release 0.0.7, the information was sent via
1076         * the process renetcolSender with an IPC message queue. But, the perf
1077         * of IPC Msg was very bad with a default system compilation.
1078         * So, now, we send information directly from here through sockets.
1079         */
1080        tmpRuleList = myPtrs->rulesListPtr;
1081        tmpRL = myPtrs->rulesListPtr;
1082        while (tmpRuleList){
1083          RuleDefPtr tmpRuleDefList = tmpRuleList->def;
1084          unsigned short check = 1;
1085          int s=0;
1086          secondOffset = secondOldOffset;
1087          while (tmpRuleDefList){
1088            check = check && tmpRuleDefList->check;
1089            tmpRuleDefList->check = 0;
1090            tmpRuleDefList = tmpRuleDefList->next;
1091          }
1092          if ( (tmpRuleList->def != NULL) && (check == 1)) {
1093            /* msg building */
1094            secondPftmp = tmp->lastField;
1095            msgTextIndex = mempcpy(mempcpy(mempcpy(myMsg.text,   
1096                                                   &tplMsgType,
1097                                                   sizeof(unsigned short)
1098                                                   ),
1099                                           &tmpRuleList->id,
1100                                           sizeof(tmpRuleList->id)
1101                                           ),
1102                                   &myPtrs->currentRouterPtr->IpAddress,
1103                                   sizeof(unsigned long)
1104                                   );
1105            msgTextIndex = mempcpy(mempcpy(mempcpy(msgTextIndex,
1106                                                   &tmp->sourceId,
1107                                                   sizeof(unsigned long)
1108                                                   ),
1109                                           &tmp->templateFlowSetId,
1110                                           sizeof(tmp->templateFlowSetId)
1111                                           ),
1112                                   myPtrs->ptr_buffer+secondOffset,
1113                                   flow_size
1114                                   );
1115            myMsg.type = 1;
1116             
1117
1118            /* NEW transfert type */
1119            for ( ; tmpRL; tmpRL=tmpRL->next){
1120              if (tmpRL->id == tmpRuleList->id){       
1121                s = sendMessage(tmpRL->host->sockId, myMsg.text, sizeof(myMsg.text),
1122                                tmpRL->host->hostAddressPtr);
1123              }
1124            }
1125            /* FIXME : perhaps check "s" */
1126            noEnd = 1;
1127            secondCpt=0;
1128          } /* end if check */
1129          tmpRuleList = tmpRuleList->next;
1130          tmpRL = myPtrs->rulesListPtr; /* ticket #11 */
1131          secondPftmp = tmp->lastField;
1132        } /* end while tmpRuleList */
1133        /*
1134         * end redirection
1135         */
1136        secondOffset = *myPtrs->offsetV9Ptr;
1137        secondOldOffset = secondOffset;
1138        pftmp = tmp->lastField;
1139        cpt=0;
1140        (*myPtrs->currentFlowsetNumberPtr)++; /* pointer on the flows number */
1141        if (((*myPtrs->offsetV9Ptr)-48-shift+flow_size) > data_length){
1142          overflow = 1; /* buffer index not correct */
1143        }
1144      } else {
1145        /* not the flow end, progress in field list */
1146        pftmp = pftmp->prev;
1147      }
1148    } /* end of the while on one flow record */
1149     
1150    while ( ((*myPtrs->offsetV9Ptr)-48-shift) < data_length ) {
1151      (*myPtrs->offsetV9Ptr)++; /* if padding */
1152      paddingCounter++;
1153      if ( paddingCounter > 8 ) {
1154#ifdef DEBUG
1155        fprintf(stderr," padding too high: %d ", paddingCounter);
1156#endif
1157        syslog(LOG_INFO,"padding too high: %d ", paddingCounter);
1158        return (-1);
1159      }
1160    }
1161    while ( (*myPtrs->offsetV9Ptr)-48-shift > data_length ) {
1162      (*myPtrs->offsetV9Ptr)--; /* crazy loop (when bug appears in template def) */
1163      crazyCounter++;
1164    }
1165#ifdef DEBUG
1166    if (crazyCounter != 0){ fprintf(stderr," crazyCounter: %d ", crazyCounter); }
1167#endif
1168    if (crazyCounter!=0) { syslog(LOG_INFO,"crazyCounter: %d ", crazyCounter);}
1169     
1170#ifdef DEBUG
1171    fprintf(stderr,"}");
1172#endif
1173     
1174    return (data_length+shift);
1175    /* end new place */
1176
1177  } else {
1178    /*
1179     *
1180     *
1181     *  OPTIONAL TEMPLATE
1182     *
1183     *
1184     */
1185    if ((tmpOpt=existTplOptId(myPtrs->currentRouterPtr, myPtrs->currentHeaderV9Ptr->sourceId,
1186                              (*myPtrs->currentFlowsetIdPtr)))!=NULL) {       
1187#ifdef DEBUG
1188      fprintf(stderr,"<d id: %hu, lg %hu", (*myPtrs->currentFlowsetIdPtr), data_length);
1189#endif
1190      for ( i=0; i<(tmpOpt->optionScopeLg/4); i++){
1191        /* FIXME : today we skip the scope fields, it's bad :( */ 
1192        if ((pftmp=tmpOpt->lastField)!=NULL) {
1193          for (j=0; j<pftmp->fieldLength; j++) {
1194            (*myPtrs->offsetV9Ptr)++;
1195          }
1196          pftmp = pftmp->prev;
1197        }
1198      }
1199      while (pftmp != NULL) {
1200        if (pftmp->fieldLength==1){
1201          buffer1 = *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr)); (*myPtrs->offsetV9Ptr)++;
1202        }
1203        if (pftmp->fieldLength==2){
1204          buffer2[1]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr)); (*myPtrs->offsetV9Ptr)++;
1205          buffer2[0]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr)); (*myPtrs->offsetV9Ptr)++;
1206        }
1207        if (pftmp->fieldLength==4){
1208          buffer4[3]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr)); (*myPtrs->offsetV9Ptr)++;
1209          buffer4[2]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr)); (*myPtrs->offsetV9Ptr)++;
1210          buffer4[1]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr)); (*myPtrs->offsetV9Ptr)++;
1211          buffer4[0]= *(myPtrs->ptr_buffer+(*myPtrs->offsetV9Ptr)); (*myPtrs->offsetV9Ptr)++;
1212          if (pftmp->fieldType==34||pftmp->fieldType==50){
1213            if ((*((unsigned long*)&buffer4)==1)
1214                || (*((unsigned long*)&buffer4)==10)
1215                || (*((unsigned long*)&buffer4)==100)
1216                || (*((unsigned long*)&buffer4)==1000)) {
1217              if (myPtrs->currentRouterPtr->sampled != *((unsigned long*)&buffer4) ) {
1218#ifdef DEBUGAGG
1219                fprintf(stderr,"\n SV (p) %lu != %lu (r)", *((unsigned long*)&buffer4),
1220                        myPtrs->currentRouterPtr->sampled);
1221#endif
1222                syslog(LOG_INFO,"Sampling value change for router : %lu.%lu.%lu.%lu, old: %lu, new: %lu",
1223                       (myPtrs->pcktPtr->ipH->srcAdd>>24),
1224                       (myPtrs->pcktPtr->ipH->srcAdd<<8>>24),
1225                       (myPtrs->pcktPtr->ipH->srcAdd<<16>>24),
1226                       (myPtrs->pcktPtr->ipH->srcAdd<<24>>24),
1227                       myPtrs->currentRouterPtr->sampled,
1228                       *((unsigned long*)&buffer4)
1229                       );
1230                myPtrs->currentRouterPtr->sampled = *((unsigned long*)&buffer4);
1231              }
1232            }else{
1233              syslog(LOG_INFO,"Sampling value not standard for router : %lu.%lu.%lu.%lu, value : %lu",
1234                     (myPtrs->pcktPtr->ipH->srcAdd>>24),
1235                     (myPtrs->pcktPtr->ipH->srcAdd<<8>>24),
1236                     (myPtrs->pcktPtr->ipH->srcAdd<<16>>24),
1237                     (myPtrs->pcktPtr->ipH->srcAdd<<24>>24),
1238                     *((unsigned long*)&buffer4)
1239                     );
1240            }
1241          }
1242        }       
1243        pftmp = pftmp->prev;
1244      }
1245      if ( pftmp == NULL ) {
1246        while ((*myPtrs->offsetV9Ptr)%4 != 0) {
1247          (*myPtrs->offsetV9Ptr)++;
1248#ifdef DEBUG
1249          fprintf(stderr," p ");
1250#endif
1251        }
1252      } else {
1253        fprintf(stderr,"PB ");
1254      }
1255#ifdef DEBUG
1256      fprintf(stderr,">");
1257#endif
1258      return (data_length+shift);
1259    } else {
1260      /*
1261       * template unknown, we skip this all the data
1262       */
1263      (*myPtrs->offsetV9Ptr)+=(data_length-4);
1264      (*myPtrs->currentFlowsetNumberPtr) = myPtrs->currentHeaderV9Ptr->count;
1265#ifdef DEBUG
1266      fprintf(stderr, " U, r: %lu.%lu.%lu.%lu, sourceId: %lu, TID: %hu",
1267              (myPtrs->pcktPtr->ipH->srcAdd>>24),
1268              (myPtrs->pcktPtr->ipH->srcAdd<<8>>24),
1269              (myPtrs->pcktPtr->ipH->srcAdd<<16>>24),
1270              (myPtrs->pcktPtr->ipH->srcAdd<<24>>24),
1271              myPtrs->currentHeaderV9Ptr->sourceId,
1272              (*myPtrs->currentFlowsetIdPtr)
1273              );
1274#endif
1275      return (data_length+shift);
1276    }
1277  }
1278}
Note: See TracBrowser for help on using the browser.