root/trunk/src/template.c @ 111

Revision 111, 18.6 KB (checked in by andreu, 13 years ago)

ticket #41 Pcap file integration

  • 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#ifdef DEBUG 
215          syslog (LOG_INFO,
216                  "New template: field nb, field lg or too many fields, bad template def possibility SId: %lu",
217                  v9Ptr->sourceId);
218#endif
219          ptpltmp = cTFSPtr;
220          if (ptpltmp->prev == NULL) {
221            cr->tplList = ptpltmp->next;
222            if (cr->tplList) {
223              cr->tplList->prev = NULL;
224            }
225          } else {
226            ptpltmp->prev->next = ptpltmp->next;
227            if (ptpltmp->next) {
228              ptpltmp->next->prev = ptpltmp->prev;
229            }
230          }
231          deleteTplFlSet(ptpltmp);
232          cTFSPtr = NULL;
233          return (-1);
234        } /* checkpoint end */
235      }
236    } else { /*update*/
237      ptpltmp = cTFSPtr;
238      if (ptpltmp->prev == NULL) {
239        cr->tplList = ptpltmp->next;
240        if (cr->tplList) {
241          cr->tplList->prev = NULL;
242        }
243      } else {
244        ptpltmp->prev->next = ptpltmp->next;
245        if (ptpltmp->next) {
246          ptpltmp->next->prev = ptpltmp->prev;
247        }
248      }
249      deleteTplFlSet(ptpltmp);
250      ptpltmp = NULL;
251      cTFSPtr = NULL;
252      cTFSPtr = newRouterTplList();
253      cTFSPtr->next = cr->tplList;
254      if (cr->tplList!=NULL) {cr->tplList->prev = cTFSPtr;}
255      cr->tplList = cTFSPtr;
256      cTFSPtr->templateFlowSetId = *((unsigned short*)&buffer2);
257      cTFSPtr->sourceId = v9Ptr->sourceId;
258      buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
259      buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
260      if ( (cTFSPtr->fieldCount = *((unsigned short*)&buffer2) ) == 0 ) {
261        badFieldCount = 1;
262        ptpltmp = cTFSPtr;
263        if (ptpltmp->prev == NULL) {
264          cr->tplList = ptpltmp->next;
265          if (cr->tplList) {
266            cr->tplList->prev = NULL;
267          }
268        } else {
269          ptpltmp->prev->next = ptpltmp->next;
270          if (ptpltmp->next) {
271            ptpltmp->next->prev = ptpltmp->prev;
272          }
273        }
274        deleteTplFlSet(ptpltmp);
275        cTFSPtr = NULL;
276        return (-1);
277      }
278      cpt_fields = 0;
279      for ( i=0; i<cTFSPtr->fieldCount; i++) {
280        FieldPtr fldPtr = (FieldPtr) malloc(sizeof(struct Field));
281        buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
282        buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
283        if ( (fldPtr->fieldType = *((unsigned short*)&buffer2) ) > 216) {
284          badFieldNumber = 1;
285        }
286        buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
287        buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
288        if ( (fldPtr->fieldLength = *((unsigned short*)&buffer2) ) > 16) {
289          badFieldLength = 1;
290        }
291        fldPtr->next = cTFSPtr->fieldSet;
292        fldPtr->prev = NULL;
293        if ( cTFSPtr->fieldSet ) {
294          cTFSPtr->fieldSet->prev = fldPtr;
295        }
296        cTFSPtr->fieldSet = fldPtr;
297        if (i==0) {
298          cTFSPtr->lastField = fldPtr;
299        }
300        cpt_fields++;
301        if ( (cTFSPtr->templateFlowSetId < 256 )
302             || (cpt_fields > 25)
303             || (badFieldNumber == 1)
304             || badFieldLength == 1
305             || (badFieldCount == 1)) {
306          while ( ((*offV9))> (index)){
307            buffer2[1]= *(buf+index); index++;
308            buffer2[0]= *(buf+index); index++;
309            tmp = *((unsigned short*)&buffer2);
310#ifdef DEBUG 
311            fprintf (stderr, " %hu ", tmp);
312#endif
313          }
314#ifdef DEBUG
315          syslog (LOG_INFO,
316                  "in update template function: too many fields, bug collector or wrong template def in template update");
317          fprintf(stderr,
318                  "\nin update template function: too many fields, bug collector or wrong template def in template update\n");
319#endif
320          ptpltmp = cTFSPtr;
321          if (ptpltmp->prev == NULL) {
322            cr->tplList = ptpltmp->next;
323            if (cr->tplList) {
324              cr->tplList->prev = NULL;
325            }
326          } else {
327            ptpltmp->prev->next = ptpltmp->next;
328            if (ptpltmp->next) {
329              ptpltmp->next->prev = ptpltmp->prev;
330            }
331          }
332          deleteTplFlSet(ptpltmp);
333          cTFSPtr = NULL;
334          return (-1);   
335        }
336      }
337    } /* end if template creation or update */
338    /* send to queue the template definition */
339    /*     fprintf(stderr,"%hu %d\n", tplMsgType, sizeof(tplMsgType)); */
340    /*     fprintf(stderr,"%lu %d\n", cr->IpAddress, sizeof(cr->IpAddress)); */
341    /*     fprintf(stderr, "%lu.%lu.%lu.%lu ", */
342    /*      ( cr->IpAddress)>>24, */
343    /*      ( cr->IpAddress)<<8>>24, */
344    /*      ( cr->IpAddress)<<16>>24, */
345    /*      ( cr->IpAddress)<<24>>24); */
346    /*     fprintf(stderr,"%lu %d\n", cTFSPtr->sourceId, sizeof(cTFSPtr->sourceId)); */
347    /* FIXME HERE don't send an wrong def if error detected */
348    msgTextIndex = mempcpy(mempcpy(mempcpy(mempcpy(mempcpy(myMsg.text,
349                                                           &tplMsgType,
350                                                           sizeof(unsigned short)
351                                                           ),
352                                                   &cr->IpAddress,
353                                                   sizeof(unsigned long)
354                                                   ),
355                                           &cTFSPtr->sourceId,
356                                           sizeof(unsigned long)
357                                           ),
358                                   &cTFSPtr->templateFlowSetId,
359                                   sizeof(cTFSPtr->templateFlowSetId)
360                                   ),
361                           &cTFSPtr->fieldCount,
362                           sizeof(cTFSPtr->fieldCount)
363                           );
364    /* add the fields list */
365    tmpField = cTFSPtr->lastField;
366    for (; tmpField; tmpField=tmpField->prev) {
367      msgTextIndex = mempcpy(mempcpy(msgTextIndex,
368                                     &tmpField->fieldType,
369                                     sizeof(tmpField->fieldType)),
370                             &tmpField->fieldLength,
371                             sizeof(tmpField->fieldLength));
372    }
373    myMsg.type = 1;
374    msgSend( myQueue, myMsg);
375    /* end send */
376    (*cFNPtr)++;   
377  } while ( (cpt) < (length-2) ); /*length-2*/
378#ifdef DEBUG
379  fprintf (stderr, "}");
380#endif
381  return length;
382}
383
384/*
385 * checkTemplateOption
386 *
387 */
388short 
389checkTemplateOption(RouterPtr cr, unsigned short *offV9,
390                    unsigned char *buf, NetFlowV9HeaderPtr v9Ptr,
391                    TplOptionPtr cTOPtr,
392                    short *cFNPtr)
393{
394  int i;
395  int cpt = 0;
396  unsigned short getFlowsetId = 0;
397  unsigned short length = 0;
398  unsigned char buffer2[2];
399  TplOptionPtr ptplotmp;
400  unsigned short badFieldNumber = 0;
401  unsigned short badFieldLength = 0;
402  int cpt_fields = 0;
403  int index = 0;
404
405  buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
406  buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
407  getFlowsetId = *((unsigned short*)&buffer2);
408  buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
409  buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
410  length = *((unsigned short*)&buffer2);
411  do {
412#ifdef DEBUG   
413    fprintf (stderr, "< %hu, %hu, ",getFlowsetId, length);
414#endif
415    badFieldNumber = 0;
416    badFieldLength = 0;
417    buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
418    buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
419    if ((cTOPtr=
420         existTplOptId(cr, v9Ptr->sourceId,
421                       *((unsigned short*)&buffer2)))==NULL) {
422      cTOPtr = newRouterTplOptList();
423      cTOPtr->next = cr->tplOptList;
424      if (cr->tplOptList!=NULL) {cr->tplOptList->prev = cTOPtr;}
425      cr->tplOptList = cTOPtr;
426      cTOPtr->templateOptionId = *((unsigned short*)&buffer2);
427      cTOPtr->sourceId = v9Ptr->sourceId;
428      buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
429      buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
430      cTOPtr->optionScopeLg = *((unsigned short*)&buffer2);
431      buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
432      buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
433      cTOPtr->optionLg = *((unsigned short*)&buffer2);
434#ifdef DEBUG 
435      fprintf (stderr, " otid %hu, %hu, %hu, ", cTOPtr->templateOptionId, cTOPtr->optionScopeLg, cTOPtr->optionLg);
436#endif
437      cpt_fields = 0;
438      for ( i=0; i<(((cTOPtr->optionScopeLg)+(cTOPtr->optionLg))/4); i++) {
439        FieldPtr tmp = (FieldPtr) malloc(sizeof(struct Field));
440        buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
441        buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
442        if ( (tmp->fieldType = *((unsigned short*)&buffer2) ) > 216) {
443          badFieldNumber = 1;
444        }
445#ifdef DEBUG 
446        fprintf (stderr, " %hu - ", tmp->fieldType);
447#endif
448        buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
449        buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
450        if ( (tmp->fieldLength = *((unsigned short*)&buffer2) ) > 64) {
451          badFieldLength = 1;
452        }
453#ifdef DEBUG 
454        fprintf (stderr, " %hu,", tmp->fieldLength);
455#endif
456        tmp->next = cTOPtr->fieldSet;
457        tmp->prev = NULL;
458        if ( cTOPtr->fieldSet ) {cTOPtr->fieldSet->prev = tmp;}
459        cTOPtr->fieldSet = tmp;
460        if (i==0) {
461          cTOPtr->lastField = tmp;
462        }
463        cpt_fields++;
464        if ( (cTOPtr->templateOptionId < 256)
465             || (cpt_fields > 25)
466             || (badFieldNumber == 1)
467             || badFieldLength == 1) {
468#ifdef DEBUG 
469          fprintf(stderr,"\n IP: %lu.%lu.%lu.%lu\n",
470                  cr->IpAddress>>24,
471                  cr->IpAddress<<8>>24,
472                  cr->IpAddress<<16>>24,
473                  cr->IpAddress<<24>>24);
474          syslog (LOG_INFO,
475                  "in option template function: too many fields, bug collector or wrong template def in template update");
476          fprintf(stderr,
477                  "\nin option template function: too many fields, bug collector or wrong template def in template update\n");
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          fprintf(stderr,
572                  "\nin update option tpl function: too many fields, bug collector or wrong template def in template update\n");
573#endif
574          ptplotmp = cTOPtr;
575          if (ptplotmp->prev == NULL) {
576            cr->tplOptList = ptplotmp->next;
577            if (cr->tplOptList) {
578              cr->tplOptList->prev = NULL;
579            }
580          } else {
581            ptplotmp->prev->next = ptplotmp->next;
582            if (ptplotmp->next) {
583              ptplotmp->next->prev = ptplotmp->prev;
584            }
585          }
586          deleteTplOption(ptplotmp);
587          cTOPtr = NULL;
588          return (-1);
589        }
590      }
591      while ((*offV9)%4 != 0) {
592        (*offV9)++; cpt++;
593#ifdef DEBUG 
594        fprintf(stderr,"p");
595#endif
596      } /*padding case*/
597    }
598    (*cFNPtr)++;
599  } while ((cpt) < (length-2));
600  /*   show_all_tplFlSet(); */
601#ifdef DEBUG
602  fprintf (stderr, ">");
603#endif
604  return length;
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.