// automatically generated by stateify.

package header

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

func (r *SACKBlock) StateTypeName() string {
	return "pkg/tcpip/header.SACKBlock"
}

func (r *SACKBlock) StateFields() []string {
	return []string{
		"Start",
		"End",
	}
}

func (r *SACKBlock) beforeSave() {}

// +checklocksignore
func (r *SACKBlock) StateSave(stateSinkObject state.Sink) {
	r.beforeSave()
	stateSinkObject.Save(0, &r.Start)
	stateSinkObject.Save(1, &r.End)
}

func (r *SACKBlock) afterLoad() {}

// +checklocksignore
func (r *SACKBlock) StateLoad(stateSourceObject state.Source) {
	stateSourceObject.Load(0, &r.Start)
	stateSourceObject.Load(1, &r.End)
}

func (t *TCPOptions) StateTypeName() string {
	return "pkg/tcpip/header.TCPOptions"
}

func (t *TCPOptions) StateFields() []string {
	return []string{
		"TS",
		"TSVal",
		"TSEcr",
		"SACKBlocks",
	}
}

func (t *TCPOptions) beforeSave() {}

// +checklocksignore
func (t *TCPOptions) StateSave(stateSinkObject state.Sink) {
	t.beforeSave()
	stateSinkObject.Save(0, &t.TS)
	stateSinkObject.Save(1, &t.TSVal)
	stateSinkObject.Save(2, &t.TSEcr)
	stateSinkObject.Save(3, &t.SACKBlocks)
}

func (t *TCPOptions) afterLoad() {}

// +checklocksignore
func (t *TCPOptions) StateLoad(stateSourceObject state.Source) {
	stateSourceObject.Load(0, &t.TS)
	stateSourceObject.Load(1, &t.TSVal)
	stateSourceObject.Load(2, &t.TSEcr)
	stateSourceObject.Load(3, &t.SACKBlocks)
}

func init() {
	state.Register((*SACKBlock)(nil))
	state.Register((*TCPOptions)(nil))
}
