1 package com.ericsson.research.trap.utils;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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
49
50
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
76
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
142 if (address instanceof Inet6Address)
143 {
144 byte[] addr = address.getAddress();
145
146
147 if ((addr[0] == (byte) 0xfe) && ((addr[1] & 0xc) != 0))
148 {
149 disqualified = true;
150 }
151
152
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 }