Here's a solution for icmpv6 ping with php, dropping it here in case if someone has problems with icmpv6 with php.<?php$host = "2a03:2880:f11b:83:face:b00c:0:25de";$timeout = 100000;$count = 3;echo "Latency: ". round(1000 * pingv6($host,$timeout,$count),5) ." ms \n";function pingv6($target,$timeout,$count) { echo "target is ipv6 address, ". getprotobyname('ipv6-icmp'). " \n"; $socket = socket_create(AF_INET6, SOCK_RAW, getprotobyname('ipv6-icmp')); $sec=intval($timeout/1000); $usec=$timeout%1000*1000; socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array("sec"=>$sec, "usec"=>$usec)); $type = "\x80"; $seqNumber = chr(floor($i/256)%256) . chr($i%256); $checksum= "\x00\x00"; $code = "\x00"; $identifier = chr(rand(0,255)) . chr(rand(0,255)); $msg = "!\"#$%&'()*+,-./1234567"; $package = $type.$code.$checksum.$identifier.$seqNumber.$msg; $checksum = icmpChecksum($package); $package = $type.$code.$checksum.$identifier.$seqNumber.$msg; if(@socket_connect($socket, $target, null)){ for($i = 0; $i < $count; $i++){ list($start_usec, $start_sec) = explode(" ", microtime()); $start_time = ((float) $start_usec + (float) $start_sec); $startTime = microtime(true); socket_send($socket, $package, strLen($package), 0); while ($startTime + $timeout*1000 > microtime(true)){ if(socket_read($socket, 255) !== false) { list($end_usec, $end_sec) = explode(" ", microtime()); $end_time = ((float) $end_usec + (float) $end_sec); $total_time = $end_time - $start_time; echo "round trip time (".$i."): ". $total_time ."\n"; return $total_time; break; }else{ return "null"; echo "Timed out (".$i."), Got no echo reply\n"; break; } } usleep($interval*1000); } socket_close($socket); }}function icmpChecksum($data){if (strlen($data)%2) $data .= "\x00";$bit = unpack('n*', $data);$sum = array_sum($bit);while ($sum >> 16) $sum = ($sum >> 16) + ($sum & 0xffff);return pack('n*', ~$sum);}?>