@@ -1792,6 +1792,10 @@ private boolean isLiveNetworkAgent(NetworkAgentInfo nai, String msg) {
17921792 return false ;
17931793 }
17941794
1795+ private boolean isRequest (NetworkRequest request ) {
1796+ return mNetworkRequests .get (request ).isRequest ;
1797+ }
1798+
17951799 // must be stateless - things change under us.
17961800 private class NetworkStateTrackerHandler extends Handler {
17971801 public NetworkStateTrackerHandler (Looper looper ) {
@@ -1908,8 +1912,13 @@ public void handleMessage(Message msg) {
19081912 if (valid ) {
19091913 if (DBG ) log ("Validated " + nai .name ());
19101914 final boolean previouslyValidated = nai .validated ;
1915+ final int previousScore = nai .getCurrentScore ();
19111916 nai .validated = true ;
19121917 rematchNetworkAndRequests (nai , !previouslyValidated );
1918+ // If score has changed, rebroadcast to NetworkFactories. b/17726566
1919+ if (nai .getCurrentScore () != previousScore ) {
1920+ sendUpdatedScoreToFactories (nai );
1921+ }
19131922 }
19141923 updateInetCondition (nai , valid );
19151924 // Let the NetworkAgent know the state of its network
@@ -2203,7 +2212,7 @@ private void handleReleaseNetworkRequest(NetworkRequest request, int callingUid)
22032212 boolean keep = nai .isVPN ();
22042213 for (int i = 0 ; i < nai .networkRequests .size () && !keep ; i ++) {
22052214 NetworkRequest r = nai .networkRequests .valueAt (i );
2206- if (mNetworkRequests . get (r ). isRequest ) keep = true ;
2215+ if (isRequest (r )) keep = true ;
22072216 }
22082217 if (!keep ) {
22092218 if (DBG ) log ("no live requests for " + nai .name () + "; disconnecting" );
@@ -2487,6 +2496,10 @@ public void reportBadNetwork(Network network) {
24872496 if (nai == null ) return ;
24882497 if (DBG ) log ("reportBadNetwork(" + nai .name () + ") by " + uid );
24892498 synchronized (nai ) {
2499+ // Validating an uncreated network could result in a call to rematchNetworkAndRequests()
2500+ // which isn't meant to work on uncreated networks.
2501+ if (!nai .created ) return ;
2502+
24902503 if (isNetworkBlocked (nai , uid )) return ;
24912504
24922505 nai .networkMonitor .sendMessage (NetworkMonitor .CMD_FORCE_REEVALUATION , uid );
@@ -3692,6 +3705,15 @@ private void updateCapabilities(NetworkAgentInfo networkAgent,
36923705 }
36933706 }
36943707
3708+ private void sendUpdatedScoreToFactories (NetworkAgentInfo nai ) {
3709+ for (int i = 0 ; i < nai .networkRequests .size (); i ++) {
3710+ NetworkRequest nr = nai .networkRequests .valueAt (i );
3711+ // Don't send listening requests to factories. b/17393458
3712+ if (!isRequest (nr )) continue ;
3713+ sendUpdatedScoreToFactories (nr , nai .getCurrentScore ());
3714+ }
3715+ }
3716+
36953717 private void sendUpdatedScoreToFactories (NetworkRequest networkRequest , int score ) {
36963718 if (VDBG ) log ("sending new Min Network Score(" + score + "): " + networkRequest .toString ());
36973719 for (NetworkFactoryInfo nfi : mNetworkFactoryInfos .values ()) {
@@ -3746,22 +3768,24 @@ private void callCallbackForRequest(NetworkRequestInfo nri,
37463768 }
37473769 }
37483770
3771+ private void teardownUnneededNetwork (NetworkAgentInfo nai ) {
3772+ for (int i = 0 ; i < nai .networkRequests .size (); i ++) {
3773+ NetworkRequest nr = nai .networkRequests .valueAt (i );
3774+ // Ignore listening requests.
3775+ if (!isRequest (nr )) continue ;
3776+ loge ("Dead network still had at least " + nr );
3777+ break ;
3778+ }
3779+ nai .asyncChannel .disconnect ();
3780+ }
3781+
37493782 private void handleLingerComplete (NetworkAgentInfo oldNetwork ) {
37503783 if (oldNetwork == null ) {
37513784 loge ("Unknown NetworkAgentInfo in handleLingerComplete" );
37523785 return ;
37533786 }
3754- if (DBG ) {
3755- log ("handleLingerComplete for " + oldNetwork .name ());
3756- for (int i = 0 ; i < oldNetwork .networkRequests .size (); i ++) {
3757- NetworkRequest nr = oldNetwork .networkRequests .valueAt (i );
3758- // Ignore listening requests.
3759- if (mNetworkRequests .get (nr ).isRequest == false ) continue ;
3760- loge ("Dead network still had at least " + nr );
3761- break ;
3762- }
3763- }
3764- oldNetwork .asyncChannel .disconnect ();
3787+ if (DBG ) log ("handleLingerComplete for " + oldNetwork .name ());
3788+ teardownUnneededNetwork (oldNetwork );
37653789 }
37663790
37673791 private void makeDefault (NetworkAgentInfo newNetwork ) {
@@ -3898,7 +3922,7 @@ private void rematchNetworkAndRequests(NetworkAgentInfo newNetwork, boolean nasc
38983922 for (int i = 0 ; i < nai .networkRequests .size () && teardown ; i ++) {
38993923 NetworkRequest nr = nai .networkRequests .valueAt (i );
39003924 try {
3901- if (mNetworkRequests . get (nr ). isRequest ) {
3925+ if (isRequest (nr )) {
39023926 teardown = false ;
39033927 }
39043928 } catch (Exception e ) {
@@ -3961,14 +3985,8 @@ private void rematchNetworkAndRequests(NetworkAgentInfo newNetwork, boolean nasc
39613985 // the lingering process so communication on that network is given time to wrap up.
39623986 // TODO: Could teardown unvalidated networks when their NetworkCapabilities
39633987 // satisfy no NetworkRequests.
3964- if (DBG && newNetwork .networkRequests .size () != 0 ) {
3965- loge ("tearing down network with live requests:" );
3966- for (int i =0 ; i < newNetwork .networkRequests .size (); i ++) {
3967- loge (" " + newNetwork .networkRequests .valueAt (i ));
3968- }
3969- }
39703988 if (DBG ) log ("Validated network turns out to be unwanted. Tear it down." );
3971- newNetwork . asyncChannel . disconnect ( );
3989+ teardownUnneededNetwork ( newNetwork );
39723990 }
39733991 }
39743992
@@ -4097,12 +4115,7 @@ private void updateNetworkScore(NetworkAgentInfo nai, int score) {
40974115
40984116 if (nai .created ) rematchAllNetworksAndRequests (nai , oldScore );
40994117
4100- for (int i = 0 ; i < nai .networkRequests .size (); i ++) {
4101- NetworkRequest nr = nai .networkRequests .valueAt (i );
4102- // Don't send listening requests to factories. b/17393458
4103- if (mNetworkRequests .get (nr ).isRequest == false ) continue ;
4104- sendUpdatedScoreToFactories (nr , score );
4105- }
4118+ sendUpdatedScoreToFactories (nai );
41064119 }
41074120
41084121 // notify only this one new request of the current state
0 commit comments