root/trunk/src/renetcol.c @ 23

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

optimization : new param : myPtrs in checkdataflowset function

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