1
0

89 lines
1.5 KiB
Go

package packets
import (
"time"
"eq2emu/internal/opcodes"
)
// EQ2 protocol packet
type EQ2Packet struct {
Opcode opcodes.ProtocolOpcode
Data []byte
Sequence uint16
}
// EQ2 application packet
type AppPacket struct {
Opcode opcodes.AppOpcode
Data []byte
Compressed bool
}
// Session for EQ2 connection state
type Session struct {
ID uint32
Established bool
NextSeq uint16
LastKeep time.Time
Compressed bool
Fragments map[uint16]*FragmentBuffer
}
// Fragment reassembly
type FragmentBuffer struct {
Fragments map[uint16][]byte
Total uint16
Received uint16
Timestamp time.Time
}
// Packet pools
type PacketPool struct {
eq2Packets chan *EQ2Packet
appPackets chan *AppPacket
}
func NewPacketPool(size int) *PacketPool {
return &PacketPool{
eq2Packets: make(chan *EQ2Packet, size),
appPackets: make(chan *AppPacket, size),
}
}
func (p *PacketPool) GetEQ2Packet() *EQ2Packet {
select {
case packet := <-p.eq2Packets:
return packet
default:
return &EQ2Packet{}
}
}
func (p *PacketPool) PutEQ2Packet(packet *EQ2Packet) {
packet.Data = packet.Data[:0]
packet.Opcode = 0
select {
case p.eq2Packets <- packet:
default:
}
}
func (p *PacketPool) GetAppPacket() *AppPacket {
select {
case packet := <-p.appPackets:
return packet
default:
return &AppPacket{}
}
}
func (p *PacketPool) PutAppPacket(packet *AppPacket) {
packet.Data = packet.Data[:0]
packet.Opcode = 0
select {
case p.appPackets <- packet:
default:
}
}