//go:build ignore /* SPDX-License-Identifier: MIT * * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved. */ package main import ( "bytes" "log" "math/rand" "net/netip" "time" "golang.org/x/net/icmp" "golang.org/x/net/ipv4" "golang.zx2c4.com/wireguard/conn" "golang.zx2c4.com/wireguard/device" "golang.zx2c4.com/wireguard/tun/netstack" ) func main() { tun, tnet, err := netstack.CreateNetTUN( []netip.Addr{netip.MustParseAddr("192.168.4.29")}, []netip.Addr{netip.MustParseAddr("8.8.8.8")}, 1420) if err != nil { log.Panic(err) } dev := device.NewDevice(tun, conn.NewDefaultBind(), device.NewLogger(device.LogLevelVerbose, "")) dev.IpcSet(`private_key=a8dac1d8a70a751f0f699fb14ba1cff7b79cf4fbd8f09f44c6e6a90d0369604f public_key=25123c5dcd3328ff645e4f2a3fce0d754400d3887a0cb7c56f0267e20fbf3c5b endpoint=163.172.161.0:12912 allowed_ip=0.0.0.0/0 `) err = dev.Up() if err != nil { log.Panic(err) } socket, err := tnet.Dial("ping4", "zx2c4.com") if err != nil { log.Panic(err) } requestPing := icmp.Echo{ Seq: rand.Intn(1 << 16), Data: []byte("gopher burrow"), } icmpBytes, _ := (&icmp.Message{Type: ipv4.ICMPTypeEcho, Code: 0, Body: &requestPing}).Marshal(nil) socket.SetReadDeadline(time.Now().Add(time.Second * 10)) start := time.Now() _, err = socket.Write(icmpBytes) if err != nil { log.Panic(err) } n, err := socket.Read(icmpBytes[:]) if err != nil { log.Panic(err) } replyPacket, err := icmp.ParseMessage(1, icmpBytes[:n]) if err != nil { log.Panic(err) } replyPing, ok := replyPacket.Body.(*icmp.Echo) if !ok { log.Panicf("invalid reply type: %v", replyPacket) } if !bytes.Equal(replyPing.Data, requestPing.Data) || replyPing.Seq != requestPing.Seq { log.Panicf("invalid ping reply: %v", replyPing) } log.Printf("Ping latency: %v", time.Since(start)) }