blob: 5a0061eef4366fb45bd56c25b7064d58032434d9 [file] [log] [blame]
Mikio Harad2e5a122012-09-26 21:03:09 +09001// Copyright 2012 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5// +build darwin freebsd linux netbsd openbsd
6
7package ipv4_test
8
9import (
10 "code.google.com/p/go.net/ipv4"
11 "net"
12 "os"
13 "testing"
14)
15
16func TestReadWriteUnicastIPPayloadUDP(t *testing.T) {
17 c, err := net.ListenPacket("udp4", "127.0.0.1:0")
18 if err != nil {
19 t.Fatalf("net.ListenPacket failed: %v", err)
20 }
21 defer c.Close()
22
23 dst, err := net.ResolveUDPAddr("udp4", c.LocalAddr().String())
24 if err != nil {
25 t.Fatalf("net.ResolveUDPAddr failed: %v", err)
26 }
Mikio Harad2e5a122012-09-26 21:03:09 +090027 p := ipv4.NewPacketConn(c)
Mikio Hara6b91bf22013-02-16 13:02:07 +090028 cf := ipv4.FlagTTL | ipv4.FlagDst | ipv4.FlagInterface
29 for i, toggle := range []bool{true, false, true} {
30 if err := p.SetControlMessage(cf, toggle); err != nil {
31 t.Fatalf("ipv4.PacketConn.SetControlMessage failed: %v", err)
32 }
33 writeThenReadPayload(t, i, p, []byte("HELLO-R-U-THERE"), dst)
34 }
Mikio Harad2e5a122012-09-26 21:03:09 +090035}
36
37func TestReadWriteUnicastIPPayloadICMP(t *testing.T) {
38 if os.Getuid() != 0 {
Mikio Hara413497e2013-04-04 14:37:01 +090039 t.Skip("must be root")
Mikio Harad2e5a122012-09-26 21:03:09 +090040 }
41
42 c, err := net.ListenPacket("ip4:icmp", "0.0.0.0")
43 if err != nil {
44 t.Fatalf("net.ListenPacket failed: %v", err)
45 }
46 defer c.Close()
47
48 dst, err := net.ResolveIPAddr("ip4", "127.0.0.1")
49 if err != nil {
50 t.Fatalf("ResolveIPAddr failed: %v", err)
51 }
Mikio Harad2e5a122012-09-26 21:03:09 +090052 p := ipv4.NewPacketConn(c)
Mikio Hara6b91bf22013-02-16 13:02:07 +090053 cf := ipv4.FlagTTL | ipv4.FlagDst | ipv4.FlagInterface
54 for i, toggle := range []bool{true, false, true} {
55 wb, err := (&icmpMessage{
Mikio Hara8108b4b2013-06-07 14:52:58 +090056 Type: ipv4.ICMPTypeEcho, Code: 0,
Mikio Hara6b91bf22013-02-16 13:02:07 +090057 Body: &icmpEcho{
58 ID: os.Getpid() & 0xffff, Seq: i + 1,
59 Data: []byte("HELLO-R-U-THERE"),
60 },
61 }).Marshal()
62 if err != nil {
63 t.Fatalf("icmpMessage.Marshal failed: %v", err)
64 }
65 if err := p.SetControlMessage(cf, toggle); err != nil {
66 t.Fatalf("ipv4.PacketConn.SetControlMessage failed: %v", err)
67 }
68 rb := writeThenReadPayload(t, i, p, wb, dst)
69 m, err := parseICMPMessage(rb)
70 if err != nil {
71 t.Fatalf("parseICMPMessage failed: %v", err)
72 }
Mikio Hara8108b4b2013-06-07 14:52:58 +090073 if m.Type != ipv4.ICMPTypeEchoReply || m.Code != 0 {
74 t.Fatalf("got type=%v, code=%v; expected type=%v, code=%v", m.Type, m.Code, ipv4.ICMPTypeEchoReply, 0)
Mikio Hara6b91bf22013-02-16 13:02:07 +090075 }
76 }
Mikio Harad2e5a122012-09-26 21:03:09 +090077}
78
79func TestReadWriteUnicastIPDatagram(t *testing.T) {
80 if os.Getuid() != 0 {
Mikio Hara413497e2013-04-04 14:37:01 +090081 t.Skip("must be root")
Mikio Harad2e5a122012-09-26 21:03:09 +090082 }
83
84 c, err := net.ListenPacket("ip4:icmp", "0.0.0.0")
85 if err != nil {
86 t.Fatalf("net.ListenPacket failed: %v", err)
87 }
88 defer c.Close()
89
90 dst, err := net.ResolveIPAddr("ip4", "127.0.0.1")
91 if err != nil {
92 t.Fatalf("ResolveIPAddr failed: %v", err)
93 }
Mikio Harad2e5a122012-09-26 21:03:09 +090094 r, err := ipv4.NewRawConn(c)
95 if err != nil {
96 t.Fatalf("ipv4.NewRawConn failed: %v", err)
97 }
Mikio Hara6b91bf22013-02-16 13:02:07 +090098 cf := ipv4.FlagTTL | ipv4.FlagDst | ipv4.FlagInterface
99 for i, toggle := range []bool{true, false, true} {
100 wb, err := (&icmpMessage{
Mikio Hara8108b4b2013-06-07 14:52:58 +0900101 Type: ipv4.ICMPTypeEcho, Code: 0,
Mikio Hara6b91bf22013-02-16 13:02:07 +0900102 Body: &icmpEcho{
103 ID: os.Getpid() & 0xffff, Seq: i + 1,
104 Data: []byte("HELLO-R-U-THERE"),
105 },
106 }).Marshal()
107 if err != nil {
108 t.Fatalf("icmpMessage.Marshal failed: %v", err)
109 }
110 if err := r.SetControlMessage(cf, toggle); err != nil {
111 t.Fatalf("ipv4.RawConn.SetControlMessage failed: %v", err)
112 }
113 rb := writeThenReadDatagram(t, i, r, wb, nil, dst)
114 m, err := parseICMPMessage(rb)
115 if err != nil {
116 t.Fatalf("parseICMPMessage failed: %v", err)
117 }
Mikio Hara8108b4b2013-06-07 14:52:58 +0900118 if m.Type != ipv4.ICMPTypeEchoReply || m.Code != 0 {
119 t.Fatalf("got type=%v, code=%v; expected type=%v, code=%v", m.Type, m.Code, ipv4.ICMPTypeEchoReply, 0)
Mikio Hara6b91bf22013-02-16 13:02:07 +0900120 }
121 }
Mikio Harad2e5a122012-09-26 21:03:09 +0900122}