-bool QuicConnection::OnPacketSent(WriteResult result) {
- DCHECK_NE(WRITE_STATUS_BLOCKED, result.status);
- if (pending_write_.get() == NULL) {
- LOG(DFATAL) << "OnPacketSent called without a pending write.";
- return false;
- }
-
- QuicPacketSequenceNumber sequence_number = pending_write_->sequence_number;
- TransmissionType transmission_type = pending_write_->transmission_type;
- HasRetransmittableData retransmittable = pending_write_->retransmittable;
- size_t length = pending_write_->length;
- pending_write_.reset();
-
- if (result.status == WRITE_STATUS_ERROR) {
- DVLOG(1) << ENDPOINT << "Write failed with error: " << result.error_code
- << " (" << ErrorToString(result.error_code) << ")";
- // We can't send an error as the socket is presumably borked.
- CloseConnection(QUIC_PACKET_WRITE_ERROR, false);
- return false;
- }
-
- QuicTime now = clock_->Now();
- if (transmission_type == NOT_RETRANSMISSION) {
- time_of_last_sent_new_packet_ = now;
- }
- SetPingAlarm();
- DVLOG(1) << ENDPOINT << "time of last sent packet: "
- << now.ToDebuggingValue();
-
- // TODO(ianswett): Change the sequence number length and other packet creator
- // options by a more explicit API than setting a struct value directly.
- packet_generator_.UpdateSequenceNumberLength(
- received_packet_manager_.least_packet_awaited_by_peer(),
- sent_packet_manager_.GetCongestionWindow());
-
- bool reset_retransmission_alarm =
- sent_packet_manager_.OnPacketSent(sequence_number, now, length,
- transmission_type, retransmittable);
-
- if (reset_retransmission_alarm || !retransmission_alarm_->IsSet()) {
- retransmission_alarm_->Cancel();
- QuicTime retransmission_time = sent_packet_manager_.GetRetransmissionTime();
- if (retransmission_time != QuicTime::Zero()) {
- retransmission_alarm_->Set(retransmission_time);
- }
- }
-
- stats_.bytes_sent += result.bytes_written;
- ++stats_.packets_sent;
-
- if (transmission_type != NOT_RETRANSMISSION) {
- stats_.bytes_retransmitted += result.bytes_written;
- ++stats_.packets_retransmitted;
- }
-
- return true;