106106import java .net .Inet6Address ;
107107import java .net .InetAddress ;
108108import java .net .InetSocketAddress ;
109+ import java .net .InterfaceAddress ;
110+ import java .net .NetworkInterface ;
109111import java .net .Socket ;
110112import java .net .URL ;
111113import java .net .UnknownHostException ;
112114import java .util .ArrayList ;
113115import java .util .Collections ;
114116import java .util .Comparator ;
115117import java .util .Date ;
118+ import java .util .Enumeration ;
116119import java .util .HashMap ;
117120import java .util .List ;
118121import java .util .Map ;
@@ -131,6 +134,7 @@ public class ServiceSinkhole extends VpnService {
131134
132135 private boolean registeredUser = false ;
133136 private boolean registeredIdleState = false ;
137+ private boolean registeredApState = false ;
134138 private boolean registeredConnectivityChanged = false ;
135139 private boolean registeredPackageChanged = false ;
136140
@@ -1490,6 +1494,24 @@ private Builder getBuilder(List<Rule> listAllowed, List<Rule> listRule) {
14901494 listExclude .add (new IPUtil .CIDR ("192.168.44.0" , 24 ));
14911495 // Wi-Fi direct 192.168.49.x
14921496 listExclude .add (new IPUtil .CIDR ("192.168.49.0" , 24 ));
1497+
1498+ try {
1499+ Enumeration <NetworkInterface > nis = NetworkInterface .getNetworkInterfaces ();
1500+ if (nis != null )
1501+ while (nis .hasMoreElements ()) {
1502+ NetworkInterface ni = nis .nextElement ();
1503+ if (ni != null && !ni .isLoopback () && ni .isUp () &&
1504+ ni .getName () != null && ni .getName ().startsWith ("ap_br_wlan" )) {
1505+ List <InterfaceAddress > ias = ni .getInterfaceAddresses ();
1506+ if (ias != null )
1507+ for (InterfaceAddress ia : ias )
1508+ if (ia .getAddress () instanceof Inet4Address )
1509+ listExclude .add (new IPUtil .CIDR (ia .getAddress ().getHostAddress (), 24 ));
1510+ }
1511+ }
1512+ } catch (Throwable ex ) {
1513+ Log .e (TAG , ex .toString ());
1514+ }
14931515 }
14941516
14951517 if (lan ) {
@@ -2445,6 +2467,16 @@ public void onReceive(Context context, Intent intent) {
24452467 }
24462468 };
24472469
2470+ private BroadcastReceiver apStateReceiver = new BroadcastReceiver () {
2471+ @ Override
2472+ @ TargetApi (Build .VERSION_CODES .M )
2473+ public void onReceive (Context context , Intent intent ) {
2474+ Log .i (TAG , "Received " + intent );
2475+ Util .logExtras (intent );
2476+ reload ("AP state changed" , ServiceSinkhole .this , false );
2477+ }
2478+ };
2479+
24482480 private BroadcastReceiver connectivityChangedReceiver = new BroadcastReceiver () {
24492481 @ Override
24502482 public void onReceive (Context context , Intent intent ) {
@@ -2813,6 +2845,11 @@ public void onCreate() {
28132845 registeredIdleState = true ;
28142846 }
28152847
2848+ IntentFilter ifAp = new IntentFilter ();
2849+ ifAp .addAction ("android.net.wifi.WIFI_AP_STATE_CHANGED" );
2850+ ContextCompat .registerReceiver (this , apStateReceiver , ifAp , ContextCompat .RECEIVER_NOT_EXPORTED );
2851+ registeredApState = true ;
2852+
28162853 // Listen for added/removed applications
28172854 IntentFilter ifPackage = new IntentFilter ();
28182855 ifPackage .addAction (Intent .ACTION_PACKAGE_ADDED );
@@ -3172,6 +3209,10 @@ public void onDestroy() {
31723209 unregisterReceiver (idleStateReceiver );
31733210 registeredIdleState = false ;
31743211 }
3212+ if (registeredApState ) {
3213+ unregisterReceiver (apStateReceiver );
3214+ registeredApState = false ;
3215+ }
31753216 if (registeredPackageChanged ) {
31763217 unregisterReceiver (packageChangedReceiver );
31773218 registeredPackageChanged = false ;
0 commit comments