|
|
@@ -59,7 +59,7 @@ func TestUDPSinglePacketConnWithMultipleGroupListeners(t *testing.T) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-func TestUDPMultipleConnWithMultipleGroupListeners(t *testing.T) {
|
|
|
+func TestUDPMultiplePacketConnWithMultipleGroupListeners(t *testing.T) {
|
|
|
switch runtime.GOOS {
|
|
|
case "plan9", "windows":
|
|
|
t.Skipf("not supported on %q", runtime.GOOS)
|
|
|
@@ -120,7 +120,7 @@ func TestUDPPerInterfaceSinglePacketConnWithSingleGroupListener(t *testing.T) {
|
|
|
t.Skip("ipv6 is not supported")
|
|
|
}
|
|
|
|
|
|
- gaddr := &net.IPAddr{IP: net.ParseIP("ff02::114")} // see RFC 4727
|
|
|
+ gaddr := net.IPAddr{IP: net.ParseIP("ff02::114")} // see RFC 4727
|
|
|
type ml struct {
|
|
|
c *ipv6.PacketConn
|
|
|
ifi *net.Interface
|
|
|
@@ -142,13 +142,13 @@ func TestUDPPerInterfaceSinglePacketConnWithSingleGroupListener(t *testing.T) {
|
|
|
}
|
|
|
defer c.Close()
|
|
|
p := ipv6.NewPacketConn(c)
|
|
|
- if err := p.JoinGroup(&ifi, gaddr); err != nil {
|
|
|
+ if err := p.JoinGroup(&ifi, &gaddr); err != nil {
|
|
|
t.Fatalf("ipv6.PacketConn.JoinGroup on %v failed: %v", ifi, err)
|
|
|
}
|
|
|
mlt = append(mlt, &ml{p, &ift[i]})
|
|
|
}
|
|
|
for _, m := range mlt {
|
|
|
- if err := m.c.LeaveGroup(m.ifi, gaddr); err != nil {
|
|
|
+ if err := m.c.LeaveGroup(m.ifi, &gaddr); err != nil {
|
|
|
t.Fatalf("ipv6.PacketConn.LeaveGroup on %v failed: %v", m.ifi, err)
|
|
|
}
|
|
|
}
|
|
|
@@ -166,14 +166,14 @@ func TestIPSinglePacketConnWithSingleGroupListener(t *testing.T) {
|
|
|
t.Skip("must be root")
|
|
|
}
|
|
|
|
|
|
- c, err := net.ListenPacket("ip6:ipv6-icmp", "::")
|
|
|
+ c, err := net.ListenPacket("ip6:ipv6-icmp", "::") // wildcard address
|
|
|
if err != nil {
|
|
|
t.Fatalf("net.ListenPacket failed: %v", err)
|
|
|
}
|
|
|
defer c.Close()
|
|
|
|
|
|
p := ipv6.NewPacketConn(c)
|
|
|
- gaddr := &net.IPAddr{IP: net.ParseIP("ff02::114")} // see RFC 4727
|
|
|
+ gaddr := net.IPAddr{IP: net.ParseIP("ff02::114")} // see RFC 4727
|
|
|
var mift []*net.Interface
|
|
|
|
|
|
ift, err := net.Interfaces()
|
|
|
@@ -184,14 +184,60 @@ func TestIPSinglePacketConnWithSingleGroupListener(t *testing.T) {
|
|
|
if _, ok := isMulticastAvailable(&ifi); !ok {
|
|
|
continue
|
|
|
}
|
|
|
- if err := p.JoinGroup(&ifi, gaddr); err != nil {
|
|
|
+ if err := p.JoinGroup(&ifi, &gaddr); err != nil {
|
|
|
t.Fatalf("ipv6.PacketConn.JoinGroup on %v failed: %v", ifi, err)
|
|
|
}
|
|
|
mift = append(mift, &ift[i])
|
|
|
}
|
|
|
for _, ifi := range mift {
|
|
|
- if err := p.LeaveGroup(ifi, gaddr); err != nil {
|
|
|
+ if err := p.LeaveGroup(ifi, &gaddr); err != nil {
|
|
|
t.Fatalf("ipv6.PacketConn.LeaveGroup on %v failed: %v", ifi, err)
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+func TestIPPerInterfaceSinglePacketConnWithSingleGroupListener(t *testing.T) {
|
|
|
+ switch runtime.GOOS {
|
|
|
+ case "darwin", "plan9", "windows":
|
|
|
+ t.Skipf("not supported on %q", runtime.GOOS)
|
|
|
+ }
|
|
|
+ if !supportsIPv6 {
|
|
|
+ t.Skip("ipv6 is not supported")
|
|
|
+ }
|
|
|
+ if os.Getuid() != 0 {
|
|
|
+ t.Skip("must be root")
|
|
|
+ }
|
|
|
+
|
|
|
+ gaddr := net.IPAddr{IP: net.ParseIP("ff02::114")} // see RFC 4727
|
|
|
+ type ml struct {
|
|
|
+ c *ipv6.PacketConn
|
|
|
+ ifi *net.Interface
|
|
|
+ }
|
|
|
+ var mlt []*ml
|
|
|
+
|
|
|
+ ift, err := net.Interfaces()
|
|
|
+ if err != nil {
|
|
|
+ t.Fatalf("net.Interfaces failed: %v", err)
|
|
|
+ }
|
|
|
+ for i, ifi := range ift {
|
|
|
+ ip, ok := isMulticastAvailable(&ifi)
|
|
|
+ if !ok {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ c, err := net.ListenPacket("ip6:ipv6-icmp", fmt.Sprintf("%s%%%s", ip.String(), ifi.Name)) // unicast address
|
|
|
+ if err != nil {
|
|
|
+ t.Fatalf("net.ListenPacket failed: %v", err)
|
|
|
+ }
|
|
|
+ defer c.Close()
|
|
|
+ p := ipv6.NewPacketConn(c)
|
|
|
+ if err := p.JoinGroup(&ifi, &gaddr); err != nil {
|
|
|
+ t.Fatalf("ipv6.PacketConn.JoinGroup on %v failed: %v", ifi, err)
|
|
|
+ }
|
|
|
+ mlt = append(mlt, &ml{p, &ift[i]})
|
|
|
+ }
|
|
|
+ for _, m := range mlt {
|
|
|
+ if err := m.c.LeaveGroup(m.ifi, &gaddr); err != nil {
|
|
|
+ t.Fatalf("ipv6.PacketConn.LeaveGroup on %v failed: %v", m.ifi, err)
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|