The plot thickens. I have created the following test app, which on Windows SetTOS doesn’t have any effect but SetTTL works. On Linux, however, I get a panic!
$ go run udp_tos.go
panic: reflect: call of reflect.Value.Int on zero Value
goroutine 1 [running]:
reflect.Value.Int(0x0, 0x0, 0x0, 0x527b6d)
/usr/local/go/src/reflect/value.go:914 +0x141 The Go Programming Language(0x5be5e0, 0xc42000e030, 0xc420053e08, 0x4de159, 0x515760)
/home/kgolding/go/src/golang.org/x/net/ipv4/helper_unix.go:46 +0x196 The Go Programming Language(0xc420080190, 0xc42000e030, 0xc420080190, 0xc42000e030)
/home/kgolding/go/src/golang.org/x/net/ipv4/helper_unix.go:17 +0x57 The Go Programming Language(0xc420080190, 0x2, 0xc420080190, 0xc42000e030)
/home/kgolding/go/src/golang.org/x/net/ipv4/genericopt_posix.go:29 +0x45
main.main()
/home/kgolding/Projects/golang/src/xxxxxxxxx.co.uk/_tests/udp_tos/udp_tos.go:24 +0x239
exit status 2
The app code:
package main
import (
"log"
"net"
"golang.org/x/net/ipv4"
)
func main() {
laddr, err := net.ResolveUDPAddr("udp4", "192.168.5.22:5000")
if err != nil {
log.Fatal(err)
}
raddr, err := net.ResolveUDPAddr("udp4", "192.168.5.29:5000")
if err != nil {
log.Fatal(err)
}
conn, err := net.ListenUDP("udp4", laddr)
if err != nil {
log.Fatal(err)
}
p := ipv4.NewPacketConn(conn)
err = p.SetTOS(2) // IGNORED
if err != nil {
log.Fatal(err)
}
p.SetTTL(10) // WORKS
if err != nil {
log.Fatal(err)
}
b := []byte("HELLO")
n, err := p.WriteTo(b, nil, raddr)
log.Printf("Write %d bytes", n)
if err != nil {
log.Fatal(err)
}
n, err = conn.WriteToUDP(b, raddr)
log.Printf("WriteToUDP %d bytes", n)
if err != nil {
log.Fatal(err)
}
log.Fatal("Done")
}