root/trunk/src/renetcol.c @ 30

Revision 30, 21.1 KB (checked in by andreu, 15 years ago)

bug of "template fantom" correction

  • Property svn:eol-style set to native
Line 
1/*
2 * File: renetcol.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 "renetcol.h"
27
28struct MyPtrs myPtrs; /* defined in dataflowset.h */
29
30struct SHMForAgg *shmForAgg;
31
32struct IPFLowCache tabIP[MAX_IP_FLOW];
33struct MPLSFlowCache tabMPLS[MAX_MPLS_FLOW];
34unsigned long ipNb = 0;                     /* counter of IP flows number */
35unsigned long mplsNb = 0;                   /* counter of MPLS flow number */
36
37unsigned short currentIPOutputFile = 0;    /* index on the current IP file */
38unsigned short currentMPLSOutputFile = 0;  /* index on the current MPLS file */
39char outputName[256];
40char cof_str[20];                          /* current ouput file name */
41FILE *fIP;                                 /* pointer on the IP output file */
42FILE *fMPLS;                              /* pointer on the MPLS output file */
43
44char *rulesFileName;                    /* file name of the rules (like acl) */
45char *configFileName;                   /* file name where routers list is */
46char *prefixV4FileName;                 /* IPv4 prefix list */
47
48struct sigaction myAction; /* handler for renetcolSender communication */
49sigjmp_buf contextSigalrm; /* '' */
50volatile sig_atomic_t sigusr1Up = 0;
51/* struct sigaction myAction;  for timer not used in this version */
52
53unsigned short currentIntervalle = 0;        /* based on 5 min intervalles */ 
54
55unsigned short offsetV9 = 0;                 /* index in a neflow v9 packet */
56
57unsigned char buffer1;
58unsigned char buffer2[2];
59unsigned char buffer4[4];
60unsigned char buffer6[6];
61
62short currentFlowsetNumber;
63short currentFlowsetId;
64TplFlowSetPtr curTplFlSetPtr; /* current template flowset pointer */
65TplOptionPtr curTplOptionPtr;
66RouterPtr routersListPtr;
67
68unsigned long sortedRouterList[ROUTER_INDEX_MAX];
69unsigned long indexedRouterList[ROUTER_INDEX_MAX];
70int routerNb = 0;                                  /* routers number */
71/* unsigned short v4PrefixNb = 0;                    IPv4 prefix number */ 
72/* struct PrefixV4 prefixV4Tab[2][MAX_IPV4_PREFIX];  IPv4 prefix structure */
73
74
75key_t myKey = 0; /* FIXME to delete in futur */
76int myQueue = 0; /* FIXME to delete in futur */
77
78/* Next structure used as cache in rules reading */
79RuleDefPtr rulesAddress[FIELD_TYPE_NUMBER+1][MAX_RULES_PER_FIELD];
80
81int reInitConf = 0;
82
83static time_t lastRock;
84static struct tm *tmPtr;
85
86extern int errno;
87static int inputSock;
88static int sockNamelg;
89static int inputSock2;
90static int sockNameFromlg;
91static int rcv;
92static int sockBufSize = SOCKET_BUFFER_SIZE;           
93/* static unsigned short flowNumber; */
94static unsigned short receptPort = RECEPTION_PORT;
95/* static unsigned char *ptr_buffer; */
96static char *receptAddress = RECEPTION_ADDRESS;
97static struct sockaddr_in name;
98static struct sockaddr_in name2;
99static struct sockaddr_in fromName;
100
101/*
102 * Main
103 * ----
104 */
105int 
106main (int argc, char *argv[])
107{
108  RulesPtr tmp = NULL;
109  int shmid;
110  key_t key;
111 
112  if ( argc != 4) {
113    fprintf (stderr,
114             "%s: Usage: %s <routers file> <prefix IPv4 file> <rules file>\n exp: %s routers.txt IPv4_prefix.txt rules.txt\n",
115             argv[0], argv[0], argv[0]);
116    exit(1);
117  }
118
119#ifdef CRIHAN
120  fprintf(stderr, "renetcol compilation with CRIHAN feature enable\n");
121#endif
122#ifdef IPV4AGG
123  fprintf(stderr, "renetcol compilation and execution with IPv4 Aggregation feature enable\n");
124#endif
125 
126  openlog(argv[0], LOG_PID, LOG_USER);
127 
128  configFileName = (char *) malloc((strlen(argv[1])+1) * sizeof(char));
129  strcpy (configFileName, argv[1]);
130  prefixV4FileName = (char *) malloc((strlen(argv[2])+1) * sizeof(char));
131  strcpy (prefixV4FileName, argv[2]);
132  rulesFileName = (char *) malloc((strlen(argv[3])+1) * sizeof(char));
133  strcpy (rulesFileName, argv[3]);
134
135  initCache();
136  routerNb = getRegisteredRouters(configFileName, &sortedRouterList[0],
137                                  &indexedRouterList[0]);
138  key = 8765;
139  if ((shmid = shmget(key, SHMSIZE, IPC_CREAT | 0666)) < 0) {
140    perror("shmget");
141    exit(1);
142  }
143  if ((shmForAgg = (struct SHMForAgg *)shmat(shmid, (void *)0, 0)) == (void *) -1) {
144    perror("shmat");
145    exit(1);
146  }
147
148  if ( (shmForAgg->v4PrefixNb = getPrefixV4(prefixV4FileName, &(shmForAgg->prefixV4Tab[0][0]))) < 1){
149    fprintf(stderr, "renetcol: Error \n");
150    exit(1);
151  }
152  if ( (shmForAgg->v4PrefixNb = getPrefixV4(prefixV4FileName, &(shmForAgg->prefixV4Tab[1][0]))) < 1){
153    fprintf(stderr, "renetcol:  Error \n");
154    exit(1);
155  }
156
157  shmForAgg->currentTable = 0;
158  shmForAgg->secondTable = 1;
159
160  myPtrs.rulesListPtr = NULL;
161  myPtrs.rulesListPtr = getLightRules(myPtrs.rulesListPtr, rulesFileName);
162  tmp = myPtrs.rulesListPtr;
163  for ( ; tmp->next; tmp=tmp->next) {
164    if (tmp->type != 2) {
165      myPtrs.rulesListPtr = delRule(tmp, myPtrs.rulesListPtr);
166    }
167  }
168/*   printRule(rulesListPtr); */
169/*   exit(1); */
170
171  fprintf(stderr, "renetcol: I become a deamon, next messages via syslogd. By.\n");
172  if (fork () != 0)
173    exit (0);
174  if (setsid() == -1){
175    exit(4);
176  }
177
178  /* handler, SIGUSR1 from renetcolSender */
179  myAction.sa_handler = sigusr1Mgmt;
180  myAction.sa_flags = SA_RESTART;
181  sigemptyset (&(myAction.sa_mask));
182  sigaddset (&(myAction.sa_mask), SIGALRM);
183  sigaction (SIGUSR1, &myAction, NULL);
184
185  /* Pointer on rules Table */
186  setCache(myPtrs.rulesListPtr);
187  myPtrs.rulesAddressPtr = (RuleDefPtr *)rulesAddress;
188
189  /* init IPC messages queue */
190  myKey = createKey(argv[0]);
191  myQueue = createQueue(myKey);
192  sendMyPid(myQueue);
193
194  /* INIT THE CURRENTS VARIABLES*/
195  myPtrs.currentRouterPtr = routersListPtr;
196  myPtrs.currentHeaderV9Ptr = (NetFlowV9HeaderPtr)
197    malloc(sizeof(struct NetFlowV9Header));
198  myPtrs.offsetV9Ptr = &offsetV9;
199  myPtrs.currentFlowsetIdPtr = &currentFlowsetId;
200  myPtrs.pcktPtr = (DatagramPtr) malloc(sizeof(struct Datagram));
201  myPtrs.currentFlowsetNumberPtr = &currentFlowsetNumber;
202  myPtrs.ipNbPtr =  &ipNb;
203  myPtrs.mplsNbPtr =  &mplsNb;
204  myPtrs.routersID = &indexedRouterList;
205  myPtrs.currentV4Tab = shmForAgg->prefixV4Tab[shmForAgg->currentTable];
206  myPtrs.secondV4Tab = shmForAgg->prefixV4Tab[shmForAgg->secondTable]; 
207 
208  if (myPtrs.pcktPtr==NULL) {
209    fprintf(stderr, "ERROR in struct Datagram allocation\n");
210    exit(1);
211  } else {
212    myPtrs.pcktPtr->ipH = (IpHeaderPtr) malloc(sizeof(struct IpHeader));
213    myPtrs.pcktPtr->udp_header = (UdpHeaderPtr) malloc(sizeof(struct UdpHeader));
214  }
215
216  if (! (myPtrs.ptr_buffer = malloc(sockBufSize))) 
217    {
218      printf("ERROR during socket buffer allocation\n");
219      exit(2);
220    }
221
222  /* INIT INPUT STREAM*/
223  initStream();
224
225  socketLoop(); /* all work on datagram is made here */
226
227  closelog();
228
229  fprintf(stderr, "END\n");
230
231  return (0);
232}
233
234/*
235 * send his PID to another program via IPC message queue
236 *
237 * @param queueID the IPC queue ident
238 *
239 */
240void 
241sendMyPid(int queueID)
242{
243  msgType myMsg;
244  char *msgTextIndex;
245  unsigned short tplMsgType = 12;
246  pid_t myPID;
247 
248  myPID = getpid();
249  msgTextIndex = mempcpy(mempcpy(myMsg.text,
250                                 &tplMsgType,
251                                 sizeof (unsigned short)
252                                 ),
253                         &myPID,
254                         sizeof(pid_t)
255                         );
256  myMsg.type = 1;
257  msgSend(queueID, myMsg);
258}
259
260/*
261 * Send the "read rules list" message to another program
262 *
263 * @param queueID the IPC queue ident
264 *
265 */
266void sendReadRulesSignal(int queueID)
267{
268  msgType myMsg;
269  char *msgTextIndex;
270  unsigned short tplMsgType = 13;
271 
272  msgTextIndex = mempcpy(myMsg.text,
273                         &tplMsgType,
274                         sizeof (unsigned short)
275                         );
276  myMsg.type = 1;
277  msgSend(queueID, myMsg);
278}
279
280/*
281 *
282 */
283void 
284sigusr1Mgmt(int num)
285{
286  sigusr1Up = 1;
287}
288
289/*
290 * init the rule structure
291 */
292void 
293initRule()
294{
295  RulesPtr tmp = NULL;
296  initCache();
297  tmp = myPtrs.rulesListPtr;
298  for ( ; tmp; tmp=tmp->next) {
299    myPtrs.rulesListPtr = delRule(tmp, myPtrs.rulesListPtr);
300  }
301  myPtrs.rulesListPtr = NULL;
302  myPtrs.rulesListPtr = getLightRules(myPtrs.rulesListPtr, rulesFileName);
303  tmp = myPtrs.rulesListPtr;
304  for ( ; tmp; tmp=tmp->next) {
305    if (tmp->type != 2) {
306      myPtrs.rulesListPtr = delRule(tmp, myPtrs.rulesListPtr);
307    }
308  }
309  tmp = NULL;
310  initCache();
311  setCache(myPtrs.rulesListPtr);
312  sendReadRulesSignal(myQueue);
313}
314
315/*
316 * init cache table
317 */
318void
319initCache()
320{
321  int i,j;
322  for (i=0; i<FIELD_TYPE_NUMBER+1; i++){
323    for (j=0; j<MAX_RULES_PER_FIELD; j++){
324      rulesAddress[i][j] = NULL;
325    }
326  }
327}
328
329/*
330 * setCache()
331 */
332void
333setCache(RulesPtr rPtr)
334{
335  int i=0;
336  RulesPtr tmp = rPtr;
337  RuleDefPtr def = NULL;
338
339  while (tmp) {
340    def = tmp->def;
341    while (def) {
342      i = 0;
343      while (rulesAddress[def->fieldType][i] != NULL){
344        i++;
345      }
346      rulesAddress[def->fieldType][i] = def;
347      def = def->next;
348    }
349    tmp = tmp->next;
350  }
351}
352
353/*
354 * initStream()
355 */
356void 
357initStream()
358{
359  static unsigned short n0, n1, n2, n3;
360
361  initSocket();
362  if (sscanf(receptAddress,"%hu.%hu.%hu.%hu",&n0,&n1,&n2,&n3)==0) {
363    perror("sscanf");
364  }             
365  buffer4[0] = (unsigned char)n3;
366  buffer4[1] = (unsigned char)n2;
367  buffer4[2] = (unsigned char)n1;
368  buffer4[3] = (unsigned char)n0;
369}
370
371/*
372 * socketLoop()
373 */
374int 
375socketLoop()
376{
377  short shift;
378  short version = 0;
379  int regRouter = 0;
380  time_t now = time((time_t *)NULL);
381  int iIP, iMPLS, i;
382  int loopNb = 0;
383  int gardeFou = 0;
384  time_t lastIPOutput, lastMPLSOutput;
385  time_t receptionTime;
386
387  now = time((time_t *)NULL);
388  tmPtr = localtime(&now);
389  currentIntervalle = tmPtr->tm_min;
390  lastMPLSOutput = now;
391  lastIPOutput = now;
392  do {
393#ifdef DEBUG   
394    fprintf (stderr, "[");
395#endif
396    if ( ((tmPtr->tm_min)%STEP == 0) && (currentIntervalle != tmPtr->tm_min)){
397      currentIntervalle = tmPtr->tm_min;
398      if (shmForAgg->currentTable == 0) {
399        shmForAgg->currentTable = 1;
400        shmForAgg->secondTable = 0;
401      }else{
402        shmForAgg->currentTable = 0;
403        shmForAgg->secondTable = 1;
404      }
405      shmForAgg->readed = 1;
406    }
407    if (sigusr1Up == 1){
408      sigusr1Up = 0;
409      initRule();
410    }
411    socketReading();
412    getIpHeader(myPtrs.pcktPtr, myPtrs.ptr_buffer);
413    regRouter = checkIpHeader(myPtrs.pcktPtr, &sortedRouterList[0], routerNb);
414    getUdpHeader(myPtrs.pcktPtr, myPtrs.ptr_buffer);
415    if ( checkUdpHeader(myPtrs.pcktPtr, regRouter, receptPort) == 1 ){
416      continue;
417    }
418   
419    switch( version =
420            getNetFlowHeader(myPtrs.pcktPtr, myPtrs.ptr_buffer,
421                             myPtrs.currentHeaderV9Ptr, myPtrs.offsetV9Ptr)){
422    case 9:
423      if ((myPtrs.currentRouterPtr=notExistRouter(routersListPtr,
424                                                  myPtrs.pcktPtr->ipH->srcAdd))==NULL) {
425        routersListPtr = addRouter(routersListPtr,
426                                   myPtrs.pcktPtr->ipH->srcAdd,
427                                   (unsigned long) 0);
428        myPtrs.currentRouterPtr = routersListPtr;
429      }
430      currentFlowsetNumber = 0;
431      shift = 0;
432      gardeFou=0;
433      while ((currentFlowsetNumber < myPtrs.currentHeaderV9Ptr->count)) {
434        gardeFou++;
435        curTplFlSetPtr = NULL;
436        currentFlowsetId=getFlowsetId(currentFlowsetNumber,
437                                      myPtrs.offsetV9Ptr, myPtrs.ptr_buffer);
438        if ( currentFlowsetId == 0 ) {
439          if ( (shift = checkTemplateFlowSet(myPtrs.currentRouterPtr, myPtrs.offsetV9Ptr,
440                                             myPtrs.ptr_buffer, myPtrs.currentHeaderV9Ptr,
441                                             curTplFlSetPtr,
442                                             myPtrs.currentFlowsetNumberPtr,
443                                             myQueue)) < 0 ) {
444#ifdef DEBUG
445            fprintf (stderr, "w>\n");
446#endif
447            currentFlowsetNumber = myPtrs.currentHeaderV9Ptr->count + 1;
448          };
449          writeAllTplFlSet();
450        } else if (currentFlowsetId == 1) {
451          if ( (shift = checkTemplateOption(myPtrs.currentRouterPtr, myPtrs.offsetV9Ptr,
452                                      myPtrs.ptr_buffer, myPtrs.currentHeaderV9Ptr,
453                                      curTplOptionPtr,
454                                            myPtrs.currentFlowsetNumberPtr) ) < 0 ) {
455#ifdef DEBUG
456            fprintf (stderr, "wo>\n");
457#endif 
458            currentFlowsetNumber = myPtrs.currentHeaderV9Ptr->count + 1;
459          }
460        } else if (currentFlowsetId > 255) {
461          if ( (shift = checkDataFlowSet(shift,
462                                         &myPtrs,
463                                         myQueue,
464                                         shmForAgg->prefixV4Tab[shmForAgg->currentTable],
465                                         (size_t) shmForAgg->v4PrefixNb
466                                         ) ) < 0 ) {
467#ifdef DEBUG   
468            fprintf (stderr, "wd>\n");
469#endif
470            currentFlowsetNumber = myPtrs.currentHeaderV9Ptr->count + 1;
471          }
472        } else {
473#ifdef DEBUG   
474          fprintf (stderr, "1<<255\n");
475#endif
476          currentFlowsetNumber = myPtrs.currentHeaderV9Ptr->count + 1;
477        }
478        if ( gardeFou > 200) { exit(-1); }
479      } /* end while flowset exist */
480      break;
481    default:
482      syslog(LOG_INFO,
483             "NetFlow exp. version unknown: %hu, from router: %lu.%lu.%lu.%lu",
484             (unsigned short) version,
485             (myPtrs.pcktPtr->ipH->srcAdd>>24),
486             (myPtrs.pcktPtr->ipH->srcAdd<<8>>24),
487             (myPtrs.pcktPtr->ipH->srcAdd<<16>>24),
488             (myPtrs.pcktPtr->ipH->srcAdd<<24>>24));
489      break;
490    }
491    if (loopNb  > 1000 ){
492      /* FIXME perhaps call this function via the compilation options */
493      writeAllTplFlSet();
494#ifdef DEBUG   
495      fprintf(stderr, "W");
496#endif
497      loopNb = 0;
498    }
499    loopNb++;
500
501#ifdef CRIHAN
502    now = time((time_t *)NULL);
503    receptionTime = now;
504    if ( (ipNb > (MAX_IP_FLOW - 50)) ||
505         ( (now-lastIPOutput) > IP_TIME_THRESHOLD) ) {
506      outputName[0] = '\0';
507      sprintf(cof_str, "%d", currentIPOutputFile);
508      strcat(outputName, OUTPUT_IP);
509      strcat(outputName, cof_str);
510      strcat(outputName, EXTENSION);
511      if (fopen(outputName, "x") == NULL) {
512        currentIPOutputFile = (currentIPOutputFile + 1)%MAX_IP_OUTPUT_FILES;
513        outputName[0] = '\0';
514        sprintf(cof_str, "%d", currentIPOutputFile);
515        strcat(outputName, OUTPUT_IP);
516        strcat(outputName, cof_str);
517        strcat(outputName, EXTENSION);
518      }
519      if ((fIP = fopen(outputName, "w")) == NULL) {
520        syslog(LOG_ERR,"Error in OUTPUT_IP opening : %s", strerror(errno));
521      } else {
522        for ( iIP = 0; iIP < ipNb; iIP++){
523          if ( tabIP[iIP].ipProt == 0 ) {
524            fprintf(fIP, "%lu;%lu;%hu;%hu;%lu.%lu.%lu.%lu;%lu.%lu.%lu.%lu;%d;%hu;%hu;%d;%d;%lu.%lu.%lu.%lu;%lu;%d\n",
525                    tabIP[iIP].bytes, tabIP[iIP].pkts,
526                    tabIP[iIP].inSnmp,  tabIP[iIP].outSnmp,
527                    tabIP[iIP].v4AdS>>24, tabIP[iIP].v4AdS<<8>>24,
528                    tabIP[iIP].v4AdS<<16>>24, tabIP[iIP].v4AdS<<24>>24,
529                    tabIP[iIP].v4AdD>>24, tabIP[iIP].v4AdD<<8>>24,
530                    tabIP[iIP].v4AdD<<16>>24, tabIP[iIP].v4AdD<<24>>24,
531                    tabIP[iIP].tProt, tabIP[iIP].sPort,
532                    tabIP[iIP].dPort, tabIP[iIP].maskD,
533                    tabIP[iIP].maskS, tabIP[iIP].routerAd>>24,
534                    tabIP[iIP].routerAd<<8>>24, tabIP[iIP].routerAd<<16>>24,
535                    tabIP[iIP].routerAd<<24>>24, tabIP[iIP].liveTime,
536                    receptionTime
537                    );
538          }
539        }
540        fclose(fIP);
541      }
542      ipNb = 0;
543      lastIPOutput = now;
544    }
545    now = time((time_t *)NULL);
546    if ( mplsNb > (MAX_MPLS_FLOW - 50) ||
547         ( (now-lastMPLSOutput) > MPLS_TIME_THRESHOLD) ) {
548      outputName[0] = '\0';
549      sprintf(cof_str, "%d", currentMPLSOutputFile);
550      strcat(outputName, OUTPUT_MPLS);
551      strcat(outputName, cof_str);
552      strcat(outputName, EXTENSION);
553      if (fopen(outputName, "x") == NULL) {
554        currentMPLSOutputFile = (currentMPLSOutputFile + 1)%MAX_MPLS_OUTPUT_FILES;
555        outputName[0] = '\0';
556        sprintf(cof_str, "%d", currentMPLSOutputFile);
557        strcat(outputName, OUTPUT_MPLS);
558        strcat(outputName, cof_str);
559        strcat(outputName, EXTENSION);
560      }
561      if ((fMPLS = fopen(outputName, "w")) == NULL) {
562        syslog(LOG_ERR,"Error in OUTPUT_MPLS opening : %s", strerror(errno));
563      } else {
564        for ( iMPLS = 0; iMPLS < mplsNb; iMPLS++){
565          if ( tabMPLS[iMPLS].ipProt == 0 ) {
566            fprintf(fMPLS, "%lu.%lu.%lu.%lu;%hu;%lu.%lu.%lu.%lu;%lu.%lu.%lu.%lu\n",
567                    tabMPLS[iMPLS].routerAd>>24,tabMPLS[iMPLS].routerAd<<8>>24,
568                    tabMPLS[iMPLS].routerAd<<16>>24,
569                    tabMPLS[iMPLS].routerAd<<24>>24,
570                    tabMPLS[iMPLS].mplsLabel1,tabMPLS[iMPLS].v4AdS>>24,
571                    tabMPLS[iMPLS].v4AdS<<8>>24,tabMPLS[iMPLS].v4AdS<<16>>24,
572                    tabMPLS[iMPLS].v4AdS<<24>>24,tabMPLS[iMPLS].v4AdD>>24,
573                    tabMPLS[iMPLS].v4AdD<<8>>24,tabMPLS[iMPLS].v4AdD<<16>>24,
574                    tabMPLS[iMPLS].v4AdD<<24>>24
575                    );
576          }
577        }
578        fclose(fMPLS);
579      }
580      mplsNb = 0;
581      lastMPLSOutput = now;
582    }
583#endif /* CRIHAN */
584    now = time((time_t *)NULL);
585    tmPtr = localtime(&now);
586#ifdef DEBUG   
587    fprintf (stderr, "]\n");
588#endif
589  } while (1);
590}
591
592/*
593 * initSocket()
594 */
595short 
596initSocket()
597{
598  inputSock = socket(AF_INET, SOCK_RAW, IPPROTO_UDP);
599  if (inputSock < 0)
600    {
601      syslog(LOG_ERR,"socket : %s", strerror(errno));
602      exit(1);
603    }
604  memset((void*)&name, 0, sizeof(name));
605  name.sin_family = AF_INET;
606  name.sin_addr.s_addr = htonl(INADDR_ANY);
607  if (name.sin_addr.s_addr == INADDR_NONE){
608    syslog(LOG_ERR, " INADDR_NONE ");
609    exit(1);
610  }
611  name.sin_port = htons(receptPort);
612  if (bind(inputSock,(struct sockaddr *)(&name), sizeof(name)) < 0)
613    {
614      syslog(LOG_ERR, "bind : %s", strerror(errno));
615      exit(1);
616    }                                                           
617  sockNamelg = sizeof(name);
618  if (getsockname(inputSock, (struct sockaddr *) (&name),
619                  (socklen_t *)&sockNamelg) < 0)
620    {
621      syslog(LOG_ERR, "getsockname: %s", strerror(errno));
622      exit(1);
623    }
624  /* Here socket DGRAM creation, only to not have a unreachable service */
625  /* message in return */
626  inputSock2 = socket(AF_INET, SOCK_DGRAM, 0);
627  if (inputSock2 < 0)
628    {
629      syslog(LOG_ERR,"socket : %s", strerror(errno));
630      exit(1);
631    }
632  memset((void*)&name, 0, sizeof(name));
633  name2.sin_family = AF_INET;
634  name2.sin_addr.s_addr = htonl(INADDR_ANY);
635  if (name2.sin_addr.s_addr == INADDR_NONE){
636    syslog(LOG_ERR, " INADDR_NONE ");
637    exit(1);
638  }
639  name2.sin_port = htons(receptPort);
640  if (bind(inputSock2,(struct sockaddr *)(&name2), sizeof(name2)) < 0)
641    {
642      syslog(LOG_ERR, "bind : %s", strerror(errno));
643      exit(1);
644    }                                                           
645  sockNamelg = sizeof(name2);
646  if (getsockname(inputSock2, (struct sockaddr *) (&name2),
647                  (socklen_t *)&sockNamelg) < 0)
648    {
649      syslog(LOG_ERR, "getsockname: %s", strerror(errno));
650      exit(1);
651    }
652  return(0);
653}
654
655
656/*
657 * init socket
658 */
659short 
660socketReading()
661{
662  signed short sockLg;
663
664  sockNameFromlg = sizeof(fromName);
665  rcv = recvfrom(inputSock, myPtrs.ptr_buffer, sockBufSize, 0,
666                 (struct sockaddr *)(&fromName),
667                 (socklen_t *)&sockNameFromlg);   
668  sockLg = rcv;
669  if (sockLg < 0) {
670    syslog(LOG_ERR,"recvfrom : %s", strerror(errno));
671    exit(1);
672  }
673  if (sockLg == 0) {
674    syslog(LOG_ERR,"recvfrom : %s", strerror(errno));
675    exit(1);
676  }
677  return(0);
678}
679 
680/*
681 * check up flow datagramme 
682 */
683short 
684checkFlow(short flowNumber)
685{
686  return(0); /* FIXME : why this function ??? */
687}
688
689/*
690 * showAllTplFlSet
691 *
692 * to use only in debug mode
693 */
694void 
695showAllTplFlSet()
696{
697  RouterPtr tmp = routersListPtr;
698  TplFlowSetPtr tmpFS;
699  TplOptionPtr tmpOP;
700  fprintf(stderr,"\n*********************************************\n* All template definitions: (field, size) : *\n*********************************************\n");
701  for (; tmp; tmp=tmp->next) {
702    fprintf(stderr,"----------------------\nrouter %lu.%lu.%lu.%lu : \n----------------------\n",
703            (tmp->IpAddress>>24),
704            (tmp->IpAddress<<8>>24),
705            (tmp->IpAddress<<16>>24),
706            (tmp->IpAddress<<24>>24));
707    tmpFS =  tmp->tplList;
708    for (; tmpFS; tmpFS=tmpFS->next) {
709      fprintf(stderr,"TId %hu (sourceId: %lu):\n",
710              tmpFS->templateFlowSetId,
711              tmpFS->sourceId);
712      printFieldSet(stderr, tmpFS->fieldSet);
713      fprintf(stderr,"\n");
714    }
715    if ((tmpOP = tmp->tplOptList) != NULL){
716      for (; tmpOP; tmpOP=tmpOP->next) {
717        fprintf(stderr,"OpTId %hu (sourceId: %lu) >\n",
718                tmpOP->templateOptionId,
719                tmpOP->sourceId);
720        printFieldSet(stderr, tmpOP->fieldSet);
721        fprintf(stderr,"\n");
722      }
723      fprintf(stderr,"\n");
724    }
725  }
726}
727
728
729/*
730 * writeAllTplFlSet
731 *
732 */
733void 
734writeAllTplFlSet()
735{
736
737  RouterPtr tmp = routersListPtr;
738  TplFlowSetPtr tmpFS;
739  TplOptionPtr tmpOP;
740  FILE *TPLFILE;
741  if (!(TPLFILE = fopen("/tmp/TemplateDef.txt", "w"))) {
742    syslog (LOG_ERR, "error during %s opening", "/tmp/TemplateDef.txt");
743  }
744  fprintf(TPLFILE,"\n*********************************************\n* All template definitions: (field, size) : *\n*********************************************\n");
745  for (; tmp; tmp=tmp->next) {
746    fprintf(TPLFILE,"----------------------\nrouter %lu.%lu.%lu.%lu : \n----------------------\n",
747            (tmp->IpAddress>>24),
748            (tmp->IpAddress<<8>>24),
749            (tmp->IpAddress<<16>>24),
750            (tmp->IpAddress<<24>>24));
751    tmpFS =  tmp->tplList;
752    for (; tmpFS; tmpFS=tmpFS->next) {
753      fprintf(TPLFILE,"TId %hu (sourceId: %lu):\n",
754              tmpFS->templateFlowSetId,
755              tmpFS->sourceId);
756      printFieldSet(TPLFILE, tmpFS->fieldSet);
757      fprintf(TPLFILE,"\n");
758    }
759    if ((tmpOP = tmp->tplOptList) != NULL){
760      for (; tmpOP; tmpOP=tmpOP->next) {
761        fprintf(TPLFILE,"OpTId %hu (sourceId: %lu) last %d brackets are Scope >\n lg: %hu, opScopeLg: %hu, opLg: %hu\n",
762                tmpOP->templateOptionId,
763                tmpOP->sourceId,
764                tmpOP->optionScopeLg/4,
765                tmpOP->length,
766                tmpOP->optionScopeLg,
767                tmpOP->optionLg);
768        printFieldSet(TPLFILE, tmpOP->fieldSet);
769        fprintf(TPLFILE,"\n");
770      }
771      fprintf(TPLFILE,"\n");
772    }
773  }
774  fclose(TPLFILE);
775}
Note: See TracBrowser for help on using the browser.