root/trunk/src/get_conf.c

Revision 154, 21.2 KB (checked in by andreu, 12 years ago)

Typo correction and copyright update

  • Property svn:eol-style set to native
Line 
1/*
2 * File: get_conf.c
3 *
4 * Authors: ANDREU Francois-Xavier
5 *
6 * Copyright (C) 2005-2011 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 <stdio.h>
27#include <string.h>
28#include <stdlib.h>
29#include <arpa/inet.h>
30
31#include "get_conf.h"
32
33/*
34 * initConf()
35 */
36void initConf(char *routersfile)
37
38  /* getRegisteredRouters(routersfile); */
39}
40
41/*
42 * longCmp()
43 */
44int
45longCmp(const void *elem1, const void *elem2){
46  return (*((unsigned long*)elem1) - *((unsigned long*)elem2));
47}
48
49/*
50 * getRegisteredRouters
51 */
52int
53getRegisteredRouters(char *filename, unsigned long *sortedRLPtr,
54                          unsigned long *indexedRLPtr)
55{
56  FILE *routerFile;
57  char line[200];
58  int cptLine;
59  int nbR = 0;
60  char tindex[5];
61  char tname[40];
62  char tad[16];
63  char tad2[16];
64  int ind=0;
65  unsigned short n0, n1, n2, n3;
66  unsigned char buffer4[4];
67
68  if (!(routerFile = fopen(filename, "r"))) {
69    fprintf (stderr, "error during file \"%s\" opening\n", filename);
70    exit(1);
71  }
72  cptLine=0;
73  while ( fgets(line, 200, routerFile) != 0) {   
74    if ( strspn(line, "#") == 0 ) {
75      if (sscanf(line, "%s %s %s %s\n",
76                 tindex,       
77                 tname,
78                 tad,
79                 tad2) == 0) {
80        fprintf(stderr, "Error in file %s, line %d\n",
81                filename, cptLine);
82        exit(1);
83      }
84      cptLine++;
85      ind = atoi(tindex);
86      if (sscanf(tad,"%hu.%hu.%hu.%hu\n",&n0,&n1,&n2,&n3) == 0){
87        fprintf(stderr, "Address error in file %s, line %d\n",
88                filename, cptLine);
89        exit(1);
90      }
91      buffer4[3] = (unsigned char)n0;
92      buffer4[2] = (unsigned char)n1;
93      buffer4[1] = (unsigned char)n2;
94      buffer4[0] = (unsigned char)n3;   
95      sortedRLPtr[ind] = *((unsigned long*)(&buffer4));
96      if (sortedRLPtr[ind] != 0){
97        nbR++;
98      }
99      indexedRLPtr[ind] = *((unsigned long*)(&buffer4));
100    }
101  }
102  qsort(sortedRLPtr, cptLine, sizeof(unsigned long), longCmp);
103  if( fclose(routerFile) != 0) {
104    return (-1);
105  } else {
106    return nbR;
107  }
108}
109
110
111/*
112 *
113 */
114int compStr(a,b)
115{
116  static unsigned short a0,a1,a2,a3,a4,a5;
117  static unsigned short b0,b1,b2,b3,b4,b5;
118  sscanf((char *)a,"%hu.%hu.%hu.%hu/%hu-%hu\n",&a0,&a1,&a2,&a3,&a4,&a5);
119  sscanf((char *)b,"%hu.%hu.%hu.%hu/%hu-%hu\n",&b0,&b1,&b2,&b3,&b4,&b5);
120  if (a0 > b0) return(1);
121  if (a0 < b0) return(-1);
122  if (a1 > b1) return(1);
123  if (a1 < b1) return(-1);
124  if (a2 > b2) return(1);
125  if (a2 < b2) return(-1);
126  if (a3 > b3) return(1);
127  if (a3 < b3) return(-1);
128  return(0);
129}
130
131/*
132 * getPrefixV4()
133 *
134 * read IPv4 prefix file and sort the list
135 */
136unsigned short getPrefixV4(char *filename,
137                           struct PrefixV4 *pV4TabPtr,
138                           struct PrefixV4 *pV4SubTabPtr,
139                           unsigned short *subnetNb)
140{
141  FILE *prefixFile;
142  char line[200];
143  unsigned short counter = 0;
144  unsigned short n0, n1, n2, n3, n4;
145#if defined(MULTISAMPLING)
146  unsigned short n6;
147#endif
148#if defined(IPV4AGGIDR)
149  unsigned short n5;
150#endif
151  unsigned char buffer4[4];
152  int i = 0;
153  char prefixStrTab[MAX_IPV4_PREFIX+MAX_IPV4_SUBNET][50];
154  struct PrefixV4 lastSuperNet;
155  unsigned short lastSuperNetIndex = 0;
156  unsigned short superNetIndex = 0;
157  unsigned short subNetIndex = 0;
158
159  if (!(prefixFile = fopen(filename, "r"))) {
160    fprintf (stderr, "error during file \"%s\" opening\n", filename);
161    exit(1);
162  }
163 
164  *subnetNb = 0;
165
166  lastSuperNet.beginning = 0;
167  lastSuperNet.end = 0;
168  lastSuperNet.mask = 0;
169  lastSuperNet.sampling = 0;
170#ifdef IPV4AGGIDR     
171  lastSuperNet.routerNb = 0;
172#endif
173  lastSuperNet.flowNbIN = 0;
174  lastSuperNet.bytesNbIN = 0;
175  lastSuperNet.pktsNbIN = 0;
176  lastSuperNet.flowNbOUT = 0;
177  lastSuperNet.bytesNbOUT = 0;
178  lastSuperNet.pktsNbOUT = 0;
179  lastSuperNet.firstCoSIN = 0;
180  lastSuperNet.secondCoSIN = 0;
181  lastSuperNet.thirdCoSIN = 0;
182  lastSuperNet.fourthCoSIN = 0;
183  lastSuperNet.firstCoSOUT = 0;
184  lastSuperNet.secondCoSOUT = 0;
185  lastSuperNet.thirdCoSOUT = 0;
186  lastSuperNet.fourthCoSOUT = 0;
187
188  for(i=0;i<MAX_IPV4_PREFIX;i++){
189    pV4TabPtr[i].beginning = 0;
190    pV4TabPtr[i].end = 0;
191    pV4TabPtr[i].mask = 0;
192    pV4TabPtr[i].sampling = 0;
193#ifdef IPV4AGGIDR     
194    pV4TabPtr[i].routerNb = 0;
195#endif
196    pV4TabPtr[i].flowNbIN = 0;
197    pV4TabPtr[i].bytesNbIN = 0;
198    pV4TabPtr[i].pktsNbIN = 0;
199    pV4TabPtr[i].flowNbOUT = 0;
200    pV4TabPtr[i].bytesNbOUT = 0;
201    pV4TabPtr[i].pktsNbOUT = 0;
202    pV4TabPtr[i].firstCoSIN = 0;
203    pV4TabPtr[i].secondCoSIN = 0;
204    pV4TabPtr[i].thirdCoSIN = 0;
205    pV4TabPtr[i].fourthCoSIN = 0;
206    pV4TabPtr[i].firstCoSOUT = 0;
207    pV4TabPtr[i].secondCoSOUT = 0;
208    pV4TabPtr[i].thirdCoSOUT = 0;
209    pV4TabPtr[i].fourthCoSOUT = 0;
210  }
211  for(i=0;i<MAX_IPV4_SUBNET;i++){
212    pV4SubTabPtr[i].beginning = 0;
213    pV4SubTabPtr[i].end = 0;
214    pV4SubTabPtr[i].mask = 0;
215    pV4SubTabPtr[i].sampling = 0;
216#ifdef IPV4AGGIDR     
217    pV4SubTabPtr[i].routerNb = 0;
218#endif
219    pV4SubTabPtr[i].flowNbIN = 0;
220    pV4SubTabPtr[i].bytesNbIN = 0;
221    pV4SubTabPtr[i].pktsNbIN = 0;
222    pV4SubTabPtr[i].flowNbOUT = 0;
223    pV4SubTabPtr[i].bytesNbOUT = 0;
224    pV4SubTabPtr[i].pktsNbOUT = 0;
225    pV4SubTabPtr[i].firstCoSIN = 0;
226    pV4SubTabPtr[i].secondCoSIN = 0;
227    pV4SubTabPtr[i].thirdCoSIN = 0;
228    pV4SubTabPtr[i].fourthCoSIN = 0;
229    pV4SubTabPtr[i].firstCoSOUT = 0;
230    pV4SubTabPtr[i].secondCoSOUT = 0;
231    pV4SubTabPtr[i].thirdCoSOUT = 0;
232    pV4SubTabPtr[i].fourthCoSOUT = 0;
233  }
234  while (fgets(line, 50, prefixFile) != 0)
235    {
236      strcpy(prefixStrTab[counter], line);
237      counter++;
238      if (counter == MAX_IPV4_PREFIX+MAX_IPV4_SUBNET) {
239        fprintf(stderr, "bufferoverflow in getPrefixV4 function (get_conf.c)\
240change the value of MAX_IPV4_PREFIX  declaration and recompile \n");
241        exit(1);
242      }
243    }
244  qsort(prefixStrTab, counter, 50, compStr);
245#ifdef DEBUG
246  for(i=0;i<counter;i++) {
247    fprintf(stderr,"i : %hu - line : %s\n", i,prefixStrTab[i]);
248  }
249#endif
250  for(i=0;i<counter;i++)
251    {
252#if defined(IPV4AGGIDR)
253#if defined(MULTISAMPLING)
254      sscanf(prefixStrTab[i],"%hu.%hu.%hu.%hu/%hu-%hu %hu\n",
255             &n0,&n1,&n2,&n3,&n4,&n5,&n6);
256#else
257      sscanf(prefixStrTab[i],"%hu.%hu.%hu.%hu/%hu-%hu\n",
258             &n0,&n1,&n2,&n3,&n4,&n5);
259#endif
260#endif
261#if defined(IPV4AGGIDSNMP)
262#if defined(MULTISAMPLING)
263      sscanf(prefixStrTab[i],"%hu.%hu.%hu.%hu %hu %hu\n",
264             &n0,&n1,&n2,&n3,&n4,&n6);
265#else
266      sscanf(prefixStrTab[i],"%hu.%hu.%hu.%hu %hu\n",
267             &n0,&n1,&n2,&n3,&n4);
268#endif
269#endif
270      buffer4[0] = (unsigned char)n3;
271      buffer4[1] = (unsigned char)n2;
272      buffer4[2] = (unsigned char)n1;
273      buffer4[3] = (unsigned char)n0;
274      /* we sort supernet and subnet */
275      if (lastSuperNet.beginning == 0) {
276        /* case of first supernet */
277        lastSuperNet.beginning = *((unsigned long*)&buffer4[0]);
278        lastSuperNet.end = *((unsigned long*)&buffer4[0]) +~(~0<<(32-n4));
279#ifdef DEBUG
280        fprintf(stderr,"First SUPERNET : %lu.%lu.%lu.%lu",
281                (lastSuperNet.beginning>>24),
282                (lastSuperNet.beginning<<8>>24),
283                (lastSuperNet.beginning<<16>>24),
284                (lastSuperNet.beginning<<24>>24));
285#endif
286        lastSuperNet.mask = n4;
287        lastSuperNetIndex = i;
288        superNetIndex++;
289        pV4TabPtr[i].beginning =
290          *((unsigned long*)&buffer4[0]);
291        pV4TabPtr[i].end =
292          *((unsigned long*)&buffer4[0]) +~(~0<<(32-n4));
293        pV4TabPtr[i].mask = n4;
294#if defined(MULTISAMPLING)
295        pV4TabPtr[i].sampling = n6;
296#else
297        pV4TabPtr[i].sampling = 0;
298#endif
299#ifdef IPV4AGGIDR     
300        pV4TabPtr[i].routerNb = n5;
301#endif
302        pV4TabPtr[i].flowNbIN = 0;
303        pV4TabPtr[i].bytesNbIN = 0;
304        pV4TabPtr[i].pktsNbIN = 0;
305        pV4TabPtr[i].flowNbOUT = 0;
306        pV4TabPtr[i].bytesNbOUT = 0;
307        pV4TabPtr[i].pktsNbOUT = 0;
308        pV4TabPtr[i].firstCoSIN = 0;
309        pV4TabPtr[i].secondCoSIN = 0;
310        pV4TabPtr[i].thirdCoSIN = 0;
311        pV4TabPtr[i].fourthCoSIN = 0;
312        pV4TabPtr[i].firstCoSOUT = 0;
313        pV4TabPtr[i].secondCoSOUT = 0;
314        pV4TabPtr[i].thirdCoSOUT = 0;
315        pV4TabPtr[i].fourthCoSOUT = 0; 
316      } else if ( (lastSuperNet.beginning <= *((unsigned long*)&buffer4[0]))
317                  && (lastSuperNet.end>=*((unsigned long*)&buffer4[0]) +~(~0<<(32-n4))) ) {
318        /* we are in the case of subnet */
319        *subnetNb += 1;
320#ifdef DEBUG
321        fprintf(stderr,"SUBNET %lu.%lu.%lu.%lu FROM SUPERNET %lu.%lu.%lu.%lu %lu.%lu.%lu.%lu , subnetnb : %hu\n",
322                (*((unsigned long*)&buffer4[0])>>24),
323                (*((unsigned long*)&buffer4[0])<<8>>24),
324                (*((unsigned long*)&buffer4[0])<<16>>24),
325                (*((unsigned long*)&buffer4[0])<<24>>24),
326                (pV4TabPtr[lastSuperNetIndex].beginning)>>24,
327                (pV4TabPtr[lastSuperNetIndex].beginning)<<8>>24,
328                (pV4TabPtr[lastSuperNetIndex].beginning)<<16>>24,
329                (pV4TabPtr[lastSuperNetIndex].beginning)<<24>>24,
330                (pV4TabPtr[lastSuperNetIndex].end)>>24,
331                (pV4TabPtr[lastSuperNetIndex].end)<<8>>24,
332                (pV4TabPtr[lastSuperNetIndex].end)<<16>>24,
333                (pV4TabPtr[lastSuperNetIndex].end)<<24>>24,
334                *subnetNb);
335#endif
336        pV4TabPtr[lastSuperNetIndex].hasSubnet = 1;
337        pV4SubTabPtr[subNetIndex].beginning =
338          *((unsigned long*)&buffer4[0]);
339        pV4SubTabPtr[subNetIndex].end =
340          *((unsigned long*)&buffer4[0]) +~(~0<<(32-n4));
341        pV4SubTabPtr[subNetIndex].mask = n4;
342#if defined(MULTISAMPLING)
343        pV4SubTabPtr[subNetIndex].sampling = n6;
344#else
345        pV4SubTabPtr[subNetIndex].sampling = 0;
346#endif
347#ifdef IPV4AGGIDR     
348        pV4SubTabPtr[subNetIndex].routerNb = n5;
349#endif
350        pV4SubTabPtr[subNetIndex].flowNbIN = 0;
351        pV4SubTabPtr[subNetIndex].bytesNbIN = 0;
352        pV4SubTabPtr[subNetIndex].pktsNbIN = 0;
353        pV4SubTabPtr[subNetIndex].flowNbOUT = 0;
354        pV4SubTabPtr[subNetIndex].bytesNbOUT = 0;
355        pV4SubTabPtr[subNetIndex].pktsNbOUT = 0;
356        pV4SubTabPtr[subNetIndex].firstCoSIN = 0;
357        pV4SubTabPtr[subNetIndex].secondCoSIN = 0;
358        pV4SubTabPtr[subNetIndex].thirdCoSIN = 0;
359        pV4SubTabPtr[subNetIndex].fourthCoSIN = 0;
360        pV4SubTabPtr[subNetIndex].firstCoSOUT = 0;
361        pV4SubTabPtr[subNetIndex].secondCoSOUT = 0;
362        pV4SubTabPtr[subNetIndex].thirdCoSOUT = 0;
363        pV4SubTabPtr[subNetIndex].fourthCoSOUT = 0;
364        subNetIndex++;
365      } else {
366        /* we are in the supernet case */
367        lastSuperNet.beginning = *((unsigned long*)&buffer4[0]);
368        lastSuperNet.end = *((unsigned long*)&buffer4[0]) +~(~0<<(32-n4));
369#ifdef DEBUG
370        fprintf(stderr,"SUPERNET %lu.%lu.%lu.%lu \n",
371                (*((unsigned long*)&buffer4[0])>>24),
372                (*((unsigned long*)&buffer4[0])<<8>>24),
373                (*((unsigned long*)&buffer4[0])<<16>>24),
374                (*((unsigned long*)&buffer4[0])<<24>>24));
375#endif
376        lastSuperNet.mask = n4;
377        lastSuperNetIndex = superNetIndex;
378        pV4TabPtr[superNetIndex].beginning =
379          *((unsigned long*)&buffer4[0]);
380        pV4TabPtr[superNetIndex].end =
381          *((unsigned long*)&buffer4[0]) +~(~0<<(32-n4));
382        pV4TabPtr[superNetIndex].mask = n4;
383#if defined(MULTISAMPLING)
384        pV4TabPtr[superNetIndex].sampling = n6;
385#else
386        pV4TabPtr[superNetIndex].sampling = 0;
387#endif
388#ifdef IPV4AGGIDR     
389        pV4TabPtr[superNetIndex].routerNb = n5;
390#endif
391        pV4TabPtr[superNetIndex].flowNbIN = 0;
392        pV4TabPtr[superNetIndex].bytesNbIN = 0;
393        pV4TabPtr[superNetIndex].pktsNbIN = 0;
394        pV4TabPtr[superNetIndex].flowNbOUT = 0;
395        pV4TabPtr[superNetIndex].bytesNbOUT = 0;
396        pV4TabPtr[superNetIndex].pktsNbOUT = 0;
397        pV4TabPtr[superNetIndex].firstCoSIN = 0;
398        pV4TabPtr[superNetIndex].secondCoSIN = 0;
399        pV4TabPtr[superNetIndex].thirdCoSIN = 0;
400        pV4TabPtr[superNetIndex].fourthCoSIN = 0;
401        pV4TabPtr[superNetIndex].firstCoSOUT = 0;
402        pV4TabPtr[superNetIndex].secondCoSOUT = 0;
403        pV4TabPtr[superNetIndex].thirdCoSOUT = 0;
404        pV4TabPtr[superNetIndex].fourthCoSOUT = 0;
405        superNetIndex++;
406      }
407    }
408  if( fclose(prefixFile) == 0) {
409    return (superNetIndex);
410  } else {
411    fprintf(stderr,"%s not closed, \n", filename);
412    exit(1);
413    return(superNetIndex);
414  }
415}
416
417/*
418 *
419 */
420int compASStr(a,b)
421{
422  static unsigned short a0;
423  static unsigned short b0;
424  sscanf((char *)a,"%hu\n",&a0);
425  sscanf((char *)b,"%hu\n",&b0);
426  if (a0 > b0) return(1);
427  if (a0 < b0) return(-1);
428  return(0);
429}
430
431/*
432 * getAS()
433 *
434 * read AS file and sort the list
435 */
436unsigned short getAS(char *filename, struct AS *ASTabPtr)
437{
438  FILE *asFile;
439  char line[200];
440  unsigned short counter = 0;
441  unsigned short n0;
442#if defined(MULTISAMPLING)
443  unsigned short n1;
444#endif
445  unsigned short buffer;
446  int i = 0;
447  char ASStrTab[MAX_AS][256];
448
449  if (!(asFile = fopen(filename, "r"))) {
450    fprintf (stderr, "error during file \"%s\" opening\n", filename);
451    exit(1);
452  }
453  for(i=0;i<MAX_AS;i++){
454    ASTabPtr[i].as = 0;
455    ASTabPtr[i].sampling = 0;
456  }
457  while (fgets(line, 256, asFile) != 0)
458    {
459      strcpy(ASStrTab[counter], line);
460      counter++;
461      if (counter > MAX_AS) {
462        fprintf(stderr, "bufferoverflow in getAS function (get_conf.c)\
463change the value of MAX_AS declaration and recompile, counter: %hu \n",
464                        counter);
465        exit(1);
466      }
467    }
468  qsort(ASStrTab, counter, 256, compASStr);
469  for(i=0;i<counter;i++)
470    {
471#if defined(MULTISAMPLING)
472      sscanf(ASStrTab[i],"%hu %hu\n",
473             &n0,
474             &n1);
475      buffer = (unsigned short)n0;
476      ASTabPtr[i].as = *((unsigned short*)&buffer);
477      buffer = (unsigned short)n1;
478      ASTabPtr[i].sampling = *((unsigned short*)&buffer);
479#else
480      sscanf(ASStrTab[i],"%hu\n",
481             &n0);
482      buffer = (unsigned short)n0;
483      ASTabPtr[i].as = *((unsigned short*)&buffer);
484      ASTabPtr[i].sampling = 0;
485#endif
486    }
487  if( fclose(asFile) == 0) {
488    return (counter);
489  } else {
490    fprintf(stderr,"%s not closed, \n", filename);
491    exit(1);
492    return(counter);
493  }
494}
495
496/*
497 * prefixV6Cmp
498 */
499int
500prefixV6Cmp(const void *elem1, const void *elem2){
501  struct PrefixV6 *el1 = (struct PrefixV6 *) elem1;
502  struct PrefixV6 *el2 = (struct PrefixV6 *) elem2;
503
504  if (ntohl(el1->start[0]) < ntohl(el2->start[0])) {
505    return (-1);
506  } else if (ntohl(el1->start[0]) > ntohl(el2->start[0])) {
507    return (1);
508  } else {
509    if (ntohl(el1->start[1]) < ntohl(el2->start[1])) {
510      return (-1);
511    } else if (ntohl(el1->start[1]) > ntohl(el2->start[1])) {
512      return (1);
513    } else {
514      if (ntohl(el1->start[2]) < ntohl(el2->start[2])) {
515        return (-1);
516      } else if (ntohl(el1->start[2]) > ntohl(el2->start[2])) {
517        return (1);
518      } else {
519        if (ntohl(el1->start[3]) < ntohl(el2->start[3])) {
520          return (-1);
521        } else if (ntohl(el1->start[3]) > ntohl(el2->start[3])) {
522          return (1);
523        } else {
524          if (ntohl(el1->start[4]) < ntohl(el2->start[4])) {
525            return (-1);
526          } else if (ntohl(el1->start[4]) > ntohl(el2->start[4])) {
527            return (1);
528          } else {
529            if (ntohl(el1->start[5]) < ntohl(el2->start[5])) {
530             return (-1);
531            } else if (ntohl(el1->start[5]) > ntohl(el2->start[5])) {
532              return (1);
533            } else {
534              if (ntohl(el1->start[6]) < ntohl(el2->start[6])) {
535               return (-1);
536              } else if (ntohl(el1->start[6]) > ntohl(el2->start[6])) {
537                return (1);
538              } else {
539                if (ntohl(el1->start[7]) < ntohl(el2->start[7])) {
540                 return (-1);
541                } else if (ntohl(el1->start[7]) > ntohl(el2->start[7])) {
542                  return (1);
543                } else {
544                  return 0;
545                } /* 7 */
546              } /* 6 */
547            } /* 5 */
548          } /* 4 */
549        } /* 3 */
550      } /* 2 */
551    } /* 1 */
552  } /* 0 */
553}
554
555/*
556 * getPrefixV6()
557 *
558 * read IPv6 prefix file and sort the list
559 */
560unsigned short getPrefixV6(char *filename,
561                           struct PrefixV6 *pV6TabPtr)
562{
563  FILE *prefixFile;
564  char line[200];
565  unsigned short counter = 0;
566  char s0[40];
567  unsigned short n0;
568#if defined(MULTISAMPLING)
569  unsigned short n1;
570#endif
571  struct in6_addr in6addr;
572  struct in6_addr in6addr16;
573  int i = 0;
574  char prefixStrTab[MAX_IPV6_PREFIX][50];
575  unsigned short prefixIndex = 0;
576  int res = 0;
577
578  if (!(prefixFile = fopen(filename, "r"))) {
579    fprintf (stderr, "error during file \"%s\" opening\n", filename);
580    exit(1);
581  }
582
583  for(i=0;i<MAX_IPV6_PREFIX;i++){
584    pV6TabPtr[i].start[0] = 0;
585    pV6TabPtr[i].start[1] = 0;
586    pV6TabPtr[i].start[2] = 0;
587    pV6TabPtr[i].start[3] = 0;
588    pV6TabPtr[i].end[0] = 0;
589    pV6TabPtr[i].end[1] = 0;
590    pV6TabPtr[i].end[2] = 0;
591    pV6TabPtr[i].end[3] = 0;
592    pV6TabPtr[i].mask = 0;
593    pV6TabPtr[i].hasSubnet = 0;
594    pV6TabPtr[i].sampling = 0;
595    pV6TabPtr[i].flowNbIN = 0;
596    pV6TabPtr[i].bytesNbIN = 0;
597    pV6TabPtr[i].pktsNbIN = 0;
598    pV6TabPtr[i].flowNbOUT = 0;
599    pV6TabPtr[i].bytesNbOUT = 0;
600    pV6TabPtr[i].pktsNbOUT = 0;
601    pV6TabPtr[i].firstCoSIN = 0;
602    pV6TabPtr[i].secondCoSIN = 0;
603    pV6TabPtr[i].thirdCoSIN = 0;
604    pV6TabPtr[i].fourthCoSIN = 0;
605    pV6TabPtr[i].firstCoSOUT = 0;
606    pV6TabPtr[i].secondCoSOUT = 0;
607    pV6TabPtr[i].thirdCoSOUT = 0;
608    pV6TabPtr[i].fourthCoSOUT = 0;
609  }
610
611  while (fgets(line, 50, prefixFile) != 0)
612    {
613      strcpy(prefixStrTab[counter], line);
614      counter++;
615      if (counter == MAX_IPV6_PREFIX) {
616        fprintf(stderr, "bufferoverflow in getPrefixV6 function (get_conf.c)\
617change the value of MAX_IPV6_PREFIX  declaration and make again a compilation \n");
618        exit(1);
619      }
620    }
621#ifdef DEBUG
622  for(i=0;i<counter;i++) {
623    fprintf(stderr,"i : %hu - line : %s\n", i,prefixStrTab[i]);
624  }
625#endif
626  for(i=0;i<counter;i++)
627    {
628#if defined(IPV4AGGIDSNMP)
629#if defined(MULTISAMPLING)
630      sscanf(prefixStrTab[i],"%s %hu %hu\n",
631             s0,&n0,&n1);
632#else
633      sscanf(prefixStrTab[i],"%s %hu\n",
634             s0,&n0);
635#endif
636#endif
637      res = inet_pton(AF_INET6,
638                      s0,
639                      &in6addr16);
640      res = inet_pton(AF_INET6,
641                      s0,
642                      &in6addr);
643      if (res != 1){
644        fprintf(stderr,"BAD Prefix %s \n",s0);
645      } else {
646        pV6TabPtr[prefixIndex].start[0] = in6addr.s6_addr32[0];
647        pV6TabPtr[prefixIndex].start[1] = in6addr.s6_addr32[1];
648        pV6TabPtr[prefixIndex].start[2] = in6addr.s6_addr32[2];
649        pV6TabPtr[prefixIndex].start[3] = in6addr.s6_addr32[3];
650        if ((unsigned short)n0 <= 16) {
651            in6addr16.s6_addr16[0] = htons( ntohs(in6addr16.s6_addr16[0]) |~((~0)<<(16-(n0))));
652            in6addr16.s6_addr16[1] = (~0);
653            in6addr16.s6_addr16[2] = (~0);
654            in6addr16.s6_addr16[3] = (~0);
655            in6addr16.s6_addr16[4] = (~0);
656            in6addr16.s6_addr16[5] = (~0);
657            in6addr16.s6_addr16[6] = (~0);
658            in6addr16.s6_addr16[7] = (~0);
659        } else if ((unsigned short)n0 <= 32) {
660            in6addr16.s6_addr16[1] = htons( ntohs(in6addr16.s6_addr16[1]) |~((~0)<<(32-(n0))));
661            in6addr16.s6_addr16[2] = (~0);
662            in6addr16.s6_addr16[3] = (~0);
663            in6addr16.s6_addr16[4] = (~0);
664            in6addr16.s6_addr16[5] = (~0);
665            in6addr16.s6_addr16[6] = (~0);
666            in6addr16.s6_addr16[7] = (~0);
667        } else if ((unsigned short)n0 <= 48) {
668            in6addr16.s6_addr16[2] = htons( ntohs(in6addr16.s6_addr16[2]) |~((~0)<<(48-(n0))));
669            in6addr16.s6_addr16[3] = (~0);
670            in6addr16.s6_addr16[4] = (~0);
671            in6addr16.s6_addr16[5] = (~0);
672            in6addr16.s6_addr16[6] = (~0);
673            in6addr16.s6_addr16[7] = (~0);
674        } else if ((unsigned short)n0 <= 64) {
675            in6addr16.s6_addr16[3] = htons( ntohs(in6addr16.s6_addr16[3]) |~((~0)<<(64-(n0))));
676            in6addr16.s6_addr16[4] = (~0);
677            in6addr16.s6_addr16[5] = (~0);
678            in6addr16.s6_addr16[6] = (~0);
679            in6addr16.s6_addr16[7] = (~0);
680        } else if ((unsigned short)n0 <= 80) {
681            in6addr16.s6_addr16[4] = htons( ntohs(in6addr16.s6_addr16[4]) |~((~0)<<(80-(n0))));
682            in6addr16.s6_addr16[5] = (~0);
683            in6addr16.s6_addr16[6] = (~0);
684            in6addr16.s6_addr16[7] = (~0);
685        } else if ((unsigned short)n0 <= 96) {
686            in6addr16.s6_addr16[5] = htons( ntohs(in6addr16.s6_addr16[5]) |~((~0)<<(96-(n0))));
687            in6addr16.s6_addr16[6] = (~0);
688            in6addr16.s6_addr16[7] = (~0);
689        } else if ((unsigned short)n0 <= 112) {
690            in6addr16.s6_addr16[6] = htons( ntohs(in6addr16.s6_addr16[6]) |~((~0)<<(112-(n0))));
691            in6addr16.s6_addr16[7] = (~0);
692        } else {
693            in6addr16.s6_addr16[7] = htons( ntohs(in6addr16.s6_addr16[7]) |~((~0)<<(128-(n0))));
694        }
695        pV6TabPtr[prefixIndex].end[0] = in6addr16.s6_addr32[0];
696        pV6TabPtr[prefixIndex].end[1] = in6addr16.s6_addr32[1];
697        pV6TabPtr[prefixIndex].end[2] = in6addr16.s6_addr32[2];
698        pV6TabPtr[prefixIndex].end[3] = in6addr16.s6_addr32[3];
699        pV6TabPtr[prefixIndex].mask = n0;
700#if defined(MULTISAMPLING)
701        pV6TabPtr[prefixIndex].sampling = n1;
702#else
703        pV6TabPtr[prefixIndex].sampling = 0;
704#endif
705        prefixIndex++;
706      }
707    }
708  qsort(pV6TabPtr, prefixIndex, sizeof(struct PrefixV6), prefixV6Cmp);
709  if( fclose(prefixFile) == 0) {
710    return (prefixIndex);
711  } else {
712    fprintf(stderr,"%s not closed, \n", filename);
713    exit(1);
714    return(prefixIndex);
715  }
716}
Note: See TracBrowser for help on using the browser.