| | | |
Offset 2, 46 lines modified | Offset 2, 43 lines modified |
2 | package·com.android.networkstack.tethering; | 2 | package·com.android.networkstack.tethering; |
| |
3 | import·java.io.PrintWriter; | 3 | import·java.io.PrintWriter; |
4 | import·com.android.networkstack.tethering.util.StateMachine; | 4 | import·com.android.networkstack.tethering.util.StateMachine; |
5 | import·android.net.LinkProperties; | 5 | import·android.net.LinkProperties; |
6 | import·java.net.UnknownHostException; | 6 | import·java.net.UnknownHostException; |
7 | import·java.net.InetAddress; | 7 | import·java.net.InetAddress; |
8 | import·android.net.Network; | |
9 | import·java.util.Arrays; | |
10 | import·java.util.Collection; | |
11 | import·java.util.HashSet; | |
12 | import·java.util.Random; | 8 | import·java.util.Random; |
13 | import·com.android.networkstack.tethering.util.IndentingPrintWriter; | 9 | import·com.android.networkstack.tethering.util.IndentingPrintWriter; |
| 10 | import·java.util.Collection; |
| 11 | import·java.util.Arrays; |
| 12 | import·android.net.Network; |
14 | import·java.util.Iterator; | 13 | import·java.util.Iterator; |
15 | import·java.util.ArrayList; | 14 | import·java.util.ArrayList; |
16 | import·java.util.List; | 15 | import·java.util.List; |
17 | import·android.net.LinkAddress; | 16 | import·android.net.LinkAddress; |
18 | import·android.net.util.PrefixUtils; | 17 | import·android.net.util.PrefixUtils; |
19 | import·android.net.ip.IpServer; | 18 | import·android.net.ip.IpServer; |
20 | import·android.content.Context; | 19 | import·android.content.Context; |
21 | import·android.util.ArrayMap; | 20 | import·android.util.ArrayMap; |
22 | import·android.net.IpPrefix; | 21 | import·android.net.IpPrefix; |
23 | import·android.util.ArraySet; | 22 | import·android.util.ArraySet; |
24 | import·android.net.ConnectivityManager; | 23 | import·android.net.ConnectivityManager; |
| |
25 | public·class·PrivateAddressCoordinator | 24 | public·class·PrivateAddressCoordinator |
26 | { | 25 | { |
27 | ····private·final·TetheringConfiguration·mConfig; | |
28 | ····private·final·ConnectivityManager·mConnectivityMgr; | 26 | ····private·final·ConnectivityManager·mConnectivityMgr; |
29 | ····private·final·ArraySet·mDownstreams; | 27 | ····private·final·ArraySet·mDownstreams; |
30 | ····private·final·IpPrefix·mTetheringPrefix; | 28 | ····private·final·IpPrefix·mTetheringPrefix; |
31 | ····private·final·ArrayMap·mUpstreamPrefixMap; | 29 | ····private·final·ArrayMap·mUpstreamPrefixMap; |
32 | ···· | 30 | ···· |
33 | ····public·PrivateAddressCoordinator(final·Context·context,·final·TetheringConfiguration·mConfig)·{ | 31 | ····public·PrivateAddressCoordinator(final·Context·context)·{ |
34 | ········this.mDownstreams·=·new·ArraySet(); | 32 | ········this.mDownstreams·=·new·ArraySet(); |
35 | ········this.mUpstreamPrefixMap·=·new·ArrayMap(); | 33 | ········this.mUpstreamPrefixMap·=·new·ArrayMap(); |
36 | ········this.mTetheringPrefix·=·new·IpPrefix("192.168.0.0/16"); | 34 | ········this.mTetheringPrefix·=·new·IpPrefix("192.168.0.0/16"); |
37 | ········this.mConnectivityMgr·=·(ConnectivityManager)context.getSystemService("connectivity"); | 35 | ········this.mConnectivityMgr·=·(ConnectivityManager)context.getSystemService("connectivity"); |
38 | ········this.mConfig·=·mConfig; | |
39 | ····} | 36 | ····} |
40 | ···· | 37 | ···· |
41 | ····private·IpPrefix·getDownstreamPrefix(final·IpServer·ipServer)·{ | 38 | ····private·IpPrefix·getDownstreamPrefix(final·IpServer·ipServer)·{ |
42 | ········final·LinkAddress·address·=·ipServer.getAddress(); | 39 | ········final·LinkAddress·address·=·ipServer.getAddress(); |
43 | ········if·(address·==·null)·{ | 40 | ········if·(address·==·null)·{ |
44 | ············return·null; | 41 | ············return·null; |
45 | ········} | 42 | ········} |
Offset 111, 19 lines modified | Offset 108, 32 lines modified |
111 | ············if·(ipPrefix.equals((Object)this.getDownstreamPrefix(iterator.next())))·{ | 108 | ············if·(ipPrefix.equals((Object)this.getDownstreamPrefix(iterator.next())))·{ |
112 | ················return·true; | 109 | ················return·true; |
113 | ············} | 110 | ············} |
114 | ········} | 111 | ········} |
115 | ········return·false; | 112 | ········return·false; |
116 | ····} | 113 | ····} |
117 | ···· | 114 | ···· |
118 | ····private·boolean·isReservedSubnet(final·int·n)·{ | 115 | ····private·void·maybeRemoveDeprectedUpstreams()·{ |
119 | ········return·n·==·44·||·n·==·49; | 116 | ········if·(this.mDownstreams.isEmpty())·{ |
| 117 | ············if·(!this.mUpstreamPrefixMap.isEmpty())·{ |
| 118 | ················final·ArrayList<Network>·list·=·new·ArrayList<Network>(); |
| 119 | ················final·List<Network>·list2·=·Arrays.asList(this.mConnectivityMgr.getAllNetworks()); |
| 120 | ················for·(int·i·=·0;·i·<·this.mUpstreamPrefixMap.size();·++i)·{ |
| 121 | ····················final·Network·network·=·(Network)this.mUpstreamPrefixMap.keyAt(i); |
| 122 | ····················if·(!list2.contains(network))·{ |
| 123 | ························list.add(network); |
| 124 | ····················} |
| 125 | ················} |
| 126 | ················this.mUpstreamPrefixMap.removeAll((Collection)list); |
| 127 | ············} |
| 128 | ········} |
120 | ····} | 129 | ····} |
121 | ···· | 130 | ···· |
122 | ····void·dump(final·IndentingPrintWriter·indentingPrintWriter)·{ | 131 | ····void·dump(final·IndentingPrintWriter·indentingPrintWriter)·{ |
| 132 | ········indentingPrintWriter.decreaseIndent(); |
123 | ········((PrintWriter)indentingPrintWriter).println("mUpstreamPrefixMap:"); | 133 | ········((PrintWriter)indentingPrintWriter).println("mUpstreamPrefixMap:"); |
124 | ········indentingPrintWriter.increaseIndent(); | 134 | ········indentingPrintWriter.increaseIndent(); |
125 | ········int·n·=·0; | 135 | ········int·n·=·0; |
126 | ········String·s; | 136 | ········String·s; |
127 | ········while·(true)·{ | 137 | ········while·(true)·{ |
128 | ············final·int·size·=·this.mUpstreamPrefixMap.size(); | 138 | ············final·int·size·=·this.mUpstreamPrefixMap.size(); |
129 | ············s·=·"·-·"; | 139 | ············s·=·"·-·"; |
Offset 150, 52 lines modified | Offset 160, 40 lines modified |
150 | ········indentingPrintWriter.decreaseIndent(); | 160 | ········indentingPrintWriter.decreaseIndent(); |
151 | ····} | 161 | ····} |
152 | ···· | 162 | ···· |
153 | ····public·int·getRandomSubAddr()·{ | 163 | ····public·int·getRandomSubAddr()·{ |
154 | ········return·new·Random().nextInt()·&·(char)(-1); | 164 | ········return·new·Random().nextInt()·&·(char)(-1); |
155 | ····} | 165 | ····} |
156 | ···· | 166 | ···· |
157 | ····public·void·maybeRemoveDeprecatedUpstreams()·{ | |
158 | ········if·(this.mUpstreamPrefixMap.isEmpty())·{ | |
159 | ············return; | |
160 | ········} | |
161 | ········final·HashSet·set·=·new·HashSet(this.mUpstreamPrefixMap.keySet()); | |
162 | ········set.removeAll(Arrays.asList(this.mConnectivityMgr.getAllNetworks())); | |
163 | ········this.mUpstreamPrefixMap.removeAll((Collection)set); | |
164 | ····} | |
165 | ···· | |
166 | ····public·void·releaseDownstream(final·IpServer·ipServer)·{ | 167 | ····public·void·releaseDownstream(final·IpServer·ipServer)·{ |
167 | ········this.mDownstreams.remove((Object)ipServer); | 168 | ········this.mDownstreams.remove((Object)ipServer); |
168 | ····} | 169 | ····} |
169 | ···· | 170 | ···· |
170 | ····public·void·removeUpstreamPrefix(final·Network·network)·{ | 171 | ····public·void·removeUpstreamPrefix(final·Network·network)·{ |
171 | ········this.mUpstreamPrefixMap.remove((Object)network); | 172 | ········this.mUpstreamPrefixMap.remove((Object)network); |
172 | ····} | 173 | ····} |
173 | ···· | 174 | ···· |
174 | ····public·LinkAddress·requestDownstreamAddress(final·IpServer·ipServer)·{ | 175 | ····public·LinkAddress·requestDownstreamAddress(final·IpServer·ipServer)·{ |
175 | ········final·boolean·shouldEnableWifiP2pDedicatedIp·=·this.mConfig.shouldEnableWifiP2pDedicatedIp(); | 176 | ········this.maybeRemoveDeprectedUpstreams(); |
176 | ········final·int·n·=·3; | |
177 | ········if·(shouldEnableWifiP2pDedicatedIp·&&·ipServer.interfaceType()·==·n)·{ | |
178 | ············return·new·LinkAddress("192.168.49.1/24"); | |
179 | ········} | |
180 | ········final·byte[]·rawAddress·=·this.mTetheringPrefix.getRawAddress(); | 177 | ········final·byte[]·rawAddress·=·this.mTetheringPrefix.getRawAddress(); |
181 | ········final·int·randomSubAddr·=·this.getRandomSubAddr(); | 178 | ········final·int·randomSubAddr·=·this.getRandomSubAddr(); |
182 | ········final·int·n2·=·randomSubAddr·>>·8·&·0xFF; | 179 | ········final·int·n·=·randomSubAddr·>>·8·&·0xFF; |
| 180 | ········final·int·n2·=·3; |
183 | ········final·byte[]·array2; | 181 | ········final·byte[]·array2; |
184 | ········final·byte[]·array·=·array2·=·new·byte[n]; | 182 | ········final·byte[]·array·=·array2·=·new·byte[n2]; |
185 | ········array2[0]·=·0; | 183 | ········array2[0]·=·0; |
186 | ········array2[1]·=·1; | 184 | ········array2[1]·=·1; |
187 | ········array2[2]·=·-1; | 185 | ········array2[2]·=·-1; |
188 | ········rawAddress[n]·=·this.getSanitizedAddressSuffix(randomSubAddr,·array); | 186 | ········rawAddress[n2]·=·this.getSanitizedAddressSuffix(randomSubAddr,·array); |
189 | ········int·i·=·0; | 187 | ········int·i·=·0; |
190 | ········while·(i·<·256)·{ | 188 | ········while·(i·<·256)·{ |
191 | ············final·int·n3·=·n2·+·i·&·0xFF; | 189 | ············final·int·n3·=·n·+·i·&·0xFF; |
192 | ············Label_0209:·{ | 190 | ············Label_0166:·{ |
193 | ················if·(this.isReservedSubnet(n3))·{ | 191 | ················if·(n3·==·44)·{ |
194 | ····················break·Label_0209; | 192 | ····················break·Label_0166; |
195 | ················} | 193 | ················} |
196 | ················rawAddress[2]·=·(byte)n3; | 194 | ················rawAddress[2]·=·(byte)n3; |
197 | ················try·{ | 195 | ················try·{ |
198 | ····················final·InetAddress·byAddress·=·InetAddress.getByAddress(rawAddress); | 196 | ····················final·InetAddress·byAddress·=·InetAddress.getByAddress(rawAddress); |
199 | ····················final·int·n4·=·24; | 197 | ····················final·int·n4·=·24; |
200 | ····················final·IpPrefix·ipPrefix·=·new·IpPrefix(byAddress,·n4); | 198 | ····················final·IpPrefix·ipPrefix·=·new·IpPrefix(byAddress,·n4); |
201 | ····················if·(!this.isDownstreamPrefixInUse(ipPrefix))·{ | 199 | ····················if·(!this.isDownstreamPrefixInUse(ipPrefix))·{ |