I'm struggling with a small project I am working on. I want to implement functionality in GO that allows me to set the IP header TTL on an outgoing UDP packet that I then send and view the received TTL on the other end. I have a tried using a number of connections provided by the 'net' library and have so far had no success (I can set the TTL but I can't read it). Can anyone suggest a way of sending and receiving UDP packets that provide access to the packet's TTL field?
3
votes
UDP doesn't have a TTL, that is part of the IP protocol. Have you tried to use lower level packages like godoc.org/golang.org/x/net/ipv4 or github.com/google/gopacket?
– JimB
Yes, I've used both, I've tried using a packetConn from ipv4 but the ip header is still stripped away before I receive a message. I cannot figure out how to use the RawConn correctly, if you could show me how to use a RawConn to send/receive UDP messages that would be very helpful.
– Brash Man
1 Answers
2
votes
Set TTL:
var conn *icmp.PacketConn
// for IPv4
conn.IPv4PacketConn().SetTTL(p.ttl)
conn.IPv4PacketConn().SetControlMessage(ipv4.FlagTTL, true)
// for IPv6
conn.IPv6PacketConn().SetHopLimit(p.ttl)
conn.IPv6PacketConn().SetControlMessage(ipv6.FlagHopLimit, true)
Recieve TTL:
var ttl, n int
bytes := make([]byte, 512)
if IPv4 {
var cm *ipv4.ControlMessage
n, cm, _, err = conn.IPv4PacketConn().ReadFrom(bytes)
if cm != nil {
ttl = cm.TTL
}
} else {
var cm *ipv6.ControlMessage
n, cm, _, err = conn.IPv6PacketConn().ReadFrom(bytes)
if cm != nil {
ttl = cm.HopLimit
}
}