package vpnruntime import ( "encoding/binary" "testing" ) func TestNormalizeIPv4PacketChecksumsRepairsTCP(t *testing.T) { packet := []byte{ 0x45, 0x00, 0x00, 0x28, 0x00, 0x00, 0x40, 0x00, 0x40, 0x06, 0x12, 0x34, 192, 168, 200, 61, 10, 77, 0, 2, 0x46, 0xa0, 0xdd, 0x78, 0, 0, 0, 1, 0, 0, 0, 0, 0x50, 0x12, 0x72, 0x10, 0xab, 0xcd, 0, 0, } if !normalizeIPv4PacketChecksums(packet) { t.Fatal("normalize returned false") } if got := checksum(packet[:20]); got != 0 { t.Fatalf("ip checksum verification = %#x, want 0", got) } tcp := packet[20:] pseudo := make([]byte, 12+len(tcp)) copy(pseudo[0:4], packet[12:16]) copy(pseudo[4:8], packet[16:20]) pseudo[9] = 6 binary.BigEndian.PutUint16(pseudo[10:12], uint16(len(tcp))) copy(pseudo[12:], tcp) if got := checksum(pseudo); got != 0 { t.Fatalf("tcp checksum verification = %#x, want 0", got) } } func TestNormalizeIPv4PacketChecksumsRepairsUDP(t *testing.T) { packet := []byte{ 0x45, 0x00, 0x00, 0x20, 0, 0, 0x40, 0, 0x40, 0x11, 0x12, 0x34, 10, 77, 0, 2, 192, 168, 200, 210, 0x30, 0x39, 0x00, 0x35, 0x00, 0x0c, 0xab, 0xcd, 0xde, 0xad, 0xbe, 0xef, } if !normalizeIPv4PacketChecksums(packet) { t.Fatal("normalize returned false") } if got := checksum(packet[:20]); got != 0 { t.Fatalf("ip checksum verification = %#x, want 0", got) } udp := packet[20:] pseudo := make([]byte, 12+len(udp)) copy(pseudo[0:4], packet[12:16]) copy(pseudo[4:8], packet[16:20]) pseudo[9] = 17 binary.BigEndian.PutUint16(pseudo[10:12], uint16(len(udp))) copy(pseudo[12:], udp) if got := checksum(pseudo); got != 0 { t.Fatalf("udp checksum verification = %#x, want 0", got) } }