root/trunk/src/template.c @ 23

Revision 23, 12.1 KB (checked in by andreu, 16 years ago)

optimization : new param : myPtrs in checkdataflowset function

  • 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 */
55unsigned short 
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;
72  /* for msg sending: */
73  msgType myMsg;
74  FieldPtr tmpField;
75  char *msgTextIndex;
76  unsigned short tplMsgType = 1;
77
78  buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
79  buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
80  getFlowsetId = *((unsigned short*)&buffer2);
81  buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
82  buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
83  length = *((unsigned short*)&buffer2);
84  do {
85    buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
86    buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
87    if ((cTFSPtr=
88         existTplId(cr, v9Ptr->sourceId,
89                    *((unsigned short*)&buffer2)))==NULL) {
90      cTFSPtr = newRouterTplList();
91      cTFSPtr->next = cr->tplList;
92      if (cr->tplList!=NULL) {cr->tplList->prev = cTFSPtr;}
93      cr->tplList = cTFSPtr;
94      cTFSPtr->templateFlowSetId = *((unsigned short*)&buffer2);
95      cTFSPtr->sourceId = v9Ptr->sourceId;
96      buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
97      buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
98      cTFSPtr->fieldCount = *((unsigned short*)&buffer2);
99      cpt_fields = 0;
100      for ( i=0; i<cTFSPtr->fieldCount; i++) {
101        FieldPtr fldPtr = (FieldPtr) malloc(sizeof(struct Field));
102        buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
103        buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
104        fldPtr->fieldType = *((unsigned short*)&buffer2);
105        buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
106        buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
107        fldPtr->fieldLength = *((unsigned short*)&buffer2);
108        fldPtr->next = cTFSPtr->fieldSet;
109        fldPtr->prev = NULL;
110        if ( cTFSPtr->fieldSet ) {cTFSPtr->fieldSet->prev = fldPtr;}
111        cTFSPtr->fieldSet = fldPtr;
112        if (i==0) {
113          cTFSPtr->lastField = fldPtr;
114        }
115        cpt_fields++;
116        if ( cpt_fields > 40 ) { /* FIXME : declarer une constante pour cela */
117          fprintf(stderr,"IP: %lu \n",cr->IpAddress);
118          fprintf (stderr, "cTFSPtr->templateFlowSetId: %hu\n",
119                   cTFSPtr->templateFlowSetId);
120          while ( ((*offV9))> (index)){
121            buffer2[1]= *(buf+index); index++;
122            buffer2[0]= *(buf+index); index++;
123            tmp = *((unsigned short*)&buffer2);
124            fprintf (stderr, " %hu ", tmp);
125          }
126          syslog (LOG_INFO,
127                  "fields nb too large, bug collector or wrong template def");
128          cTFSPtr = deleteTplFlSet(cTFSPtr);
129        }
130      }
131    } else { /*update*/
132      ptpltmp = cTFSPtr;
133      if (ptpltmp->prev == NULL) {
134        cr->tplList = ptpltmp->next;
135        if (cr->tplList) {
136          cr->tplList->prev = NULL;
137        }
138      } else {
139        ptpltmp->prev->next = ptpltmp->next;
140        if (ptpltmp->next) {
141          ptpltmp->next->prev = ptpltmp->prev;
142        }
143      }
144      deleteTplFlSet(ptpltmp);
145      cTFSPtr = NULL;
146      cTFSPtr = newRouterTplList();
147      cTFSPtr->next = cr->tplList;
148      if (cr->tplList!=NULL) {cr->tplList->prev = cTFSPtr;}
149      cr->tplList = cTFSPtr;
150      cTFSPtr->templateFlowSetId = *((unsigned short*)&buffer2);
151      cTFSPtr->sourceId = v9Ptr->sourceId;
152      buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
153      buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
154      cTFSPtr->fieldCount = *((unsigned short*)&buffer2);
155      cpt_fields = 0;
156      for ( i=0; i<cTFSPtr->fieldCount; i++) {
157        FieldPtr fldPtr = (FieldPtr) malloc(sizeof(struct Field));
158        buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
159        buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
160        fldPtr->fieldType = *((unsigned short*)&buffer2);
161        buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
162        buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
163        fldPtr->fieldLength = *((unsigned short*)&buffer2);
164        fldPtr->next = cTFSPtr->fieldSet;
165        fldPtr->prev = NULL;
166        if ( cTFSPtr->fieldSet ) {
167          cTFSPtr->fieldSet->prev = fldPtr;
168        }
169        cTFSPtr->fieldSet = fldPtr;
170        if (i==0) {
171          cTFSPtr->lastField = fldPtr;
172        }
173        cpt_fields++;
174        if ( cpt_fields > 40 ) { /* FIXME : declarer une constante pour cela */
175          while ( ((*offV9))> (index)){
176            buffer2[1]= *(buf+index); index++;
177            buffer2[0]= *(buf+index); index++;
178            tmp = *((unsigned short*)&buffer2);
179            fprintf (stderr, " %hu ", tmp);
180          }
181          syslog (LOG_INFO,
182                  "fields nb too large, bug collector or wrong template def");
183          cTFSPtr = deleteTplFlSet(cTFSPtr);
184        }
185      }
186    } /* end if template creation or update */
187    /* send to queue the template definition */
188/*     fprintf(stderr,"%hu %d\n", tplMsgType, sizeof(tplMsgType)); */
189/*     fprintf(stderr,"%lu %d\n", cr->IpAddress, sizeof(cr->IpAddress)); */
190/*     fprintf(stderr, "%lu.%lu.%lu.%lu ", */
191/*          ( cr->IpAddress)>>24, */
192/*          ( cr->IpAddress)<<8>>24, */
193/*          ( cr->IpAddress)<<16>>24, */
194/*          ( cr->IpAddress)<<24>>24); */
195/*     fprintf(stderr,"%lu %d\n", cTFSPtr->sourceId, sizeof(cTFSPtr->sourceId)); */
196    /* FIXME HERE don't send an wrong def if error detected */
197    msgTextIndex = mempcpy(mempcpy(mempcpy(mempcpy(mempcpy(myMsg.text,
198                                                           &tplMsgType,
199                                                           sizeof(unsigned short)
200                                                           ),
201                                                   &cr->IpAddress,
202                                                   sizeof(unsigned long)
203                                                   ),
204                                           &cTFSPtr->sourceId,
205                                           sizeof(unsigned long)
206                                           ),
207                                   &cTFSPtr->templateFlowSetId,
208                                   sizeof(cTFSPtr->templateFlowSetId)
209                                   ),
210                           &cTFSPtr->fieldCount,
211                           sizeof(cTFSPtr->fieldCount)
212                           );
213    /* add the fields list */
214    tmpField = cTFSPtr->lastField;
215    for (; tmpField; tmpField=tmpField->prev) {
216      msgTextIndex = mempcpy(mempcpy(msgTextIndex,
217                                     &tmpField->fieldType,
218                                     sizeof(tmpField->fieldType)),
219                             &tmpField->fieldLength,
220                             sizeof(tmpField->fieldLength));
221    }
222    myMsg.type = 1;
223    msgSend( myQueue, myMsg);
224    /* end send */
225    (*cFNPtr)++;   
226  } while ( (cpt) < (length-2) ); /*length-2*/
227  return length;
228}
229
230/*
231 * checkTemplateOption
232 *
233 */
234unsigned short 
235checkTemplateOption(RouterPtr cr, unsigned short *offV9,
236                    unsigned char *buf, NetFlowV9HeaderPtr v9Ptr,
237                    TplOptionPtr cTOPtr,
238                    short *cFNPtr)
239{
240  int i;
241  static int cpt = 0;
242  static unsigned short getFlowsetId = 0;
243  static unsigned short length = 0;
244  unsigned char buffer2[2];
245  TplOptionPtr ptplotmp;
246
247  buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
248  buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
249  getFlowsetId = *((unsigned short*)&buffer2);
250  buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
251  buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
252  length = *((unsigned short*)&buffer2);
253  do {
254    buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
255    buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
256    if ((cTOPtr=
257         existTplOptId(cr, v9Ptr->sourceId,
258                       *((unsigned short*)&buffer2)))==NULL) {
259      cTOPtr = newRouterTplOptList();
260      cTOPtr->next = cr->tplOptList;
261      if (cr->tplOptList!=NULL) {cr->tplOptList->prev = cTOPtr;}
262      cr->tplOptList = cTOPtr;
263      cTOPtr->templateOptionId = *((unsigned short*)&buffer2);
264      cTOPtr->sourceId = v9Ptr->sourceId;
265      buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
266      buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
267      cTOPtr->optionScopeLg = *((unsigned short*)&buffer2);
268      buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
269      buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
270      cTOPtr->optionLg = *((unsigned short*)&buffer2);
271      for ( i=0; i<(((cTOPtr->optionScopeLg)+(cTOPtr->optionLg))/4); i++) {
272        FieldPtr tmp = (FieldPtr) malloc(sizeof(struct Field));
273        buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
274        buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
275        tmp->fieldType = *((unsigned short*)&buffer2);
276        buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
277        buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
278        tmp->fieldLength = *((unsigned short*)&buffer2);
279        tmp->next = cTOPtr->fieldSet;
280        tmp->prev = NULL;
281        if ( cTOPtr->fieldSet ) {cTOPtr->fieldSet->prev = tmp;}
282        cTOPtr->fieldSet = tmp;
283        if (i==0) {
284          cTOPtr->lastField = tmp;
285        }
286      }
287      while ((*offV9)%4 != 0) {
288        (*offV9)++; cpt++;
289      } /*padding case*/
290    } else { /*update */
291      ptplotmp = cTOPtr;
292      if (ptplotmp->prev == NULL) {
293        cr->tplOptList = ptplotmp->next;
294        if (cr->tplOptList) {
295          cr->tplOptList->prev = NULL;
296        }
297      } else {
298        ptplotmp->prev->next = ptplotmp->next;
299        if (ptplotmp->next) {
300          ptplotmp->next->prev = ptplotmp->prev;
301        }
302      }
303      deleteTplOption(ptplotmp);
304      cTOPtr = NULL;
305      cTOPtr = newRouterTplOptList();
306      cTOPtr->next = cr->tplOptList;
307      if (cr->tplOptList!=NULL) {cr->tplOptList->prev = cTOPtr;}
308      cr->tplOptList = cTOPtr;
309      cTOPtr->templateOptionId = *((unsigned short*)&buffer2);
310      cTOPtr->sourceId = v9Ptr->sourceId;
311      buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
312      buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
313      cTOPtr->optionScopeLg = *((unsigned short*)&buffer2);
314      buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
315      buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
316      cTOPtr->optionLg = *((unsigned short*)&buffer2);
317      for ( i=0; i<(((cTOPtr->optionScopeLg)+(cTOPtr->optionLg))/4); i++) {
318        FieldPtr tmp = (FieldPtr) malloc(sizeof(struct Field));
319        buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
320        buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
321        tmp->fieldType = *((unsigned short*)&buffer2);
322        buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++;
323        buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++;
324        tmp->fieldLength = *((unsigned short*)&buffer2);
325        tmp->next = cTOPtr->fieldSet;
326        tmp->prev = NULL;
327        if ( cTOPtr->fieldSet ) {cTOPtr->fieldSet->prev = tmp;}
328        cTOPtr->fieldSet = tmp;
329        if (i==0) {
330          cTOPtr->lastField = tmp;
331        }
332      }
333      while ((*offV9)%4 != 0) {
334        (*offV9)++; cpt++;
335      } /*padding case*/
336    }
337    (*cFNPtr)++;
338  } while ((cpt) < (length-2));
339/*   show_all_tplFlSet(); */
340  return length;
341}
342
343
344/*
345 * exist_id
346 *
347 * used in check a template flowset
348 * the id is the source_id(idh) plus getFlowsetId
349 * return:
350 *    - a pointer on the template flowset or NULL
351 */
352TplFlowSetPtr
353existId(RouterPtr cr, unsigned long idh, short idfs)
354{
355  TplFlowSetPtr tmp=cr->tplList;
356  for (; tmp; tmp=tmp->next) {
357    if ((tmp->sourceId==idh)) {
358      return tmp;
359    }
360  }
361  return NULL;
362}
363
364/*
365 * existTplId
366 *
367 * return:
368 *    - a pointer on the correct template flowset definition
369 */
370TplFlowSetPtr
371existTplId(RouterPtr cr, unsigned long sid, short idfs)
372{
373  TplFlowSetPtr tmp=cr->tplList;
374  for (; tmp; tmp=tmp->next) {
375    if ((tmp->sourceId==sid)&&(tmp->templateFlowSetId == idfs)) {
376      return tmp;
377    }
378  }
379  return NULL;
380}
381
382/*
383 * existTploptId
384 *
385 * return:
386 *    - a pointer on the correct template option definition
387 */
388TplOptionPtr
389existTplOptId(RouterPtr cr, unsigned long sid, short idfs)
390{
391  TplOptionPtr tmp=cr->tplOptList;
392  for (; tmp; tmp=tmp->next) {
393    if ((tmp->sourceId==sid)&&(tmp->templateOptionId == idfs)) {
394      return tmp;
395    }
396  }
397  return NULL;
398}
Note: See TracBrowser for help on using the browser.