root/trunk/src/template.c

Revision 154, 18.3 KB (checked in by andreu, 12 years ago)

Typo correction and copyright update

  • Property svn:eol-style set to native
Line 
1/*
2 * File: template.c
3 *
4 * Authors: ANDREU Francois-Xavier
5 *
6 * Copyright (C) 2005-2011 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 "template.h"
27
28/*
29 * getFlowsetId
30 *
31 * return the flowset id
32 */
33short 
34getFlowsetId(short cfn, unsigned short *offV9, unsigned char *buf)
35{
36  unsigned short os;
37  unsigned char buffer2[2];
38
39  if ( cfn == 0 ) {
40    os = 20+8+20;
41  } else {
42    os = *offV9;
43  }
44  buffer2[1]= *(buf+os+0);
45  buffer2[0]= *(buf+os+1);
46  return *((unsigned short*)&buffer2);
47}
48
49/*
50 * checkTemplateFlowSet
51 *
52 * check the fields of a template flowset and build the Template Flowset List
53 * it can exist many templates definitions in a template flowset
54 */
55short 
56checkTemplateFlowSet(short shift,
57                     RouterPtr cr,
58                     struct RenetcolMIB *myMIB,
59                     unsigned short *offV9,
60                     unsigned char *buf,
61                     NetFlowV9HeaderPtr v9Ptr,
62                     TplFlowSetPtr cTFSPtr,
63                     short *cFNPtr,
64                     int myQueue)
65{
66  int i = 0;
67  int cpt = 0;
68  int cpt_fields = 0;
69  int index = 0;
70  unsigned char buffer2[2];
71  unsigned short tmp = 0;
72  unsigned short flowsetId = 0;
73  unsigned short length = 0;
74  TplFlowSetPtr ptpltmp = NULL;
75  /* for msg sending: */
76  msgType myMsg;
77  FieldPtr tmpField;
78  char *msgTextIndex;
79  unsigned short tplMsgType = 1;
80  unsigned short badFieldNumber = 0;
81  unsigned short badFieldLength = 0;
82  unsigned short badFieldCount = 0;
83
84  buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
85  buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
86  flowsetId = *((unsigned short*)&buffer2);
87  /* checkpoint on FLOWSET ID*/
88  if ( flowsetId > 1024 ) /* FIXME CONST */ 
89    {
90#ifdef DEBUG 
91      fprintf(stderr,"\n IP: %lu.%lu.%lu.%lu, %d,%d\n",
92              cr->IpAddress>>24,
93              cr->IpAddress<<8>>24,
94              cr->IpAddress<<16>>24,
95              cr->IpAddress<<24>>24,
96              badFieldNumber,
97              badFieldLength
98              );
99      fprintf (stderr, "\n cTFSPtr->templateFlowSetId >1024: %hu\n"
100               cTFSPtr->templateFlowSetId);
101#endif
102      while ( ((*offV9))> (index)){
103        buffer2[1]= *(buf+index); index++;
104        buffer2[0]= *(buf+index); index++;
105        tmp = *((unsigned short*)&buffer2);
106#ifdef DEBUG 
107        fprintf (stderr, " %hu ", tmp);
108#endif
109      }
110      syslog (LOG_INFO,
111              "in new template: flowset id too big !");
112      ptpltmp = cTFSPtr;
113      if (ptpltmp->prev == NULL) {
114        cr->tplList = ptpltmp->next;
115        if (cr->tplList) {
116          cr->tplList->prev = NULL;
117        }
118      } else {
119        ptpltmp->prev->next = ptpltmp->next;
120        if (ptpltmp->next) {
121          ptpltmp->next->prev = ptpltmp->prev;
122        }
123      }
124      deleteTplFlSet(ptpltmp);
125      cTFSPtr = NULL;
126      return (-1);
127    } /* checkpoint end */ 
128
129  buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
130  buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
131  length = *((unsigned short*)&buffer2);
132  do {
133#ifdef DEBUG   
134    fprintf (stderr, "{");
135#endif
136    badFieldNumber = 0;
137    badFieldLength = 0;
138    badFieldCount = 0;
139    buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
140    buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
141    if ((cTFSPtr=
142         existTplId(cr, v9Ptr->sourceId,
143                    *((unsigned short*)&buffer2)))==NULL) {
144      cTFSPtr = newRouterTplList();
145      cTFSPtr->next = cr->tplList;
146      if (cr->tplList!=NULL) {cr->tplList->prev = cTFSPtr;}
147      cr->tplList = cTFSPtr;
148      cTFSPtr->templateFlowSetId = *((unsigned short*)&buffer2);
149      cTFSPtr->sourceId = v9Ptr->sourceId;
150      buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
151      buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
152      if ( (cTFSPtr->fieldCount = *((unsigned short*)&buffer2) ) == 0 ) {
153        badFieldCount = 1;
154        ptpltmp = cTFSPtr;
155        if (ptpltmp->prev == NULL) {
156          cr->tplList = ptpltmp->next;
157          if (cr->tplList) {
158            cr->tplList->prev = NULL;
159          }
160        } else {
161          ptpltmp->prev->next = ptpltmp->next;
162          if (ptpltmp->next) {
163            ptpltmp->next->prev = ptpltmp->prev;
164          }
165        }
166        deleteTplFlSet(ptpltmp);
167        cTFSPtr = NULL;
168        return (-1);
169      }
170      cpt_fields = 0;
171      for ( i=0; i<cTFSPtr->fieldCount; i++) {
172        FieldPtr fldPtr = (FieldPtr) malloc(sizeof(struct Field));
173        buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
174        buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
175        if ( (fldPtr->fieldType = *((unsigned short*)&buffer2) ) > 216) {
176          badFieldNumber = 1;
177        }
178        buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
179        buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
180        if ( (fldPtr->fieldLength = *((unsigned short*)&buffer2) ) > 16) {
181          badFieldLength = 1;
182        }
183        fldPtr->next = cTFSPtr->fieldSet;
184        fldPtr->prev = NULL;
185        if ( cTFSPtr->fieldSet ) {cTFSPtr->fieldSet->prev = fldPtr;}
186        cTFSPtr->fieldSet = fldPtr;
187        if (i==0) {
188          cTFSPtr->lastField = fldPtr;
189        }
190        cpt_fields++;
191        /* checkpoint */
192        if ( (cTFSPtr->templateFlowSetId < 256 )
193             || (cpt_fields > 25)
194             || (badFieldNumber == 1)
195             || badFieldLength == 1
196             || (badFieldCount == 1)) {
197#ifdef DEBUG
198          fprintf(stderr,"\n IP: %lu.%lu.%lu.%lu, %d,%d\n",
199                  cr->IpAddress>>24,
200                  cr->IpAddress<<8>>24,
201                  cr->IpAddress<<16>>24,
202                  cr->IpAddress<<24>>24,
203                  badFieldNumber,
204                  badFieldLength
205                  );
206          fprintf (stderr, "\n cTFSPtr->templateFlowSetId: %hu\n"
207                   cTFSPtr->templateFlowSetId);
208#endif
209          while ( ((*offV9))> (index)){
210            buffer2[1]= *(buf+index); index++;
211            buffer2[0]= *(buf+index); index++;
212            tmp = *((unsigned short*)&buffer2);
213#ifdef DEBUG 
214            fprintf (stderr, " %hu ", tmp);
215#endif
216          }
217          ptpltmp = cTFSPtr;
218          if (ptpltmp->prev == NULL) {
219            cr->tplList = ptpltmp->next;
220            if (cr->tplList) {
221              cr->tplList->prev = NULL;
222            }
223          } else {
224            ptpltmp->prev->next = ptpltmp->next;
225            if (ptpltmp->next) {
226              ptpltmp->next->prev = ptpltmp->prev;
227            }
228          }
229          deleteTplFlSet(ptpltmp);
230          cTFSPtr = NULL;
231          return (-1);
232        } /* checkpoint end */
233      }
234    } else { /*update*/
235      ptpltmp = cTFSPtr;
236      if (ptpltmp->prev == NULL) {
237        cr->tplList = ptpltmp->next;
238        if (cr->tplList) {
239          cr->tplList->prev = NULL;
240        }
241      } else {
242        ptpltmp->prev->next = ptpltmp->next;
243        if (ptpltmp->next) {
244          ptpltmp->next->prev = ptpltmp->prev;
245        }
246      }
247      deleteTplFlSet(ptpltmp);
248      ptpltmp = NULL;
249      cTFSPtr = NULL;
250      cTFSPtr = newRouterTplList();
251      cTFSPtr->next = cr->tplList;
252      if (cr->tplList!=NULL) {cr->tplList->prev = cTFSPtr;}
253      cr->tplList = cTFSPtr;
254      cTFSPtr->templateFlowSetId = *((unsigned short*)&buffer2);
255      cTFSPtr->sourceId = v9Ptr->sourceId;
256      buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
257      buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
258      if ( (cTFSPtr->fieldCount = *((unsigned short*)&buffer2) ) == 0 ) {
259        badFieldCount = 1;
260        ptpltmp = cTFSPtr;
261        if (ptpltmp->prev == NULL) {
262          cr->tplList = ptpltmp->next;
263          if (cr->tplList) {
264            cr->tplList->prev = NULL;
265          }
266        } else {
267          ptpltmp->prev->next = ptpltmp->next;
268          if (ptpltmp->next) {
269            ptpltmp->next->prev = ptpltmp->prev;
270          }
271        }
272        deleteTplFlSet(ptpltmp);
273        cTFSPtr = NULL;
274        return (-1);
275      }
276      cpt_fields = 0;
277      for ( i=0; i<cTFSPtr->fieldCount; i++) {
278        FieldPtr fldPtr = (FieldPtr) malloc(sizeof(struct Field));
279        buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
280        buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
281        if ( (fldPtr->fieldType = *((unsigned short*)&buffer2) ) > 216) {
282          badFieldNumber = 1;
283        }
284        buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
285        buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
286        if ( (fldPtr->fieldLength = *((unsigned short*)&buffer2) ) > 16) {
287          badFieldLength = 1;
288        }
289        fldPtr->next = cTFSPtr->fieldSet;
290        fldPtr->prev = NULL;
291        if ( cTFSPtr->fieldSet ) {
292          cTFSPtr->fieldSet->prev = fldPtr;
293        }
294        cTFSPtr->fieldSet = fldPtr;
295        if (i==0) {
296          cTFSPtr->lastField = fldPtr;
297        }
298        cpt_fields++;
299        if ( (cTFSPtr->templateFlowSetId < 256 )
300             || (cpt_fields > 25)
301             || (badFieldNumber == 1)
302             || badFieldLength == 1
303             || (badFieldCount == 1)) {
304          while ( ((*offV9))> (index)){
305            buffer2[1]= *(buf+index); index++;
306            buffer2[0]= *(buf+index); index++;
307            tmp = *((unsigned short*)&buffer2);
308#ifdef DEBUG 
309            fprintf (stderr, " %hu ", tmp);
310#endif
311          }
312#ifdef DEBUG
313          fprintf(stderr,
314                  "\nin update template function: too many fields, bug collector or wrong template def in template update\n");
315#endif
316          ptpltmp = cTFSPtr;
317          if (ptpltmp->prev == NULL) {
318            cr->tplList = ptpltmp->next;
319            if (cr->tplList) {
320              cr->tplList->prev = NULL;
321            }
322          } else {
323            ptpltmp->prev->next = ptpltmp->next;
324            if (ptpltmp->next) {
325              ptpltmp->next->prev = ptpltmp->prev;
326            }
327          }
328          deleteTplFlSet(ptpltmp);
329          cTFSPtr = NULL;
330          return (-1);   
331        }
332      }
333    } /* end if template creation or update */
334    /* send to queue the template definition */
335    /*     fprintf(stderr,"%hu %d\n", tplMsgType, sizeof(tplMsgType)); */
336    /*     fprintf(stderr,"%lu %d\n", cr->IpAddress, sizeof(cr->IpAddress)); */
337    /*     fprintf(stderr, "%lu.%lu.%lu.%lu ", */
338    /*      ( cr->IpAddress)>>24, */
339    /*      ( cr->IpAddress)<<8>>24, */
340    /*      ( cr->IpAddress)<<16>>24, */
341    /*      ( cr->IpAddress)<<24>>24); */
342    /*     fprintf(stderr,"%lu %d\n", cTFSPtr->sourceId, sizeof(cTFSPtr->sourceId)); */
343    /* FIXME HERE don't send an wrong def if error detected */
344    msgTextIndex = mempcpy(mempcpy(mempcpy(mempcpy(mempcpy(myMsg.text,
345                                                           &tplMsgType,
346                                                           sizeof(unsigned short)
347                                                           ),
348                                                   &cr->IpAddress,
349                                                   sizeof(unsigned long)
350                                                   ),
351                                           &cTFSPtr->sourceId,
352                                           sizeof(unsigned long)
353                                           ),
354                                   &cTFSPtr->templateFlowSetId,
355                                   sizeof(cTFSPtr->templateFlowSetId)
356                                   ),
357                           &cTFSPtr->fieldCount,
358                           sizeof(cTFSPtr->fieldCount)
359                           );
360    /* add the fields list */
361    tmpField = cTFSPtr->lastField;
362    for (; tmpField; tmpField=tmpField->prev) {
363      msgTextIndex = mempcpy(mempcpy(msgTextIndex,
364                                     &tmpField->fieldType,
365                                     sizeof(tmpField->fieldType)),
366                             &tmpField->fieldLength,
367                             sizeof(tmpField->fieldLength));
368    }
369    myMsg.type = 1;
370    msgSend( myQueue, myMsg);
371    /* end send */
372    (*cFNPtr)++; 
373#ifdef DEBUG
374    fprintf (stderr, "}");
375#endif
376    myMIB->defFlowSetNb += 1;
377    myMIB->realFlowNb += 1;   
378  } while ( (cpt) < (length-2) ); /*length-2*/
379  return length+shift;
380}
381
382/*
383 * checkTemplateOption
384 *
385 */
386short 
387checkTemplateOption(short shift,
388                    RouterPtr cr,
389                    struct RenetcolMIB *myMIB,
390                    unsigned short *offV9,
391                    unsigned char *buf,
392                    NetFlowV9HeaderPtr v9Ptr,
393                    TplOptionPtr cTOPtr,
394                    short *cFNPtr)
395{
396  int i;
397  int cpt = 0;
398  unsigned short getFlowsetId = 0;
399  unsigned short length = 0;
400  unsigned char buffer2[2];
401  TplOptionPtr ptplotmp;
402  unsigned short badFieldNumber = 0;
403  unsigned short badFieldLength = 0;
404  int cpt_fields = 0;
405  int index = 0;
406
407  buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
408  buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
409  getFlowsetId = *((unsigned short*)&buffer2);
410  buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
411  buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
412  length = *((unsigned short*)&buffer2);
413  do {
414#ifdef DEBUG   
415    fprintf (stderr, "< %hu, %hu, ",getFlowsetId, length);
416#endif
417    badFieldNumber = 0;
418    badFieldLength = 0;
419    buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
420    buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
421    if ((cTOPtr=
422         existTplOptId(cr, v9Ptr->sourceId,
423                       *((unsigned short*)&buffer2)))==NULL) {
424      cTOPtr = newRouterTplOptList();
425      cTOPtr->next = cr->tplOptList;
426      if (cr->tplOptList!=NULL) {cr->tplOptList->prev = cTOPtr;}
427      cr->tplOptList = cTOPtr;
428      cTOPtr->templateOptionId = *((unsigned short*)&buffer2);
429      cTOPtr->sourceId = v9Ptr->sourceId;
430      buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
431      buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
432      cTOPtr->optionScopeLg = *((unsigned short*)&buffer2);
433      buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
434      buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
435      cTOPtr->optionLg = *((unsigned short*)&buffer2);
436#ifdef DEBUG 
437      fprintf (stderr, " otid %hu, %hu, %hu, ", cTOPtr->templateOptionId, cTOPtr->optionScopeLg, cTOPtr->optionLg);
438#endif
439      cpt_fields = 0;
440      for ( i=0; i<(((cTOPtr->optionScopeLg)+(cTOPtr->optionLg))/4); i++) {
441        FieldPtr tmp = (FieldPtr) malloc(sizeof(struct Field));
442        buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
443        buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
444        if ( (tmp->fieldType = *((unsigned short*)&buffer2) ) > 216) {
445          badFieldNumber = 1;
446        }
447#ifdef DEBUG 
448        fprintf (stderr, " %hu - ", tmp->fieldType);
449#endif
450        buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
451        buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
452        if ( (tmp->fieldLength = *((unsigned short*)&buffer2) ) > 64) {
453          badFieldLength = 1;
454        }
455#ifdef DEBUG 
456        fprintf (stderr, " %hu,", tmp->fieldLength);
457#endif
458        tmp->next = cTOPtr->fieldSet;
459        tmp->prev = NULL;
460        if ( cTOPtr->fieldSet ) {cTOPtr->fieldSet->prev = tmp;}
461        cTOPtr->fieldSet = tmp;
462        if (i==0) {
463          cTOPtr->lastField = tmp;
464        }
465        cpt_fields++;
466        if ( (cTOPtr->templateOptionId < 256)
467             || (cpt_fields > 25)
468             || (badFieldNumber == 1)
469             || badFieldLength == 1) {
470#ifdef DEBUG 
471          fprintf(stderr,"\n IP: %lu.%lu.%lu.%lu Opt Templ\n",
472                  cr->IpAddress>>24,
473                  cr->IpAddress<<8>>24,
474                  cr->IpAddress<<16>>24,
475                  cr->IpAddress<<24>>24);
476          syslog (LOG_INFO,
477                  "in option template function: too many fields, bug collector or wrong template def in template update");
478#endif
479          while ( ((*offV9))> (index)){
480            buffer2[1]= *(buf+index); index++;
481            buffer2[0]= *(buf+index); index++;
482            tmp = *((unsigned short*)&buffer2);
483#ifdef DEBUG 
484            fprintf (stderr, " %hu ", tmp);
485#endif
486          }
487
488          ptplotmp = cTOPtr;
489          if (ptplotmp->prev == NULL) {
490            cr->tplOptList = ptplotmp->next;
491            if (cr->tplOptList) {
492              cr->tplOptList->prev = NULL;
493            }
494          } else {
495            ptplotmp->prev->next = ptplotmp->next;
496            if (ptplotmp->next) {
497              ptplotmp->next->prev = ptplotmp->prev;
498            }
499          }
500          deleteTplOption(ptplotmp);
501          cTOPtr = NULL;
502          return (-1);
503        }
504      }
505      while ((*offV9)%4 != 0) {
506        (*offV9)++; cpt++;
507#ifdef DEBUG 
508        fprintf(stderr,"p");
509#endif
510      } /*padding case*/
511    } else { /*update */
512      ptplotmp = cTOPtr;
513      if (ptplotmp->prev == NULL) {
514        cr->tplOptList = ptplotmp->next;
515        if (cr->tplOptList) {
516          cr->tplOptList->prev = NULL;
517        }
518      } else {
519        ptplotmp->prev->next = ptplotmp->next;
520        if (ptplotmp->next) {
521          ptplotmp->next->prev = ptplotmp->prev;
522        }
523      }
524      deleteTplOption(ptplotmp);
525      cTOPtr = NULL;
526      cTOPtr = newRouterTplOptList();
527      cTOPtr->next = cr->tplOptList;
528      if (cr->tplOptList!=NULL) {cr->tplOptList->prev = cTOPtr;}
529      cr->tplOptList = cTOPtr;
530      cTOPtr->templateOptionId = *((unsigned short*)&buffer2);
531      cTOPtr->sourceId = v9Ptr->sourceId;
532      buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
533      buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
534      cTOPtr->optionScopeLg = *((unsigned short*)&buffer2);
535      buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
536      buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
537      cTOPtr->optionLg = *((unsigned short*)&buffer2);
538      cpt_fields = 0;
539      for ( i=0; i<(((cTOPtr->optionScopeLg)+(cTOPtr->optionLg))/4); i++) {
540        FieldPtr tmp = (FieldPtr) malloc(sizeof(struct Field));
541        buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
542        buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
543        if ( (tmp->fieldType = *((unsigned short*)&buffer2) ) > 216) {
544          badFieldNumber = 1;
545        }
546        buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
547        buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
548        if ( (tmp->fieldLength = *((unsigned short*)&buffer2) ) > 64) {
549          badFieldLength = 1;
550        }
551        tmp->next = cTOPtr->fieldSet;
552        tmp->prev = NULL;
553        if ( cTOPtr->fieldSet ) {cTOPtr->fieldSet->prev = tmp;}
554        cTOPtr->fieldSet = tmp;
555        if (i==0) {
556          cTOPtr->lastField = tmp;
557        }
558        cpt_fields++;
559        if ( (cTOPtr->templateOptionId < 256)
560             || (cpt_fields > 25)
561             || (badFieldNumber == 1)
562             || badFieldLength == 1) {
563#ifdef DEBUG 
564          fprintf(stderr,"\n IP: %lu.%lu.%lu.%lu\n",
565                  cr->IpAddress>>24,
566                  cr->IpAddress<<8>>24,
567                  cr->IpAddress<<16>>24,
568                  cr->IpAddress<<24>>24);
569          syslog (LOG_INFO,
570                  "in update option tpl function: too many fields, bug collector or wrong template def in template update");
571#endif
572          ptplotmp = cTOPtr;
573          if (ptplotmp->prev == NULL) {
574            cr->tplOptList = ptplotmp->next;
575            if (cr->tplOptList) {
576              cr->tplOptList->prev = NULL;
577            }
578          } else {
579            ptplotmp->prev->next = ptplotmp->next;
580            if (ptplotmp->next) {
581              ptplotmp->next->prev = ptplotmp->prev;
582            }
583          }
584          deleteTplOption(ptplotmp);
585          cTOPtr = NULL;
586          return (-1);
587        }
588      }
589      while ((*offV9)%4 != 0) {
590        (*offV9)++; cpt++;
591#ifdef DEBUG 
592        fprintf(stderr,"p");
593#endif
594      } /*padding case*/
595    }
596    (*cFNPtr)++;
597#ifdef DEBUG
598    fprintf (stderr, ">");
599#endif
600    myMIB->optDefFlowSetNb += 1;
601    myMIB->realFlowNb += 1;   
602  } while ((cpt) < (length-2));
603  /*   show_all_tplFlSet(); */
604  return length+shift;
605}
606
607
608/*
609 * exist_id
610 *
611 * used in check a template flowset
612 * the id is the source_id(idh) plus getFlowsetId
613 * return:
614 *    - a pointer on the template flowset or NULL
615 */
616TplFlowSetPtr
617existId(RouterPtr cr, unsigned long idh, short idfs)
618{
619  TplFlowSetPtr tmp=cr->tplList;
620  for (; tmp; tmp=tmp->next) {
621    if ((tmp->sourceId==idh)) {
622      return tmp;
623    }
624  }
625  return NULL;
626}
627
628/*
629 * existTplId
630 *
631 * return:
632 *    - a pointer on the correct template flowset definition
633 */
634TplFlowSetPtr
635existTplId(RouterPtr cr, unsigned long sid, short idfs)
636{
637  TplFlowSetPtr tmp=cr->tplList;
638  for (; tmp; tmp=tmp->next) {
639    if ((tmp->sourceId==sid)&&(tmp->templateFlowSetId == idfs)) {
640      return tmp;
641    }
642  }
643  return NULL;
644}
645
646/*
647 * existTploptId
648 *
649 * return:
650 *    - a pointer on the correct template option definition
651 */
652TplOptionPtr
653existTplOptId(RouterPtr cr, unsigned long sid, short idfs)
654{
655  TplOptionPtr tmp=cr->tplOptList;
656  for (; tmp; tmp=tmp->next) {
657    if ((tmp->sourceId==sid)&&(tmp->templateOptionId == idfs)) {
658      return tmp;
659    }
660  }
661  return NULL;
662}
Note: See TracBrowser for help on using the browser.