Changeset 94 for trunk/src/get_conf.c

Show
Ignore:
Timestamp:
02/06/09 16:58:57 (14 years ago)
Author:
andreu
Message:

IPv6 aggregation : prefix reading

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/src/get_conf.c

    r86 r94  
    2727#include <string.h> 
    2828#include <stdlib.h> 
     29#include <arpa/inet.h> 
    2930 
    3031#include "get_conf.h" 
     
    488489} 
    489490 
     491/*  
     492 * prefixV6Cmp 
     493 */ 
     494int 
     495prefixV6Cmp(const void *elem1, const void *elem2){ 
     496  struct PrefixV6 *el1 = (struct PrefixV6 *) elem1; 
     497  struct PrefixV6 *el2 = (struct PrefixV6 *) elem2; 
     498 
     499  if (ntohl(el1->start[0]) < ntohl(el2->start[0])) { 
     500    return (-1); 
     501  } else if (ntohl(el1->start[0]) > ntohl(el2->start[0])) { 
     502    return (1); 
     503  } else { 
     504    if (ntohl(el1->start[1]) < ntohl(el2->start[1])) { 
     505      return (-1); 
     506    } else if (ntohl(el1->start[1]) > ntohl(el2->start[1])) { 
     507      return (1); 
     508    } else { 
     509      if (ntohl(el1->start[2]) < ntohl(el2->start[2])) { 
     510        return (-1); 
     511      } else if (ntohl(el1->start[2]) > ntohl(el2->start[2])) { 
     512        return (1); 
     513      } else { 
     514        if (ntohl(el1->start[3]) < ntohl(el2->start[3])) { 
     515          return (-1); 
     516        } else if (ntohl(el1->start[3]) > ntohl(el2->start[3])) { 
     517          return (1); 
     518        } else { 
     519          if (ntohl(el1->start[4]) < ntohl(el2->start[4])) { 
     520            return (-1); 
     521          } else if (ntohl(el1->start[4]) > ntohl(el2->start[4])) { 
     522            return (1); 
     523          } else { 
     524            if (ntohl(el1->start[5]) < ntohl(el2->start[5])) { 
     525             return (-1); 
     526            } else if (ntohl(el1->start[5]) > ntohl(el2->start[5])) { 
     527              return (1); 
     528            } else { 
     529              if (ntohl(el1->start[6]) < ntohl(el2->start[6])) { 
     530               return (-1); 
     531              } else if (ntohl(el1->start[6]) > ntohl(el2->start[6])) { 
     532                return (1); 
     533              } else { 
     534                if (ntohl(el1->start[7]) < ntohl(el2->start[7])) { 
     535                 return (-1); 
     536                } else if (ntohl(el1->start[7]) > ntohl(el2->start[7])) { 
     537                  return (1); 
     538                } else { 
     539                  return 0; 
     540                } /* 7 */ 
     541              } /* 6 */ 
     542            } /* 5 */ 
     543          } /* 4 */ 
     544        } /* 3 */ 
     545      } /* 2 */ 
     546    } /* 1 */ 
     547  } /* 0 */ 
     548} 
     549 
     550/*  
     551 * getPrefixV6() 
     552 * 
     553 * read IPv6 prefix file and sort the list 
     554 */ 
     555unsigned short getPrefixV6(char *filename, 
     556                           struct PrefixV6 *pV6TabPtr) 
     557{ 
     558  FILE *prefixFile; 
     559  char line[200]; 
     560  unsigned short counter = 0; 
     561  char s0[40]; 
     562  unsigned short n0; 
     563#if defined(MULTISAMPLING) 
     564  unsigned short n1; 
     565#endif 
     566  struct in6_addr in6addr; 
     567  struct in6_addr in6addr16; 
     568  int i = 0; 
     569  char prefixStrTab[MAX_IPV6_PREFIX][50]; 
     570  unsigned short prefixIndex = 0; 
     571  int res = 0; 
     572 
     573  if (!(prefixFile = fopen(filename, "r"))) { 
     574    fprintf (stderr, "error during file \"%s\" opening\n", filename); 
     575    exit(1); 
     576  } 
     577 
     578  for(i=0;i<MAX_IPV6_PREFIX;i++){ 
     579    pV6TabPtr[i].start[0] = 0; 
     580    pV6TabPtr[i].start[1] = 0; 
     581    pV6TabPtr[i].start[2] = 0; 
     582    pV6TabPtr[i].start[3] = 0; 
     583    pV6TabPtr[i].end[0] = 0; 
     584    pV6TabPtr[i].end[1] = 0; 
     585    pV6TabPtr[i].end[2] = 0; 
     586    pV6TabPtr[i].end[3] = 0; 
     587    pV6TabPtr[i].mask = 0; 
     588    pV6TabPtr[i].hasSubnet = 0; 
     589    pV6TabPtr[i].sampling = 0; 
     590    pV6TabPtr[i].flowNbIN = 0; 
     591    pV6TabPtr[i].bytesNbIN = 0; 
     592    pV6TabPtr[i].pktsNbIN = 0; 
     593    pV6TabPtr[i].flowNbOUT = 0; 
     594    pV6TabPtr[i].bytesNbOUT = 0; 
     595    pV6TabPtr[i].pktsNbOUT = 0; 
     596    pV6TabPtr[i].firstCoSIN = 0; 
     597    pV6TabPtr[i].secondCoSIN = 0; 
     598    pV6TabPtr[i].thirdCoSIN = 0; 
     599    pV6TabPtr[i].fourthCoSIN = 0; 
     600    pV6TabPtr[i].firstCoSOUT = 0; 
     601    pV6TabPtr[i].secondCoSOUT = 0; 
     602    pV6TabPtr[i].thirdCoSOUT = 0; 
     603    pV6TabPtr[i].fourthCoSOUT = 0; 
     604  } 
     605 
     606  while (fgets(line, 50, prefixFile) != 0) 
     607    { 
     608      strcpy(prefixStrTab[counter], line); 
     609      counter++; 
     610      if (counter == MAX_IPV6_PREFIX) { 
     611        fprintf(stderr, "bufferoverflow in getPrefixV6 function (get_conf.c)\ 
     612change the value of MAX_IPV6_PREFIX  declaration and make again a compilation \n"); 
     613        exit(1); 
     614      } 
     615    } 
     616#ifdef DEBUG 
     617  for(i=0;i<counter;i++) { 
     618    fprintf(stderr,"i : %hu - line : %s\n", i,prefixStrTab[i]); 
     619  } 
     620#endif 
     621  for(i=0;i<counter;i++) 
     622    { 
     623#if defined(IPV4AGGIDSNMP) 
     624#if defined(MULTISAMPLING) 
     625      sscanf(prefixStrTab[i],"%s %hu %hu\n", 
     626             s0,&n0,&n1); 
     627#else 
     628      sscanf(prefixStrTab[i],"%s %hu\n", 
     629             s0,&n0); 
     630#endif 
     631#endif 
     632      res = inet_pton(AF_INET6, 
     633                      s0, 
     634                      &in6addr16); 
     635      res = inet_pton(AF_INET6, 
     636                      s0, 
     637                      &in6addr); 
     638      if (res != 1){ 
     639        fprintf(stderr,"BAD Prefix %s \n",s0); 
     640      } else { 
     641        pV6TabPtr[prefixIndex].start[0] = in6addr.s6_addr32[0]; 
     642        pV6TabPtr[prefixIndex].start[1] = in6addr.s6_addr32[1]; 
     643        pV6TabPtr[prefixIndex].start[2] = in6addr.s6_addr32[2]; 
     644        pV6TabPtr[prefixIndex].start[3] = in6addr.s6_addr32[3]; 
     645        if ((unsigned short)n0 <= 16) { 
     646            in6addr16.s6_addr16[0] = htons( ntohs(in6addr16.s6_addr16[0]) |~((~0)<<(16-(n0)))); 
     647            in6addr16.s6_addr16[1] = (~0); 
     648            in6addr16.s6_addr16[2] = (~0); 
     649            in6addr16.s6_addr16[3] = (~0); 
     650            in6addr16.s6_addr16[4] = (~0); 
     651            in6addr16.s6_addr16[5] = (~0); 
     652            in6addr16.s6_addr16[6] = (~0); 
     653            in6addr16.s6_addr16[7] = (~0); 
     654        } else if ((unsigned short)n0 <= 32) { 
     655            in6addr16.s6_addr16[1] = htons( ntohs(in6addr16.s6_addr16[1]) |~((~0)<<(32-(n0)))); 
     656            in6addr16.s6_addr16[2] = (~0); 
     657            in6addr16.s6_addr16[3] = (~0); 
     658            in6addr16.s6_addr16[4] = (~0); 
     659            in6addr16.s6_addr16[5] = (~0); 
     660            in6addr16.s6_addr16[6] = (~0); 
     661            in6addr16.s6_addr16[7] = (~0); 
     662        } else if ((unsigned short)n0 <= 48) { 
     663            in6addr16.s6_addr16[2] = htons( ntohs(in6addr16.s6_addr16[2]) |~((~0)<<(48-(n0)))); 
     664            in6addr16.s6_addr16[3] = (~0); 
     665            in6addr16.s6_addr16[4] = (~0); 
     666            in6addr16.s6_addr16[5] = (~0); 
     667            in6addr16.s6_addr16[6] = (~0); 
     668            in6addr16.s6_addr16[7] = (~0); 
     669        } else if ((unsigned short)n0 <= 64) { 
     670            in6addr16.s6_addr16[3] = htons( ntohs(in6addr16.s6_addr16[3]) |~((~0)<<(64-(n0)))); 
     671            in6addr16.s6_addr16[4] = (~0); 
     672            in6addr16.s6_addr16[5] = (~0); 
     673            in6addr16.s6_addr16[6] = (~0); 
     674            in6addr16.s6_addr16[7] = (~0); 
     675        } else if ((unsigned short)n0 <= 80) { 
     676            in6addr16.s6_addr16[4] = htons( ntohs(in6addr16.s6_addr16[4]) |~((~0)<<(80-(n0)))); 
     677            in6addr16.s6_addr16[5] = (~0); 
     678            in6addr16.s6_addr16[6] = (~0); 
     679            in6addr16.s6_addr16[7] = (~0); 
     680        } else if ((unsigned short)n0 <= 96) { 
     681            in6addr16.s6_addr16[5] = htons( ntohs(in6addr16.s6_addr16[5]) |~((~0)<<(96-(n0)))); 
     682            in6addr16.s6_addr16[6] = (~0); 
     683            in6addr16.s6_addr16[7] = (~0); 
     684        } else if ((unsigned short)n0 <= 112) { 
     685            in6addr16.s6_addr16[6] = htons( ntohs(in6addr16.s6_addr16[6]) |~((~0)<<(112-(n0)))); 
     686            in6addr16.s6_addr16[7] = (~0); 
     687        } else { 
     688            in6addr16.s6_addr16[7] = htons( ntohs(in6addr16.s6_addr16[7]) |~((~0)<<(128-(n0)))); 
     689        } 
     690        pV6TabPtr[prefixIndex].end[0] = in6addr16.s6_addr32[0]; 
     691        pV6TabPtr[prefixIndex].end[1] = in6addr16.s6_addr32[1]; 
     692        pV6TabPtr[prefixIndex].end[2] = in6addr16.s6_addr32[2]; 
     693        pV6TabPtr[prefixIndex].end[3] = in6addr16.s6_addr32[3]; 
     694        pV6TabPtr[prefixIndex].mask = n0; 
     695#if defined(MULTISAMPLING) 
     696        pV6TabPtr[prefixIndex].sampling = n1; 
     697#else 
     698        pV6TabPtr[prefixIndex].sampling = 0; 
     699#endif 
     700        prefixIndex++; 
     701      } 
     702    } 
     703  qsort(prefixStrTab, prefixIndex, sizeof(struct PrefixV6), prefixV6Cmp); 
     704  if( fclose(prefixFile) == 0) { 
     705    return (prefixIndex); 
     706  } else { 
     707    fprintf(stderr,"%s not closed, \n", filename); 
     708    exit(1); 
     709    return(prefixIndex); 
     710  } 
     711}