89 lines
1.5 KiB
Go
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:
|
|
}
|
|
}
|