// automatically generated by stateify.

package tcp

import (
	"gvisor.dev/gvisor/pkg/state"
	"gvisor.dev/gvisor/pkg/tcpip/buffer"
)

func (c *cubicState) StateTypeName() string {
	return "pkg/tcpip/transport/tcp.cubicState"
}

func (c *cubicState) StateFields() []string {
	return []string{
		"wLastMax",
		"wMax",
		"t",
		"numCongestionEvents",
		"c",
		"k",
		"beta",
		"wC",
		"wEst",
		"s",
	}
}

func (c *cubicState) beforeSave() {}

// +checklocksignore
func (c *cubicState) StateSave(stateSinkObject state.Sink) {
	c.beforeSave()
	var tValue unixTime = c.saveT()
	stateSinkObject.SaveValue(2, tValue)
	stateSinkObject.Save(0, &c.wLastMax)
	stateSinkObject.Save(1, &c.wMax)
	stateSinkObject.Save(3, &c.numCongestionEvents)
	stateSinkObject.Save(4, &c.c)
	stateSinkObject.Save(5, &c.k)
	stateSinkObject.Save(6, &c.beta)
	stateSinkObject.Save(7, &c.wC)
	stateSinkObject.Save(8, &c.wEst)
	stateSinkObject.Save(9, &c.s)
}

func (c *cubicState) afterLoad() {}

// +checklocksignore
func (c *cubicState) StateLoad(stateSourceObject state.Source) {
	stateSourceObject.Load(0, &c.wLastMax)
	stateSourceObject.Load(1, &c.wMax)
	stateSourceObject.Load(3, &c.numCongestionEvents)
	stateSourceObject.Load(4, &c.c)
	stateSourceObject.Load(5, &c.k)
	stateSourceObject.Load(6, &c.beta)
	stateSourceObject.Load(7, &c.wC)
	stateSourceObject.Load(8, &c.wEst)
	stateSourceObject.Load(9, &c.s)
	stateSourceObject.LoadValue(2, new(unixTime), func(y interface{}) { c.loadT(y.(unixTime)) })
}

func (s *SACKInfo) StateTypeName() string {
	return "pkg/tcpip/transport/tcp.SACKInfo"
}

func (s *SACKInfo) StateFields() []string {
	return []string{
		"Blocks",
		"NumBlocks",
	}
}

func (s *SACKInfo) beforeSave() {}

// +checklocksignore
func (s *SACKInfo) StateSave(stateSinkObject state.Sink) {
	s.beforeSave()
	stateSinkObject.Save(0, &s.Blocks)
	stateSinkObject.Save(1, &s.NumBlocks)
}

func (s *SACKInfo) afterLoad() {}

// +checklocksignore
func (s *SACKInfo) StateLoad(stateSourceObject state.Source) {
	stateSourceObject.Load(0, &s.Blocks)
	stateSourceObject.Load(1, &s.NumBlocks)
}

func (r *rcvBufAutoTuneParams) StateTypeName() string {
	return "pkg/tcpip/transport/tcp.rcvBufAutoTuneParams"
}

func (r *rcvBufAutoTuneParams) StateFields() []string {
	return []string{
		"measureTime",
		"copied",
		"prevCopied",
		"rtt",
		"rttMeasureSeqNumber",
		"rttMeasureTime",
		"disabled",
	}
}

func (r *rcvBufAutoTuneParams) beforeSave() {}

// +checklocksignore
func (r *rcvBufAutoTuneParams) StateSave(stateSinkObject state.Sink) {
	r.beforeSave()
	var measureTimeValue unixTime = r.saveMeasureTime()
	stateSinkObject.SaveValue(0, measureTimeValue)
	var rttMeasureTimeValue unixTime = r.saveRttMeasureTime()
	stateSinkObject.SaveValue(5, rttMeasureTimeValue)
	stateSinkObject.Save(1, &r.copied)
	stateSinkObject.Save(2, &r.prevCopied)
	stateSinkObject.Save(3, &r.rtt)
	stateSinkObject.Save(4, &r.rttMeasureSeqNumber)
	stateSinkObject.Save(6, &r.disabled)
}

func (r *rcvBufAutoTuneParams) afterLoad() {}

// +checklocksignore
func (r *rcvBufAutoTuneParams) StateLoad(stateSourceObject state.Source) {
	stateSourceObject.Load(1, &r.copied)
	stateSourceObject.Load(2, &r.prevCopied)
	stateSourceObject.Load(3, &r.rtt)
	stateSourceObject.Load(4, &r.rttMeasureSeqNumber)
	stateSourceObject.Load(6, &r.disabled)
	stateSourceObject.LoadValue(0, new(unixTime), func(y interface{}) { r.loadMeasureTime(y.(unixTime)) })
	stateSourceObject.LoadValue(5, new(unixTime), func(y interface{}) { r.loadRttMeasureTime(y.(unixTime)) })
}

func (e *EndpointInfo) StateTypeName() string {
	return "pkg/tcpip/transport/tcp.EndpointInfo"
}

func (e *EndpointInfo) StateFields() []string {
	return []string{
		"TransportEndpointInfo",
	}
}

func (e *EndpointInfo) beforeSave() {}

// +checklocksignore
func (e *EndpointInfo) StateSave(stateSinkObject state.Sink) {
	e.beforeSave()
	stateSinkObject.Save(0, &e.TransportEndpointInfo)
}

func (e *EndpointInfo) afterLoad() {}

// +checklocksignore
func (e *EndpointInfo) StateLoad(stateSourceObject state.Source) {
	stateSourceObject.Load(0, &e.TransportEndpointInfo)
}

func (e *endpoint) StateTypeName() string {
	return "pkg/tcpip/transport/tcp.endpoint"
}

func (e *endpoint) StateFields() []string {
	return []string{
		"EndpointInfo",
		"DefaultSocketOptionsHandler",
		"waiterQueue",
		"uniqueID",
		"hardError",
		"lastError",
		"rcvList",
		"rcvClosed",
		"rcvBufSize",
		"rcvBufUsed",
		"rcvAutoParams",
		"rcvMemUsed",
		"ownedByUser",
		"state",
		"boundNICID",
		"ttl",
		"isConnectNotified",
		"portFlags",
		"boundBindToDevice",
		"boundPortFlags",
		"boundDest",
		"effectiveNetProtos",
		"workerRunning",
		"workerCleanup",
		"sendTSOk",
		"recentTS",
		"recentTSTime",
		"tsOffset",
		"shutdownFlags",
		"tcpRecovery",
		"sackPermitted",
		"sack",
		"delay",
		"scoreboard",
		"segmentQueue",
		"synRcvdCount",
		"userMSS",
		"maxSynRetries",
		"windowClamp",
		"sndBufUsed",
		"sndClosed",
		"sndBufInQueue",
		"sndQueue",
		"cc",
		"packetTooBigCount",
		"sndMTU",
		"keepalive",
		"userTimeout",
		"deferAccept",
		"acceptedChan",
		"rcv",
		"snd",
		"connectingAddress",
		"amss",
		"sendTOS",
		"gso",
		"tcpLingerTimeout",
		"closed",
		"txHash",
		"owner",
		"ops",
		"lastOutOfWindowAckTime",
	}
}

// +checklocksignore
func (e *endpoint) StateSave(stateSinkObject state.Sink) {
	e.beforeSave()
	var stateValue EndpointState = e.saveState()
	stateSinkObject.SaveValue(13, stateValue)
	var recentTSTimeValue unixTime = e.saveRecentTSTime()
	stateSinkObject.SaveValue(26, recentTSTimeValue)
	var acceptedChanValue []*endpoint = e.saveAcceptedChan()
	stateSinkObject.SaveValue(49, acceptedChanValue)
	var lastOutOfWindowAckTimeValue unixTime = e.saveLastOutOfWindowAckTime()
	stateSinkObject.SaveValue(61, lastOutOfWindowAckTimeValue)
	stateSinkObject.Save(0, &e.EndpointInfo)
	stateSinkObject.Save(1, &e.DefaultSocketOptionsHandler)
	stateSinkObject.Save(2, &e.waiterQueue)
	stateSinkObject.Save(3, &e.uniqueID)
	stateSinkObject.Save(4, &e.hardError)
	stateSinkObject.Save(5, &e.lastError)
	stateSinkObject.Save(6, &e.rcvList)
	stateSinkObject.Save(7, &e.rcvClosed)
	stateSinkObject.Save(8, &e.rcvBufSize)
	stateSinkObject.Save(9, &e.rcvBufUsed)
	stateSinkObject.Save(10, &e.rcvAutoParams)
	stateSinkObject.Save(11, &e.rcvMemUsed)
	stateSinkObject.Save(12, &e.ownedByUser)
	stateSinkObject.Save(14, &e.boundNICID)
	stateSinkObject.Save(15, &e.ttl)
	stateSinkObject.Save(16, &e.isConnectNotified)
	stateSinkObject.Save(17, &e.portFlags)
	stateSinkObject.Save(18, &e.boundBindToDevice)
	stateSinkObject.Save(19, &e.boundPortFlags)
	stateSinkObject.Save(20, &e.boundDest)
	stateSinkObject.Save(21, &e.effectiveNetProtos)
	stateSinkObject.Save(22, &e.workerRunning)
	stateSinkObject.Save(23, &e.workerCleanup)
	stateSinkObject.Save(24, &e.sendTSOk)
	stateSinkObject.Save(25, &e.recentTS)
	stateSinkObject.Save(27, &e.tsOffset)
	stateSinkObject.Save(28, &e.shutdownFlags)
	stateSinkObject.Save(29, &e.tcpRecovery)
	stateSinkObject.Save(30, &e.sackPermitted)
	stateSinkObject.Save(31, &e.sack)
	stateSinkObject.Save(32, &e.delay)
	stateSinkObject.Save(33, &e.scoreboard)
	stateSinkObject.Save(34, &e.segmentQueue)
	stateSinkObject.Save(35, &e.synRcvdCount)
	stateSinkObject.Save(36, &e.userMSS)
	stateSinkObject.Save(37, &e.maxSynRetries)
	stateSinkObject.Save(38, &e.windowClamp)
	stateSinkObject.Save(39, &e.sndBufUsed)
	stateSinkObject.Save(40, &e.sndClosed)
	stateSinkObject.Save(41, &e.sndBufInQueue)
	stateSinkObject.Save(42, &e.sndQueue)
	stateSinkObject.Save(43, &e.cc)
	stateSinkObject.Save(44, &e.packetTooBigCount)
	stateSinkObject.Save(45, &e.sndMTU)
	stateSinkObject.Save(46, &e.keepalive)
	stateSinkObject.Save(47, &e.userTimeout)
	stateSinkObject.Save(48, &e.deferAccept)
	stateSinkObject.Save(50, &e.rcv)
	stateSinkObject.Save(51, &e.snd)
	stateSinkObject.Save(52, &e.connectingAddress)
	stateSinkObject.Save(53, &e.amss)
	stateSinkObject.Save(54, &e.sendTOS)
	stateSinkObject.Save(55, &e.gso)
	stateSinkObject.Save(56, &e.tcpLingerTimeout)
	stateSinkObject.Save(57, &e.closed)
	stateSinkObject.Save(58, &e.txHash)
	stateSinkObject.Save(59, &e.owner)
	stateSinkObject.Save(60, &e.ops)
}

// +checklocksignore
func (e *endpoint) StateLoad(stateSourceObject state.Source) {
	stateSourceObject.Load(0, &e.EndpointInfo)
	stateSourceObject.Load(1, &e.DefaultSocketOptionsHandler)
	stateSourceObject.LoadWait(2, &e.waiterQueue)
	stateSourceObject.Load(3, &e.uniqueID)
	stateSourceObject.Load(4, &e.hardError)
	stateSourceObject.Load(5, &e.lastError)
	stateSourceObject.LoadWait(6, &e.rcvList)
	stateSourceObject.Load(7, &e.rcvClosed)
	stateSourceObject.Load(8, &e.rcvBufSize)
	stateSourceObject.Load(9, &e.rcvBufUsed)
	stateSourceObject.Load(10, &e.rcvAutoParams)
	stateSourceObject.Load(11, &e.rcvMemUsed)
	stateSourceObject.Load(12, &e.ownedByUser)
	stateSourceObject.Load(14, &e.boundNICID)
	stateSourceObject.Load(15, &e.ttl)
	stateSourceObject.Load(16, &e.isConnectNotified)
	stateSourceObject.Load(17, &e.portFlags)
	stateSourceObject.Load(18, &e.boundBindToDevice)
	stateSourceObject.Load(19, &e.boundPortFlags)
	stateSourceObject.Load(20, &e.boundDest)
	stateSourceObject.Load(21, &e.effectiveNetProtos)
	stateSourceObject.Load(22, &e.workerRunning)
	stateSourceObject.Load(23, &e.workerCleanup)
	stateSourceObject.Load(24, &e.sendTSOk)
	stateSourceObject.Load(25, &e.recentTS)
	stateSourceObject.Load(27, &e.tsOffset)
	stateSourceObject.Load(28, &e.shutdownFlags)
	stateSourceObject.Load(29, &e.tcpRecovery)
	stateSourceObject.Load(30, &e.sackPermitted)
	stateSourceObject.Load(31, &e.sack)
	stateSourceObject.Load(32, &e.delay)
	stateSourceObject.Load(33, &e.scoreboard)
	stateSourceObject.LoadWait(34, &e.segmentQueue)
	stateSourceObject.Load(35, &e.synRcvdCount)
	stateSourceObject.Load(36, &e.userMSS)
	stateSourceObject.Load(37, &e.maxSynRetries)
	stateSourceObject.Load(38, &e.windowClamp)
	stateSourceObject.Load(39, &e.sndBufUsed)
	stateSourceObject.Load(40, &e.sndClosed)
	stateSourceObject.Load(41, &e.sndBufInQueue)
	stateSourceObject.LoadWait(42, &e.sndQueue)
	stateSourceObject.Load(43, &e.cc)
	stateSourceObject.Load(44, &e.packetTooBigCount)
	stateSourceObject.Load(45, &e.sndMTU)
	stateSourceObject.Load(46, &e.keepalive)
	stateSourceObject.Load(47, &e.userTimeout)
	stateSourceObject.Load(48, &e.deferAccept)
	stateSourceObject.LoadWait(50, &e.rcv)
	stateSourceObject.LoadWait(51, &e.snd)
	stateSourceObject.Load(52, &e.connectingAddress)
	stateSourceObject.Load(53, &e.amss)
	stateSourceObject.Load(54, &e.sendTOS)
	stateSourceObject.Load(55, &e.gso)
	stateSourceObject.Load(56, &e.tcpLingerTimeout)
	stateSourceObject.Load(57, &e.closed)
	stateSourceObject.Load(58, &e.txHash)
	stateSourceObject.Load(59, &e.owner)
	stateSourceObject.Load(60, &e.ops)
	stateSourceObject.LoadValue(13, new(EndpointState), func(y interface{}) { e.loadState(y.(EndpointState)) })
	stateSourceObject.LoadValue(26, new(unixTime), func(y interface{}) { e.loadRecentTSTime(y.(unixTime)) })
	stateSourceObject.LoadValue(49, new([]*endpoint), func(y interface{}) { e.loadAcceptedChan(y.([]*endpoint)) })
	stateSourceObject.LoadValue(61, new(unixTime), func(y interface{}) { e.loadLastOutOfWindowAckTime(y.(unixTime)) })
	stateSourceObject.AfterLoad(e.afterLoad)
}

func (k *keepalive) StateTypeName() string {
	return "pkg/tcpip/transport/tcp.keepalive"
}

func (k *keepalive) StateFields() []string {
	return []string{
		"idle",
		"interval",
		"count",
		"unacked",
	}
}

func (k *keepalive) beforeSave() {}

// +checklocksignore
func (k *keepalive) StateSave(stateSinkObject state.Sink) {
	k.beforeSave()
	stateSinkObject.Save(0, &k.idle)
	stateSinkObject.Save(1, &k.interval)
	stateSinkObject.Save(2, &k.count)
	stateSinkObject.Save(3, &k.unacked)
}

func (k *keepalive) afterLoad() {}

// +checklocksignore
func (k *keepalive) StateLoad(stateSourceObject state.Source) {
	stateSourceObject.Load(0, &k.idle)
	stateSourceObject.Load(1, &k.interval)
	stateSourceObject.Load(2, &k.count)
	stateSourceObject.Load(3, &k.unacked)
}

func (rc *rackControl) StateTypeName() string {
	return "pkg/tcpip/transport/tcp.rackControl"
}

func (rc *rackControl) StateFields() []string {
	return []string{
		"dsackSeen",
		"endSequence",
		"exitedRecovery",
		"fack",
		"minRTT",
		"reorderSeen",
		"reoWnd",
		"reoWndIncr",
		"reoWndPersist",
		"rtt",
		"rttSeq",
		"xmitTime",
		"tlpRxtOut",
		"tlpHighRxt",
		"snd",
	}
}

func (rc *rackControl) beforeSave() {}

// +checklocksignore
func (rc *rackControl) StateSave(stateSinkObject state.Sink) {
	rc.beforeSave()
	var xmitTimeValue unixTime = rc.saveXmitTime()
	stateSinkObject.SaveValue(11, xmitTimeValue)
	stateSinkObject.Save(0, &rc.dsackSeen)
	stateSinkObject.Save(1, &rc.endSequence)
	stateSinkObject.Save(2, &rc.exitedRecovery)
	stateSinkObject.Save(3, &rc.fack)
	stateSinkObject.Save(4, &rc.minRTT)
	stateSinkObject.Save(5, &rc.reorderSeen)
	stateSinkObject.Save(6, &rc.reoWnd)
	stateSinkObject.Save(7, &rc.reoWndIncr)
	stateSinkObject.Save(8, &rc.reoWndPersist)
	stateSinkObject.Save(9, &rc.rtt)
	stateSinkObject.Save(10, &rc.rttSeq)
	stateSinkObject.Save(12, &rc.tlpRxtOut)
	stateSinkObject.Save(13, &rc.tlpHighRxt)
	stateSinkObject.Save(14, &rc.snd)
}

func (rc *rackControl) afterLoad() {}

// +checklocksignore
func (rc *rackControl) StateLoad(stateSourceObject state.Source) {
	stateSourceObject.Load(0, &rc.dsackSeen)
	stateSourceObject.Load(1, &rc.endSequence)
	stateSourceObject.Load(2, &rc.exitedRecovery)
	stateSourceObject.Load(3, &rc.fack)
	stateSourceObject.Load(4, &rc.minRTT)
	stateSourceObject.Load(5, &rc.reorderSeen)
	stateSourceObject.Load(6, &rc.reoWnd)
	stateSourceObject.Load(7, &rc.reoWndIncr)
	stateSourceObject.Load(8, &rc.reoWndPersist)
	stateSourceObject.Load(9, &rc.rtt)
	stateSourceObject.Load(10, &rc.rttSeq)
	stateSourceObject.Load(12, &rc.tlpRxtOut)
	stateSourceObject.Load(13, &rc.tlpHighRxt)
	stateSourceObject.Load(14, &rc.snd)
	stateSourceObject.LoadValue(11, new(unixTime), func(y interface{}) { rc.loadXmitTime(y.(unixTime)) })
}

func (r *receiver) StateTypeName() string {
	return "pkg/tcpip/transport/tcp.receiver"
}

func (r *receiver) StateFields() []string {
	return []string{
		"ep",
		"rcvNxt",
		"rcvAcc",
		"rcvWnd",
		"rcvWUP",
		"rcvWndScale",
		"prevBufUsed",
		"closed",
		"pendingRcvdSegments",
		"pendingBufUsed",
		"lastRcvdAckTime",
	}
}

func (r *receiver) beforeSave() {}

// +checklocksignore
func (r *receiver) StateSave(stateSinkObject state.Sink) {
	r.beforeSave()
	var lastRcvdAckTimeValue unixTime = r.saveLastRcvdAckTime()
	stateSinkObject.SaveValue(10, lastRcvdAckTimeValue)
	stateSinkObject.Save(0, &r.ep)
	stateSinkObject.Save(1, &r.rcvNxt)
	stateSinkObject.Save(2, &r.rcvAcc)
	stateSinkObject.Save(3, &r.rcvWnd)
	stateSinkObject.Save(4, &r.rcvWUP)
	stateSinkObject.Save(5, &r.rcvWndScale)
	stateSinkObject.Save(6, &r.prevBufUsed)
	stateSinkObject.Save(7, &r.closed)
	stateSinkObject.Save(8, &r.pendingRcvdSegments)
	stateSinkObject.Save(9, &r.pendingBufUsed)
}

func (r *receiver) afterLoad() {}

// +checklocksignore
func (r *receiver) StateLoad(stateSourceObject state.Source) {
	stateSourceObject.Load(0, &r.ep)
	stateSourceObject.Load(1, &r.rcvNxt)
	stateSourceObject.Load(2, &r.rcvAcc)
	stateSourceObject.Load(3, &r.rcvWnd)
	stateSourceObject.Load(4, &r.rcvWUP)
	stateSourceObject.Load(5, &r.rcvWndScale)
	stateSourceObject.Load(6, &r.prevBufUsed)
	stateSourceObject.Load(7, &r.closed)
	stateSourceObject.Load(8, &r.pendingRcvdSegments)
	stateSourceObject.Load(9, &r.pendingBufUsed)
	stateSourceObject.LoadValue(10, new(unixTime), func(y interface{}) { r.loadLastRcvdAckTime(y.(unixTime)) })
}

func (r *renoState) StateTypeName() string {
	return "pkg/tcpip/transport/tcp.renoState"
}

func (r *renoState) StateFields() []string {
	return []string{
		"s",
	}
}

func (r *renoState) beforeSave() {}

// +checklocksignore
func (r *renoState) StateSave(stateSinkObject state.Sink) {
	r.beforeSave()
	stateSinkObject.Save(0, &r.s)
}

func (r *renoState) afterLoad() {}

// +checklocksignore
func (r *renoState) StateLoad(stateSourceObject state.Source) {
	stateSourceObject.Load(0, &r.s)
}

func (rr *renoRecovery) StateTypeName() string {
	return "pkg/tcpip/transport/tcp.renoRecovery"
}

func (rr *renoRecovery) StateFields() []string {
	return []string{
		"s",
	}
}

func (rr *renoRecovery) beforeSave() {}

// +checklocksignore
func (rr *renoRecovery) StateSave(stateSinkObject state.Sink) {
	rr.beforeSave()
	stateSinkObject.Save(0, &rr.s)
}

func (rr *renoRecovery) afterLoad() {}

// +checklocksignore
func (rr *renoRecovery) StateLoad(stateSourceObject state.Source) {
	stateSourceObject.Load(0, &rr.s)
}

func (sr *sackRecovery) StateTypeName() string {
	return "pkg/tcpip/transport/tcp.sackRecovery"
}

func (sr *sackRecovery) StateFields() []string {
	return []string{
		"s",
	}
}

func (sr *sackRecovery) beforeSave() {}

// +checklocksignore
func (sr *sackRecovery) StateSave(stateSinkObject state.Sink) {
	sr.beforeSave()
	stateSinkObject.Save(0, &sr.s)
}

func (sr *sackRecovery) afterLoad() {}

// +checklocksignore
func (sr *sackRecovery) StateLoad(stateSourceObject state.Source) {
	stateSourceObject.Load(0, &sr.s)
}

func (s *SACKScoreboard) StateTypeName() string {
	return "pkg/tcpip/transport/tcp.SACKScoreboard"
}

func (s *SACKScoreboard) StateFields() []string {
	return []string{
		"smss",
		"maxSACKED",
	}
}

func (s *SACKScoreboard) beforeSave() {}

// +checklocksignore
func (s *SACKScoreboard) StateSave(stateSinkObject state.Sink) {
	s.beforeSave()
	stateSinkObject.Save(0, &s.smss)
	stateSinkObject.Save(1, &s.maxSACKED)
}

func (s *SACKScoreboard) afterLoad() {}

// +checklocksignore
func (s *SACKScoreboard) StateLoad(stateSourceObject state.Source) {
	stateSourceObject.Load(0, &s.smss)
	stateSourceObject.Load(1, &s.maxSACKED)
}

func (s *segment) StateTypeName() string {
	return "pkg/tcpip/transport/tcp.segment"
}

func (s *segment) StateFields() []string {
	return []string{
		"segmentEntry",
		"refCnt",
		"ep",
		"qFlags",
		"srcAddr",
		"dstAddr",
		"netProto",
		"nicID",
		"data",
		"hdr",
		"sequenceNumber",
		"ackNumber",
		"flags",
		"window",
		"csum",
		"csumValid",
		"parsedOptions",
		"options",
		"hasNewSACKInfo",
		"rcvdTime",
		"xmitTime",
		"xmitCount",
		"acked",
		"dataMemSize",
		"lost",
	}
}

func (s *segment) beforeSave() {}

// +checklocksignore
func (s *segment) StateSave(stateSinkObject state.Sink) {
	s.beforeSave()
	var dataValue buffer.VectorisedView = s.saveData()
	stateSinkObject.SaveValue(8, dataValue)
	var optionsValue []byte = s.saveOptions()
	stateSinkObject.SaveValue(17, optionsValue)
	var rcvdTimeValue unixTime = s.saveRcvdTime()
	stateSinkObject.SaveValue(19, rcvdTimeValue)
	var xmitTimeValue unixTime = s.saveXmitTime()
	stateSinkObject.SaveValue(20, xmitTimeValue)
	stateSinkObject.Save(0, &s.segmentEntry)
	stateSinkObject.Save(1, &s.refCnt)
	stateSinkObject.Save(2, &s.ep)
	stateSinkObject.Save(3, &s.qFlags)
	stateSinkObject.Save(4, &s.srcAddr)
	stateSinkObject.Save(5, &s.dstAddr)
	stateSinkObject.Save(6, &s.netProto)
	stateSinkObject.Save(7, &s.nicID)
	stateSinkObject.Save(9, &s.hdr)
	stateSinkObject.Save(10, &s.sequenceNumber)
	stateSinkObject.Save(11, &s.ackNumber)
	stateSinkObject.Save(12, &s.flags)
	stateSinkObject.Save(13, &s.window)
	stateSinkObject.Save(14, &s.csum)
	stateSinkObject.Save(15, &s.csumValid)
	stateSinkObject.Save(16, &s.parsedOptions)
	stateSinkObject.Save(18, &s.hasNewSACKInfo)
	stateSinkObject.Save(21, &s.xmitCount)
	stateSinkObject.Save(22, &s.acked)
	stateSinkObject.Save(23, &s.dataMemSize)
	stateSinkObject.Save(24, &s.lost)
}

func (s *segment) afterLoad() {}

// +checklocksignore
func (s *segment) StateLoad(stateSourceObject state.Source) {
	stateSourceObject.Load(0, &s.segmentEntry)
	stateSourceObject.Load(1, &s.refCnt)
	stateSourceObject.Load(2, &s.ep)
	stateSourceObject.Load(3, &s.qFlags)
	stateSourceObject.Load(4, &s.srcAddr)
	stateSourceObject.Load(5, &s.dstAddr)
	stateSourceObject.Load(6, &s.netProto)
	stateSourceObject.Load(7, &s.nicID)
	stateSourceObject.Load(9, &s.hdr)
	stateSourceObject.Load(10, &s.sequenceNumber)
	stateSourceObject.Load(11, &s.ackNumber)
	stateSourceObject.Load(12, &s.flags)
	stateSourceObject.Load(13, &s.window)
	stateSourceObject.Load(14, &s.csum)
	stateSourceObject.Load(15, &s.csumValid)
	stateSourceObject.Load(16, &s.parsedOptions)
	stateSourceObject.Load(18, &s.hasNewSACKInfo)
	stateSourceObject.Load(21, &s.xmitCount)
	stateSourceObject.Load(22, &s.acked)
	stateSourceObject.Load(23, &s.dataMemSize)
	stateSourceObject.Load(24, &s.lost)
	stateSourceObject.LoadValue(8, new(buffer.VectorisedView), func(y interface{}) { s.loadData(y.(buffer.VectorisedView)) })
	stateSourceObject.LoadValue(17, new([]byte), func(y interface{}) { s.loadOptions(y.([]byte)) })
	stateSourceObject.LoadValue(19, new(unixTime), func(y interface{}) { s.loadRcvdTime(y.(unixTime)) })
	stateSourceObject.LoadValue(20, new(unixTime), func(y interface{}) { s.loadXmitTime(y.(unixTime)) })
}

func (q *segmentQueue) StateTypeName() string {
	return "pkg/tcpip/transport/tcp.segmentQueue"
}

func (q *segmentQueue) StateFields() []string {
	return []string{
		"list",
		"ep",
		"frozen",
	}
}

func (q *segmentQueue) beforeSave() {}

// +checklocksignore
func (q *segmentQueue) StateSave(stateSinkObject state.Sink) {
	q.beforeSave()
	stateSinkObject.Save(0, &q.list)
	stateSinkObject.Save(1, &q.ep)
	stateSinkObject.Save(2, &q.frozen)
}

func (q *segmentQueue) afterLoad() {}

// +checklocksignore
func (q *segmentQueue) StateLoad(stateSourceObject state.Source) {
	stateSourceObject.LoadWait(0, &q.list)
	stateSourceObject.Load(1, &q.ep)
	stateSourceObject.Load(2, &q.frozen)
}

func (s *sender) StateTypeName() string {
	return "pkg/tcpip/transport/tcp.sender"
}

func (s *sender) StateFields() []string {
	return []string{
		"ep",
		"lastSendTime",
		"dupAckCount",
		"fr",
		"lr",
		"sndCwnd",
		"sndSsthresh",
		"sndCAAckCount",
		"outstanding",
		"sackedOut",
		"sndWnd",
		"sndUna",
		"sndNxt",
		"rttMeasureSeqNum",
		"rttMeasureTime",
		"firstRetransmittedSegXmitTime",
		"closed",
		"writeNext",
		"writeList",
		"rtt",
		"rto",
		"minRTO",
		"maxRTO",
		"maxRetries",
		"maxPayloadSize",
		"gso",
		"sndWndScale",
		"maxSentAck",
		"state",
		"cc",
		"rc",
	}
}

func (s *sender) beforeSave() {}

// +checklocksignore
func (s *sender) StateSave(stateSinkObject state.Sink) {
	s.beforeSave()
	var lastSendTimeValue unixTime = s.saveLastSendTime()
	stateSinkObject.SaveValue(1, lastSendTimeValue)
	var rttMeasureTimeValue unixTime = s.saveRttMeasureTime()
	stateSinkObject.SaveValue(14, rttMeasureTimeValue)
	var firstRetransmittedSegXmitTimeValue unixTime = s.saveFirstRetransmittedSegXmitTime()
	stateSinkObject.SaveValue(15, firstRetransmittedSegXmitTimeValue)
	stateSinkObject.Save(0, &s.ep)
	stateSinkObject.Save(2, &s.dupAckCount)
	stateSinkObject.Save(3, &s.fr)
	stateSinkObject.Save(4, &s.lr)
	stateSinkObject.Save(5, &s.sndCwnd)
	stateSinkObject.Save(6, &s.sndSsthresh)
	stateSinkObject.Save(7, &s.sndCAAckCount)
	stateSinkObject.Save(8, &s.outstanding)
	stateSinkObject.Save(9, &s.sackedOut)
	stateSinkObject.Save(10, &s.sndWnd)
	stateSinkObject.Save(11, &s.sndUna)
	stateSinkObject.Save(12, &s.sndNxt)
	stateSinkObject.Save(13, &s.rttMeasureSeqNum)
	stateSinkObject.Save(16, &s.closed)
	stateSinkObject.Save(17, &s.writeNext)
	stateSinkObject.Save(18, &s.writeList)
	stateSinkObject.Save(19, &s.rtt)
	stateSinkObject.Save(20, &s.rto)
	stateSinkObject.Save(21, &s.minRTO)
	stateSinkObject.Save(22, &s.maxRTO)
	stateSinkObject.Save(23, &s.maxRetries)
	stateSinkObject.Save(24, &s.maxPayloadSize)
	stateSinkObject.Save(25, &s.gso)
	stateSinkObject.Save(26, &s.sndWndScale)
	stateSinkObject.Save(27, &s.maxSentAck)
	stateSinkObject.Save(28, &s.state)
	stateSinkObject.Save(29, &s.cc)
	stateSinkObject.Save(30, &s.rc)
}

// +checklocksignore
func (s *sender) StateLoad(stateSourceObject state.Source) {
	stateSourceObject.Load(0, &s.ep)
	stateSourceObject.Load(2, &s.dupAckCount)
	stateSourceObject.Load(3, &s.fr)
	stateSourceObject.Load(4, &s.lr)
	stateSourceObject.Load(5, &s.sndCwnd)
	stateSourceObject.Load(6, &s.sndSsthresh)
	stateSourceObject.Load(7, &s.sndCAAckCount)
	stateSourceObject.Load(8, &s.outstanding)
	stateSourceObject.Load(9, &s.sackedOut)
	stateSourceObject.Load(10, &s.sndWnd)
	stateSourceObject.Load(11, &s.sndUna)
	stateSourceObject.Load(12, &s.sndNxt)
	stateSourceObject.Load(13, &s.rttMeasureSeqNum)
	stateSourceObject.Load(16, &s.closed)
	stateSourceObject.Load(17, &s.writeNext)
	stateSourceObject.Load(18, &s.writeList)
	stateSourceObject.Load(19, &s.rtt)
	stateSourceObject.Load(20, &s.rto)
	stateSourceObject.Load(21, &s.minRTO)
	stateSourceObject.Load(22, &s.maxRTO)
	stateSourceObject.Load(23, &s.maxRetries)
	stateSourceObject.Load(24, &s.maxPayloadSize)
	stateSourceObject.Load(25, &s.gso)
	stateSourceObject.Load(26, &s.sndWndScale)
	stateSourceObject.Load(27, &s.maxSentAck)
	stateSourceObject.Load(28, &s.state)
	stateSourceObject.Load(29, &s.cc)
	stateSourceObject.Load(30, &s.rc)
	stateSourceObject.LoadValue(1, new(unixTime), func(y interface{}) { s.loadLastSendTime(y.(unixTime)) })
	stateSourceObject.LoadValue(14, new(unixTime), func(y interface{}) { s.loadRttMeasureTime(y.(unixTime)) })
	stateSourceObject.LoadValue(15, new(unixTime), func(y interface{}) { s.loadFirstRetransmittedSegXmitTime(y.(unixTime)) })
	stateSourceObject.AfterLoad(s.afterLoad)
}

func (r *rtt) StateTypeName() string {
	return "pkg/tcpip/transport/tcp.rtt"
}

func (r *rtt) StateFields() []string {
	return []string{
		"srtt",
		"rttvar",
		"srttInited",
	}
}

func (r *rtt) beforeSave() {}

// +checklocksignore
func (r *rtt) StateSave(stateSinkObject state.Sink) {
	r.beforeSave()
	stateSinkObject.Save(0, &r.srtt)
	stateSinkObject.Save(1, &r.rttvar)
	stateSinkObject.Save(2, &r.srttInited)
}

func (r *rtt) afterLoad() {}

// +checklocksignore
func (r *rtt) StateLoad(stateSourceObject state.Source) {
	stateSourceObject.Load(0, &r.srtt)
	stateSourceObject.Load(1, &r.rttvar)
	stateSourceObject.Load(2, &r.srttInited)
}

func (f *fastRecovery) StateTypeName() string {
	return "pkg/tcpip/transport/tcp.fastRecovery"
}

func (f *fastRecovery) StateFields() []string {
	return []string{
		"active",
		"first",
		"last",
		"maxCwnd",
		"highRxt",
		"rescueRxt",
	}
}

func (f *fastRecovery) beforeSave() {}

// +checklocksignore
func (f *fastRecovery) StateSave(stateSinkObject state.Sink) {
	f.beforeSave()
	stateSinkObject.Save(0, &f.active)
	stateSinkObject.Save(1, &f.first)
	stateSinkObject.Save(2, &f.last)
	stateSinkObject.Save(3, &f.maxCwnd)
	stateSinkObject.Save(4, &f.highRxt)
	stateSinkObject.Save(5, &f.rescueRxt)
}

func (f *fastRecovery) afterLoad() {}

// +checklocksignore
func (f *fastRecovery) StateLoad(stateSourceObject state.Source) {
	stateSourceObject.Load(0, &f.active)
	stateSourceObject.Load(1, &f.first)
	stateSourceObject.Load(2, &f.last)
	stateSourceObject.Load(3, &f.maxCwnd)
	stateSourceObject.Load(4, &f.highRxt)
	stateSourceObject.Load(5, &f.rescueRxt)
}

func (u *unixTime) StateTypeName() string {
	return "pkg/tcpip/transport/tcp.unixTime"
}

func (u *unixTime) StateFields() []string {
	return []string{
		"second",
		"nano",
	}
}

func (u *unixTime) beforeSave() {}

// +checklocksignore
func (u *unixTime) StateSave(stateSinkObject state.Sink) {
	u.beforeSave()
	stateSinkObject.Save(0, &u.second)
	stateSinkObject.Save(1, &u.nano)
}

func (u *unixTime) afterLoad() {}

// +checklocksignore
func (u *unixTime) StateLoad(stateSourceObject state.Source) {
	stateSourceObject.Load(0, &u.second)
	stateSourceObject.Load(1, &u.nano)
}

func (l *endpointList) StateTypeName() string {
	return "pkg/tcpip/transport/tcp.endpointList"
}

func (l *endpointList) StateFields() []string {
	return []string{
		"head",
		"tail",
	}
}

func (l *endpointList) beforeSave() {}

// +checklocksignore
func (l *endpointList) StateSave(stateSinkObject state.Sink) {
	l.beforeSave()
	stateSinkObject.Save(0, &l.head)
	stateSinkObject.Save(1, &l.tail)
}

func (l *endpointList) afterLoad() {}

// +checklocksignore
func (l *endpointList) StateLoad(stateSourceObject state.Source) {
	stateSourceObject.Load(0, &l.head)
	stateSourceObject.Load(1, &l.tail)
}

func (e *endpointEntry) StateTypeName() string {
	return "pkg/tcpip/transport/tcp.endpointEntry"
}

func (e *endpointEntry) StateFields() []string {
	return []string{
		"next",
		"prev",
	}
}

func (e *endpointEntry) beforeSave() {}

// +checklocksignore
func (e *endpointEntry) StateSave(stateSinkObject state.Sink) {
	e.beforeSave()
	stateSinkObject.Save(0, &e.next)
	stateSinkObject.Save(1, &e.prev)
}

func (e *endpointEntry) afterLoad() {}

// +checklocksignore
func (e *endpointEntry) StateLoad(stateSourceObject state.Source) {
	stateSourceObject.Load(0, &e.next)
	stateSourceObject.Load(1, &e.prev)
}

func (l *segmentList) StateTypeName() string {
	return "pkg/tcpip/transport/tcp.segmentList"
}

func (l *segmentList) StateFields() []string {
	return []string{
		"head",
		"tail",
	}
}

func (l *segmentList) beforeSave() {}

// +checklocksignore
func (l *segmentList) StateSave(stateSinkObject state.Sink) {
	l.beforeSave()
	stateSinkObject.Save(0, &l.head)
	stateSinkObject.Save(1, &l.tail)
}

func (l *segmentList) afterLoad() {}

// +checklocksignore
func (l *segmentList) StateLoad(stateSourceObject state.Source) {
	stateSourceObject.Load(0, &l.head)
	stateSourceObject.Load(1, &l.tail)
}

func (e *segmentEntry) StateTypeName() string {
	return "pkg/tcpip/transport/tcp.segmentEntry"
}

func (e *segmentEntry) StateFields() []string {
	return []string{
		"next",
		"prev",
	}
}

func (e *segmentEntry) beforeSave() {}

// +checklocksignore
func (e *segmentEntry) StateSave(stateSinkObject state.Sink) {
	e.beforeSave()
	stateSinkObject.Save(0, &e.next)
	stateSinkObject.Save(1, &e.prev)
}

func (e *segmentEntry) afterLoad() {}

// +checklocksignore
func (e *segmentEntry) StateLoad(stateSourceObject state.Source) {
	stateSourceObject.Load(0, &e.next)
	stateSourceObject.Load(1, &e.prev)
}

func init() {
	state.Register((*cubicState)(nil))
	state.Register((*SACKInfo)(nil))
	state.Register((*rcvBufAutoTuneParams)(nil))
	state.Register((*EndpointInfo)(nil))
	state.Register((*endpoint)(nil))
	state.Register((*keepalive)(nil))
	state.Register((*rackControl)(nil))
	state.Register((*receiver)(nil))
	state.Register((*renoState)(nil))
	state.Register((*renoRecovery)(nil))
	state.Register((*sackRecovery)(nil))
	state.Register((*SACKScoreboard)(nil))
	state.Register((*segment)(nil))
	state.Register((*segmentQueue)(nil))
	state.Register((*sender)(nil))
	state.Register((*rtt)(nil))
	state.Register((*fastRecovery)(nil))
	state.Register((*unixTime)(nil))
	state.Register((*endpointList)(nil))
	state.Register((*endpointEntry)(nil))
	state.Register((*segmentList)(nil))
	state.Register((*segmentEntry)(nil))
}
