root/tags/REL-0.0.11beta/trunk/src/renetcol.c @ 41

Revision 41, 22.1 KB (checked in by andreu, 15 years ago)

ticket #3

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