// Copyright 2018 The gVisor Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package tcp

import (
	"time"
)

// +stateify savable
type unixTime struct {
	second int64
	nano   int64
}

// saveLastSendTime is invoked by stateify.
func (s *sender) saveLastSendTime() unixTime {
	return unixTime{s.lastSendTime.Unix(), s.lastSendTime.UnixNano()}
}

// loadLastSendTime is invoked by stateify.
func (s *sender) loadLastSendTime(unix unixTime) {
	s.lastSendTime = time.Unix(unix.second, unix.nano)
}

// saveRttMeasureTime is invoked by stateify.
func (s *sender) saveRttMeasureTime() unixTime {
	return unixTime{s.rttMeasureTime.Unix(), s.rttMeasureTime.UnixNano()}
}

// loadRttMeasureTime is invoked by stateify.
func (s *sender) loadRttMeasureTime(unix unixTime) {
	s.rttMeasureTime = time.Unix(unix.second, unix.nano)
}

// afterLoad is invoked by stateify.
func (s *sender) afterLoad() {
	s.resendTimer.init(&s.resendWaker)
	s.reorderTimer.init(&s.reorderWaker)
	s.probeTimer.init(&s.probeWaker)
}

// saveFirstRetransmittedSegXmitTime is invoked by stateify.
func (s *sender) saveFirstRetransmittedSegXmitTime() unixTime {
	return unixTime{s.firstRetransmittedSegXmitTime.Unix(), s.firstRetransmittedSegXmitTime.UnixNano()}
}

// loadFirstRetransmittedSegXmitTime is invoked by stateify.
func (s *sender) loadFirstRetransmittedSegXmitTime(unix unixTime) {
	s.firstRetransmittedSegXmitTime = time.Unix(unix.second, unix.nano)
}
