()
| 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 | } |
nothing calls this directly
no test coverage detected