// automatically generated by stateify.

package raw

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

func (p *rawPacket) StateTypeName() string {
	return "pkg/tcpip/transport/raw.rawPacket"
}

func (p *rawPacket) StateFields() []string {
	return []string{
		"rawPacketEntry",
		"data",
		"timestampNS",
		"senderAddr",
	}
}

func (p *rawPacket) beforeSave() {}

// +checklocksignore
func (p *rawPacket) StateSave(stateSinkObject state.Sink) {
	p.beforeSave()
	var dataValue buffer.VectorisedView = p.saveData()
	stateSinkObject.SaveValue(1, dataValue)
	stateSinkObject.Save(0, &p.rawPacketEntry)
	stateSinkObject.Save(2, &p.timestampNS)
	stateSinkObject.Save(3, &p.senderAddr)
}

func (p *rawPacket) afterLoad() {}

// +checklocksignore
func (p *rawPacket) StateLoad(stateSourceObject state.Source) {
	stateSourceObject.Load(0, &p.rawPacketEntry)
	stateSourceObject.Load(2, &p.timestampNS)
	stateSourceObject.Load(3, &p.senderAddr)
	stateSourceObject.LoadValue(1, new(buffer.VectorisedView), func(y interface{}) { p.loadData(y.(buffer.VectorisedView)) })
}

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

func (e *endpoint) StateFields() []string {
	return []string{
		"TransportEndpointInfo",
		"DefaultSocketOptionsHandler",
		"waiterQueue",
		"associated",
		"rcvList",
		"rcvBufSize",
		"rcvBufSizeMax",
		"rcvClosed",
		"closed",
		"connected",
		"bound",
		"owner",
		"ops",
	}
}

// +checklocksignore
func (e *endpoint) StateSave(stateSinkObject state.Sink) {
	e.beforeSave()
	var rcvBufSizeMaxValue int = e.saveRcvBufSizeMax()
	stateSinkObject.SaveValue(6, rcvBufSizeMaxValue)
	stateSinkObject.Save(0, &e.TransportEndpointInfo)
	stateSinkObject.Save(1, &e.DefaultSocketOptionsHandler)
	stateSinkObject.Save(2, &e.waiterQueue)
	stateSinkObject.Save(3, &e.associated)
	stateSinkObject.Save(4, &e.rcvList)
	stateSinkObject.Save(5, &e.rcvBufSize)
	stateSinkObject.Save(7, &e.rcvClosed)
	stateSinkObject.Save(8, &e.closed)
	stateSinkObject.Save(9, &e.connected)
	stateSinkObject.Save(10, &e.bound)
	stateSinkObject.Save(11, &e.owner)
	stateSinkObject.Save(12, &e.ops)
}

// +checklocksignore
func (e *endpoint) StateLoad(stateSourceObject state.Source) {
	stateSourceObject.Load(0, &e.TransportEndpointInfo)
	stateSourceObject.Load(1, &e.DefaultSocketOptionsHandler)
	stateSourceObject.Load(2, &e.waiterQueue)
	stateSourceObject.Load(3, &e.associated)
	stateSourceObject.Load(4, &e.rcvList)
	stateSourceObject.Load(5, &e.rcvBufSize)
	stateSourceObject.Load(7, &e.rcvClosed)
	stateSourceObject.Load(8, &e.closed)
	stateSourceObject.Load(9, &e.connected)
	stateSourceObject.Load(10, &e.bound)
	stateSourceObject.Load(11, &e.owner)
	stateSourceObject.Load(12, &e.ops)
	stateSourceObject.LoadValue(6, new(int), func(y interface{}) { e.loadRcvBufSizeMax(y.(int)) })
	stateSourceObject.AfterLoad(e.afterLoad)
}

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

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

func (l *rawPacketList) beforeSave() {}

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

func (l *rawPacketList) afterLoad() {}

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

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

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

func (e *rawPacketEntry) beforeSave() {}

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

func (e *rawPacketEntry) afterLoad() {}

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

func init() {
	state.Register((*rawPacket)(nil))
	state.Register((*endpoint)(nil))
	state.Register((*rawPacketList)(nil))
	state.Register((*rawPacketEntry)(nil))
}
