Changeset 27 for trunk/src/dataFlowSet.c

Show
Ignore:
Timestamp:
04/05/07 18:10:36 (16 years ago)
Author:
andreu
Message:

explicite output to find wrong definition bug - memory leak in renetcolAgg find

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/src/dataFlowSet.c

    r25 r27  
    3030 * 
    3131 */ 
    32 unsigned short  
    33 checkDataFlowSet(unsigned short shift,  
     32short  
     33checkDataFlowSet(short shift,  
    3434                 struct MyPtrs *myPtrs, 
    3535                 int myQueue,  
     
    6666  int bool = 0; /* in IPV4 Agg mode enabled, we need to now if it's an IPv4 */ 
    6767                /* flow, we test on the field and then put bool at 1 */ 
     68  int isMplsFlow = 0; 
     69  int paddingCounter = 0; 
     70  int crazyCounter = 0; 
     71 
    6872#ifdef CRIHAN 
    6973  struct IPFLowCache ipFirstCache; 
     
    115119      return (data_length+shift); 
    116120    } 
     121    if ( data_length >= 1452 ) { 
     122      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", 
     123             (*myPtrs->currentFlowsetIdPtr), 
     124             (myPtrs->pcktPtr->ipH->srcAdd>>24), 
     125             (myPtrs->pcktPtr->ipH->srcAdd<<8>>24), 
     126             (myPtrs->pcktPtr->ipH->srcAdd<<16>>24), 
     127             (myPtrs->pcktPtr->ipH->srcAdd<<24>>24)); 
     128      return (-1); 
     129    } 
    117130#ifdef IPV4AGG 
    118131    agCache.routerAd = myPtrs->pcktPtr->ipH->srcAdd;  
     
    136149       */ 
    137150      cpt++; 
    138       j=0; 
     151      j = 0; 
    139152      pos = (pftmp->fieldType)*10+j; 
    140153      field_size = (int) pftmp->fieldLength; 
     154       
     155      /* special case: check yes on all flows from one router (phantom field nb 0) */ 
     156      while ( ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+j))) != NULL ) {   
     157        if  ( (((RuleDefPtr)(*(myPtrs->rulesAddressPtr+j)))->value->stor.lvalue) 
     158              == myPtrs->pcktPtr->ipH->srcAdd ) 
     159          { 
     160            ((RuleDefPtr)(*(myPtrs->rulesAddressPtr+j)))->check = 1; 
     161          }      
     162        j++; 
     163      }     
     164      j = 0; 
     165       
    141166      /* 
    142167       * Comparaison between the field value and the rules 
    143168       * ... if one rule exist 
     169       * FIXME : warning, if no rules, no accounting ? 
    144170       */ 
    145171      if (((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos))) != NULL) { 
     
    153179                  (((RuleDefPtr)(*(myPtrs->rulesAddressPtr+pos)))->operator)){ 
    154180          case 2: 
     181            /* operator: "=" */  
    155182            switch (field_size) { 
    156183            case 1: 
     
    234261              /* aggregation */ 
    235262              /* end aggregation */ 
     263              if (pftmp->fieldType==70){ 
     264                isMplsFlow = 1; 
     265              } 
    236266#ifdef CRIHAN 
    237267              if (pftmp->fieldType==70){ 
     
    255285#ifdef IPV4AGG 
    256286              if ((pftmp->fieldType==8)){ 
     287                bool = 1; /* very important, test if we have an IPv4 flow for Agg */ 
    257288                agCache.v4AdS = *((unsigned long*)&buffer4); 
    258289              } 
     
    506537          /* aggregation */ 
    507538          /* end aggregation */ 
     539          if (pftmp->fieldType==70){ 
     540            isMplsFlow = 1; 
     541          } 
    508542#ifdef CRIHAN 
    509543          if (pftmp->fieldType==70){ 
     
    620654        /* first we must know if the address belong to our prefix   */ 
    621655#ifdef IPV4AGG 
    622         if (bool == 1){ 
     656        if ( (bool == 1) && (isMplsFlow == 0) ){ 
    623657          prefixKey.beginning = agCache.v4AdS>>(32-agCache.maskS)<<(32-agCache.maskS); 
    624658          res = bsearch(&prefixKey, V4PTab, nbPV4,  
    625                         sizeof(struct PrefixV4), prefCmp); 
    626           if (res!=NULL){  
    627             /* OUT ("traffic from the prefix/subnet")  */ 
    628             res->bytesNbOUT += agCache.bytes; 
    629             res->pktsNbOUT += agCache.pkts; 
    630             (res->flowNbOUT)++; 
    631             switch (agCache.tProt) { 
    632             case 1: 
    633               res->icmpBytesNbOUT += agCache.bytes; 
    634               res->icmpPktsNbOUT += agCache.pkts; 
    635               (res->icmpFlowNbOUT)++; 
    636               break; 
    637             case 6: 
    638               res->tcpBytesNbOUT += agCache.bytes; 
    639               res->tcpPktsNbOUT += agCache.pkts; 
    640               (res->tcpFlowNbOUT)++;           
    641               break; 
    642             case 17: 
    643               res->udpBytesNbOUT += agCache.bytes; 
    644               res->udpPktsNbOUT += agCache.pkts; 
    645               (res->udpFlowNbOUT)++; 
    646               break; 
    647             default: 
    648               res->othersBytesNbOUT += agCache.bytes; 
    649               res->othersPktsNbOUT += agCache.pkts; 
    650               (res->othersFlowNbOUT)++; 
     659                        sizeof(struct PrefixV4), prefGlobalCmp); 
     660          if (res!=NULL){ 
     661            if ( myPtrs->routersID[res->routerNb] == agCache.routerAd  ) { 
     662              /* OUT ("traffic from the prefix/subnet")  */ 
     663              res->bytesNbOUT += agCache.bytes; 
     664              res->pktsNbOUT += agCache.pkts; 
     665              (res->flowNbOUT)++; 
     666            } else { 
     667              /* doublon or bad reference in prefix list */ 
    651668            } 
    652669          } else { 
    653670            prefixKey.beginning = agCache.v4AdD>>(32-agCache.maskD)<<(32-agCache.maskD); 
    654671            res = bsearch(&prefixKey, V4PTab, nbPV4,  
    655                           sizeof(struct PrefixV4), prefCmp); 
    656             if (res!=NULL){ /* IN ("traffic to the prefix")  */ 
    657               res->bytesNbIN += agCache.bytes; 
    658               res->pktsNbIN += agCache.pkts; 
    659               (res->flowNbIN)++; 
    660               switch (agCache.tProt) { 
    661               case 1: 
    662                 res->icmpBytesNbIN += agCache.bytes; 
    663                 res->icmpPktsNbIN += agCache.pkts; 
    664                 (res->icmpFlowNbIN)++; 
    665                 break; 
    666               case 6: 
    667                 res->tcpBytesNbIN += agCache.bytes; 
    668                 res->tcpPktsNbIN += agCache.pkts; 
    669                 (res->tcpFlowNbIN)++; 
    670                 break; 
    671               case 17: 
    672                 res->udpBytesNbIN += agCache.bytes; 
    673                 res->udpPktsNbIN += agCache.pkts; 
    674                 (res->udpFlowNbIN)++; 
    675                 break; 
    676               default: 
    677                 res->othersBytesNbIN += agCache.bytes; 
    678                 res->othersPktsNbIN += agCache.pkts; 
    679                 (res->othersFlowNbIN)++; 
     672                          sizeof(struct PrefixV4), prefGlobalCmp); 
     673            if (res!=NULL){  
     674              if ( myPtrs->routersID[res->routerNb] == agCache.routerAd  ) { 
     675                /* IN ("traffic to the prefix")  */ 
     676                res->bytesNbIN += agCache.bytes; 
     677                res->pktsNbIN += agCache.pkts; 
     678                (res->flowNbIN)++; 
     679              } else { 
     680                /* doublon or bad reference in prefix list */ 
     681                 
     682/*              fprintf(stderr, "IN NC: %lu.%lu.%lu.%lu/%hu -> %lu.%lu.%lu.%lu/%hu R:%lu.%lu.%lu.%lu \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->pcktPtr->ipH->srcAdd>>24),  */ 
     694/*                      (myPtrs->pcktPtr->ipH->srcAdd<<8>>24), */ 
     695/*                      (myPtrs->pcktPtr->ipH->srcAdd<<16>>24), */ 
     696/*                      (myPtrs->pcktPtr->ipH->srcAdd<<24>>24) */ 
     697/*                      ); */ 
    680698              } 
    681699            } else { 
     
    706724        } 
    707725        bool = 0; 
     726        isMplsFlow = 0; 
    708727#endif 
    709728        /*  
    710729         * Redirection if needed  
    711730         * switch the rules definition (check & fieldToRecord),  
    712          * we send the flow or a part of the flow to a remote host or a file 
     731         * we send the flow or a part of the flow to a remote host or a file. 
     732         * In a first time (until release 0.0.7, the information was sent via 
     733         * the process renetcolSender with an IPC message queue. But, the perf 
     734         * of IPC Msg was very bad with a system compilation by default. 
     735         * So now, we send information directly from here. 
    713736         */ 
    714737        tmpRuleList = myPtrs->rulesListPtr; 
    715738        while (tmpRuleList){ 
     739          RulesPtr tmpRuleList_for_to = myPtrs->rulesListPtr; 
     740          RuleDefPtr tmpRuleDefList = tmpRuleList->def; 
    716741          unsigned short check = 1; 
    717           RuleDefPtr tmpRuleDefList = tmpRuleList->def; 
     742          int s=0; 
    718743          secondOffset = secondOldOffset; 
    719744          while (tmpRuleDefList){ 
     
    725750            /* msg building */ 
    726751            secondPftmp = tmp->lastField; 
    727 /*          memcpy(myMsg.text, (char*)(myPtrs->ptr_buffer+secondOffset),flow_size); */ 
    728752            msgTextIndex = mempcpy(mempcpy(mempcpy(myMsg.text,  
    729753                                                   &tplMsgType,  
     
    747771                                   );  
    748772            myMsg.type = 1; 
     773            /* OLD transfert type */ 
    749774            msgSend( myQueue, myMsg); 
     775            /* NEW transfert type */ 
     776/*          for ( ; tmpRuleList_for_to; tmpRuleList_for_to=tmpRuleList_for_to->next){ */ 
     777/*            fprintf(stderr, "?\n"); */ 
     778/*            if (tmpRuleList_for_to->id == tmpRuleList->id){ */ 
     779/*              fprintf(stderr, "y\n"); */ 
     780/*              s = sendMessage(tmpRuleList_for_to->host->sockId, &(myMsg.text), sizeof(myMsg.text), */ 
     781/*                              tmpRuleList_for_to->host->hostAddressPtr); */ 
     782/*              fprintf(stderr, "o\n"); */ 
     783/*            } */ 
     784/*          } */ 
     785            /* FIXME : perhaps check "s" */ 
    750786            noEnd = 1; 
    751787            secondCpt=0; 
     
    776812    (*myPtrs->offsetV9Ptr)+=(data_length-4); 
    777813    (*myPtrs->currentFlowsetNumberPtr) = myPtrs->currentHeaderV9Ptr->count; 
     814    fprintf(stderr, "\n unknown template \n"); 
    778815  } 
    779816  while ( ((*myPtrs->offsetV9Ptr)-48-shift) < data_length ) { 
    780817    (*myPtrs->offsetV9Ptr)++; /* if padding */ 
     818    paddingCounter++; 
     819    fprintf(stderr, "\n padding \n"); 
     820    if ( paddingCounter > 8 ) { 
     821      syslog(LOG_INFO,"padding too high: %d ", paddingCounter); 
     822      return (-1); 
     823    } 
    781824  } 
    782825  while ( (*myPtrs->offsetV9Ptr)-48-shift > data_length ) {  
    783826    (*myPtrs->offsetV9Ptr)--; /* crazy loop (when bug appears in template def) */ 
     827    crazyCounter++; 
    784828  } 
     829  if (crazyCounter!=0) { syslog(LOG_INFO,"crazyCounter: %d ", crazyCounter);} 
    785830  return (data_length+shift); 
    786831}