<html>
<head>
    <title>IPv6rd Magic tool!</title>
</head>
<body>
    <form action="" method="get">
        <table border="0">
            <tr><td>WAN IP</td><td><input type="text" size="15" name="wanip" value="<?php echo isset($_GET['wanip']) ? $_GET['wanip'] : $_SERVER['REMOTE_ADDR']; ?>"></td></tr>
            <tr><td>ip6rd</td><td><input type="text" size="64" name="ip6rd" value="<?php echo htmlentities(@$_GET['ip6rd']); ?>"></td></tr>
        </table>
        <input type="submit" value="Submit">
    </form>
    <pre><?php
        
function expand_ip($ip) {
            
$ip trim($ip,'[].');

            if (
strpos($ip':') === false) {
                
$c substr_count($ip'.');
                if (
$c <= 3) {
                    
$ip .= str_repeat('.0',3-$c);
                } else {
                    
$ip '';
                }
                return 
$ip//ipv4
            
}

            if (
substr_count($ip'::') > 1) { 
                return 
'';
            }

            
$ip str_replace('::'str_repeat(':0'substr_count($ip':')) . ':'$ip) ;

            if (
$ip[0] === ':') {
                
$ip '0'.$ip;
            }
            if(
substr($ip,-1,1) === ':') {
                
$ip .= '0';
            }
            
$r_ip '';
            foreach(
explode(':'$ip) as $group) {
                if (
hexdec($group) > 0xffff) return '';
                
$r_ip .= str_pad($group4'0'STR_PAD_LEFT).':';
            }
            return 
trim($r_ip':');
        } 
        function 
shorten_ipv6($ip) {
            
$ip expand_ip($ip); // soyons certain que l'ip n'est pas dirty.

            
if (strpos($ip':') === false) {
                return 
$ip//ipv4
            
}
            
            
$n_ip = array();
            foreach(
explode(':'$ip) as $group) {
                
$group ltrim($group'0');
                
$n_ip[] = $group == '' '0' $group;
            }
            
$ip ':'.implode(':'$n_ip).':';
            
            for(
$i 8$i != 1; --$i) {
                
$ip str_replace(str_repeat(':0',$i).':' '::'$ip$count);
                if (
$count) break;
            }

            if (
$ip[0] === ':' && $ip[1] !== ':'$ip substr($ip,1);
            if (
substr($ip, -11) === ':' && substr($ip, -21) !== ':'$ip substr($ip,0,-1);

            return 
$ip;
        } 
        function 
ip2bin($ip) {
            
$ip str_replace(':''.'expand_ip($ip));
            
$groups explode('.'$ip);
            
$r_ip '';
            
            switch (
count($groups)) {
                case 
8:
                    foreach(
$groups as $group) {
                        
$r_ip .= str_pad(base_convert($group162), 16'0'STR_PAD_LEFT);
                    }
                    break;
                    
                case 
4:
                    foreach(
$groups as $group) {
                        
$r_ip .= str_pad(base_convert($group102), 8'0'STR_PAD_LEFT);
                    }
                    break;
                    
                default:
            }
            return 
$r_ip;
        }
        function 
bin2ip($ip) {
            
$r_ip '';
            switch (
strlen($ip)) {
                case 
128:
                    foreach(
str_split($ip16) as $group) {
                        
$r_ip .= str_pad(base_convert($group216), 4'0'STR_PAD_LEFT).':';
                    }
                    break;
                    
                case 
32:
                    foreach(
str_split($ip8) as $group) {
                        
$r_ip .= base_convert($group210).'.';
                    }
                    break;
                    
                default:
            }
            return 
trim($r_ip':.');
        } 

        if (!empty(
$_GET['ip6rd'])) {
            list(
$ip6rd_ipv4masklen$ip6rd_6rdprefixlen$ip6rd_6rdprefix$ip6rd_6rdbripv4address) = explode(' '$_GET['ip6rd']);
            if (!isset(
$ip6rd_6rdbripv4address)) {
                echo 
'Make sure your ipv6rd string is using the format: ip6rd_ipv4masklen ip6rd_6rdprefixlen ip6rd_6rdprefix ip6rd_6rdbripv4address';
            } else {
                
$prefix_length $ip6rd_6rdprefixlen + (32-$ip6rd_ipv4masklen);
                
$client_pref shorten_ipv6(bin2ip(str_pad(substr(ip2bin($ip6rd_6rdprefix), 0$ip6rd_6rdprefixlen).substr(ip2bin($_GET['wanip']), $ip6rd_ipv4masklen), 128'0')));
                echo 
"\n6to4 static tunnel config:\n";
                echo 
"* Assigned / Routed Prefix: $client_pref\n";
                echo 
"* Prefix Length: $prefix_length\n";
                echo 
"* Tunnel Remote Endpoint (IPv4 Address): {$ip6rd_6rdbripv4address}\n";
                echo 
"* Tunnel Client IPv6 Address: $client_pref/$prefix_length \n";
            }
        }
    
?></pre>
</body>
</html>