@@ -43,24 +43,54 @@ type flow3Tuple struct {
4343
4444// icmpEchoFlow implements the packet.Funnel interface.
4545type icmpEchoFlow struct {
46- * packet.RawPacketFunnel
46+ * packet.ActivityTracker
47+ closeCallback func () error
48+ src netip.Addr
49+ originConn * icmp.PacketConn
50+ responder * packetResponder
4751 assignedEchoID int
4852 originalEchoID int
4953 // it's up to the user to ensure respEncoder is not used concurrently
5054 respEncoder * packet.Encoder
5155}
5256
53- func newICMPEchoFlow (src netip.Addr , sendPipe , returnPipe packet. FunnelUniPipe , assignedEchoID , originalEchoID int , respEncoder * packet.Encoder ) * icmpEchoFlow {
57+ func newICMPEchoFlow (src netip.Addr , closeCallback func () error , originConn * icmp. PacketConn , responder * packetResponder , assignedEchoID , originalEchoID int , respEncoder * packet.Encoder ) * icmpEchoFlow {
5458 return & icmpEchoFlow {
55- RawPacketFunnel : packet .NewRawPacketFunnel (src , sendPipe , returnPipe ),
59+ ActivityTracker : packet .NewActivityTracker (),
60+ closeCallback : closeCallback ,
61+ src : src ,
62+ originConn : originConn ,
63+ responder : responder ,
5664 assignedEchoID : assignedEchoID ,
5765 originalEchoID : originalEchoID ,
5866 respEncoder : respEncoder ,
5967 }
6068}
6169
70+ func (ief * icmpEchoFlow ) Equal (other packet.Funnel ) bool {
71+ otherICMPFlow , ok := other .(* icmpEchoFlow )
72+ if ! ok {
73+ return false
74+ }
75+ if otherICMPFlow .src != ief .src {
76+ return false
77+ }
78+ if otherICMPFlow .originalEchoID != ief .originalEchoID {
79+ return false
80+ }
81+ if otherICMPFlow .assignedEchoID != ief .assignedEchoID {
82+ return false
83+ }
84+ return true
85+ }
86+
87+ func (ief * icmpEchoFlow ) Close () error {
88+ return ief .closeCallback ()
89+ }
90+
6291// sendToDst rewrites the echo ID to the one assigned to this flow
6392func (ief * icmpEchoFlow ) sendToDst (dst netip.Addr , msg * icmp.Message ) error {
93+ ief .UpdateLastActive ()
6494 originalEcho , err := getICMPEcho (msg )
6595 if err != nil {
6696 return err
@@ -80,17 +110,21 @@ func (ief *icmpEchoFlow) sendToDst(dst netip.Addr, msg *icmp.Message) error {
80110 if err != nil {
81111 return err
82112 }
83- return ief .SendToDst (dst , packet.RawPacket {Data : serializedPacket })
113+ _ , err = ief .originConn .WriteTo (serializedPacket , & net.UDPAddr {
114+ IP : dst .AsSlice (),
115+ })
116+ return err
84117}
85118
86119// returnToSrc rewrites the echo ID to the original echo ID from the eyeball
87120func (ief * icmpEchoFlow ) returnToSrc (reply * echoReply ) error {
121+ ief .UpdateLastActive ()
88122 reply .echo .ID = ief .originalEchoID
89123 reply .msg .Body = reply .echo
90124 pk := packet.ICMP {
91125 IP : & packet.IP {
92126 Src : reply .from ,
93- Dst : ief .Src ,
127+ Dst : ief .src ,
94128 Protocol : layers .IPProtocol (reply .msg .Type .Protocol ()),
95129 TTL : packet .DefaultTTL ,
96130 },
@@ -100,7 +134,7 @@ func (ief *icmpEchoFlow) returnToSrc(reply *echoReply) error {
100134 if err != nil {
101135 return err
102136 }
103- return ief .ReturnToSrc (serializedPacket )
137+ return ief .responder . returnPacket (serializedPacket )
104138}
105139
106140type echoReply struct {
0 commit comments