Initial load
diff --git a/test/java/net/MulticastSocket/NoLoopbackPackets.java b/test/java/net/MulticastSocket/NoLoopbackPackets.java
new file mode 100644
index 0000000..8341988
--- /dev/null
+++ b/test/java/net/MulticastSocket/NoLoopbackPackets.java
@@ -0,0 +1,146 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 4742177
+ * @summary Re-test IPv6 (and specifically MulticastSocket) with latest Linux & USAGI code
+ */
+import java.util.*;
+import java.net.*;
+
+
+public class NoLoopbackPackets {
+ private static int PORT = 9001;
+ private static String osname;
+
+ static boolean isWindows() {
+ if (osname == null)
+ osname = System.getProperty("os.name");
+ return osname.contains("Windows");
+ }
+
+ private static boolean hasIPv6() throws Exception {
+ List<NetworkInterface> nics = Collections.list(
+ NetworkInterface.getNetworkInterfaces());
+ for (NetworkInterface nic : nics) {
+ if (!nic.isLoopback()) {
+ List<InetAddress> addrs = Collections.list(nic.getInetAddresses());
+ for (InetAddress addr : addrs) {
+ if (addr instanceof Inet6Address) {
+ return true;
+ }
+ }
+ }
+ }
+
+ return false;
+ }
+
+ public static void main(String[] args) throws Exception {
+ if (isWindows()) {
+ System.out.println("The test only run on non-Windows OS. Bye.");
+ return;
+ }
+
+ if (!hasIPv6()) {
+ System.out.println("No IPv6 available. Bye.");
+ return;
+ }
+
+ // we will send packets to three multicast groups :-
+ // 224.1.1.1, ::ffff:224.1.1.2, and ff02::1:1
+ //
+ List<SocketAddress> groups = new ArrayList<SocketAddress>();
+ groups.add(new InetSocketAddress(InetAddress.getByName("224.1.1.1"), PORT));
+ groups.add(new InetSocketAddress(InetAddress.getByName("::ffff:224.1.1.2"), PORT));
+ groups.add(new InetSocketAddress(InetAddress.getByName("ff02::1:1"), PORT));
+
+ Thread sender = new Thread(new Sender(groups));
+ sender.setDaemon(true); // we want sender to stop when main thread exits
+ sender.start();
+
+ // Now try to receive multicast packets. we should not see any of them
+ // since we disable loopback mode.
+ //
+ MulticastSocket msock = new MulticastSocket(PORT);
+ msock.setSoTimeout(5000); // 5 seconds
+
+ byte[] buf = new byte[1024];
+ DatagramPacket packet = new DatagramPacket(buf, 0, buf.length);
+ List<SocketAddress> failedGroups = new ArrayList<SocketAddress>();
+ for (SocketAddress group : groups) {
+ msock.joinGroup(group, null);
+
+ try {
+ msock.receive(packet);
+
+ // it is an error if we receive something
+ failedGroups.add(group);
+ } catch (SocketTimeoutException e) {
+ // we expect this
+ }
+
+ msock.leaveGroup(group, null);
+ }
+
+ if (failedGroups.size() > 0) {
+ System.out.println("We should not receive anything from following groups, but we did:");
+ for (SocketAddress group : failedGroups)
+ System.out.println(group);
+ throw new RuntimeException("test failed.");
+ }
+ }
+}
+
+class Sender implements Runnable {
+ private List<SocketAddress> sendToGroups;
+
+ public Sender(List<SocketAddress> groups) {
+ sendToGroups = groups;
+ }
+
+ public void run() {
+ byte[] buf = "hello world".getBytes();
+ List<DatagramPacket> packets = new ArrayList<DatagramPacket>();
+
+ try {
+ for (SocketAddress group : sendToGroups) {
+ DatagramPacket packet = new DatagramPacket(buf, buf.length, group);
+ packets.add(packet);
+ }
+
+ MulticastSocket msock = new MulticastSocket();
+ msock.setLoopbackMode(true); // disable loopback mode
+ for (;;) {
+ for (DatagramPacket packet : packets) {
+ msock.send(packet);
+ }
+
+ Thread.currentThread().sleep(1000); // 1 second
+ }
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+}