ipv6 adresleri için bir network mask fonksiyonu implementasyonu

Geçenlerde şirkette ürünlerimizi ipv6 içinde uygun hale geitrmek için birtakım çalışmalar içindeydik. Takdir edersinizki ipv6 adresleri 16 byte yani 128 bit. Bu sebepten ötürü C veya C++ da primitiv (ilkel) türlere sığmayacak büyüklükte (int, double, float..). İşte bütün bunlardan ötürü bi ipv6 adresine network mask yeni adıyla prefix uygulamak eskisi kadar kolay değil. Ama zorda değil 😀

Ben bir tane işimi görmesi için bir fonksiyon yazdım bunu şimdilik sizinle paylaşıyorum. Aklımda ise kapsamlı bir ipv6 class ’ ı oluşturmak var ..

  
typedef u_int16_t ip6_addr[8]; // for ipv6 addresses

void ipv6_app_mask(const char *ip6addr, unsigned int mask, ip6_addr ip6){

            ip6_addr in_ip6;

           if(inet_pton(PF_INET6, ip6addr, ip6) < 0)

                        cout « “ipv6 adresi gecersiz” « endl;

            for(int i = 0; i < 8; i++){

            in_ip6[i] = ntohs(ip6[i]);

             }

             int index = (int) (mask / 16);

            int remain_mask = mask % 16;

            if(remain_mask == 0 && index == 8)

            return;

            switch(remain_mask){

            case 0:in_ip6[index++] = 0; break;

            case 1:in_ip6[index++]&=0x8000; break;

            case 2:in_ip6[index++]&=0xc000; break;

            case 3:in_ip6[index++]&=0xe000; break;

            case 4:in_ip6[index++]&=0xf000; break;

            case 5:in_ip6[index++]&=0xf800; break;

            case 6:in_ip6[index++]&=0xfc00; break;

            case 7:in_ip6[index++]&=0xfe00; break;

            case 8:in_ip6[index++]&=0xff00; break;

            case  9:in_ip6[index++]&=0xff80; break;

            case 10:in_ip6[index++]&=0xffc0; break; 

            case 11:in_ip6[index++]&=0xffe0; break;

            case 12:in_ip6[index++]&=0xfff0; break;

            case 13:in_ip6[index++]&=0xfff8; break;

            case 14:in_ip6[index++]&=0xfffc; break;

           case 15:in_ip6[index++]&=0xfffe; break;

     }

         for (int i = index; i < 8; i++){

              in_ip6[i] = 0;

        }

        for(int i = 0; i < 8; i++){

             ip6[i] = htons(in_ip6[i]);

        }

   return;

}

İslam YAŞAR

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s