root/trunk/src/template.c @ 29

Revision 29, 15.5 KB (checked in by andreu, 15 years ago)

sampling information in rrd filename - optional template first step

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