root/trunk/src/template.c @ 15

Revision 15, 13.0 KB (checked in by andreu, 17 years ago)

?

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