Chromium Code Reviews| Index: net/quic/quic_stream_factory.cc |
| diff --git a/net/quic/quic_stream_factory.cc b/net/quic/quic_stream_factory.cc |
| index d3bf9de857fb7449ab46be24987c93778e4938a2..10f67dab241d17887134665b3542a445a3ac3362 100644 |
| --- a/net/quic/quic_stream_factory.cc |
| +++ b/net/quic/quic_stream_factory.cc |
| @@ -1112,7 +1112,43 @@ void QuicStreamFactory::ClearCachedStatesInCryptoConfig() { |
| } |
| void QuicStreamFactory::OnIPAddressChanged() { |
| - CloseAllSessions(ERR_NETWORK_CHANGED); |
| + // CloseAllIdleSessions(ERR_NETWORK_CHANGED); |
| + for (QuicStreamFactory::SessionIdMap::iterator it = all_sessions_.begin(); |
| + it != all_sessions_.end(); ++it) { |
|
Ryan Hamilton
2015/09/08 04:09:38
Can you do a C++11 range loop here?
Jana
2015/11/17 01:50:09
Done.
|
| + QuicChromiumClientSession* session = it->first; |
| + QuicServerId server_id = it->second; |
| + if (session->GetNumOpenStreams() == 0) { |
| + // If idle session, close session |
| + active_sessions_.erase(server_id); |
| + session->CloseSessionOnError(ERR_NETWORK_CHANGED, QUIC_INTERNAL_ERROR); |
|
Ryan Hamilton
2015/09/08 04:09:38
not sure about INTERNAL_ERROR
nit: add a continue
Jana
2015/11/17 01:50:09
Done.
|
| + } else { |
| + // If session is active, (i) create a new socket (which should be |
|
Ryan Hamilton
2015/09/08 04:09:38
nit: s/is active/has active streams/
Jana
2015/11/17 01:50:09
Done.
|
| + // bound to the new interface), (ii) add a new PacketReader to the |
| + // session that reads from the new socket, (iii) replace the |
| + // connection's PacketWriter with a new PacketWriter that uses the |
| + // new socket, and (iv) make the session go away. |
| + scoped_ptr<DatagramClientSocket> socket( |
| + client_socket_factory_->CreateDatagramClientSocket( |
| + DatagramSocket::DEFAULT_BIND, RandIntCallback(), |
| + // Fix net_log.source() |
| + session->net_log().net_log(), session->net_log().source())); |
| + if (!session->AddPacketReader(new QuicPacketReader(socket.get(), session, |
| + session->net_log()))) { |
| + CloseAllSessions(ERR_NETWORK_CHANGED); |
| + set_require_confirmation(true); |
|
Ryan Hamilton
2015/09/08 04:09:38
Is this required?
Jana
2015/11/17 01:50:08
We've not verified this new network, and while it
|
| + continue; |
| + } |
| + session->StartReading(); |
| + |
| + DefaultPacketWriterFactory packet_writer_factory(socket.get()); |
| + QuicConnection* connection = session->connection(); |
| + connection->SetQuicPacketWriter(packet_writer_factory.Create(connection), |
| + /*owns_writer=*/true); |
| + |
| + session->AddSocket(socket.Pass()); |
|
Ryan Hamilton
2015/09/08 04:09:38
Yeah, probably a single method which takes Socket,
Jana
2015/11/17 01:50:09
Done. PTAL.
|
| + OnSessionGoingAway(session); |
| + } |
| + } |
| set_require_confirmation(true); |
|
Ryan Hamilton
2015/09/08 04:09:38
Might as well do this before the for loop since it
Jana
2015/11/17 01:50:09
Done.
|
| } |
| @@ -1180,7 +1216,6 @@ int QuicStreamFactory::CreateSession(const QuicServerId& server_id, |
| } |
| int rv = socket->Connect(addr); |
| - |
| if (rv != OK) { |
| HistogramCreateSessionFailure(CREATION_ERROR_CONNECTING_SOCKET); |
| return rv; |