root/trunk/src/template.c @ 28

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

debug mode in compilation option - Wno-long-long - copyright update

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