root/trunk/src/template.c @ 78

Revision 78, 18.6 KB (checked in by andreu, 14 years ago)

some updates to prepare release 0.0.12

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