@@ -1785,6 +1785,10 @@ private boolean isLiveNetworkAgent(NetworkAgentInfo nai, String msg) {
17851785 return false ;
17861786 }
17871787
1788+ private boolean isRequest (NetworkRequest request ) {
1789+ return mNetworkRequests .get (request ).isRequest ;
1790+ }
1791+
17881792 // must be stateless - things change under us.
17891793 private class NetworkStateTrackerHandler extends Handler {
17901794 public NetworkStateTrackerHandler (Looper looper ) {
@@ -1901,8 +1905,13 @@ public void handleMessage(Message msg) {
19011905 if (valid ) {
19021906 if (DBG ) log ("Validated " + nai .name ());
19031907 final boolean previouslyValidated = nai .validated ;
1908+ final int previousScore = nai .getCurrentScore ();
19041909 nai .validated = true ;
19051910 rematchNetworkAndRequests (nai , !previouslyValidated );
1911+ // If score has changed, rebroadcast to NetworkFactories. b/17726566
1912+ if (nai .getCurrentScore () != previousScore ) {
1913+ sendUpdatedScoreToFactories (nai );
1914+ }
19061915 }
19071916 updateInetCondition (nai , valid );
19081917 // Let the NetworkAgent know the state of its network
@@ -2196,7 +2205,7 @@ private void handleReleaseNetworkRequest(NetworkRequest request, int callingUid)
21962205 boolean keep = nai .isVPN ();
21972206 for (int i = 0 ; i < nai .networkRequests .size () && !keep ; i ++) {
21982207 NetworkRequest r = nai .networkRequests .valueAt (i );
2199- if (mNetworkRequests . get (r ). isRequest ) keep = true ;
2208+ if (isRequest (r )) keep = true ;
22002209 }
22012210 if (!keep ) {
22022211 if (DBG ) log ("no live requests for " + nai .name () + "; disconnecting" );
@@ -2480,6 +2489,10 @@ public void reportBadNetwork(Network network) {
24802489 if (nai == null ) return ;
24812490 if (DBG ) log ("reportBadNetwork(" + nai .name () + ") by " + uid );
24822491 synchronized (nai ) {
2492+ // Validating an uncreated network could result in a call to rematchNetworkAndRequests()
2493+ // which isn't meant to work on uncreated networks.
2494+ if (!nai .created ) return ;
2495+
24832496 if (isNetworkBlocked (nai , uid )) return ;
24842497
24852498 nai .networkMonitor .sendMessage (NetworkMonitor .CMD_FORCE_REEVALUATION , uid );
@@ -3685,6 +3698,15 @@ private void updateCapabilities(NetworkAgentInfo networkAgent,
36853698 }
36863699 }
36873700
3701+ private void sendUpdatedScoreToFactories (NetworkAgentInfo nai ) {
3702+ for (int i = 0 ; i < nai .networkRequests .size (); i ++) {
3703+ NetworkRequest nr = nai .networkRequests .valueAt (i );
3704+ // Don't send listening requests to factories. b/17393458
3705+ if (!isRequest (nr )) continue ;
3706+ sendUpdatedScoreToFactories (nr , nai .getCurrentScore ());
3707+ }
3708+ }
3709+
36883710 private void sendUpdatedScoreToFactories (NetworkRequest networkRequest , int score ) {
36893711 if (VDBG ) log ("sending new Min Network Score(" + score + "): " + networkRequest .toString ());
36903712 for (NetworkFactoryInfo nfi : mNetworkFactoryInfos .values ()) {
@@ -3739,22 +3761,24 @@ private void callCallbackForRequest(NetworkRequestInfo nri,
37393761 }
37403762 }
37413763
3764+ private void teardownUnneededNetwork (NetworkAgentInfo nai ) {
3765+ for (int i = 0 ; i < nai .networkRequests .size (); i ++) {
3766+ NetworkRequest nr = nai .networkRequests .valueAt (i );
3767+ // Ignore listening requests.
3768+ if (!isRequest (nr )) continue ;
3769+ loge ("Dead network still had at least " + nr );
3770+ break ;
3771+ }
3772+ nai .asyncChannel .disconnect ();
3773+ }
3774+
37423775 private void handleLingerComplete (NetworkAgentInfo oldNetwork ) {
37433776 if (oldNetwork == null ) {
37443777 loge ("Unknown NetworkAgentInfo in handleLingerComplete" );
37453778 return ;
37463779 }
3747- if (DBG ) {
3748- log ("handleLingerComplete for " + oldNetwork .name ());
3749- for (int i = 0 ; i < oldNetwork .networkRequests .size (); i ++) {
3750- NetworkRequest nr = oldNetwork .networkRequests .valueAt (i );
3751- // Ignore listening requests.
3752- if (mNetworkRequests .get (nr ).isRequest == false ) continue ;
3753- loge ("Dead network still had at least " + nr );
3754- break ;
3755- }
3756- }
3757- oldNetwork .asyncChannel .disconnect ();
3780+ if (DBG ) log ("handleLingerComplete for " + oldNetwork .name ());
3781+ teardownUnneededNetwork (oldNetwork );
37583782 }
37593783
37603784 private void makeDefault (NetworkAgentInfo newNetwork ) {
@@ -3891,7 +3915,7 @@ private void rematchNetworkAndRequests(NetworkAgentInfo newNetwork, boolean nasc
38913915 for (int i = 0 ; i < nai .networkRequests .size () && teardown ; i ++) {
38923916 NetworkRequest nr = nai .networkRequests .valueAt (i );
38933917 try {
3894- if (mNetworkRequests . get (nr ). isRequest ) {
3918+ if (isRequest (nr )) {
38953919 teardown = false ;
38963920 }
38973921 } catch (Exception e ) {
@@ -3954,14 +3978,8 @@ private void rematchNetworkAndRequests(NetworkAgentInfo newNetwork, boolean nasc
39543978 // the lingering process so communication on that network is given time to wrap up.
39553979 // TODO: Could teardown unvalidated networks when their NetworkCapabilities
39563980 // satisfy no NetworkRequests.
3957- if (DBG && newNetwork .networkRequests .size () != 0 ) {
3958- loge ("tearing down network with live requests:" );
3959- for (int i =0 ; i < newNetwork .networkRequests .size (); i ++) {
3960- loge (" " + newNetwork .networkRequests .valueAt (i ));
3961- }
3962- }
39633981 if (DBG ) log ("Validated network turns out to be unwanted. Tear it down." );
3964- newNetwork . asyncChannel . disconnect ( );
3982+ teardownUnneededNetwork ( newNetwork );
39653983 }
39663984 }
39673985
@@ -4090,12 +4108,7 @@ private void updateNetworkScore(NetworkAgentInfo nai, int score) {
40904108
40914109 if (nai .created ) rematchAllNetworksAndRequests (nai , oldScore );
40924110
4093- for (int i = 0 ; i < nai .networkRequests .size (); i ++) {
4094- NetworkRequest nr = nai .networkRequests .valueAt (i );
4095- // Don't send listening requests to factories. b/17393458
4096- if (mNetworkRequests .get (nr ).isRequest == false ) continue ;
4097- sendUpdatedScoreToFactories (nr , score );
4098- }
4111+ sendUpdatedScoreToFactories (nai );
40994112 }
41004113
41014114 // notify only this one new request of the current state
0 commit comments