root/trunk/src/renetcol.c @ 28

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