broadcast and prefix length with IPv6

Christopher Hegarty - Sun Microsystems Ireland Christopher.Hegarty at Sun.COM
Mon Dec 14 08:56:25 PST 2009


Hi Mark,

I've actually just reproduced this myself on one of our Vista boxes. 
I've accepted the bug, 6707289, and will try to determine the root cause.

-Chris.

On 14/12/2009 16:27, Mark Thornton wrote:
> On Vista, if you try to find the broadcast address and net prefix length
> associated with an IPv4 address (InterfaceAddress.getBroadcast(),
> InterfaceAddress.getNetworkPrefixLength()), you get nonsense unless IPv6
> is disabled. Bug 6707289 describes the prefix length case.
> 
> Workaround: -Djava.net.preferIPv4Stack=true
> 
> Without that option, the result on my machine is
>  /192.168.0.7, broadcast=/255.255.255.255, prefixLength=128
> 
> With -Djava.net.preferIPv4Stack=true
>  /192.168.0.7, broadcast=/192.168.0.255, prefixLength=24
> 
> Regards,
> Mark Thornton
> 
> 
> public class TestNetworkInterfaces
> {
>    /**
>     * Must use -Djava.net.preferIPv4Stack=true to get expected results
> for broadcast address and
>     * prefix length
>     * @throws SocketException
>     */
>    @Test public void enumerateInterfaces() throws SocketException
>    {
>        for (Enumeration<NetworkInterface> interfaces =
> NetworkInterface.getNetworkInterfaces(); interfaces.hasMoreElements();)
>        {
>            NetworkInterface ni = interfaces.nextElement();
>            if (ni.isUp() && !ni.isVirtual())
>                reportInterface(ni, "");
>        }
>    }
> 
>    private void reportInterface(NetworkInterface ni, String indent)
> throws SocketException
>    {
>        if (ni.getInterfaceAddresses().isEmpty() &&
> !ni.getSubInterfaces().hasMoreElements())
>            return;    // has no addresses or child interfaces
>        System.out.print(indent);
>        System.out.print("\"");
>        System.out.print(ni.getDisplayName());
>        System.out.print("\"");
>        if (ni.isLoopback())
>        {
>            System.out.print(" [loopback]");
>        }
>        if (ni.isPointToPoint())
>        {
>            System.out.print(" [ptp]");
>        }
>        byte[] mac = ni.getHardwareAddress();
>        if (mac != null && mac.length > 0)
>        {
>            System.out.print(", hardware=");
>            for (byte b: mac)
>            {
>                System.out.print(':');
>                System.out.print(Integer.toHexString(b&255));
>            }
>        }
>        System.out.println();
>        indent = indent+"  ";
>        for (InterfaceAddress addr: ni.getInterfaceAddresses())
>        {
>            System.out.print(indent);
>            System.out.print(addr.getAddress());
>            if (addr.getAddress().isLoopbackAddress())
>                System.out.print(" [loopback]");
>            System.out.print(", broadcast=");
>            System.out.print(addr.getBroadcast());
>            System.out.print(", prefixLength=");
>            System.out.print(addr.getNetworkPrefixLength());
>            //System.out.print(", searchedBroadcast=");
> 
> //System.out.print(BroadcastAddress.instance().getBroadcastAddress(addr.getAddress())); 
> 
>            try
>            {
>                String name = addr.getAddress().getCanonicalHostName();
>                if (name != null)
>                {
>                    System.out.print(", host=");
>                    System.out.print(name);
>                }
>            }
>            catch (Exception e)
>            {
> 
>            }
>            System.out.println();
>        }
>        for (Enumeration<NetworkInterface>
> interfaces=ni.getSubInterfaces(); interfaces.hasMoreElements();)
>        {
>            NetworkInterface child = interfaces.nextElement();
>            if (child.isUp())
>            {
>                reportInterface(child, indent);
>            }
>        }
>    }
> }
> 



More information about the net-dev mailing list