root/trunk/src/template.c @ 77

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