From 735b3a96b7e61be03de3b6495ea5a274998fc7cd Mon Sep 17 00:00:00 2001 From: Sean Purser-Haskell Date: Mon, 9 May 2016 16:17:22 +0800 Subject: [PATCH 1/2] add port accessors and modifiers for TCP/UDP --- waterutil/tun_ipv4.go | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/waterutil/tun_ipv4.go b/waterutil/tun_ipv4.go index 6878174..6a6bd36 100644 --- a/waterutil/tun_ipv4.go +++ b/waterutil/tun_ipv4.go @@ -28,11 +28,42 @@ func IPv4Source(packet []byte) net.IP { return net.IPv4(packet[12], packet[13], packet[14], packet[15]) } +func SetIPv4Source(packet []byte, source net.IP) { + copy(packet[12:16], source) +} + func IPv4Destination(packet []byte) net.IP { return net.IPv4(packet[16], packet[17], packet[18], packet[19]) } +func SetIPv4Destination(packet []byte, dest net.IP) { + copy(packet[16:20], dest) +} + func IPv4Payload(packet []byte) []byte { ihl := packet[0] & 0x0F return packet[ihl*4:] } + +// For TCP/UDP +func IPv4SourcePort(packet []byte) uint16 { + payload := IPv4Payload(packet) + return (uint16(payload[0]) << 8) | uint16(payload[1]) +} + +func IPv4DestinationPort(packet []byte) uint16 { + payload := IPv4Payload(packet) + return (uint16(payload[2]) << 8) | uint16(payload[3]) +} + +func SetIPv4SourcePort(packet []byte, port uint16) { + payload := IPv4Payload(packet) + payload[0] = byte(port >> 8) + payload[1] = byte(port & 0xFF) +} + +func SetIPv4DestinationPort(packet []byte, port uint16) { + payload := IPv4Payload(packet) + payload[2] = byte(port >> 8) + payload[3] = byte(port & 0xFF) +} From 93f6384fddf18bf1bc66e718d9e0edf6058fc12b Mon Sep 17 00:00:00 2001 From: Sean Purser-Haskell Date: Tue, 10 May 2016 11:30:32 +0800 Subject: [PATCH 2/2] Fix to use To4() This will also produce a runtime error if non-IPv4 addresses are passed in. --- waterutil/tun_ipv4.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/waterutil/tun_ipv4.go b/waterutil/tun_ipv4.go index 6a6bd36..6e249e5 100644 --- a/waterutil/tun_ipv4.go +++ b/waterutil/tun_ipv4.go @@ -29,7 +29,7 @@ func IPv4Source(packet []byte) net.IP { } func SetIPv4Source(packet []byte, source net.IP) { - copy(packet[12:16], source) + copy(packet[12:16], source.To4()) } func IPv4Destination(packet []byte) net.IP { @@ -37,7 +37,7 @@ func IPv4Destination(packet []byte) net.IP { } func SetIPv4Destination(packet []byte, dest net.IP) { - copy(packet[16:20], dest) + copy(packet[16:20], dest.To4()) } func IPv4Payload(packet []byte) []byte {