root/trunk/src/template.c @ 27

Revision 27, 15.7 KB (checked in by andreu, 16 years ago)

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

  • Property svn:eol-style set to native
Line 
1/*
2 * File: template.c
3 *
4 * Authors: ANDREU François-Xavier
5 *
6 * Copyright (C) 2005 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 getFlowsetId = 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
80  buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
81  buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
82  getFlowsetId = *((unsigned short*)&buffer2);
83  buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
84  buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
85  length = *((unsigned short*)&buffer2);
86  do {
87    fprintf (stderr, " TD \n");
88    badFieldNumber = 0;
89    badFieldLength = 0;
90    buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
91    buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
92    if ((cTFSPtr=
93         existTplId(cr, v9Ptr->sourceId,
94                    *((unsigned short*)&buffer2)))==NULL) {
95      cTFSPtr = newRouterTplList();
96      cTFSPtr->next = cr->tplList;
97      if (cr->tplList!=NULL) {cr->tplList->prev = cTFSPtr;}
98      cr->tplList = cTFSPtr;
99      cTFSPtr->templateFlowSetId = *((unsigned short*)&buffer2);
100      cTFSPtr->sourceId = v9Ptr->sourceId;
101      buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
102      buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
103      cTFSPtr->fieldCount = *((unsigned short*)&buffer2);
104      cpt_fields = 0;
105      for ( i=0; i<cTFSPtr->fieldCount; i++) {
106        FieldPtr fldPtr = (FieldPtr) malloc(sizeof(struct Field));
107        buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
108        buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
109        if ( (fldPtr->fieldType = *((unsigned short*)&buffer2) ) > 89) {
110          badFieldNumber = 1;
111        }
112        buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
113        buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
114        if ( (fldPtr->fieldLength = *((unsigned short*)&buffer2) ) > 16) {
115          badFieldLength = 1;
116        }
117        fldPtr->next = cTFSPtr->fieldSet;
118        fldPtr->prev = NULL;
119        if ( cTFSPtr->fieldSet ) {cTFSPtr->fieldSet->prev = fldPtr;}
120        cTFSPtr->fieldSet = fldPtr;
121        if (i==0) {
122          cTFSPtr->lastField = fldPtr;
123        }
124        cpt_fields++;
125        if ( (cpt_fields > 40) || (badFieldNumber == 1) || badFieldLength == 1) { /* FIXME : constante pour cela */
126          fprintf(stderr,"\n IP: %lu.%lu.%lu.%lu, %d,%d\n",
127                  cr->IpAddress>>24,
128                  cr->IpAddress<<8>>24,
129                  cr->IpAddress<<16>>24,
130                  cr->IpAddress<<24>>24,
131                  badFieldNumber,
132                  badFieldLength
133                  );
134          fprintf (stderr, "\n cTFSPtr->templateFlowSetId: %hu\n",
135                   cTFSPtr->templateFlowSetId);
136          while ( ((*offV9))> (index)){
137            buffer2[1]= *(buf+index); index++;
138            buffer2[0]= *(buf+index); index++;
139            tmp = *((unsigned short*)&buffer2);
140            fprintf (stderr, " %hu ", tmp);
141          }
142          syslog (LOG_INFO,
143                  "in new template: field nb gt 89, field lg gt 16 or too many fields, bad template definition possibility");
144          fprintf(stderr,
145                  "\n in new template function: too many fields, bug collector or wrong template def \n");
146          ptpltmp = cTFSPtr;
147          if (ptpltmp->prev == NULL) {
148            cr->tplList = ptpltmp->next;
149            if (cr->tplList) {
150              cr->tplList->prev = NULL;
151            }
152          } else {
153            ptpltmp->prev->next = ptpltmp->next;
154            if (ptpltmp->next) {
155              ptpltmp->next->prev = ptpltmp->prev;
156            }
157          }
158          deleteTplFlSet(ptpltmp);
159          cTFSPtr = NULL;
160          return (-1);
161        }
162        fprintf (stderr, "t for new \n");
163      }
164    } else { /*update*/
165      ptpltmp = cTFSPtr;
166      if (ptpltmp->prev == NULL) {
167        cr->tplList = ptpltmp->next;
168        if (cr->tplList) {
169          cr->tplList->prev = NULL;
170        }
171      } else {
172        ptpltmp->prev->next = ptpltmp->next;
173        if (ptpltmp->next) {
174          ptpltmp->next->prev = ptpltmp->prev;
175        }
176      }
177      deleteTplFlSet(ptpltmp);
178      cTFSPtr = NULL;
179      cTFSPtr = newRouterTplList();
180      cTFSPtr->next = cr->tplList;
181      if (cr->tplList!=NULL) {cr->tplList->prev = cTFSPtr;}
182      cr->tplList = cTFSPtr;
183      cTFSPtr->templateFlowSetId = *((unsigned short*)&buffer2);
184      cTFSPtr->sourceId = v9Ptr->sourceId;
185      buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
186      buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
187      cTFSPtr->fieldCount = *((unsigned short*)&buffer2);
188      cpt_fields = 0;
189      for ( i=0; i<cTFSPtr->fieldCount; i++) {
190        FieldPtr fldPtr = (FieldPtr) malloc(sizeof(struct Field));
191        buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
192        buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
193        if ( (fldPtr->fieldType = *((unsigned short*)&buffer2) ) > 89) {
194          badFieldNumber = 1;
195        }
196        buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
197        buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
198        if ( (fldPtr->fieldLength = *((unsigned short*)&buffer2) ) > 16) {
199          badFieldLength = 1;
200        }
201        fldPtr->next = cTFSPtr->fieldSet;
202        fldPtr->prev = NULL;
203        if ( cTFSPtr->fieldSet ) {
204          cTFSPtr->fieldSet->prev = fldPtr;
205        }
206        cTFSPtr->fieldSet = fldPtr;
207        if (i==0) {
208          cTFSPtr->lastField = fldPtr;
209        }
210        cpt_fields++;
211        if ( (cpt_fields > 40) || (badFieldNumber == 1) || badFieldLength == 1) { /* FIXME : declarer une constante pour cela */
212          while ( ((*offV9))> (index)){
213            buffer2[1]= *(buf+index); index++;
214            buffer2[0]= *(buf+index); index++;
215            tmp = *((unsigned short*)&buffer2);
216            fprintf (stderr, " %hu ", tmp);
217          }
218          syslog (LOG_INFO,
219                  "in update template function: too many fields, bug collector or wrong template def in template update");
220          fprintf(stderr,
221                  "\nin update template function: too many fields, bug collector or wrong template def in template update\n");
222          ptpltmp = cTFSPtr;
223          if (ptpltmp->prev == NULL) {
224            cr->tplList = ptpltmp->next;
225            if (cr->tplList) {
226              cr->tplList->prev = NULL;
227            }
228          } else {
229            ptpltmp->prev->next = ptpltmp->next;
230            if (ptpltmp->next) {
231              ptpltmp->next->prev = ptpltmp->prev;
232            }
233          }
234          deleteTplFlSet(ptpltmp);
235          cTFSPtr = NULL;
236          return (-1);   
237        }
238        fprintf (stderr, "t for up \n");
239      }
240    } /* end if template creation or update */
241    /* send to queue the template definition */
242/*     fprintf(stderr,"%hu %d\n", tplMsgType, sizeof(tplMsgType)); */
243/*     fprintf(stderr,"%lu %d\n", cr->IpAddress, sizeof(cr->IpAddress)); */
244/*     fprintf(stderr, "%lu.%lu.%lu.%lu ", */
245/*          ( cr->IpAddress)>>24, */
246/*          ( cr->IpAddress)<<8>>24, */
247/*          ( cr->IpAddress)<<16>>24, */
248/*          ( cr->IpAddress)<<24>>24); */
249/*     fprintf(stderr,"%lu %d\n", cTFSPtr->sourceId, sizeof(cTFSPtr->sourceId)); */
250    /* FIXME HERE don't send an wrong def if error detected */
251    msgTextIndex = mempcpy(mempcpy(mempcpy(mempcpy(mempcpy(myMsg.text,
252                                                           &tplMsgType,
253                                                           sizeof(unsigned short)
254                                                           ),
255                                                   &cr->IpAddress,
256                                                   sizeof(unsigned long)
257                                                   ),
258                                           &cTFSPtr->sourceId,
259                                           sizeof(unsigned long)
260                                           ),
261                                   &cTFSPtr->templateFlowSetId,
262                                   sizeof(cTFSPtr->templateFlowSetId)
263                                   ),
264                           &cTFSPtr->fieldCount,
265                           sizeof(cTFSPtr->fieldCount)
266                           );
267    /* add the fields list */
268    tmpField = cTFSPtr->lastField;
269    for (; tmpField; tmpField=tmpField->prev) {
270      msgTextIndex = mempcpy(mempcpy(msgTextIndex,
271                                     &tmpField->fieldType,
272                                     sizeof(tmpField->fieldType)),
273                             &tmpField->fieldLength,
274                             sizeof(tmpField->fieldLength));
275    }
276    myMsg.type = 1;
277    msgSend( myQueue, myMsg);
278    /* end send */
279    (*cFNPtr)++;   
280  } while ( (cpt) < (length-2) ); /*length-2*/
281  return length;
282}
283
284/*
285 * checkTemplateOption
286 *
287 */
288short 
289checkTemplateOption(RouterPtr cr, unsigned short *offV9,
290                    unsigned char *buf, NetFlowV9HeaderPtr v9Ptr,
291                    TplOptionPtr cTOPtr,
292                    short *cFNPtr)
293{
294  int i;
295  static int cpt = 0;
296  static unsigned short getFlowsetId = 0;
297  static unsigned short length = 0;
298  unsigned char buffer2[2];
299  TplOptionPtr ptplotmp;
300  unsigned short badFieldNumber = 0;
301  unsigned short badFieldLength = 0;
302  int cpt_fields = 0;
303
304  buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
305  buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
306  getFlowsetId = *((unsigned short*)&buffer2);
307  buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
308  buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
309  length = *((unsigned short*)&buffer2);
310  do {
311    fprintf (stderr, " TO \n");
312    badFieldNumber = 0;
313    badFieldLength = 0;
314    buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
315    buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
316    if ((cTOPtr=
317         existTplOptId(cr, v9Ptr->sourceId,
318                       *((unsigned short*)&buffer2)))==NULL) {
319      cTOPtr = newRouterTplOptList();
320      cTOPtr->next = cr->tplOptList;
321      if (cr->tplOptList!=NULL) {cr->tplOptList->prev = cTOPtr;}
322      cr->tplOptList = cTOPtr;
323      cTOPtr->templateOptionId = *((unsigned short*)&buffer2);
324      cTOPtr->sourceId = v9Ptr->sourceId;
325      buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
326      buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
327      cTOPtr->optionScopeLg = *((unsigned short*)&buffer2);
328      buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
329      buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
330      cTOPtr->optionLg = *((unsigned short*)&buffer2);
331      cpt_fields = 0;
332      for ( i=0; i<(((cTOPtr->optionScopeLg)+(cTOPtr->optionLg))/4); i++) {
333        FieldPtr tmp = (FieldPtr) malloc(sizeof(struct Field));
334        buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
335        buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
336        if ( (tmp->fieldType = *((unsigned short*)&buffer2) ) > 89) {
337          badFieldNumber = 1;
338        }
339        buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
340        buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
341        if ( (tmp->fieldLength = *((unsigned short*)&buffer2) ) > 16) {
342          badFieldLength = 1;
343        }
344        tmp->next = cTOPtr->fieldSet;
345        tmp->prev = NULL;
346        if ( cTOPtr->fieldSet ) {cTOPtr->fieldSet->prev = tmp;}
347        cTOPtr->fieldSet = tmp;
348        if (i==0) {
349          cTOPtr->lastField = tmp;
350        }
351        cpt_fields++;
352        if ( (cpt_fields > 40) || (badFieldNumber == 1) || badFieldLength == 1) {
353          syslog (LOG_INFO,
354                  "in option template function: too many fields, bug collector or wrong template def in template update");
355          fprintf(stderr,
356                  "\nin option template function: too many fields, bug collector or wrong template def in template update\n");
357          ptplotmp = cTOPtr;
358          if (ptplotmp->prev == NULL) {
359            cr->tplOptList = ptplotmp->next;
360            if (cr->tplOptList) {
361              cr->tplOptList->prev = NULL;
362            }
363          } else {
364            ptplotmp->prev->next = ptplotmp->next;
365            if (ptplotmp->next) {
366              ptplotmp->next->prev = ptplotmp->prev;
367            }
368          }
369          deleteTplOption(ptplotmp);
370          cTOPtr = NULL;
371          return (-1);
372        }
373        fprintf (stderr, "to for new \n");
374      }
375      while ((*offV9)%4 != 0) {
376        (*offV9)++; cpt++;
377        fprintf (stderr, " TO new padding \n");
378      } /*padding case*/
379    } else { /*update */
380      ptplotmp = cTOPtr;
381      if (ptplotmp->prev == NULL) {
382        cr->tplOptList = ptplotmp->next;
383        if (cr->tplOptList) {
384          cr->tplOptList->prev = NULL;
385        }
386      } else {
387        ptplotmp->prev->next = ptplotmp->next;
388        if (ptplotmp->next) {
389          ptplotmp->next->prev = ptplotmp->prev;
390        }
391      }
392      deleteTplOption(ptplotmp);
393      cTOPtr = NULL;
394      cTOPtr = newRouterTplOptList();
395      cTOPtr->next = cr->tplOptList;
396      if (cr->tplOptList!=NULL) {cr->tplOptList->prev = cTOPtr;}
397      cr->tplOptList = cTOPtr;
398      cTOPtr->templateOptionId = *((unsigned short*)&buffer2);
399      cTOPtr->sourceId = v9Ptr->sourceId;
400      buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
401      buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
402      cTOPtr->optionScopeLg = *((unsigned short*)&buffer2);
403      buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
404      buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
405      cTOPtr->optionLg = *((unsigned short*)&buffer2);
406      cpt_fields = 0;
407      for ( i=0; i<(((cTOPtr->optionScopeLg)+(cTOPtr->optionLg))/4); i++) {
408        FieldPtr tmp = (FieldPtr) malloc(sizeof(struct Field));
409        buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
410        buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
411        if ( (tmp->fieldType = *((unsigned short*)&buffer2) ) > 89) {
412          badFieldNumber = 1;
413        }
414        buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
415        buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
416        if ( (tmp->fieldLength = *((unsigned short*)&buffer2) ) > 16) {
417          badFieldLength = 1;
418        }
419        tmp->next = cTOPtr->fieldSet;
420        tmp->prev = NULL;
421        if ( cTOPtr->fieldSet ) {cTOPtr->fieldSet->prev = tmp;}
422        cTOPtr->fieldSet = tmp;
423        if (i==0) {
424          cTOPtr->lastField = tmp;
425        }
426        cpt_fields++;
427        if ( (cpt_fields > 40) || (badFieldNumber == 1) || badFieldLength == 1) {
428          syslog (LOG_INFO,
429                  "in update option tpl function: too many fields, bug collector or wrong template def in template update");
430          fprintf(stderr,
431                  "\nin update option tpl function: too many fields, bug collector or wrong template def in template update\n");
432          ptplotmp = cTOPtr;
433          if (ptplotmp->prev == NULL) {
434            cr->tplOptList = ptplotmp->next;
435            if (cr->tplOptList) {
436              cr->tplOptList->prev = NULL;
437            }
438          } else {
439            ptplotmp->prev->next = ptplotmp->next;
440            if (ptplotmp->next) {
441              ptplotmp->next->prev = ptplotmp->prev;
442            }
443          }
444          deleteTplOption(ptplotmp);
445          cTOPtr = NULL;
446          return (-1);
447        }
448        fprintf (stderr, "to for up \n");
449      }
450      while ((*offV9)%4 != 0) {
451        (*offV9)++; cpt++;
452        fprintf (stderr, " TO update padding \n");
453      } /*padding case*/
454    }
455    (*cFNPtr)++;
456  } while ((cpt) < (length-2));
457/*   show_all_tplFlSet(); */
458  fprintf (stderr, "to return %d \n", length);
459  return length;
460}
461
462
463/*
464 * exist_id
465 *
466 * used in check a template flowset
467 * the id is the source_id(idh) plus getFlowsetId
468 * return:
469 *    - a pointer on the template flowset or NULL
470 */
471TplFlowSetPtr
472existId(RouterPtr cr, unsigned long idh, short idfs)
473{
474  TplFlowSetPtr tmp=cr->tplList;
475  for (; tmp; tmp=tmp->next) {
476    if ((tmp->sourceId==idh)) {
477      return tmp;
478    }
479  }
480  return NULL;
481}
482
483/*
484 * existTplId
485 *
486 * return:
487 *    - a pointer on the correct template flowset definition
488 */
489TplFlowSetPtr
490existTplId(RouterPtr cr, unsigned long sid, short idfs)
491{
492  TplFlowSetPtr tmp=cr->tplList;
493  for (; tmp; tmp=tmp->next) {
494    if ((tmp->sourceId==sid)&&(tmp->templateFlowSetId == idfs)) {
495      return tmp;
496    }
497  }
498  return NULL;
499}
500
501/*
502 * existTploptId
503 *
504 * return:
505 *    - a pointer on the correct template option definition
506 */
507TplOptionPtr
508existTplOptId(RouterPtr cr, unsigned long sid, short idfs)
509{
510  TplOptionPtr tmp=cr->tplOptList;
511  for (; tmp; tmp=tmp->next) {
512    if ((tmp->sourceId==sid)&&(tmp->templateOptionId == idfs)) {
513      return tmp;
514    }
515  }
516  return NULL;
517}
Note: See TracBrowser for help on using the browser.