Skip to content

Commit 89a9432

Browse files
tqbfzx2c4
authored andcommitted
tun/netstack: implement ICMP ping
Provide a PacketConn interface for netstack's ICMP endpoint; netstack currently only provides EchoRequest/EchoResponse ICMP support, so this code exposes only an interface for doing ping. Signed-off-by: Thomas Ptacek <[email protected]> [Jason: rework structure, match std go interfaces, add example code] Signed-off-by: Jason A. Donenfeld <[email protected]>
1 parent e0b8f11 commit 89a9432

File tree

2 files changed

+342
-24
lines changed

2 files changed

+342
-24
lines changed

tun/netstack/examples/ping_client.go

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
//go:build ignore
2+
// +build ignore
3+
4+
/* SPDX-License-Identifier: MIT
5+
*
6+
* Copyright (C) 2019-2021 WireGuard LLC. All Rights Reserved.
7+
*/
8+
9+
package main
10+
11+
import (
12+
"log"
13+
"time"
14+
15+
"golang.zx2c4.com/go118/netip"
16+
"golang.zx2c4.com/wireguard/conn"
17+
"golang.zx2c4.com/wireguard/device"
18+
"golang.zx2c4.com/wireguard/tun/netstack"
19+
)
20+
21+
func main() {
22+
tun, tnet, err := netstack.CreateNetTUN(
23+
[]netip.Addr{netip.MustParseAddr("192.168.4.29")},
24+
[]netip.Addr{netip.MustParseAddr("8.8.8.8")},
25+
1420)
26+
if err != nil {
27+
log.Panic(err)
28+
}
29+
dev := device.NewDevice(tun, conn.NewDefaultBind(), device.NewLogger(device.LogLevelVerbose, ""))
30+
dev.IpcSet(`private_key=a8dac1d8a70a751f0f699fb14ba1cff7b79cf4fbd8f09f44c6e6a90d0369604f
31+
public_key=25123c5dcd3328ff645e4f2a3fce0d754400d3887a0cb7c56f0267e20fbf3c5b
32+
endpoint=163.172.161.0:12912
33+
allowed_ip=0.0.0.0/0
34+
`)
35+
err = dev.Up()
36+
if err != nil {
37+
log.Panic(err)
38+
}
39+
40+
socket, err := tnet.Dial("ping4", "zx2c4.com")
41+
if err != nil {
42+
log.Panic(err)
43+
}
44+
const payload = "gopher burrow"
45+
socket.SetReadDeadline(time.Now().Add(time.Second * 10))
46+
start := time.Now()
47+
_, err = socket.Write([]byte(payload))
48+
if err != nil {
49+
log.Panic(err)
50+
}
51+
var reply [len(payload)]byte
52+
n, err := socket.Read(reply[:])
53+
if err != nil || string(reply[:n]) != payload {
54+
log.Panic(err)
55+
}
56+
log.Printf("Ping latency: %v", time.Since(start))
57+
}

0 commit comments

Comments
 (0)