multicast_test.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. // 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. // +build darwin freebsd linux netbsd openbsd
  5. package ipv4_test
  6. import (
  7. "code.google.com/p/go.net/ipv4"
  8. "net"
  9. "os"
  10. "testing"
  11. )
  12. func TestReadWriteMulticastIPPayloadUDP(t *testing.T) {
  13. if testing.Short() || !*testExternal {
  14. t.Logf("skipping test to avoid external network")
  15. return
  16. }
  17. c, err := net.ListenPacket("udp4", "224.0.0.0:1024") // see RFC 4727
  18. if err != nil {
  19. t.Fatalf("net.ListenPacket failed: %v", err)
  20. }
  21. defer c.Close()
  22. ifi := loopbackInterface()
  23. if ifi == nil {
  24. t.Logf("skipping test; an appropriate interface not found")
  25. return
  26. }
  27. dst, err := net.ResolveUDPAddr("udp4", "224.0.0.254:1024") // see RFC 4727
  28. if err != nil {
  29. t.Fatalf("net.ResolveUDPAddr failed: %v", err)
  30. }
  31. p := ipv4.NewPacketConn(c)
  32. if err := p.JoinGroup(ifi, dst); err != nil {
  33. t.Fatalf("ipv4.PacketConn.JoinGroup on %v failed: %v", ifi, err)
  34. }
  35. if err := p.SetMulticastInterface(ifi); err != nil {
  36. t.Fatalf("ipv4.PacketConn.SetMulticastInterface failed: %v", err)
  37. }
  38. if err := p.SetMulticastLoopback(true); err != nil {
  39. t.Fatalf("ipv4.PacketConn.SetMulticastLoopback failed: %v", err)
  40. }
  41. runPayloadTransponder(t, p, []byte("HELLO-R-U-THERE"), dst)
  42. }
  43. func TestReadWriteMulticastIPPayloadICMP(t *testing.T) {
  44. if testing.Short() || !*testExternal {
  45. t.Logf("skipping test to avoid external network")
  46. return
  47. }
  48. if os.Getuid() != 0 {
  49. t.Logf("skipping test; must be root")
  50. return
  51. }
  52. c, err := net.ListenPacket("ip4:icmp", "0.0.0.0")
  53. if err != nil {
  54. t.Fatalf("net.ListenPacket failed: %v", err)
  55. }
  56. defer c.Close()
  57. ifi := loopbackInterface()
  58. if ifi == nil {
  59. t.Logf("skipping test; an appropriate interface not found")
  60. return
  61. }
  62. dst, err := net.ResolveIPAddr("ip4", "224.0.0.254") // see RFC 4727
  63. if err != nil {
  64. t.Fatalf("net.ResolveIPAddr failed: %v", err)
  65. }
  66. p := ipv4.NewPacketConn(c)
  67. if err := p.JoinGroup(ifi, dst); err != nil {
  68. t.Fatalf("ipv4.PacketConn.JoinGroup on %v failed: %v", ifi, err)
  69. }
  70. if err := p.SetMulticastInterface(ifi); err != nil {
  71. t.Fatalf("ipv4.PacketConn.SetMulticastInterface failed: %v", err)
  72. }
  73. id := os.Getpid() & 0xffff
  74. pld := newICMPEchoRequest(id, 1, 128, []byte("HELLO-R-U-THERE"))
  75. runPayloadTransponder(t, p, pld, dst)
  76. }
  77. func TestReadWriteMulticastIPDatagram(t *testing.T) {
  78. if testing.Short() || !*testExternal {
  79. t.Logf("skipping test to avoid external network")
  80. return
  81. }
  82. if os.Getuid() != 0 {
  83. t.Logf("skipping test; must be root")
  84. return
  85. }
  86. c, err := net.ListenPacket("ip4:icmp", "0.0.0.0")
  87. if err != nil {
  88. t.Fatalf("net.ListenPacket failed: %v", err)
  89. }
  90. defer c.Close()
  91. ifi := loopbackInterface()
  92. if ifi == nil {
  93. t.Logf("skipping test; an appropriate interface not found")
  94. return
  95. }
  96. dst, err := net.ResolveIPAddr("ip4", "224.0.0.254") // see RFC 4727
  97. if err != nil {
  98. t.Fatalf("ResolveIPAddr failed: %v", err)
  99. }
  100. r, err := ipv4.NewRawConn(c)
  101. if err != nil {
  102. t.Fatalf("ipv4.NewRawConn failed: %v", err)
  103. }
  104. if err := r.JoinGroup(ifi, dst); err != nil {
  105. t.Fatalf("ipv4.RawConn.JoinGroup on %v failed: %v", ifi, err)
  106. }
  107. if err := r.SetMulticastInterface(ifi); err != nil {
  108. t.Fatalf("ipv4.PacketConn.SetMulticastInterface failed: %v", err)
  109. }
  110. id := os.Getpid() & 0xffff
  111. pld := newICMPEchoRequest(id, 1, 128, []byte("HELLO-R-U-THERE"))
  112. runDatagramTransponder(t, r, pld, nil, dst)
  113. }