// automatically generated by stateify.

package udp

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

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

func (u *udpPacket) StateFields() []string {
	return []string{
		"udpPacketEntry",
		"senderAddress",
		"destinationAddress",
		"packetInfo",
		"data",
		"timestamp",
		"tos",
	}
}

func (u *udpPacket) beforeSave() {}

// +checklocksignore
func (u *udpPacket) StateSave(stateSinkObject state.Sink) {
	u.beforeSave()
	var dataValue buffer.VectorisedView = u.saveData()
	stateSinkObject.SaveValue(4, dataValue)
	stateSinkObject.Save(0, &u.udpPacketEntry)
	stateSinkObject.Save(1, &u.senderAddress)
	stateSinkObject.Save(2, &u.destinationAddress)
	stateSinkObject.Save(3, &u.packetInfo)
	stateSinkObject.Save(5, &u.timestamp)
	stateSinkObject.Save(6, &u.tos)
}

func (u *udpPacket) afterLoad() {}

// +checklocksignore
func (u *udpPacket) StateLoad(stateSourceObject state.Source) {
	stateSourceObject.Load(0, &u.udpPacketEntry)
	stateSourceObject.Load(1, &u.senderAddress)
	stateSourceObject.Load(2, &u.destinationAddress)
	stateSourceObject.Load(3, &u.packetInfo)
	stateSourceObject.Load(5, &u.timestamp)
	stateSourceObject.Load(6, &u.tos)
	stateSourceObject.LoadValue(4, new(buffer.VectorisedView), func(y interface{}) { u.loadData(y.(buffer.VectorisedView)) })
}

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

func (e *endpoint) StateFields() []string {
	return []string{
		"TransportEndpointInfo",
		"DefaultSocketOptionsHandler",
		"waiterQueue",
		"uniqueID",
		"rcvReady",
		"rcvList",
		"rcvBufSizeMax",
		"rcvBufSize",
		"rcvClosed",
		"state",
		"dstPort",
		"ttl",
		"multicastTTL",
		"multicastAddr",
		"multicastNICID",
		"portFlags",
		"lastError",
		"boundBindToDevice",
		"boundPortFlags",
		"sendTOS",
		"shutdownFlags",
		"multicastMemberships",
		"effectiveNetProtos",
		"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.uniqueID)
	stateSinkObject.Save(4, &e.rcvReady)
	stateSinkObject.Save(5, &e.rcvList)
	stateSinkObject.Save(7, &e.rcvBufSize)
	stateSinkObject.Save(8, &e.rcvClosed)
	stateSinkObject.Save(9, &e.state)
	stateSinkObject.Save(10, &e.dstPort)
	stateSinkObject.Save(11, &e.ttl)
	stateSinkObject.Save(12, &e.multicastTTL)
	stateSinkObject.Save(13, &e.multicastAddr)
	stateSinkObject.Save(14, &e.multicastNICID)
	stateSinkObject.Save(15, &e.portFlags)
	stateSinkObject.Save(16, &e.lastError)
	stateSinkObject.Save(17, &e.boundBindToDevice)
	stateSinkObject.Save(18, &e.boundPortFlags)
	stateSinkObject.Save(19, &e.sendTOS)
	stateSinkObject.Save(20, &e.shutdownFlags)
	stateSinkObject.Save(21, &e.multicastMemberships)
	stateSinkObject.Save(22, &e.effectiveNetProtos)
	stateSinkObject.Save(23, &e.owner)
	stateSinkObject.Save(24, &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.uniqueID)
	stateSourceObject.Load(4, &e.rcvReady)
	stateSourceObject.Load(5, &e.rcvList)
	stateSourceObject.Load(7, &e.rcvBufSize)
	stateSourceObject.Load(8, &e.rcvClosed)
	stateSourceObject.Load(9, &e.state)
	stateSourceObject.Load(10, &e.dstPort)
	stateSourceObject.Load(11, &e.ttl)
	stateSourceObject.Load(12, &e.multicastTTL)
	stateSourceObject.Load(13, &e.multicastAddr)
	stateSourceObject.Load(14, &e.multicastNICID)
	stateSourceObject.Load(15, &e.portFlags)
	stateSourceObject.Load(16, &e.lastError)
	stateSourceObject.Load(17, &e.boundBindToDevice)
	stateSourceObject.Load(18, &e.boundPortFlags)
	stateSourceObject.Load(19, &e.sendTOS)
	stateSourceObject.Load(20, &e.shutdownFlags)
	stateSourceObject.Load(21, &e.multicastMemberships)
	stateSourceObject.Load(22, &e.effectiveNetProtos)
	stateSourceObject.Load(23, &e.owner)
	stateSourceObject.Load(24, &e.ops)
	stateSourceObject.LoadValue(6, new(int), func(y interface{}) { e.loadRcvBufSizeMax(y.(int)) })
	stateSourceObject.AfterLoad(e.afterLoad)
}

func (m *multicastMembership) StateTypeName() string {
	return "pkg/tcpip/transport/udp.multicastMembership"
}

func (m *multicastMembership) StateFields() []string {
	return []string{
		"nicID",
		"multicastAddr",
	}
}

func (m *multicastMembership) beforeSave() {}

// +checklocksignore
func (m *multicastMembership) StateSave(stateSinkObject state.Sink) {
	m.beforeSave()
	stateSinkObject.Save(0, &m.nicID)
	stateSinkObject.Save(1, &m.multicastAddr)
}

func (m *multicastMembership) afterLoad() {}

// +checklocksignore
func (m *multicastMembership) StateLoad(stateSourceObject state.Source) {
	stateSourceObject.Load(0, &m.nicID)
	stateSourceObject.Load(1, &m.multicastAddr)
}

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

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

func (l *udpPacketList) beforeSave() {}

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

func (l *udpPacketList) afterLoad() {}

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

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

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

func (e *udpPacketEntry) beforeSave() {}

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

func (e *udpPacketEntry) afterLoad() {}

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

func init() {
	state.Register((*udpPacket)(nil))
	state.Register((*endpoint)(nil))
	state.Register((*multicastMembership)(nil))
	state.Register((*udpPacketList)(nil))
	state.Register((*udpPacketEntry)(nil))
}
