mirror of
https://github.com/apernet/OpenGFW.git
synced 2024-12-22 17:09:21 +08:00
feat(pcap): impl realtime wait() with time offset
This commit is contained in:
parent
301f9af3d4
commit
1934c065ec
36
io/pcap.go
36
io/pcap.go
@ -17,11 +17,11 @@ import (
|
|||||||
var _ PacketIO = (*pcapPacketIO)(nil)
|
var _ PacketIO = (*pcapPacketIO)(nil)
|
||||||
|
|
||||||
type pcapPacketIO struct {
|
type pcapPacketIO struct {
|
||||||
pcapFile io.ReadCloser
|
pcapFile io.ReadCloser
|
||||||
pcap *pcapgo.Reader
|
pcap *pcapgo.Reader
|
||||||
lastTime *time.Time
|
timeOffset *time.Duration
|
||||||
ioCancel context.CancelFunc
|
ioCancel context.CancelFunc
|
||||||
config PcapPacketIOConfig
|
config PcapPacketIOConfig
|
||||||
|
|
||||||
dialer *net.Dialer
|
dialer *net.Dialer
|
||||||
}
|
}
|
||||||
@ -43,12 +43,12 @@ func NewPcapPacketIO(config PcapPacketIOConfig) (PacketIO, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return &pcapPacketIO{
|
return &pcapPacketIO{
|
||||||
pcapFile: pcapFile,
|
pcapFile: pcapFile,
|
||||||
pcap: handle,
|
pcap: handle,
|
||||||
lastTime: nil,
|
timeOffset: nil,
|
||||||
ioCancel: nil,
|
ioCancel: nil,
|
||||||
config: config,
|
config: config,
|
||||||
dialer: &net.Dialer{},
|
dialer: &net.Dialer{},
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -101,20 +101,18 @@ func (p *pcapPacketIO) Close() error {
|
|||||||
|
|
||||||
// Intentionally slow down the replay
|
// Intentionally slow down the replay
|
||||||
// In realtime mode, this is to match the timestamps in the capture
|
// In realtime mode, this is to match the timestamps in the capture
|
||||||
func (p *pcapPacketIO) wait(packet gopacket.Packet) error {
|
func (p *pcapPacketIO) wait(packet gopacket.Packet) {
|
||||||
if !p.config.Realtime {
|
if !p.config.Realtime {
|
||||||
return nil
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if p.lastTime == nil {
|
if p.timeOffset == nil {
|
||||||
p.lastTime = &packet.Metadata().Timestamp
|
offset := time.Since(packet.Metadata().Timestamp)
|
||||||
|
p.timeOffset = &offset
|
||||||
} else {
|
} else {
|
||||||
t := packet.Metadata().Timestamp.Sub(*p.lastTime)
|
t := time.Until(packet.Metadata().Timestamp.Add(*p.timeOffset))
|
||||||
time.Sleep(t)
|
time.Sleep(t)
|
||||||
p.lastTime = &packet.Metadata().Timestamp
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ Packet = (*pcapPacket)(nil)
|
var _ Packet = (*pcapPacket)(nil)
|
||||||
|
Loading…
Reference in New Issue
Block a user