View Javadoc
1   package com.ericsson.research.trap.utils;
2   
3   /*
4    * ##_BEGIN_LICENSE_##
5    * Transport Abstraction Package (trap)
6    * ----------
7    * Copyright (C) 2014 Ericsson AB
8    * ----------
9    * Redistribution and use in source and binary forms, with or without modification,
10   * are permitted provided that the following conditions are met:
11   * 
12   * 1. Redistributions of source code must retain the above copyright notice, this
13   *    list of conditions and the following disclaimer.
14   * 
15   * 2. Redistributions in binary form must reproduce the above copyright notice,
16   *    this list of conditions and the following disclaimer in the documentation
17   *    and/or other materials provided with the distribution.
18   * 
19   * 3. Neither the name of the Ericsson AB nor the names of its contributors
20   *    may be used to endorse or promote products derived from this software without
21   *    specific prior written permission.
22   * 
23   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
24   * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
25   * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26   * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
27   * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
28   * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29   * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
30   * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
31   * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
32   * OF THE POSSIBILITY OF SUCH DAMAGE.
33   * ##_END_LICENSE_##
34   */
35  
36  import java.net.Inet6Address;
37  import java.net.InetAddress;
38  import java.net.NetworkInterface;
39  import java.net.SocketException;
40  import java.util.Collections;
41  import java.util.Comparator;
42  import java.util.Enumeration;
43  import java.util.HashMap;
44  import java.util.HashSet;
45  import java.util.LinkedList;
46  
47  /**
48   * @hide
49   * @author Vladimir Katardjiev
50   * @since 1.0
51   */
52  class IPUtilImpl extends IPUtil
53  {
54  
55  	int score(String ifaceName)
56  	{
57  		if (ifaceName.startsWith("en"))
58  			return 1;
59  		if (ifaceName.startsWith("eth"))
60  			return 2;
61  		if (ifaceName.startsWith("ethernet"))
62  			return 3;
63  		if (ifaceName.startsWith("wireless"))
64  			return 4;
65  		if (ifaceName.startsWith("wi"))
66  			return 5;
67  		return 6;
68  	}
69  
70  	InetAddress[] performGetPublicAddresses()
71  	{
72  		try
73  		{
74  
75  			// Priority order:
76  			// en, eth, ethernet, wireless
77  
78  			Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
79  			HashMap<String, HashSet<InetAddress>> ifaceAddresses = new HashMap<String, HashSet<InetAddress>>();
80  			LinkedList<String> ifaceNames = new LinkedList<String>();
81  
82  			while (networkInterfaces.hasMoreElements())
83  			{
84  				NetworkInterface iface = networkInterfaces.nextElement();
85  				HashSet<InetAddress> foundAddresses = new HashSet<InetAddress>();
86  				Enumeration<InetAddress> inetAddresses = iface.getInetAddresses();
87  
88  				while (inetAddresses.hasMoreElements())
89  				{
90  					InetAddress address = inetAddresses.nextElement();
91  
92  					if (!IPUtil.isLocal(address))
93  						foundAddresses.add(address);
94  				}
95  
96  				ifaceAddresses.put(iface.getName(), foundAddresses);
97  				ifaceNames.add(iface.getName());
98  			}
99  
100 			Collections.sort(ifaceNames, new Comparator<String>() {
101 
102 				public int compare(String o1, String o2)
103 				{
104 					return IPUtilImpl.this.score(o1) - IPUtilImpl.this.score(o2);
105 				}
106 			});
107 
108 			LinkedList<InetAddress> foundAddresses = new LinkedList<InetAddress>();
109 
110 			for (String name : ifaceNames)
111 			{
112 				foundAddresses.addAll(ifaceAddresses.get(name));
113 			}
114 
115 			return foundAddresses.toArray(new InetAddress[] {});
116 		}
117 		catch (SocketException e)
118 		{
119 			return new InetAddress[] {};
120 		}
121 	}
122 
123 	String performGetAddressForURI(InetAddress address)
124 	{
125 
126 		String host = address.getHostAddress();
127 
128 		byte[] bs = address.getAddress();
129 		boolean isv6 = bs.length > 4;
130 
131 		if (isv6)
132 			host = "[" + host + "]";
133 
134 		return host;
135 	}
136 
137 	boolean performIsLocal(InetAddress address)
138 	{
139 
140 		boolean disqualified = false;
141 		// IPv6 tests
142 		if (address instanceof Inet6Address)
143 		{
144 			byte[] addr = address.getAddress();
145 
146 			// fe80::/10 — Addresses in the link-local prefix are only valid and unique on a single link
147 			if ((addr[0] == (byte) 0xfe) && ((addr[1] & 0xc) != 0))
148 			{
149 				disqualified = true;
150 			}
151 
152 			// fc00::/7 — Unique local addresses (ULAs) are intended for local communication.
153 			if ((addr[0] == (byte) 0xfc) || (addr[0] == (byte) 0xfd))
154 			{
155 				disqualified = true;
156 			}
157 		}
158 
159 		return disqualified || address.isMulticastAddress() || address.isAnyLocalAddress() || address.isLoopbackAddress() || address.isLinkLocalAddress() || address.isSiteLocalAddress();
160 	} 
161 
162 }