github.com/koomox/wireguard-go@v0.0.0-20230722134753-17a50b2f22a3/tun/netstack/examples/ping_client.go (about)

     1  //go:build ignore
     2  
     3  /* SPDX-License-Identifier: MIT
     4   *
     5   * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
     6   */
     7  
     8  package main
     9  
    10  import (
    11  	"bytes"
    12  	"log"
    13  	"math/rand"
    14  	"net/netip"
    15  	"time"
    16  
    17  	"golang.org/x/net/icmp"
    18  	"golang.org/x/net/ipv4"
    19  
    20  	"github.com/koomox/wireguard-go/conn"
    21  	"github.com/koomox/wireguard-go/device"
    22  	"github.com/koomox/wireguard-go/tun/netstack"
    23  )
    24  
    25  func main() {
    26  	tun, tnet, err := netstack.CreateNetTUN(
    27  		[]netip.Addr{netip.MustParseAddr("192.168.4.29")},
    28  		[]netip.Addr{netip.MustParseAddr("8.8.8.8")},
    29  		1420)
    30  	if err != nil {
    31  		log.Panic(err)
    32  	}
    33  	dev := device.NewDevice(tun, conn.NewDefaultBind(), device.NewLogger(device.LogLevelVerbose, ""))
    34  	dev.IpcSet(`private_key=a8dac1d8a70a751f0f699fb14ba1cff7b79cf4fbd8f09f44c6e6a90d0369604f
    35  public_key=25123c5dcd3328ff645e4f2a3fce0d754400d3887a0cb7c56f0267e20fbf3c5b
    36  endpoint=163.172.161.0:12912
    37  allowed_ip=0.0.0.0/0
    38  `)
    39  	err = dev.Up()
    40  	if err != nil {
    41  		log.Panic(err)
    42  	}
    43  
    44  	socket, err := tnet.Dial("ping4", "zx2c4.com")
    45  	if err != nil {
    46  		log.Panic(err)
    47  	}
    48  	requestPing := icmp.Echo{
    49  		Seq:  rand.Intn(1 << 16),
    50  		Data: []byte("gopher burrow"),
    51  	}
    52  	icmpBytes, _ := (&icmp.Message{Type: ipv4.ICMPTypeEcho, Code: 0, Body: &requestPing}).Marshal(nil)
    53  	socket.SetReadDeadline(time.Now().Add(time.Second * 10))
    54  	start := time.Now()
    55  	_, err = socket.Write(icmpBytes)
    56  	if err != nil {
    57  		log.Panic(err)
    58  	}
    59  	n, err := socket.Read(icmpBytes[:])
    60  	if err != nil {
    61  		log.Panic(err)
    62  	}
    63  	replyPacket, err := icmp.ParseMessage(1, icmpBytes[:n])
    64  	if err != nil {
    65  		log.Panic(err)
    66  	}
    67  	replyPing, ok := replyPacket.Body.(*icmp.Echo)
    68  	if !ok {
    69  		log.Panicf("invalid reply type: %v", replyPacket)
    70  	}
    71  	if !bytes.Equal(replyPing.Data, requestPing.Data) || replyPing.Seq != requestPing.Seq {
    72  		log.Panicf("invalid ping reply: %v", replyPing)
    73  	}
    74  	log.Printf("Ping latency: %v", time.Since(start))
    75  }