diff --git a/pcap.go b/pcap.go index 46a6f07c..4f40f8e7 100644 --- a/pcap.go +++ b/pcap.go @@ -50,7 +50,7 @@ func newPcapIO(ifName string, promisc bool, snaplen int, bufSz int) (handle *Pca } func (pi *PcapIO) ReadPacket() (data []byte, err error) { - data, _, err = pi.handle.ReadPacketData() + data, _, err = pi.handle.ZeroCopyReadPacketData() return } diff --git a/router.go b/router.go index e4353f27..7e41c4bf 100644 --- a/router.go +++ b/router.go @@ -111,10 +111,16 @@ func (router *Router) handleCapturedPacket(frameData []byte, dec *EthernetDecode } else { router.LogFrame("Forwarding", frameData, &dec.eth) } + // at this point we are handing over the frame to forwarders, so + // we need to make a copy of it in order to prevent the next + // capture from overwriting the data + frameLen := len(frameData) + frameCopy := make([]byte, frameLen, frameLen) + copy(frameCopy, frameData) if !found || dec.BroadcastFrame() { - return checkFrameTooBig(router.Ourself.Broadcast(df, frameData, dec)) + return checkFrameTooBig(router.Ourself.Broadcast(df, frameCopy, dec)) } else { - return checkFrameTooBig(router.Ourself.Forward(dstPeer, df, frameData, dec)) + return checkFrameTooBig(router.Ourself.Forward(dstPeer, df, frameCopy, dec)) } }